]> granicus.if.org Git - clang/commitdiff
Fix assertion failure if we can't deduce a template argument for a variable
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 2 Jun 2017 22:53:06 +0000 (22:53 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 2 Jun 2017 22:53:06 +0000 (22:53 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@304604 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplateDeduction.cpp
test/SemaTemplate/deduction-crash.cpp

index ebdf6dd57fc545965e1710bdb826a9248093bcfe..7467ce40a88e0036e7184440f6a04ec570ee2521 100644 (file)
@@ -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;
     }
 
index c94c9db94e06439f3a88bcfca222cfb517e8b7dc..74a25865aa20710c21091d93f54548a29e184d4a 100644 (file)
@@ -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 *>;
+}