diff options
-rw-r--r-- | lib/AST/TypeLoc.cpp | 7 | ||||
-rw-r--r-- | test/SemaTemplate/deduction-crash.cpp | 11 |
2 files changed, 16 insertions, 2 deletions
diff --git a/lib/AST/TypeLoc.cpp b/lib/AST/TypeLoc.cpp index 945e783835..4c103dbf54 100644 --- a/lib/AST/TypeLoc.cpp +++ b/lib/AST/TypeLoc.cpp @@ -301,7 +301,6 @@ void TemplateSpecializationTypeLoc::initializeArgLocs(ASTContext &Context, case TemplateArgument::Null: case TemplateArgument::Declaration: case TemplateArgument::Integral: - case TemplateArgument::Pack: case TemplateArgument::NullPtr: llvm_unreachable("Impossible TemplateArgument"); @@ -331,7 +330,11 @@ void TemplateSpecializationTypeLoc::initializeArgLocs(ASTContext &Context, ? SourceLocation() : Loc); break; - } + } + + case TemplateArgument::Pack: + ArgInfos[i] = TemplateArgumentLocInfo(); + break; } } } diff --git a/test/SemaTemplate/deduction-crash.cpp b/test/SemaTemplate/deduction-crash.cpp index ab5e465680..0714c5e516 100644 --- a/test/SemaTemplate/deduction-crash.cpp +++ b/test/SemaTemplate/deduction-crash.cpp @@ -99,3 +99,14 @@ namespacae PR12933 { return 0; } } + +// A buildbot failure from libcxx +namespace libcxx_test { + template <class _Ptr, bool> struct __pointer_traits_element_type; + template <class _Ptr> struct __pointer_traits_element_type<_Ptr, true>; + template <template <class, class...> class _Sp, class _Tp, class ..._Args> struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> { + typedef char type; + }; + template <class T> struct B {}; + __pointer_traits_element_type<B<int>, true>::type x; +} |