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/2] [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/2] [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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits