Fix for dependent contexts in alias templates.
authorEli Friedman <eli.friedman@gmail.com>
Thu, 15 Aug 2013 23:59:20 +0000 (23:59 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Thu, 15 Aug 2013 23:59:20 +0000 (23:59 +0000)
When we are parsing a type for an alias template, we are not entering
the context, so we can't look into dependent classes.  Make sure the
parser handles this correctly.

PR16904.

llvm-svn: 188510

clang/lib/Parse/ParseDecl.cpp
clang/test/SemaTemplate/alias-templates.cpp

index eda52a4e83a84a8dbabf5facc6f6f3869dd69803..392535acef2faebe4dc7c86a4e69612f79313ac2 100644 (file)
@@ -2436,7 +2436,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
 
     case tok::coloncolon: // ::foo::bar
       // C++ scope specifier.  Annotate and loop, or bail out on error.
-      if (TryAnnotateCXXScopeToken(true)) {
+      if (TryAnnotateCXXScopeToken(EnteringContext)) {
         if (!DS.hasTypeSpecifier())
           DS.SetTypeSpecError();
         goto DoneWithDeclSpec;
@@ -2632,7 +2632,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
       // In C++, check to see if this is a scope specifier like foo::bar::, if
       // so handle it as such.  This is important for ctor parsing.
       if (getLangOpts().CPlusPlus) {
-        if (TryAnnotateCXXScopeToken(true)) {
+        if (TryAnnotateCXXScopeToken(EnteringContext)) {
           if (!DS.hasTypeSpecifier())
             DS.SetTypeSpecError();
           goto DoneWithDeclSpec;
index eeb6b95189769264b5021bd48baf11640b4d1728..e7be184db3d6ab75f9601e7d1cf54fd209326b8f 100644 (file)
@@ -189,3 +189,15 @@ namespace PR16646 {
     }
   }
 }
+
+namespace PR16904 {
+  template <typename,typename>
+  struct base {
+    template <typename> struct derived;
+  };
+  // FIXME: The diagnostics here are terrible.
+  template <typename T, typename U, typename V>
+  using derived = base<T, U>::template derived<V>; // expected-error {{expected a type}} expected-error {{expected ';'}}
+  template <typename T, typename U, typename V>
+  using derived2 = ::PR16904::base<T, U>::template derived<V>; // expected-error {{expected a type}} expected-error {{expected ';'}}
+}