aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-04-30 03:11:01 +0000
committerJohn McCall <rjmccall@apple.com>2010-04-30 03:11:01 +0000
commit51e2a5d45d321c53355fe038b3a3e7a2f502afa4 (patch)
tree31a351bd6637f71ed13b2c36698c54d497ff73e8
parentcf00ac81354b397d12e528cd87b06f86b3b85197 (diff)
Fix a tentative-parse error with unqualified template ids in cast expressions.
Also resolve a long-working FIXME in the test case I modified. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102688 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Parse/ParseTentative.cpp13
-rw-r--r--test/Parser/cxx-casting.cpp9
2 files changed, 19 insertions, 3 deletions
diff --git a/lib/Parse/ParseTentative.cpp b/lib/Parse/ParseTentative.cpp
index 516a9a620b..a6c6d3f945 100644
--- a/lib/Parse/ParseTentative.cpp
+++ b/lib/Parse/ParseTentative.cpp
@@ -14,6 +14,7 @@
#include "clang/Parse/Parser.h"
#include "clang/Parse/ParseDiagnostic.h"
+#include "clang/Parse/Template.h"
using namespace clang;
/// isCXXDeclarationStatement - C++-specialized function that disambiguates
@@ -761,6 +762,17 @@ Parser::TPResult Parser::isCXXDeclarationSpecifier() {
case tok::kw___vector:
return TPResult::True();
+ case tok::annot_template_id: {
+ TemplateIdAnnotation *TemplateId
+ = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue());
+ if (TemplateId->Kind != TNK_Type_template)
+ return TPResult::False();
+ CXXScopeSpec SS;
+ AnnotateTemplateIdTokenAsType(&SS);
+ assert(Tok.is(tok::annot_typename));
+ goto case_typename;
+ }
+
case tok::annot_cxxscope: // foo::bar or ::foo::bar, but already parsed
// We've already annotated a scope; try to annotate a type.
if (TryAnnotateTypeOrScopeToken())
@@ -801,6 +813,7 @@ Parser::TPResult Parser::isCXXDeclarationSpecifier() {
case tok::kw_double:
case tok::kw_void:
case tok::annot_typename:
+ case_typename:
if (NextToken().is(tok::l_paren))
return TPResult::Ambiguous();
diff --git a/test/Parser/cxx-casting.cpp b/test/Parser/cxx-casting.cpp
index c8b4716aa3..98d962ad09 100644
--- a/test/Parser/cxx-casting.cpp
+++ b/test/Parser/cxx-casting.cpp
@@ -5,8 +5,6 @@ char *const_cast_test(const char *var)
return const_cast<char*>(var);
}
-#if 0
-// FIXME: Uncomment when C++ is supported more.
struct A {
virtual ~A() {}
};
@@ -18,7 +16,6 @@ struct B *dynamic_cast_test(struct A *a)
{
return dynamic_cast<struct B*>(a);
}
-#endif
char *reinterpret_cast_test()
{
@@ -34,3 +31,9 @@ char postfix_expr_test()
{
return reinterpret_cast<char*>(0xdeadbeef)[0];
}
+
+// This was being incorrectly tentatively parsed.
+namespace test1 {
+ template <class T> class A {};
+ void foo() { A<int>(*(A<int>*)0); }
+}