diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -4385,7 +4385,7 @@ llvm::SmallDenseMap SeenAttrs; bool AttrParsed = false; - while (!Tok.isOneOf(tok::r_square, tok::semi)) { + while (!Tok.isOneOf(tok::r_square, tok::semi, tok::eof)) { if (AttrParsed) { // If we parsed an attribute, a comma is required before parsing any // additional attributes. diff --git a/clang/test/Parser/cxx-attributes.cpp b/clang/test/Parser/cxx-attributes.cpp --- a/clang/test/Parser/cxx-attributes.cpp +++ b/clang/test/Parser/cxx-attributes.cpp @@ -42,3 +42,6 @@ [[,,maybe_unused,]] int Commas4; // ok [[foo bar]] int NoComma; // expected-error {{expected ','}} \ // expected-warning {{unknown attribute 'foo' ignored}} +// expected-error@+2 2 {{expected ']'}} +// expected-error@+1 {{expected external declaration}} +[[foo