https://github.com/DenisGZM updated 
https://github.com/llvm/llvm-project/pull/133107

>From c46eda67cd7434dcce5c1f29125a940dc4ff64ba Mon Sep 17 00:00:00 2001
From: Denis Gerasimov <deng...@gmail.com>
Date: Wed, 26 Mar 2025 18:29:38 +0300
Subject: [PATCH 1/3] [CLANG] Enable alignas after GNU attributes

---
 clang/lib/Parse/ParseStmt.cpp          |  5 +++++
 clang/test/SemaCUDA/cuda-attr-order.cu | 15 +++++++++++++++
 2 files changed, 20 insertions(+)
 create mode 100644 clang/test/SemaCUDA/cuda-attr-order.cu

diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index 150b2879fc94f..33b9f63bcfa08 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -296,6 +296,11 @@ StmtResult 
Parser::ParseStatementOrDeclarationAfterAttributes(
     goto Retry;
   }
 
+  case tok::kw_alignas: {
+    ParseAlignmentSpecifier(CXX11Attrs);
+    goto Retry;
+  }
+
   case tok::kw_template: {
     SourceLocation DeclEnd;
     ParseTemplateDeclarationOrSpecialization(DeclaratorContext::Block, DeclEnd,
diff --git a/clang/test/SemaCUDA/cuda-attr-order.cu 
b/clang/test/SemaCUDA/cuda-attr-order.cu
new file mode 100644
index 0000000000000..d3bf5b014d1c6
--- /dev/null
+++ b/clang/test/SemaCUDA/cuda-attr-order.cu
@@ -0,0 +1,15 @@
+// Verify that we can parse a simple CUDA file with different attributes order.
+// RUN: %clang_cc1 "-triple" "nvptx-nvidia-cuda"  -fsyntax-only -verify %s
+// expected-no-diagnostics
+#include "Inputs/cuda.h"
+
+struct alignas(16) float4 {
+    float x, y, z, w;
+};
+
+__attribute__((device)) float func() {
+    __shared__ alignas(alignof(float4)) float As[4][4];  // Both combinations
+    alignas(alignof(float4)) __shared__  float Bs[4][4]; // must be legal
+
+    return As[0][0] + Bs[0][0];
+}

>From 517ba9e99f06c23ec675f5bf808b84273f5b409d Mon Sep 17 00:00:00 2001
From: Denis Gerasimov <deng...@gmail.com>
Date: Fri, 28 Mar 2025 18:27:49 +0300
Subject: [PATCH 2/3] [CLANG] Enable cxx11 attributes after gnu attributes in
 ParseCXXClassMemberDeclaration

---
 clang/lib/Parse/ParseDeclCXX.cpp                   | 7 +++++--
 clang/test/AST/ast-dump-color.cpp                  | 2 +-
 clang/test/Index/annotate-attribute.cpp            | 2 +-
 clang/test/Parser/cxx0x-attributes.cpp             | 6 ++++++
 clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 8 ++++----
 5 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 51fe0663a8d1a..42db9ceb89a2b 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -3035,10 +3035,13 @@ Parser::DeclGroupPtrTy 
Parser::ParseCXXClassMemberDeclaration(
   }
 
   ParsedAttributes DeclSpecAttrs(AttrFactory);
-  MaybeParseMicrosoftAttributes(DeclSpecAttrs);
-
   // Hold late-parsed attributes so we can attach a Decl to them later.
   LateParsedAttrList CommonLateParsedAttrs;
+  while (MaybeParseCXX11Attributes(DeclAttrs) ||
+         MaybeParseGNUAttributes(DeclSpecAttrs, &CommonLateParsedAttrs)) {
+  }
+
+  MaybeParseMicrosoftAttributes(DeclSpecAttrs);
 
   // decl-specifier-seq:
   // Parse the common declaration-specifiers piece.
diff --git a/clang/test/AST/ast-dump-color.cpp 
b/clang/test/AST/ast-dump-color.cpp
index 87797f6bffc5b..2bd9ab7c3c841 100644
--- a/clang/test/AST/ast-dump-color.cpp
+++ b/clang/test/AST/ast-dump-color.cpp
@@ -91,7 +91,7 @@ struct Invalid {
 //CHECK: {{^}}[[Blue]]|   `-[[RESET]][[MAGENTA]]DeclRefExpr[[RESET]][[Yellow]] 
0x{{[0-9a-fA-F]*}}[[RESET]] <[[Yellow]]col:40[[RESET]]> [[Green]]'class 
Mutex':'Mutex'[[RESET]][[Cyan]] lvalue[[RESET]][[Cyan]][[RESET]] 
[[GREEN]]Var[[RESET]][[Yellow]] 0x{{[0-9a-fA-F]*}}[[RESET]][[CYAN]] 
'mu1'[[RESET]] [[Green]]'class Mutex':'Mutex'[[RESET]] 
non_odr_use_unevaluated{{$}}
 //CHECK: {{^}}[[Blue]]|-[[RESET]][[GREEN]]CXXRecordDecl[[RESET]][[Yellow]] 
0x{{[0-9a-fA-F]*}}[[RESET]] <[[Yellow]]line:28:1[[RESET]], 
[[Yellow]]line:30:1[[RESET]]> [[Yellow]]line:28:8[[RESET]] struct[[CYAN]] 
Invalid[[RESET]] definition
 //CHECK: {{^}}[[Blue]]| |-[[RESET]][[GREEN]]CXXRecordDecl[[RESET]][[Yellow]] 
0x{{[0-9a-fA-F]*}}[[RESET]] <[[Yellow]]col:1[[RESET]], 
[[Yellow]]col:8[[RESET]]> [[Yellow]]col:8[[RESET]] implicit referenced 
struct[[CYAN]] Invalid[[RESET]]
-//CHECK: {{^}}[[Blue]]| 
|-[[RESET]][[GREEN]]CXXConstructorDecl[[RESET]][[Yellow]] 
0x{{[0-9a-fA-F]*}}[[RESET]] <[[Yellow]]line:29:3[[RESET]], 
[[Yellow]]col:42[[RESET]]> [[Yellow]]col:29[[RESET]] invalid[[CYAN]] 
Invalid[[RESET]] [[Green]]'void (int)'[[RESET]]
+//CHECK: {{^}}[[Blue]]| 
|-[[RESET]][[GREEN]]CXXConstructorDecl[[RESET]][[Yellow]] 
0x{{[0-9a-fA-F]*}}[[RESET]] <[[Yellow]]line:29:29[[RESET]], 
[[Yellow]]col:42[[RESET]]> [[Yellow]]col:29[[RESET]] invalid[[CYAN]] 
Invalid[[RESET]] [[Green]]'void (int)'[[RESET]]
 //CHECK: {{^}}[[Blue]]| | |-[[RESET]][[GREEN]]ParmVarDecl[[RESET]][[Yellow]] 
0x{{[0-9a-fA-F]*}}[[RESET]] <[[Yellow]]col:37[[RESET]], [[Yellow]]<invalid 
sloc>[[RESET]]> [[Yellow]]col:42[[RESET]] invalid [[Green]]'int'[[RESET]]
 //CHECK: {{^}}[[Blue]]| | `-[[RESET]][[BLUE]]NoInlineAttr[[RESET]][[Yellow]] 
0x{{[0-9a-fA-F]*}}[[RESET]] <[[Yellow]]col:18[[RESET]]>
 //CHECK: {{^}}[[Blue]]| 
|-[[RESET]][[GREEN]]CXXConstructorDecl[[RESET]][[Yellow]] 
0x{{[0-9a-fA-F]*}}[[RESET]] <[[Yellow]]line:28:8[[RESET]]> 
[[Yellow]]col:8[[RESET]] implicit used constexpr[[CYAN]] Invalid[[RESET]] 
[[Green]]'void () noexcept'[[RESET]] inline
diff --git a/clang/test/Index/annotate-attribute.cpp 
b/clang/test/Index/annotate-attribute.cpp
index bf415fc8fe64d..6b5b0f1eab7d4 100644
--- a/clang/test/Index/annotate-attribute.cpp
+++ b/clang/test/Index/annotate-attribute.cpp
@@ -24,7 +24,7 @@ int templateFunction(T value) 
__attribute__((annotate("works")));
 
 // CHECK: ClassDecl=Test:3:7 (Definition) Extent=[3:1 - 17:2]
 // CHECK-NEXT: CXXAccessSpecifier=:4:1 (Definition) Extent=[4:1 - 4:8]
-// CHECK-NEXT: CXXMethod=aMethod:5:51 Extent=[5:3 - 5:60]
+// CHECK-NEXT: CXXMethod=aMethod:5:51 Extent=[5:46 - 5:60]
 // CHECK-NEXT: attribute(annotate)=spiffy_method Extent=[5:18 - 5:43]
 // CHECK-NEXT: CXXAccessSpecifier=:7:1 (Definition) Extent=[7:1 - 7:43]
 // CHECK-NEXT: attribute(annotate)=works Extent=[7:23 - 7:40]
diff --git a/clang/test/Parser/cxx0x-attributes.cpp 
b/clang/test/Parser/cxx0x-attributes.cpp
index fad3010c98b9c..0ff5afa43b8a6 100644
--- a/clang/test/Parser/cxx0x-attributes.cpp
+++ b/clang/test/Parser/cxx0x-attributes.cpp
@@ -71,6 +71,12 @@ namespace test_misplacement {
 [[]] union union_attr2; //expected-error{{misplaced attributes}}
 [[]] enum  E2 { }; //expected-error{{misplaced attributes}}
 }
+struct S1 { __attribute__((deprecated)) alignas(16) int x; }; // expected-none
+class C1 { __attribute__((deprecated)) alignas(16) int x; }; // expected-none
+
+void fn_with_decl() {
+  __attribute__((deprecated)) alignas(16) int x; // expected-none
+}
 
 // Checks attributes placed at wrong syntactic locations of class specifiers.
 class [[]] [[]]
diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp 
b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
index ac3ca5e0c12a8..ed7821b2affe4 100644
--- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
+++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
@@ -2434,10 +2434,10 @@ class Foo {
 namespace WarnNoDecl {
 
 class Foo {
-  void foo(int a);  __attribute__(( // \
-    // expected-warning {{declaration does not declare anything}}
-    exclusive_locks_required(a))); // \
-    // expected-warning {{attribute exclusive_locks_required ignored}}
+  void foo(int a);  __attribute__((
+    exclusive_locks_required(a))); // expected-warning {{declaration does not 
declare anything}} \
+                                   // expected-warning {{attribute 
exclusive_locks_required ignored}}
+
 };
 
 } // end namespace WarnNoDecl

