summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-03-01 23:49:23 +0000
committerDouglas Gregor <dgregor@apple.com>2010-03-01 23:49:23 +0000
commitd29f2799b7bc8f442b165960aed1a8d91b0acf19 (patch)
tree1bbe48d2c1cc024202d5694d3528dce6b5af0db4
parentbd8d9bd39c2df594c4104c117b3b8fea555e8b2c (diff)
downloadbcm5719-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.cpp2
-rw-r--r--clang/test/CXX/temp/temp.decls/temp.mem/p1.cpp19
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;
+}
OpenPOWER on IntegriCloud