[clang] [Clang] disallow # operators in attribute argument lists (PR #147308)
Oleksandr T. via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 8 01:54:28 PDT 2025
https://github.com/a-tarasyuk updated https://github.com/llvm/llvm-project/pull/147308
>From 8f1c383f8f84fb636af4a78e0ff504830f9272f5 Mon Sep 17 00:00:00 2001
From: Oleksandr Tarasiuk <oleksandr.tarasiuk at outlook.com>
Date: Mon, 7 Jul 2025 17:20:48 +0300
Subject: [PATCH 1/3] [Clang] disallow operator in attribute argument lists
---
clang/docs/ReleaseNotes.rst | 1 +
clang/include/clang/Basic/DiagnosticParseKinds.td | 2 ++
clang/lib/Parse/ParseDecl.cpp | 7 +++++++
clang/test/Parser/cxx0x-attributes.cpp | 5 +++++
4 files changed, 15 insertions(+)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index a6be59f1d6bd7..b8032ee9c03da 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -673,6 +673,7 @@ Improvements to Clang's diagnostics
false positives in exception-heavy code, though only simple patterns
are currently recognized.
+- Clang now rejects ``#`` operators in attribute argument lists. (#GH147217)
Improvements to Clang's time-trace
----------------------------------
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 6c30da376dafb..b39e2a7359c22 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -830,6 +830,8 @@ def err_ms_property_expected_comma_or_rparen : Error<
"expected ',' or ')' at end of property accessor list">;
def err_ms_property_initializer : Error<
"property declaration cannot have a default member initializer">;
+def err_invalid_attribute_argument
+ : Error<"'%0' is not allowed in attribute argument lists">;
def err_assume_attr_expects_cond_expr : Error<
"use of this expression in an %0 attribute requires parentheses">;
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 7e739e09b15e8..059636653723c 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -488,6 +488,13 @@ unsigned Parser::ParseAttributeArgsCommon(
bool AttributeHasVariadicIdentifierArg =
attributeHasVariadicIdentifierArg(*AttrName, Form.getSyntax(), ScopeName);
+ if (Tok.is(tok::hash) || Tok.is(tok::hashhash)) {
+ Diag(Tok.getLocation(), diag::err_invalid_attribute_argument)
+ << PP.getSpelling(Tok);
+ SkipUntil(tok::r_paren, StopAtSemi);
+ return 0;
+ }
+
// Interpret "kw_this" as an identifier if the attributed requests it.
if (ChangeKWThisToIdent && Tok.is(tok::kw_this))
Tok.setKind(tok::identifier);
diff --git a/clang/test/Parser/cxx0x-attributes.cpp b/clang/test/Parser/cxx0x-attributes.cpp
index 372a373a49ec5..d343cd4f3a93e 100644
--- a/clang/test/Parser/cxx0x-attributes.cpp
+++ b/clang/test/Parser/cxx0x-attributes.cpp
@@ -477,3 +477,8 @@ namespace P2361 {
}
alignas(int) struct AlignAsAttribute {}; // expected-error {{misplaced attributes; expected attributes here}}
+
+namespace GH147217 {
+ [[clang::annotate(#)]] void a(); // expected-error {{'#' is not allowed in attribute argument lists}}
+ [[clang::annotate(##)]] void b(); // expected-error {{'##' is not allowed in attribute argument lists}}
+}
>From 962f703e11a25f6ddf9b0ba5ac045456d5167242 Mon Sep 17 00:00:00 2001
From: Oleksandr Tarasiuk <oleksandr.tarasiuk at outlook.com>
Date: Mon, 7 Jul 2025 18:49:55 +0300
Subject: [PATCH 2/3] update diagnostic message
---
clang/include/clang/Basic/DiagnosticParseKinds.td | 2 +-
clang/test/Parser/cxx0x-attributes.cpp | 6 ++++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index b39e2a7359c22..d53ef7a93bfda 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -831,7 +831,7 @@ def err_ms_property_expected_comma_or_rparen : Error<
def err_ms_property_initializer : Error<
"property declaration cannot have a default member initializer">;
def err_invalid_attribute_argument
- : Error<"'%0' is not allowed in attribute argument lists">;
+ : Error<"'%0' is not allowed in an attribute argument list">;
def err_assume_attr_expects_cond_expr : Error<
"use of this expression in an %0 attribute requires parentheses">;
diff --git a/clang/test/Parser/cxx0x-attributes.cpp b/clang/test/Parser/cxx0x-attributes.cpp
index d343cd4f3a93e..f5a3039c4470c 100644
--- a/clang/test/Parser/cxx0x-attributes.cpp
+++ b/clang/test/Parser/cxx0x-attributes.cpp
@@ -479,6 +479,8 @@ namespace P2361 {
alignas(int) struct AlignAsAttribute {}; // expected-error {{misplaced attributes; expected attributes here}}
namespace GH147217 {
- [[clang::annotate(#)]] void a(); // expected-error {{'#' is not allowed in attribute argument lists}}
- [[clang::annotate(##)]] void b(); // expected-error {{'##' is not allowed in attribute argument lists}}
+ [[clang::annotate(#)]] void a(); // expected-error {{'#' is not allowed in an attribute argument list}}
+ [[clang::annotate(##)]] void b(); // expected-error {{'##' is not allowed in an attribute argument list}}
+ [[clang::annotate(%:)]] void c(); // expected-error {{'%:' is not allowed in an attribute argument list}}
+ [[clang::annotate(%:%:)]] void d(); // expected-error {{'%:%:' is not allowed in an attribute argument list}}
}
>From a697990d1fc6aa021c4b63bc0b3ad1efe55cec5b Mon Sep 17 00:00:00 2001
From: Oleksandr Tarasiuk <oleksandr.tarasiuk at outlook.com>
Date: Mon, 7 Jul 2025 18:51:30 +0300
Subject: [PATCH 3/3] disallow and operators in C++ mode only
---
clang/lib/Parse/ParseDecl.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 059636653723c..495aa778b0d7f 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -488,7 +488,7 @@ unsigned Parser::ParseAttributeArgsCommon(
bool AttributeHasVariadicIdentifierArg =
attributeHasVariadicIdentifierArg(*AttrName, Form.getSyntax(), ScopeName);
- if (Tok.is(tok::hash) || Tok.is(tok::hashhash)) {
+ if (getLangOpts().CPlusPlus && Tok.isOneOf(tok::hash, tok::hashhash)) {
Diag(Tok.getLocation(), diag::err_invalid_attribute_argument)
<< PP.getSpelling(Tok);
SkipUntil(tok::r_paren, StopAtSemi);
More information about the cfe-commits
mailing list