diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-10-13 22:12:28 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-10-13 22:12:28 +0000 |
| commit | f39720b26e8dc6c36df0860529fc850573a2cbd7 (patch) | |
| tree | 4362be7d800f86ee8bf6fd56f5c09ccb2cefe6fd | |
| parent | 5357df6290e7049c2130d4e36dcd37d6f78f0018 (diff) | |
| download | bcm5719-llvm-f39720b26e8dc6c36df0860529fc850573a2cbd7.tar.gz bcm5719-llvm-f39720b26e8dc6c36df0860529fc850573a2cbd7.zip | |
Don't get confused by a virt-specifier after a trailing-return-type - it's not
an accidentally-included name for the declarator.
llvm-svn: 192559
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 15 | ||||
| -rw-r--r-- | clang/test/Parser/cxx0x-decl.cpp | 15 |
2 files changed, 25 insertions, 5 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index b71cced3536..31349ce9946 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -4740,11 +4740,16 @@ void Parser::ParseDirectDeclarator(Declarator &D) { ConsumeToken(); goto PastIdentifier; } else if (Tok.is(tok::identifier) && D.diagnoseIdentifier()) { - Diag(Tok.getLocation(), diag::err_unexpected_unqualified_id) - << FixItHint::CreateRemoval(Tok.getLocation()); - D.SetIdentifier(0, Tok.getLocation()); - ConsumeToken(); - goto PastIdentifier; + // A virt-specifier isn't treated as an identifier if it appears after a + // trailing-return-type. + if (D.getContext() != Declarator::TrailingReturnContext || + !isCXX11VirtSpecifier(Tok)) { + Diag(Tok.getLocation(), diag::err_unexpected_unqualified_id) + << FixItHint::CreateRemoval(Tok.getLocation()); + D.SetIdentifier(0, Tok.getLocation()); + ConsumeToken(); + goto PastIdentifier; + } } if (Tok.is(tok::l_paren)) { diff --git a/clang/test/Parser/cxx0x-decl.cpp b/clang/test/Parser/cxx0x-decl.cpp index 3d04bfe8160..961896d8fc8 100644 --- a/clang/test/Parser/cxx0x-decl.cpp +++ b/clang/test/Parser/cxx0x-decl.cpp @@ -80,3 +80,18 @@ namespace PR5066 { auto f() -> int (*f)(); // expected-error {{type-id cannot have a name}} auto g = []() -> int (*f)() {}; // expected-error {{type-id cannot have a name}} } + +namespace FinalOverride { + struct Base { + virtual void *f(); + virtual void *g(); + virtual void *h(); + virtual void *i(); + }; + struct Derived : Base { + virtual auto f() -> void *final; + virtual auto g() -> void *override; + virtual auto h() -> void *final override; + virtual auto i() -> void *override final; + }; +} |

