[clang] [clang] Improve `_Alignas` on a `struct` declaration diagnostic (PR #65638)
Jerin Philip via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 16 23:42:33 PDT 2023
https://github.com/jerinphilip updated https://github.com/llvm/llvm-project/pull/65638
>From 941af68ab8dad68ed8df65f6e0559476f137bfe2 Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Sat, 19 Aug 2023 16:43:53 +0530
Subject: [PATCH 01/10] Fix `Form` to recognize `_Alignas` in addition to
`alignas`
---
clang/include/clang/Basic/AttributeCommonInfo.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/include/clang/Basic/AttributeCommonInfo.h b/clang/include/clang/Basic/AttributeCommonInfo.h
index e57adc4bf5b99a2..36f4eb885cf12f8 100644
--- a/clang/include/clang/Basic/AttributeCommonInfo.h
+++ b/clang/include/clang/Basic/AttributeCommonInfo.h
@@ -94,7 +94,7 @@ class AttributeCommonInfo {
IsRegularKeywordAttribute(IsRegularKeywordAttribute) {}
constexpr Form(tok::TokenKind Tok)
: SyntaxUsed(AS_Keyword), SpellingIndex(SpellingNotCalculated),
- IsAlignas(Tok == tok::kw_alignas),
+ IsAlignas(Tok == tok::kw_alignas || Tok == tok::kw__Alignas),
IsRegularKeywordAttribute(tok::isRegularKeywordAttribute(Tok)) {}
Syntax getSyntax() const { return Syntax(SyntaxUsed); }
>From 8c0bfe350dfa2d4d24988eb544f5c1a9eb1aec6d Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Thu, 7 Sep 2023 18:53:57 +0530
Subject: [PATCH 02/10] Avoid mixing `isCXX11Attribute` with `isAlignAs`
---
clang/include/clang/Basic/AttributeCommonInfo.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/Basic/AttributeCommonInfo.h b/clang/include/clang/Basic/AttributeCommonInfo.h
index 36f4eb885cf12f8..669227589dfacd5 100644
--- a/clang/include/clang/Basic/AttributeCommonInfo.h
+++ b/clang/include/clang/Basic/AttributeCommonInfo.h
@@ -186,14 +186,14 @@ class AttributeCommonInfo {
bool isGNUScope() const;
bool isClangScope() const;
- bool isCXX11Attribute() const { return SyntaxUsed == AS_CXX11 || IsAlignas; }
+ bool isCXX11Attribute() const { return SyntaxUsed == AS_CXX11; }
bool isC23Attribute() const { return SyntaxUsed == AS_C23; }
/// The attribute is spelled [[]] in either C or C++ mode, including standard
/// attributes spelled with a keyword, like alignas.
bool isStandardAttributeSyntax() const {
- return isCXX11Attribute() || isC23Attribute();
+ return isCXX11Attribute() || isC23Attribute() || IsAlignas;
}
bool isGNUAttribute() const { return SyntaxUsed == AS_GNU; }
>From 8f699d5dfe62b2a1eb1f67f37ffa3d4ba1f2bfce Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Thu, 7 Sep 2023 19:15:03 +0530
Subject: [PATCH 03/10] Fix diagnostic warning post `isAlignAs` decoupling
---
clang/include/clang/Basic/AttributeCommonInfo.h | 2 +-
clang/lib/Parse/ParseDecl.cpp | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/clang/include/clang/Basic/AttributeCommonInfo.h b/clang/include/clang/Basic/AttributeCommonInfo.h
index 669227589dfacd5..f1e3325d44f0e1a 100644
--- a/clang/include/clang/Basic/AttributeCommonInfo.h
+++ b/clang/include/clang/Basic/AttributeCommonInfo.h
@@ -186,8 +186,8 @@ class AttributeCommonInfo {
bool isGNUScope() const;
bool isClangScope() const;
+ bool isAlignas() const { return IsAlignas; }
bool isCXX11Attribute() const { return SyntaxUsed == AS_CXX11; }
-
bool isC23Attribute() const { return SyntaxUsed == AS_C23; }
/// The attribute is spelled [[]] in either C or C++ mode, including standard
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 4a9f2caf654713e..f91141f7cd39cbf 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -3405,8 +3405,8 @@ void Parser::ParseDeclarationSpecifiers(
else {
// Reject C++11 / C23 attributes that aren't type attributes.
for (const ParsedAttr &PA : attrs) {
- if (!PA.isCXX11Attribute() && !PA.isC23Attribute() &&
- !PA.isRegularKeywordAttribute())
+ if (!PA.isAlignas() && !PA.isCXX11Attribute() &&
+ !PA.isC23Attribute() && !PA.isRegularKeywordAttribute())
continue;
if (PA.getKind() == ParsedAttr::UnknownAttribute)
// We will warn about the unknown attribute elsewhere (in
>From e7ddd755f1a873421809a05a4d5d999b7a15f62e Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Sat, 19 Aug 2023 16:44:51 +0530
Subject: [PATCH 04/10] Add attribute-ignored diagnostic warning variant
---
clang/include/clang/Basic/DiagnosticSemaKinds.td | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 0ac4df8edb242f6..f76f872a98288f7 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -3491,10 +3491,14 @@ def err_attribute_invalid_on_decl : Error<
def warn_type_attribute_deprecated_on_decl : Warning<
"applying attribute %0 to a declaration is deprecated; apply it to the type instead">,
InGroup<DeprecatedAttributes>;
-def warn_declspec_attribute_ignored : Warning<
+def warn_declspec_attribute_ignored_place_after : Warning<
"attribute %0 is ignored, place it after "
"\"%select{class|struct|interface|union|enum|enum class|enum struct}1\" to apply attribute to "
"type declaration">, InGroup<IgnoredAttributes>;
+def warn_declspec_attribute_ignored : Warning<
+ "attribute %0 before "
+ "\"%select{class|struct|interface|union|enum|enum class|enum struct}1\" "
+ "is ignored">, InGroup<IgnoredAttributes>;
def err_declspec_keyword_has_no_effect : Error<
"%0 cannot appear here, place it after "
"\"%select{class|struct|interface|union|enum}1\" to apply it to the "
>From ca03b9efbd0eaec1904656ce16f2d47915a26f17 Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Wed, 16 Aug 2023 16:09:52 +0530
Subject: [PATCH 05/10] Fix diagnostic emission for C Alignas
---
clang/lib/Sema/SemaDecl.cpp | 28 ++++++++++++++++++----------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index d94366dac102a2a..97d74b413d3f911 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -27,6 +27,7 @@
#include "clang/AST/Randstruct.h"
#include "clang/AST/StmtCXX.h"
#include "clang/Basic/Builtins.h"
+#include "clang/Basic/DiagnosticSema.h"
#include "clang/Basic/HLSLRuntime.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/SourceManager.h"
@@ -5339,16 +5340,23 @@ Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS,
TypeSpecType == DeclSpec::TST_interface ||
TypeSpecType == DeclSpec::TST_union ||
TypeSpecType == DeclSpec::TST_enum) {
- for (const ParsedAttr &AL : DS.getAttributes())
- Diag(AL.getLoc(), AL.isRegularKeywordAttribute()
- ? diag::err_declspec_keyword_has_no_effect
- : diag::warn_declspec_attribute_ignored)
- << AL << GetDiagnosticTypeSpecifierID(DS);
- for (const ParsedAttr &AL : DeclAttrs)
- Diag(AL.getLoc(), AL.isRegularKeywordAttribute()
- ? diag::err_declspec_keyword_has_no_effect
- : diag::warn_declspec_attribute_ignored)
- << AL << GetDiagnosticTypeSpecifierID(DS);
+
+ auto EmitAttributeDiagnostic = [this, &DS](const ParsedAttr &AL) {
+ if (AL.isAlignas() && !getLangOpts().CPlusPlus) {
+ Diag(AL.getLoc(), diag::warn_declspec_attribute_ignored)
+ << AL << GetDiagnosticTypeSpecifierID(DS);
+
+ } else {
+ Diag(AL.getLoc(),
+ AL.isRegularKeywordAttribute()
+ ? diag::err_declspec_keyword_has_no_effect
+ : diag::warn_declspec_attribute_ignored_place_after)
+ << AL << GetDiagnosticTypeSpecifierID(DS);
+ }
+ };
+
+ llvm::for_each(DS.getAttributes(), EmitAttributeDiagnostic);
+ llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
}
}
>From 1c1d4c60ee6cf4349b6ff0aa41a11603022aa425 Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Thu, 7 Sep 2023 20:06:40 +0530
Subject: [PATCH 06/10] Fix test for C files
---
clang/test/C/drs/dr4xx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/test/C/drs/dr4xx.c b/clang/test/C/drs/dr4xx.c
index b8ccceaad12c59f..0e25952be26f50d 100644
--- a/clang/test/C/drs/dr4xx.c
+++ b/clang/test/C/drs/dr4xx.c
@@ -168,7 +168,7 @@ void dr444(void) {
* where the diagnostic recommends causes a different, more inscrutable error
* about anonymous structures.
*/
- _Alignas(int) struct T { /* expected-warning {{attribute '_Alignas' is ignored, place it after "struct" to apply attribute to type declaration}} */
+ _Alignas(int) struct T { /* expected-warning {{attribute '_Alignas' before "struct" is ignored}} */
int i;
};
>From bc968c4c16c1b309e06df457b4c546956b06e6f6 Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Mon, 16 Oct 2023 12:41:50 +0530
Subject: [PATCH 07/10] Remove accidental header inclusion
---
clang/lib/Sema/SemaDecl.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 97d74b413d3f911..5ed2073eea3d6d7 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -27,7 +27,6 @@
#include "clang/AST/Randstruct.h"
#include "clang/AST/StmtCXX.h"
#include "clang/Basic/Builtins.h"
-#include "clang/Basic/DiagnosticSema.h"
#include "clang/Basic/HLSLRuntime.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/SourceManager.h"
>From e45c9534cae9bc94e2d3aa1dc0abb4c1ffde42d2 Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Mon, 16 Oct 2023 22:01:19 +0530
Subject: [PATCH 08/10] Simplify DiagnosticId extraction and printing
---
clang/lib/Sema/SemaDecl.cpp | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 5ed2073eea3d6d7..9f5aebe5a0fb37f 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -5341,17 +5341,18 @@ Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS,
TypeSpecType == DeclSpec::TST_enum) {
auto EmitAttributeDiagnostic = [this, &DS](const ParsedAttr &AL) {
+ unsigned DiagnosticId;
if (AL.isAlignas() && !getLangOpts().CPlusPlus) {
- Diag(AL.getLoc(), diag::warn_declspec_attribute_ignored)
- << AL << GetDiagnosticTypeSpecifierID(DS);
-
+ // Don't use the message with placement with _Alignas.
+ // This is because C doesnt let you use _Alignas on type declarations.
+ DiagnosticId = diag::warn_declspec_attribute_ignored;
+ } else if (AL.isRegularKeywordAttribute()) {
+ DiagnosticId = diag::err_declspec_keyword_has_no_effect;
} else {
- Diag(AL.getLoc(),
- AL.isRegularKeywordAttribute()
- ? diag::err_declspec_keyword_has_no_effect
- : diag::warn_declspec_attribute_ignored_place_after)
- << AL << GetDiagnosticTypeSpecifierID(DS);
+ DiagnosticId = diag::warn_declspec_attribute_ignored_place_after;
}
+ Diag(AL.getLoc(), DiagnosticId)
+ << AL << GetDiagnosticTypeSpecifierID(DS);
};
llvm::for_each(DS.getAttributes(), EmitAttributeDiagnostic);
>From eb5523dfd4c38e14568b4a3137352a1211c7db0e Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Tue, 17 Oct 2023 00:16:52 +0530
Subject: [PATCH 09/10] Add more tests: cxx0x, c1x-alignas
---
clang/test/Parser/c1x-alignas.c | 1 +
clang/test/Parser/cxx0x-attributes.cpp | 2 ++
2 files changed, 3 insertions(+)
diff --git a/clang/test/Parser/c1x-alignas.c b/clang/test/Parser/c1x-alignas.c
index 8f3d9bdb62d477a..76ad9873c37e224 100644
--- a/clang/test/Parser/c1x-alignas.c
+++ b/clang/test/Parser/c1x-alignas.c
@@ -9,5 +9,6 @@ char c4 _Alignas(32); // expected-error {{expected ';' after top level declarato
char _Alignas(_Alignof(int)) c5;
+_Alignas(int) struct c6; // expected-warning {{attribute '_Alignas' before "struct" is ignored}}
// CHECK-EXT: '_Alignas' is a C11 extension
// CHECK-EXT: '_Alignof' is a C11 extension
diff --git a/clang/test/Parser/cxx0x-attributes.cpp b/clang/test/Parser/cxx0x-attributes.cpp
index 10c5bbcac10227b..fad3010c98b9c28 100644
--- a/clang/test/Parser/cxx0x-attributes.cpp
+++ b/clang/test/Parser/cxx0x-attributes.cpp
@@ -451,3 +451,5 @@ namespace P2361 {
// expected-warning {{use of the 'deprecated' attribute is a C++14 extension}}
[[nodiscard("\123")]] int b(); // expected-error{{invalid escape sequence '\123' in an unevaluated string literal}}
}
+
+alignas(int) struct AlignAsAttribute {}; // expected-error {{misplaced attributes; expected attributes here}}
>From f8a294e095ee12762a0ac877670212ee6a6eb96c Mon Sep 17 00:00:00 2001
From: Jerin Philip <jerinphilip at live.in>
Date: Tue, 17 Oct 2023 01:07:02 +0530
Subject: [PATCH 10/10] Add c2x-alignas tests
---
clang/test/Parser/c2x-alignas.c | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 clang/test/Parser/c2x-alignas.c
diff --git a/clang/test/Parser/c2x-alignas.c b/clang/test/Parser/c2x-alignas.c
new file mode 100644
index 000000000000000..447afa28dd682be
--- /dev/null
+++ b/clang/test/Parser/c2x-alignas.c
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -std=c23 -fsyntax-only -verify %s
+// RUN: not %clang_cc1 -std=c99 -pedantic -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-EXT %s
+
+_Alignas(int) struct c1; // expected-warning {{attribute '_Alignas' before "struct" is ignored}}
+alignas(int) struct c1; // expected-warning {{attribute 'alignas' before "struct" is ignored}}
More information about the cfe-commits
mailing list