diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index ebdf6dd57fc545965e1710bdb826a9248093bcfe..7467ce40a88e0036e7184440f6a04ec570ee2521 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -2383,7 +2383,8 @@ static Sema::TemplateDeductionResult ConvertDeducedTemplateArguments( bool HasDefaultArg = false; TemplateDecl *TD = dyn_cast<TemplateDecl>(Template); if (!TD) { - assert(isa<ClassTemplatePartialSpecializationDecl>(Template)); + assert(isa<ClassTemplatePartialSpecializationDecl>(Template) || + isa<VarTemplatePartialSpecializationDecl>(Template)); return Sema::TDK_Incomplete; } diff --git a/test/SemaTemplate/deduction-crash.cpp b/test/SemaTemplate/deduction-crash.cpp index c94c9db94e06439f3a88bcfca222cfb517e8b7dc..74a25865aa20710c21091d93f54548a29e184d4a 100644 --- a/test/SemaTemplate/deduction-crash.cpp +++ b/test/SemaTemplate/deduction-crash.cpp @@ -1,14 +1,10 @@ -// RUN: not %clang_cc1 -fsyntax-only %s -std=c++11 2>&1| FileCheck %s - -// Note that the error count below doesn't matter. We just want to -// make sure that the parser doesn't crash. -// CHECK: 17 errors +// RUN: %clang_cc1 -fsyntax-only %s -std=c++1z -verify // PR7511 -template<a> +template<a> // expected-error +{{}} struct int_; -template<a> +template<a> // expected-error +{{}} template<int,typename T1,typename> struct ac { @@ -17,7 +13,7 @@ struct ac template<class>struct aaa { - typedef ac<1,int,int>::ae ae + typedef ac<1,int,int>::ae ae // expected-error +{{}} }; template<class> @@ -36,19 +32,19 @@ struct state_machine struct In; template<int my> - struct In<a::int_<aaa::a>,my>; + struct In<a::int_<aaa::a>,my>; // expected-error +{{}} template<class Event> int process(Event) { - In<a::int_<0> > a; + In<a::int_<0> > a; // expected-error +{{}} } - } + } // expected-error +{{}} template<class Event> int ant(Event) { region_processing_helper<int>* helper; - helper->process(0) + helper->process(0) // expected-error +{{}} } }; @@ -81,21 +77,21 @@ void endl( ) ; extern basic_ostream<char> cout; -int operator<<( basic_ostream<char> , pair ) ; +int operator<<( basic_ostream<char> , pair ) ; // expected-note +{{}} void register_object_imp ( ) { -cout << endl<1>; +cout << endl<1>; // expected-error +{{}} } // PR12933 -namespacae PR12933 { - template<typename S> +namespace PR12933 { + template<typename S> // expected-error +{{}} template<typename T> void function(S a, T b) {} int main() { - function(0, 1); + function(0, 1); // expected-error +{{}} return 0; } } @@ -142,3 +138,9 @@ namespace PR14281_part3 { template <class T, int* i> struct B {}; A<B<int, &some_decl>, &some_decl>::type x; } + +namespace var_template_partial_spec_incomplete { + template<typename T> int n; + template<typename T, typename U = void> int n<T *>; // expected-error +{{}} expected-note {{}} + int k = n<void *>; +}