Skip to content
Snippets Groups Projects
Commit e7db86dd authored by John McCall's avatar John McCall
Browse files

Fix a tentative-parse error with unqualified template ids in cast expressions.

Also resolve a long-working FIXME in the test case I modified.

llvm-svn: 102688
parent dead00f9
No related branches found
No related tags found
No related merge requests found
......@@ -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();
......
......@@ -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); }
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment