]> granicus.if.org Git - clang/commitdiff
Remove an overly-eager assertion when replacing tokens with an
authorDouglas Gregor <dgregor@apple.com>
Thu, 12 Nov 2009 00:03:40 +0000 (00:03 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 12 Nov 2009 00:03:40 +0000 (00:03 +0000)
annotation token, because some of the tokens we're annotating might
not be in the set of cached tokens (we could have consumed them
unconditionally).

Also, move the tentative parsing from ParseTemplateTemplateArgument
into the one caller that needs it, improving recovery.

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

lib/Lex/PPCaching.cpp
lib/Parse/ParseTemplate.cpp
test/SemaTemplate/default-arguments.cpp

index c3f0eeab584819b6b1fa15f4bcdaf250de30f0e7..7c3780ffc0ac74f6ef962763c5e78d7958851a64 100644 (file)
@@ -109,6 +109,4 @@ void Preprocessor::AnnotatePreviousCachedTokens(const Token &Tok) {
       return;
     }
   }
-
-  assert(0&&"Didn't find the first token represented by the annotation token!");
 }
index b5063ee44b60589b064181e0fede238d1ac10565..16b1c800800f1cb29bd67c5adf77b08916bf876f 100644 (file)
@@ -823,15 +823,13 @@ ParsedTemplateArgument Parser::ParseTemplateTemplateArgument() {
   //   A template-argument for a template template-parameter shall be the name
   //   of a class template or a template alias, expressed as id-expression.
   //   
-  // We perform some tentative parsing at this point, to determine whether
-  // we have an id-expression that refers to a class template or template
-  // alias. The grammar we tentatively parse is:
+  // We parse an id-expression that refers to a class template or template
+  // alias. The grammar we parse is:
   //
   //   nested-name-specifier[opt] template[opt] identifier
   //
   // followed by a token that terminates a template argument, such as ',', 
   // '>', or (in some cases) '>>'.
-  TentativeParsingAction TPA(*this);
   CXXScopeSpec SS; // nested-name-specifier, if present
   ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/0, 
                                  /*EnteringContext=*/false);
@@ -854,10 +852,8 @@ ParsedTemplateArgument Parser::ParseTemplateTemplateArgument() {
         TemplateTy Template
         = Actions.ActOnDependentTemplateName(TemplateLoc, SS, Name, 
                                              /*ObjectType=*/0);
-        if (Template.get()) {
-          TPA.Commit();
+        if (Template.get())
           return ParsedTemplateArgument(SS, Template, Name.StartLocation);
-        }
       }
     } 
   } else if (Tok.is(tok::identifier)) {
@@ -875,16 +871,12 @@ ParsedTemplateArgument Parser::ParseTemplateTemplateArgument() {
       if (TNK == TNK_Dependent_template_name || TNK == TNK_Type_template) {
         // We have an id-expression that refers to a class template or
         // (C++0x) template alias. 
-        TPA.Commit();
         return ParsedTemplateArgument(SS, Template, Name.StartLocation);
       }
     }
   }
   
-  // We don't have a template template argument; revert everything we have
-  // tentatively parsed.
-  TPA.Revert();
-  
+  // We don't have a template template argument.  
   return ParsedTemplateArgument();
 }
 
@@ -912,10 +904,19 @@ ParsedTemplateArgument Parser::ParseTemplateArgument() {
   }
   
   // Try to parse a template template argument.
-  ParsedTemplateArgument TemplateTemplateArgument
-    = ParseTemplateTemplateArgument();
-  if (!TemplateTemplateArgument.isInvalid())
-    return TemplateTemplateArgument;
+  {
+    TentativeParsingAction TPA(*this);
+
+    ParsedTemplateArgument TemplateTemplateArgument
+      = ParseTemplateTemplateArgument();
+    if (!TemplateTemplateArgument.isInvalid()) {
+      TPA.Commit();
+      return TemplateTemplateArgument;
+    }
+    
+    // Revert this tentative parse to parse a non-type template argument.
+    TPA.Revert();
+  }
   
   // Parse a non-type template argument. 
   SourceLocation Loc = Tok.getLocation();
index e082693aa52ebb78dc63fa877c5627bf3da66728..0247ddc0ef28d14f2cc7f6eafa3a4345a5357c84 100644 (file)
@@ -118,3 +118,6 @@ template<typename T,
 X6<int> x6a;
 X6<long> x6b; // expected-note{{while checking a default template argument}}
 X6<long, X5b> x6c;
+
+
+template<template<class> class X = B<int> > struct X7; // expected-error{{must be a class template}}