[clang] [clang] Restrict parenthesized direct initialization to C++ (PR #229034)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 5 03:13:45 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Chen Miao (ChenMiaoi)
<details>
<summary>Changes</summary>
Only recognize parenthesized direct initializers in C++ mode. This avoids an assertion when a malformed GNU attribute in C is followed by a parenthesized expression list:
```c
int a __attribute__ ) (1, 2);
```
Fixes #<!-- -->225045
---
Full diff: https://github.com/llvm/llvm-project/pull/229034.diff
2 Files Affected:
- (modified) clang/lib/Parse/ParseDecl.cpp (+1-1)
- (modified) clang/test/Parser/attributes.c (+5)
``````````diff
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 6ab03e8a7fc4a..9793cd19c6206 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -2536,7 +2536,7 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(
// If a '==' or '+=' is found, suggest a fixit to '='.
if (isTokenEqualOrEqualTypo())
TheInitKind = InitKind::Equal;
- else if (Tok.is(tok::l_paren))
+ else if (getLangOpts().CPlusPlus && Tok.is(tok::l_paren))
TheInitKind = InitKind::CXXDirect;
else if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace) &&
(!CurParsedObjCImpl || !D.isFunctionDeclarator()))
diff --git a/clang/test/Parser/attributes.c b/clang/test/Parser/attributes.c
index c73505d9f547d..a648f581cd7e6 100644
--- a/clang/test/Parser/attributes.c
+++ b/clang/test/Parser/attributes.c
@@ -116,3 +116,8 @@ __attribute__(()) struct t;
void f5() {
__attribute__(()) struct t;
}
+
+// GH225045: attribute recovery must not parse a C++ direct initializer in C.
+// expected-error at +2 {{expected '(' after 'attribute'}}
+// expected-error at +1 {{expected ';' after top level declarator}}
+int a __attribute__ ) (1, 2);
``````````
</details>
https://github.com/llvm/llvm-project/pull/229034
More information about the cfe-commits
mailing list