Author: Jialun Hu Date: 2022-10-18T21:57:32+08:00 New Revision: 94e8bd002c81ace308ddac9b66385ef932655fd3
URL: https://github.com/llvm/llvm-project/commit/94e8bd002c81ace308ddac9b66385ef932655fd3 DIFF: https://github.com/llvm/llvm-project/commit/94e8bd002c81ace308ddac9b66385ef932655fd3.diff LOG: [clang] Fix crash upon stray coloncolon token in C2x mode The parser assumes that the lexer never emits coloncolon token for C code, but this assumption no longer holds in C2x attribute namespaces. As a result, stray coloncolon tokens out of attributes cause assertion failures and hangs in release build, which this patch tries to handle. Crash input minimal example: `T n::v` Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D133248 Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Parse/Parser.h clang/lib/Parse/ParseDecl.cpp clang/lib/Parse/Parser.cpp clang/test/Parser/c2x-attributes.c Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 6eaec2a5f3e9f..9fe63dd5de840 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -251,6 +251,7 @@ Bug Fixes - Address the thread identification problems in coroutines. `Issue 47177 <https://github.com/llvm/llvm-project/issues/47177>`_ `Issue 47179 <https://github.com/llvm/llvm-project/issues/47179>`_ +- Fix a crash upon stray coloncolon token in C2x mode. Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index c518ce5487bd8..d70f36daa891f 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -866,10 +866,11 @@ class Parser : public CodeCompletionHandler { bool TryAnnotateCXXScopeToken(bool EnteringContext = false); bool MightBeCXXScopeToken() { - return Tok.is(tok::identifier) || Tok.is(tok::coloncolon) || - (Tok.is(tok::annot_template_id) && - NextToken().is(tok::coloncolon)) || - Tok.is(tok::kw_decltype) || Tok.is(tok::kw___super); + return getLangOpts().CPlusPlus && + (Tok.is(tok::identifier) || Tok.is(tok::coloncolon) || + (Tok.is(tok::annot_template_id) && + NextToken().is(tok::coloncolon)) || + Tok.is(tok::kw_decltype) || Tok.is(tok::kw___super)); } bool TryAnnotateOptionalCXXScopeToken(bool EnteringContext = false) { return MightBeCXXScopeToken() && TryAnnotateCXXScopeToken(EnteringContext); diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index ddb83a8c6694d..e15a6ffa8d689 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -5411,6 +5411,8 @@ bool Parser::isDeclarationSpecifier( return isDeclarationSpecifier(AllowImplicitTypename); case tok::coloncolon: // ::foo::bar + if (!getLangOpts().CPlusPlus) + return false; if (NextToken().is(tok::kw_new) || // ::new NextToken().is(tok::kw_delete)) // ::delete return false; diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 79528d25be21f..8fcd02146ba5c 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -2080,9 +2080,9 @@ bool Parser::TryAnnotateTypeOrScopeTokenAfterScopeSpec( } if (!getLangOpts().CPlusPlus) { - // If we're in C, we can't have :: tokens at all (the lexer won't return - // them). If the identifier is not a type, then it can't be scope either, - // just early exit. + // If we're in C, the only place we can have :: tokens is C2x + // attribute which is parsed elsewhere. If the identifier is not a type, + // then it can't be scope either, just early exit. return false; } diff --git a/clang/test/Parser/c2x-attributes.c b/clang/test/Parser/c2x-attributes.c index f8ed1eda14886..e3201e2315d2f 100644 --- a/clang/test/Parser/c2x-attributes.c +++ b/clang/test/Parser/c2x-attributes.c @@ -141,3 +141,6 @@ void test_asm(void) { struct [[]] S4 *s; // expected-error {{an attribute list cannot appear here}} struct S5 {}; int c = sizeof(struct [[]] S5); // expected-error {{an attribute list cannot appear here}} + +// Ensure that '::' outside of attributes does not crash and is not treated as scope +double n::v; // expected-error {{expected ';' after top level declarator}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits