[llvm] r297255 - Work around an ICE on MSVC 2017.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 7 17:57:41 PST 2017


Author: zturner
Date: Tue Mar  7 19:57:40 2017
New Revision: 297255

URL: http://llvm.org/viewvc/llvm-project?rev=297255&view=rev
Log:
Work around an ICE on MSVC 2017.

MSVC 2017 was released today, and I found one bug in the
compiler which prevents a successful build of LLVM.  This
patch works around the bug in a fairly benign way.

Modified:
    llvm/trunk/include/llvm/ADT/STLExtras.h

Modified: llvm/trunk/include/llvm/ADT/STLExtras.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/STLExtras.h?rev=297255&r1=297254&r2=297255&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/STLExtras.h (original)
+++ llvm/trunk/include/llvm/ADT/STLExtras.h Tue Mar  7 19:57:40 2017
@@ -358,21 +358,27 @@ template <class... Ts> struct index_sequ
 namespace detail {
 using std::declval;
 
+// We have to alias this since inlining the actual type at the usage site
+// in the parameter list of iterator_facade_base<> below ICEs MSVC 2017.
+template<typename... Iters> struct ZipTupleType {
+  typedef std::tuple<decltype(*declval<Iters>())...> type;
+};
+
 template <typename ZipType, typename... Iters>
 using zip_traits = iterator_facade_base<
     ZipType, typename std::common_type<std::bidirectional_iterator_tag,
                                        typename std::iterator_traits<
                                            Iters>::iterator_category...>::type,
     // ^ TODO: Implement random access methods.
-    std::tuple<decltype(*declval<Iters>())...>,
+    typename ZipTupleType<Iters...>::type,
     typename std::iterator_traits<typename std::tuple_element<
         0, std::tuple<Iters...>>::type>::difference_type,
     // ^ FIXME: This follows boost::make_zip_iterator's assumption that all
     // inner iterators have the same difference_type. It would fail if, for
     // instance, the second field's difference_type were non-numeric while the
     // first is.
-    std::tuple<decltype(*declval<Iters>())...> *,
-    std::tuple<decltype(*declval<Iters>())...>>;
+    typename ZipTupleType<Iters...>::type *,
+    typename ZipTupleType<Iters...>::type>;
 
 template <typename ZipType, typename... Iters>
 struct zip_common : public zip_traits<ZipType, Iters...> {




More information about the llvm-commits mailing list