>From 2b0665871eb8a87f481766fd399db1dfc1af7a38 Mon Sep 17 00:00:00 2001
From: Denis Gerasimov <deng...@gmail.com>
Date: Fri, 4 Apr 2025 12:37:08 +0300
Subject: [PATCH 3/3] [CLANG] Move microsoft attrs into loop

---
 clang/include/clang/Parse/Parser.h | 5 ++++-
 clang/lib/Parse/ParseDeclCXX.cpp   | 6 +++---
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Parse/Parser.h 
b/clang/include/clang/Parse/Parser.h
index c8ceef8f8987d..fed7879ba7c8d 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -3056,13 +3056,16 @@ class Parser : public CodeCompletionHandler {
                             bool CouldBeBitField = false);
   Decl *ParseHLSLBuffer(SourceLocation &DeclEnd);
 
-  void MaybeParseMicrosoftAttributes(ParsedAttributes &Attrs) {
+  bool MaybeParseMicrosoftAttributes(ParsedAttributes &Attrs) {
+    bool AttrsParsed = false;
     if ((getLangOpts().MicrosoftExt || getLangOpts().HLSL) &&
         Tok.is(tok::l_square)) {
       ParsedAttributes AttrsWithRange(AttrFactory);
       ParseMicrosoftAttributes(AttrsWithRange);
+      AttrsParsed = AttrsWithRange.size();
       Attrs.takeAllFrom(AttrsWithRange);
     }
+    return AttrsParsed;
   }
   void ParseMicrosoftUuidAttributeArgs(ParsedAttributes &Attrs);
   void ParseMicrosoftAttributes(ParsedAttributes &Attrs);
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 42db9ceb89a2b..b46c1411ed777 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -3037,12 +3037,12 @@ Parser::DeclGroupPtrTy 
Parser::ParseCXXClassMemberDeclaration(
   ParsedAttributes DeclSpecAttrs(AttrFactory);
   // Hold late-parsed attributes so we can attach a Decl to them later.
   LateParsedAttrList CommonLateParsedAttrs;
+
   while (MaybeParseCXX11Attributes(DeclAttrs) ||
-         MaybeParseGNUAttributes(DeclSpecAttrs, &CommonLateParsedAttrs)) {
+         MaybeParseGNUAttributes(DeclSpecAttrs, &CommonLateParsedAttrs) ||
+         MaybeParseMicrosoftAttributes(DeclSpecAttrs)) {
   }
 
-  MaybeParseMicrosoftAttributes(DeclSpecAttrs);
-
   // decl-specifier-seq:
   // Parse the common declaration-specifiers piece.
   ParsingDeclSpec DS(*this, TemplateDiags);

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to