[clang] [Clang] disallow attributes after namespace identifier (PR #121614)
Oleksandr T. via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 5 02:07:54 PST 2025
https://github.com/a-tarasyuk updated https://github.com/llvm/llvm-project/pull/121614
>From b8f6ffc0a98a0d3ac55fba4e6ee680f1edea4571 Mon Sep 17 00:00:00 2001
From: Oleksandr T <oleksandr.tarasiuk at outlook.com>
Date: Sat, 4 Jan 2025 02:24:26 +0200
Subject: [PATCH 1/2] [Clang] disallow attributes after namespace identifier
---
clang/docs/ReleaseNotes.rst | 2 ++
clang/include/clang/Basic/DiagnosticParseKinds.td | 2 ++
clang/lib/Parse/ParseDeclCXX.cpp | 9 ++++++---
clang/test/Parser/namespace-attributes.cpp | 10 +++++-----
4 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index e0aef1af2135cd..43a95fd022c070 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -553,6 +553,8 @@ Attribute Changes in Clang
- Clang now permits the usage of the placement new operator in ``[[msvc::constexpr]]``
context outside of the std namespace. (#GH74924)
+- Clang now disallows the use of attributes after the namespace name. (#GH121407)
+
Improvements to Clang's diagnostics
-----------------------------------
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 86fcae209c40db..9d76376cd6b015 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -283,6 +283,8 @@ def err_unexpected_qualified_namespace_alias : Error<
"namespace alias must be a single identifier">;
def err_unexpected_nested_namespace_attribute : Error<
"attributes cannot be specified on a nested namespace definition">;
+def err_attribute_after_namespace : Error<
+ "standard attributes cannot appear after the namespace name">;
def err_inline_namespace_alias : Error<"namespace alias cannot be inline">;
def err_namespace_nonnamespace_scope : Error<
"namespaces can only be defined in global or namespace scope">;
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index f30603feb65c5d..ec87163ffb7cee 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -81,7 +81,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context,
ParsedAttributes attrs(AttrFactory);
- auto ReadAttributes = [&] {
+ auto ReadAttributes = [&](bool TrailingAttrs) {
bool MoreToParse;
do {
MoreToParse = false;
@@ -90,6 +90,9 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context,
MoreToParse = true;
}
if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) {
+ if (TrailingAttrs)
+ Diag(Tok.getLocation(), diag::err_attribute_after_namespace);
+
Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
? diag::warn_cxx14_compat_ns_enum_attribute
: diag::ext_ns_enum_attribute)
@@ -100,7 +103,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context,
} while (MoreToParse);
};
- ReadAttributes();
+ ReadAttributes(/*TrailingAttrs*/ false);
if (Tok.is(tok::identifier)) {
Ident = Tok.getIdentifierInfo();
@@ -126,7 +129,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context,
}
}
- ReadAttributes();
+ ReadAttributes(/*TrailingAttrs*/ true);
SourceLocation attrLoc = attrs.Range.getBegin();
diff --git a/clang/test/Parser/namespace-attributes.cpp b/clang/test/Parser/namespace-attributes.cpp
index 9f925b742dfebd..8a873c55c5d633 100644
--- a/clang/test/Parser/namespace-attributes.cpp
+++ b/clang/test/Parser/namespace-attributes.cpp
@@ -16,11 +16,11 @@ namespace [[]] __attribute__(()) A
{
}
-namespace A __attribute__(()) [[]]
+namespace A __attribute__(()) [[]] // expected-error {{standard attributes cannot appear after the namespace name}}
{
}
-namespace A [[]] __attribute__(())
+namespace A [[]] __attribute__(()) // expected-error {{standard attributes cannot appear after the namespace name}}
{
}
@@ -28,14 +28,14 @@ namespace [[]] A __attribute__(())
{
}
-namespace __attribute__(()) A [[]]
+namespace __attribute__(()) A [[]] // expected-error {{standard attributes cannot appear after the namespace name}}
{
}
-namespace A::B __attribute__(()) // expected-error{{attributes cannot be specified on a nested namespace definition}}
+namespace A::B __attribute__(()) // expected-error {{attributes cannot be specified on a nested namespace definition}}
{
}
-namespace __attribute__(()) A::B // expected-error{{attributes cannot be specified on a nested namespace definition}}
+namespace __attribute__(()) A::B // expected-error {{attributes cannot be specified on a nested namespace definition}}
{
}
>From b8bf77687644c035683ae64a0a2a8e788ad74a83 Mon Sep 17 00:00:00 2001
From: Oleksandr T <oleksandr.tarasiuk at outlook.com>
Date: Sun, 5 Jan 2025 12:07:40 +0200
Subject: [PATCH 2/2] change param name from TrailingAttrs to
CheckProhibitedCXX11Attribute
---
clang/lib/Parse/ParseDeclCXX.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index ec87163ffb7cee..7b810bb66138d3 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -81,7 +81,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context,
ParsedAttributes attrs(AttrFactory);
- auto ReadAttributes = [&](bool TrailingAttrs) {
+ auto ReadAttributes = [&](bool CheckProhibitedCXX11Attribute) {
bool MoreToParse;
do {
MoreToParse = false;
@@ -90,7 +90,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context,
MoreToParse = true;
}
if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) {
- if (TrailingAttrs)
+ if (CheckProhibitedCXX11Attribute)
Diag(Tok.getLocation(), diag::err_attribute_after_namespace);
Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
@@ -103,7 +103,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context,
} while (MoreToParse);
};
- ReadAttributes(/*TrailingAttrs*/ false);
+ ReadAttributes(/*CheckProhibitedCXX11Attribute*/ false);
if (Tok.is(tok::identifier)) {
Ident = Tok.getIdentifierInfo();
@@ -129,7 +129,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context,
}
}
- ReadAttributes(/*TrailingAttrs*/ true);
+ ReadAttributes(/*CheckProhibitedCXX11Attribute*/ true);
SourceLocation attrLoc = attrs.Range.getBegin();
More information about the cfe-commits
mailing list