diff options
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 11 | ||||
| -rw-r--r-- | clang/test/Parser/cxx-decl.cpp | 15 |
2 files changed, 24 insertions, 2 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 5d47d3d9b80..48a30a15b1b 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -4779,8 +4779,15 @@ void Parser::ParseDirectDeclarator(Declarator &D) { else if (getLangOpts().CPlusPlus) { if (Tok.is(tok::period) || Tok.is(tok::arrow)) Diag(Tok, diag::err_invalid_operator_on_type) << Tok.is(tok::arrow); - else - Diag(Tok, diag::err_expected_unqualified_id) << getLangOpts().CPlusPlus; + else { + SourceLocation Loc = D.getCXXScopeSpec().getEndLoc(); + if (Tok.isAtStartOfLine() && Loc.isValid()) + Diag(PP.getLocForEndOfToken(Loc), diag::err_expected_unqualified_id) + << getLangOpts().CPlusPlus; + else + Diag(Tok, diag::err_expected_unqualified_id) + << getLangOpts().CPlusPlus; + } } else Diag(Tok, diag::err_expected_ident_lparen); D.SetIdentifier(0, Tok.getLocation()); diff --git a/clang/test/Parser/cxx-decl.cpp b/clang/test/Parser/cxx-decl.cpp index e3f3957d564..281e33b20f8 100644 --- a/clang/test/Parser/cxx-decl.cpp +++ b/clang/test/Parser/cxx-decl.cpp @@ -187,6 +187,21 @@ namespace PR15017 { // Ensure we produce at least some diagnostic for attributes in C++98. [[]] struct S; // expected-error 2{{}} +namespace test7 { + struct Foo { + void a(); + void b(); + }; + + void Foo:: + // Comment! + a() {} + + + void Foo:: // expected-error {{expected unqualified-id}} + // Comment! +} + namespace PR5066 { template<typename T> struct X {}; X<int N> x; // expected-error {{type-id cannot have a name}} |

