]> granicus.if.org Git - clang/commitdiff
Address more comments from Doug.
authorAnders Carlsson <andersca@mac.com>
Fri, 12 Jun 2009 23:09:56 +0000 (23:09 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 12 Jun 2009 23:09:56 +0000 (23:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73267 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseTemplate.cpp
test/SemaTemplate/variadic-unsupported.cpp [new file with mode: 0644]

index 81afac9a602e088369262653a7d490f5fe396a33..b681b7d27168c405fc5f9d48087f92e448ab655e 100644 (file)
@@ -256,6 +256,9 @@ def err_typename_refers_to_non_type_template : Error<
 def err_expected_type_name_after_typename : Error<
   "expected an identifier or template-id after '::'">;
 
+def err_variadic_templates : Error<
+  "variadic templates are only allowed in C++0x">;
+
 // Language specific pragmas
 // - Generic warnings
 def warn_pragma_expected_lparen : Warning<
index 30924b217f2b527b5e3e4d42f5655030fd885c62..a9f75d8be17da97e328215ad9c52e0b6de07700f 100644 (file)
@@ -290,11 +290,11 @@ Parser::ParseTemplateParameterList(unsigned Depth,
 ///         parameter-declaration
 ///
 ///       type-parameter: (see below)
-///         'class' ...[opt] identifier[opt]
+///         'class' ...[opt][C++0x] identifier[opt]
 ///         'class' identifier[opt] '=' type-id
-///         'typename' ...[opt] identifier[opt]
+///         'typename' ...[opt][C++0x] identifier[opt]
 ///         'typename' identifier[opt] '=' type-id
-///         'template' ...[opt] '<' template-parameter-list '>' 'class' identifier[opt]
+///         'template' ...[opt][C++0x] '<' template-parameter-list '>' 'class' identifier[opt]
 ///         'template' '<' template-parameter-list '>' 'class' identifier[opt] = id-expression
 Parser::DeclPtrTy 
 Parser::ParseTemplateParameter(unsigned Depth, unsigned Position) {
@@ -319,9 +319,9 @@ Parser::ParseTemplateParameter(unsigned Depth, unsigned Position) {
 /// ParseTemplateTemplateParameter and ParseNonTypeTemplateParameter.
 ///
 ///       type-parameter:     [C++ temp.param]
-///         'class' ...[opt] identifier[opt]
+///         'class' ...[opt][C++0x] identifier[opt]
 ///         'class' identifier[opt] '=' type-id
-///         'typename' ...[opt] identifier[opt]
+///         'typename' ...[opt][C++0x] identifier[opt]
 ///         'typename' identifier[opt] '=' type-id
 Parser::DeclPtrTy Parser::ParseTypeParameter(unsigned Depth, unsigned Position){
   assert((Tok.is(tok::kw_class) || Tok.is(tok::kw_typename)) &&
@@ -334,9 +334,12 @@ Parser::DeclPtrTy Parser::ParseTypeParameter(unsigned Depth, unsigned Position){
   // Grab the ellipsis (if given).
   bool Ellipsis = false;
   SourceLocation EllipsisLoc;
-  if (getLang().CPlusPlus0x && Tok.is(tok::ellipsis)) {
+  if (Tok.is(tok::ellipsis)) {
     Ellipsis = true;
     EllipsisLoc = ConsumeToken();
+    
+    if (!getLang().CPlusPlus0x) 
+      Diag(EllipsisLoc, diag::err_variadic_templates);
   }
   
   // Grab the template parameter name (if given)
diff --git a/test/SemaTemplate/variadic-unsupported.cpp b/test/SemaTemplate/variadic-unsupported.cpp
new file mode 100644 (file)
index 0000000..98f217c
--- /dev/null
@@ -0,0 +1,5 @@
+// RUN: clang-cc -fsyntax-only -verify %s
+
+// Type parameter packs.
+template <typename ... > struct T1 {}; // expected-error{{variadic templates are only allowed in C++0x}}
+