diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-06-02 22:53:06 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-06-02 22:53:06 +0000 |
commit | f8ba3fd8e65d45d4f741867a5503a046a8fae8a2 (patch) | |
tree | 04b26d3d3569706a08201afb12ec2765e9ecc6a8 /clang | |
parent | 2145cf3f070700feff5b54d185607399badb7a7a (diff) | |
download | bcm5719-llvm-f8ba3fd8e65d45d4f741867a5503a046a8fae8a2.tar.gz bcm5719-llvm-f8ba3fd8e65d45d4f741867a5503a046a8fae8a2.zip |
Fix assertion failure if we can't deduce a template argument for a variable
template partial specialization.
In passing, fix the deduction-crash.cpp test to actually run all the tests. Due
to a typo, the last third of the file was being skipped by the parser and some
of the tests were not actually testing anything as a result. Switch from
FileCheck to -verify to make the problem more obvious and prevent this
happening again.
llvm-svn: 304604
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaTemplateDeduction.cpp | 3 | ||||
-rw-r--r-- | clang/test/SemaTemplate/deduction-crash.cpp | 36 |
2 files changed, 21 insertions, 18 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index ebdf6dd57fc..7467ce40a88 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/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/clang/test/SemaTemplate/deduction-crash.cpp b/clang/test/SemaTemplate/deduction-crash.cpp index c94c9db94e0..74a25865aa2 100644 --- a/clang/test/SemaTemplate/deduction-crash.cpp +++ b/clang/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 *>; +} |