]> granicus.if.org Git - clang/commitdiff
Explain that a template needs arguments to make it into a type, for
authorJeffrey Yasskin <jyasskin@google.com>
Thu, 8 Apr 2010 21:04:54 +0000 (21:04 +0000)
committerJeffrey Yasskin <jyasskin@google.com>
Thu, 8 Apr 2010 21:04:54 +0000 (21:04 +0000)
variable declarations.

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

lib/Sema/SemaDecl.cpp
test/SemaTemplate/temp_arg.cpp

index 92d2f4b50c59ea6989366c0bf3d89f5b4bf9c39b..82cecc3f4d02a08fdb891b2db8e407f98192c53f 100644 (file)
@@ -275,6 +275,24 @@ bool Sema::DiagnoseUnknownTypeName(const IdentifierInfo &II,
     }
   }
 
+  if (getLangOptions().CPlusPlus) {
+    // See if II is a class template that the user forgot to pass arguments to.
+    UnqualifiedId Name;
+    Name.setIdentifier(&II, IILoc);
+    CXXScopeSpec EmptySS;
+    TemplateTy TemplateResult;
+    if (isTemplateName(S, SS ? *SS : EmptySS, Name, 0, true, TemplateResult)
+        == TNK_Type_template) {
+      TemplateName TplName = TemplateResult.getAsVal<TemplateName>();
+      Diag(IILoc, diag::err_template_missing_args) << TplName;
+      if (TemplateDecl *TplDecl = TplName.getAsTemplateDecl()) {
+        Diag(TplDecl->getLocation(), diag::note_template_decl_here)
+          << TplDecl->getTemplateParameters()->getSourceRange();
+      }
+      return true;
+    }
+  }
+
   // FIXME: Should we move the logic that tries to recover from a missing tag
   // (struct, union, enum) from Parser::ParseImplicitInt here, instead?
   
index 80bbda785d0551282a054426779a56a10dcd5539..5a4c8fc16fd6524a8e6fafe259650bbe74f57c37 100644 (file)
@@ -2,7 +2,7 @@
 template<typename T, 
          int I, 
          template<typename> class TT>
-  class A; // expected-note 2 {{template is declared here}}
+  class A; // expected-note 3 {{template is declared here}}
 
 template<typename> class X;
 
@@ -10,6 +10,7 @@ A<int, 0, X> * a1;
 
 A<float, 1, X, double> *a2; // expected-error{{too many template arguments for class template 'A'}}
 A<float, 1> *a3; // expected-error{{too few template arguments for class template 'A'}}
+A a3; // expected-error{{use of class template A requires template arguments}}
 
 namespace test0 {
   template <class t> class foo {};