diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-03-01 23:49:23 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-03-01 23:49:23 +0000 |
commit | d29f2799b7bc8f442b165960aed1a8d91b0acf19 (patch) | |
tree | 1bbe48d2c1cc024202d5694d3528dce6b5af0db4 | |
parent | bd8d9bd39c2df594c4104c117b3b8fea555e8b2c (diff) | |
download | bcm5719-llvm-d29f2799b7bc8f442b165960aed1a8d91b0acf19.tar.gz bcm5719-llvm-d29f2799b7bc8f442b165960aed1a8d91b0acf19.zip |
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.
llvm-svn: 97524
-rw-r--r-- | clang/lib/Parse/ParseDeclCXX.cpp | 2 | ||||
-rw-r--r-- | clang/test/CXX/temp/temp.decls/temp.mem/p1.cpp | 19 |
2 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index bccfc6ad624..993ec3dfd45 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/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/clang/test/CXX/temp/temp.decls/temp.mem/p1.cpp b/clang/test/CXX/temp/temp.decls/temp.mem/p1.cpp index 1b9da84886e..b057eedf93b 100644 --- a/clang/test/CXX/temp/temp.decls/temp.mem/p1.cpp +++ b/clang/test/CXX/temp/temp.decls/temp.mem/p1.cpp @@ -14,3 +14,22 @@ int foo() { A<bool>::cond = true; return A<bool>::B<int>::twice(4); } + +namespace PR6376 { + template<typename T> + struct X { + template<typename Y> + struct Y { }; + }; + + template<> + struct X<float> { + template<typename Y> + struct Y { }; + }; + + template<typename T, typename U> + struct Z : public X<T>::template Y<U> { }; + + Z<float, int> z0; +} |