From 21d53e179651657e243587b79234fe6fedfae71c Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 1 Mar 2010 23:49:23 +0000 Subject: [PATCH] When we're parsing template names as part of base-specifiers, we are *not* entering the context of the nested-name-specifier. This was causing us to look into an uninstantiated template that we shouldn't look into. Fixes PR6376. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97524 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseDeclCXX.cpp | 2 +- test/CXX/temp/temp.decls/temp.mem/p1.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index bccfc6ad62..993ec3dfd4 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -1084,7 +1084,7 @@ Parser::BaseResult Parser::ParseBaseSpecifier(DeclPtrTy ClassDecl) { // Parse optional '::' and optional nested-name-specifier. CXXScopeSpec SS; - ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/0, true); + ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/0, false); // The location of the base class itself. SourceLocation BaseLoc = Tok.getLocation(); diff --git a/test/CXX/temp/temp.decls/temp.mem/p1.cpp b/test/CXX/temp/temp.decls/temp.mem/p1.cpp index 1b9da84886..b057eedf93 100644 --- a/test/CXX/temp/temp.decls/temp.mem/p1.cpp +++ b/test/CXX/temp/temp.decls/temp.mem/p1.cpp @@ -14,3 +14,22 @@ int foo() { A::cond = true; return A::B::twice(4); } + +namespace PR6376 { + template + struct X { + template + struct Y { }; + }; + + template<> + struct X { + template + struct Y { }; + }; + + template + struct Z : public X::template Y { }; + + Z z0; +} -- 2.50.1