summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-09-28 07:26:33 +0000
committerDouglas Gregor <dgregor@apple.com>2009-09-28 07:26:33 +0000
commitc5790dfeb4535d417f82e724ae4013a337191c8e (patch)
treedd17a14cea4067532c5bcb9ac74c5a588bf9f506
parent0261b5d2d2f59da443196f11eb17af3aee8a4480 (diff)
downloadbcm5719-llvm-c5790dfeb4535d417f82e724ae4013a337191c8e.tar.gz
bcm5719-llvm-c5790dfeb4535d417f82e724ae4013a337191c8e.zip
Parse a C++ scope specifier followed by a "typename" annotation token as a type name within the declaration specifiers. Fixes PR5061.
llvm-svn: 82974
-rw-r--r--clang/lib/Parse/ParseDecl.cpp13
-rw-r--r--clang/test/SemaTemplate/qualified-id.cpp9
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 2dac473cc6c..d885558e1f3 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -778,6 +778,19 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
continue;
}
+ if (Next.is(tok::annot_typename)) {
+ // FIXME: is this scope-specifier getting dropped?
+ ConsumeToken(); // the scope-specifier
+ if (Tok.getAnnotationValue())
+ isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc,
+ PrevSpec, DiagID,
+ Tok.getAnnotationValue());
+ else
+ DS.SetTypeSpecError();
+ DS.SetRangeEnd(Tok.getAnnotationEndLoc());
+ ConsumeToken(); // The typename
+ }
+
if (Next.isNot(tok::identifier))
goto DoneWithDeclSpec;
diff --git a/clang/test/SemaTemplate/qualified-id.cpp b/clang/test/SemaTemplate/qualified-id.cpp
new file mode 100644
index 00000000000..85efab2b5cc
--- /dev/null
+++ b/clang/test/SemaTemplate/qualified-id.cpp
@@ -0,0 +1,9 @@
+// RUN: clang-cc -fsyntax-only -verify %s
+
+// PR5061
+namespace a {
+ template <typename T> class C {};
+}
+namespace b {
+ template<typename T> void f0(a::C<T> &a0) { }
+}
OpenPOWER on IntegriCloud