Move explicit template class specialization out of the class to fix gcc builds (NFC)
authorMehdi Amini <joker.eph@gmail.com>
Thu, 25 Jun 2020 01:40:53 +0000 (01:40 +0000)
committerMehdi Amini <joker.eph@gmail.com>
Thu, 25 Jun 2020 01:43:21 +0000 (01:43 +0000)
gcc fails with:

   explicit specialization in non-namespace scope

mlir/include/mlir/Support/InterfaceSupport.h

index c29c49d..e7a7eca 100644 (file)
@@ -123,6 +123,24 @@ private:
 // InterfaceMap
 //===----------------------------------------------------------------------===//
 
+/// Utility to filter a given sequence of types base upon a predicate.
+template <bool>
+struct FilterTypeT {
+  template <class E>
+  using type = std::tuple<E>;
+};
+template <>
+struct FilterTypeT<false> {
+  template <class E>
+  using type = std::tuple<>;
+};
+template <template <class> class Pred, class... Es>
+struct FilterTypes {
+  using type = decltype(std::tuple_cat(
+      std::declval<
+          typename FilterTypeT<Pred<Es>::value>::template type<Es>>()...));
+};
+
 /// This class provides an efficient mapping between a given `Interface` type,
 /// and a particular implementation of its concept.
 class InterfaceMap {
@@ -163,18 +181,6 @@ private:
     template <typename T>
     using detect_get_interface_id = llvm::is_detected<has_get_interface_id, T>;
 
-    /// Utility to filter a given sequence of types base upon a predicate.
-    template <bool> struct FilterTypeT {
-      template <class E> using type = std::tuple<E>;
-    };
-    template <> struct FilterTypeT<false> {
-      template <class E> using type = std::tuple<>;
-    };
-    template <template <class> class Pred, class... Es> struct FilterTypes {
-      using type = decltype(std::tuple_cat(
-          std::declval<
-              typename FilterTypeT<Pred<Es>::value>::template type<Es>>()...));
-    };
     template <typename... Ts>
     static std::unique_ptr<llvm::SmallDenseMap<TypeID, void *>>
     createImpl(std::tuple<Ts...> *) {