[libcxx] r292097 - Added a workaround for a `-fdelayed-template-parsing` bug.

Michael Park via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 16 00:14:26 PST 2017


Author: mpark
Date: Mon Jan 16 02:14:25 2017
New Revision: 292097

URL: http://llvm.org/viewvc/llvm-project?rev=292097&view=rev
Log:
Added a workaround for a `-fdelayed-template-parsing` bug.

Summary:
There seems to be an additional bug in `-fdelayed-template-parsing`
similar to
http://llvm.org/viewvc/llvm-project?view=revision&revision=236063.

This is a workaround for it for <variant> to compile with `clang-cl` on Windows.

Reviewers: EricWF

Differential Revision: https://reviews.llvm.org/D28734

Modified:
    libcxx/trunk/include/variant
    libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp

Modified: libcxx/trunk/include/variant
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/variant?rev=292097&r1=292096&r2=292097&view=diff
==============================================================================
--- libcxx/trunk/include/variant (original)
+++ libcxx/trunk/include/variant Mon Jan 16 02:14:25 2017
@@ -466,17 +466,22 @@ private:
     return __result{{_VSTD::forward<_Fs>(__fs)...}};
   }
 
-  template <class _Fp, class... _Vs, size_t... _Is>
-  inline _LIBCPP_INLINE_VISIBILITY
-  static constexpr auto __make_dispatch(index_sequence<_Is...>) {
-    struct __dispatcher {
-      static constexpr decltype(auto) __dispatch(_Fp __f, _Vs... __vs) {
+  template <std::size_t... _Is>
+  struct __dispatcher {
+    template <class _Fp, class... _Vs>
+    inline _LIBCPP_INLINE_VISIBILITY
+    static constexpr decltype(auto) __dispatch(_Fp __f, _Vs... __vs) {
         return __invoke_constexpr(
             static_cast<_Fp>(__f),
             __access::__base::__get_alt<_Is>(static_cast<_Vs>(__vs))...);
-      }
-    };
-    return _VSTD::addressof(__dispatcher::__dispatch);
+    }
+  };
+
+  template <class _Fp, class... _Vs, size_t... _Is>
+  inline _LIBCPP_INLINE_VISIBILITY
+  static constexpr auto __make_dispatch(index_sequence<_Is...>) {
+    return _VSTD::addressof(
+        __dispatcher<_Is...>::template __dispatch<_Fp, _Vs...>);
   }
 
   template <size_t _Ip, class _Fp, class... _Vs>

Modified: libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp?rev=292097&r1=292096&r2=292097&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/variant/variant.visit/visit.pass.cpp Mon Jan 16 02:14:25 2017
@@ -10,9 +10,6 @@
 
 // UNSUPPORTED: c++98, c++03, c++11, c++14
 
-// FIXME: This test hangs for an unknown reason on Windows. See llvm.org/PR31642
-// UNSUPPORTED: windows
-
 // <variant>
 // template <class Visitor, class... Variants>
 // constexpr see below visit(Visitor&& vis, Variants&&... vars);




More information about the cfe-commits mailing list