https://github.com/akash-manna-sky updated https://github.com/llvm/llvm-project/pull/216348
>From 09077e2b96e01e7a0bc93318991b9c9557c1989e Mon Sep 17 00:00:00 2001 From: Akash Manna <[email protected]> Date: Fri, 14 Aug 2026 21:44:45 +0530 Subject: [PATCH 1/5] [clang][Sema] Fix crash on address_space attribute written after the declarator-id --- clang/docs/ReleaseNotes.md | 4 ++++ clang/lib/Sema/SemaType.cpp | 24 ++++++++++++------- .../SemaTemplate/address_space-dependent.cpp | 14 +++++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index 16911cf384ea3..3647cfe20af91 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -441,6 +441,10 @@ features cannot lower the translation-unit ABI level; `sized_by_or_null` describe the size in bytes rather than a count of elements, they are now correctly accepted on such pointers. +- Fixed a crash when an `address_space` attribute with a dependent argument was + written after the declarator-id, where it appertains to the declared entity + rather than to a declarator chunk. (#GH196982) + #### Bug Fixes to C++ Support - Fixed an issue where `__typeof__` incorrectly rejected cv-qualified function types. diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 42ef93b98aa0a..da848d6431004 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6343,11 +6343,20 @@ namespace { }; } // end anonymous namespace -static void -fillDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc DASTL, - const ParsedAttributesView &Attrs) { - for (const ParsedAttr &AL : Attrs) { - if (AL.getKind() == ParsedAttr::AT_AddressSpace) { +static void fillDependentAddressSpaceTypeLoc(ASTContext &Context, + DependentAddressSpaceTypeLoc DASTL, + const Declarator &D, + const DeclaratorChunk &Chunk) { + // An attribute written after the declarator-id appertains to the declared + // entity, so it is applied to the outermost type instead of to the chunk + // that is being visited. + const ParsedAttributesView *AttrLists[] = {&Chunk.getAttrs(), + &D.getAttributes()}; + for (const ParsedAttributesView *Attrs : AttrLists) { + for (const ParsedAttr &AL : *Attrs) { + if (AL.getKind() != ParsedAttr::AT_AddressSpace || AL.getNumArgs() != 1 || + !AL.isArgExpr(0)) + continue; DASTL.setAttrNameLoc(AL.getLoc()); DASTL.setAttrExprOperand(AL.getArgAsExpr(0)); DASTL.setAttrOperandParensRange(SourceRange()); @@ -6355,8 +6364,7 @@ fillDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc DASTL, } } - llvm_unreachable( - "no address_space attribute found at the expected location!"); + DASTL.initializeLocal(Context, DASTL.getTypePtr()->getAttributeLoc()); } /// Create and instantiate a TypeSourceInfo with type source information. @@ -6422,7 +6430,7 @@ GetTypeSourceInfoForDeclarator(TypeProcessingState &State, case TypeLoc::DependentAddressSpace: { auto TL = CurrTL.castAs<DependentAddressSpaceTypeLoc>(); - fillDependentAddressSpaceTypeLoc(TL, D.getTypeObject(i).getAttrs()); + fillDependentAddressSpaceTypeLoc(S.Context, TL, D, D.getTypeObject(i)); CurrTL = TL.getPointeeTypeLoc().getUnqualifiedLoc(); break; } diff --git a/clang/test/SemaTemplate/address_space-dependent.cpp b/clang/test/SemaTemplate/address_space-dependent.cpp index d6f25923b69b5..9c90c9831b7e3 100644 --- a/clang/test/SemaTemplate/address_space-dependent.cpp +++ b/clang/test/SemaTemplate/address_space-dependent.cpp @@ -130,3 +130,17 @@ struct EntryTy { ASPtrTy<1> x; EntryTy<2> y; } + +namespace gh196982 { +template <int AS> +void trailing() { + void *p [[clang::address_space(AS)]]; // expected-warning {{applying attribute 'clang::address_space' to a declaration is deprecated; apply it to the type instead}} + void *q __attribute__((address_space(AS))); + int r[2] __attribute__((address_space(AS))); +} + +void invalidOperand() { + void *p [[clang::address_space(undeclared())]]; // expected-error {{use of undeclared identifier 'undeclared'}} \ + // expected-warning {{applying attribute 'clang::address_space' to a declaration is deprecated; apply it to the type instead}} +} +} >From 9f4826a7f88d713435476757f78f4f7ff6a434b6 Mon Sep 17 00:00:00 2001 From: Akash Manna <[email protected]> Date: Tue, 18 Aug 2026 22:54:52 +0530 Subject: [PATCH 2/5] [Sema] Refactor fillDependentAddressSpaceTypeLoc to streamline attribute handling --- clang/lib/Sema/SemaType.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index da848d6431004..3613897a832ea 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6343,19 +6343,21 @@ namespace { }; } // end anonymous namespace -static void fillDependentAddressSpaceTypeLoc(ASTContext &Context, - DependentAddressSpaceTypeLoc DASTL, - const Declarator &D, - const DeclaratorChunk &Chunk) { +static void +fillDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc DASTL, + const Declarator &D, + const DeclaratorChunk &Chunk) { // An attribute written after the declarator-id appertains to the declared - // entity, so it is applied to the outermost type instead of to the chunk - // that is being visited. - const ParsedAttributesView *AttrLists[] = {&Chunk.getAttrs(), - &D.getAttributes()}; + // entity and is applied to the outermost type rather than to a chunk, so + // every attribute list of the declarator has to be searched. + const ParsedAttributesView *AttrLists[] = { + &Chunk.getAttrs(), &D.getAttributes(), &D.getDeclSpec().getAttributes(), + &D.getDeclarationAttributes()}; for (const ParsedAttributesView *Attrs : AttrLists) { for (const ParsedAttr &AL : *Attrs) { - if (AL.getKind() != ParsedAttr::AT_AddressSpace || AL.getNumArgs() != 1 || - !AL.isArgExpr(0)) + // Invalid or malformed attributes never produce a type. + if (AL.getKind() != ParsedAttr::AT_AddressSpace || AL.isInvalid() || + AL.getNumArgs() != 1 || !AL.isArgExpr(0)) continue; DASTL.setAttrNameLoc(AL.getLoc()); DASTL.setAttrExprOperand(AL.getArgAsExpr(0)); @@ -6364,7 +6366,8 @@ static void fillDependentAddressSpaceTypeLoc(ASTContext &Context, } } - DASTL.initializeLocal(Context, DASTL.getTypePtr()->getAttributeLoc()); + llvm_unreachable( + "no address_space attribute found at the expected location!"); } /// Create and instantiate a TypeSourceInfo with type source information. @@ -6430,7 +6433,7 @@ GetTypeSourceInfoForDeclarator(TypeProcessingState &State, case TypeLoc::DependentAddressSpace: { auto TL = CurrTL.castAs<DependentAddressSpaceTypeLoc>(); - fillDependentAddressSpaceTypeLoc(S.Context, TL, D, D.getTypeObject(i)); + fillDependentAddressSpaceTypeLoc(TL, D, D.getTypeObject(i)); CurrTL = TL.getPointeeTypeLoc().getUnqualifiedLoc(); break; } >From 0e283748e0b6cf0886b7a925172013e605177159 Mon Sep 17 00:00:00 2001 From: Akash Manna <[email protected]> Date: Tue, 18 Aug 2026 23:56:35 +0530 Subject: [PATCH 3/5] [Sema] Refactor fillDependentAddressSpaceTypeLoc to accept attribute lists as an array reference --- clang/lib/Sema/SemaType.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 3613897a832ea..368cb4b254290 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6343,21 +6343,16 @@ namespace { }; } // end anonymous namespace -static void -fillDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc DASTL, - const Declarator &D, - const DeclaratorChunk &Chunk) { - // An attribute written after the declarator-id appertains to the declared - // entity and is applied to the outermost type rather than to a chunk, so - // every attribute list of the declarator has to be searched. - const ParsedAttributesView *AttrLists[] = { - &Chunk.getAttrs(), &D.getAttributes(), &D.getDeclSpec().getAttributes(), - &D.getDeclarationAttributes()}; +static void fillDependentAddressSpaceTypeLoc( + DependentAddressSpaceTypeLoc DASTL, + ArrayRef<const ParsedAttributesView *> AttrLists) { for (const ParsedAttributesView *Attrs : AttrLists) { for (const ParsedAttr &AL : *Attrs) { - // Invalid or malformed attributes never produce a type. - if (AL.getKind() != ParsedAttr::AT_AddressSpace || AL.isInvalid() || - AL.getNumArgs() != 1 || !AL.isArgExpr(0)) + if (AL.getKind() != ParsedAttr::AT_AddressSpace) + continue; + // Skip an attribute that did not produce a type: one diagnosed as + // invalid, or one whose argument is missing or is not an expression. + if (AL.isInvalid() || AL.getNumArgs() != 1 || !AL.isArgExpr(0)) continue; DASTL.setAttrNameLoc(AL.getLoc()); DASTL.setAttrExprOperand(AL.getArgAsExpr(0)); @@ -6433,7 +6428,14 @@ GetTypeSourceInfoForDeclarator(TypeProcessingState &State, case TypeLoc::DependentAddressSpace: { auto TL = CurrTL.castAs<DependentAddressSpaceTypeLoc>(); - fillDependentAddressSpaceTypeLoc(TL, D, D.getTypeObject(i)); + // An attribute written after the declarator-id appertains to the + // declared entity and is applied to the outermost type rather than + // to a chunk, so every attribute list of the declarator has to be + // searched. + fillDependentAddressSpaceTypeLoc(TL, {&D.getTypeObject(i).getAttrs(), + &D.getAttributes(), + &D.getDeclSpec().getAttributes(), + &D.getDeclarationAttributes()}); CurrTL = TL.getPointeeTypeLoc().getUnqualifiedLoc(); break; } >From 2e89c1eced3cc84f61a9988eb8bc28751af91fae Mon Sep 17 00:00:00 2001 From: Akash Manna <[email protected]> Date: Wed, 19 Aug 2026 15:37:16 +0530 Subject: [PATCH 4/5] [Sema] Improve comments for address space attribute handling and add test for malformed attributes --- clang/lib/Sema/SemaType.cpp | 8 +++----- clang/test/SemaTemplate/address_space-dependent.cpp | 7 +++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 368cb4b254290..65ce71bfdc67d 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -6350,8 +6350,7 @@ static void fillDependentAddressSpaceTypeLoc( for (const ParsedAttr &AL : *Attrs) { if (AL.getKind() != ParsedAttr::AT_AddressSpace) continue; - // Skip an attribute that did not produce a type: one diagnosed as - // invalid, or one whose argument is missing or is not an expression. + // Skip invalid or malformed attributes; they did not produce a type. if (AL.isInvalid() || AL.getNumArgs() != 1 || !AL.isArgExpr(0)) continue; DASTL.setAttrNameLoc(AL.getLoc()); @@ -6429,9 +6428,8 @@ GetTypeSourceInfoForDeclarator(TypeProcessingState &State, case TypeLoc::DependentAddressSpace: { auto TL = CurrTL.castAs<DependentAddressSpaceTypeLoc>(); // An attribute written after the declarator-id appertains to the - // declared entity and is applied to the outermost type rather than - // to a chunk, so every attribute list of the declarator has to be - // searched. + // declared entity, not to a chunk, so every attribute list of the + // declarator has to be searched. fillDependentAddressSpaceTypeLoc(TL, {&D.getTypeObject(i).getAttrs(), &D.getAttributes(), &D.getDeclSpec().getAttributes(), diff --git a/clang/test/SemaTemplate/address_space-dependent.cpp b/clang/test/SemaTemplate/address_space-dependent.cpp index 9c90c9831b7e3..f3f418cd16251 100644 --- a/clang/test/SemaTemplate/address_space-dependent.cpp +++ b/clang/test/SemaTemplate/address_space-dependent.cpp @@ -143,4 +143,11 @@ void invalidOperand() { void *p [[clang::address_space(undeclared())]]; // expected-error {{use of undeclared identifier 'undeclared'}} \ // expected-warning {{applying attribute 'clang::address_space' to a declaration is deprecated; apply it to the type instead}} } + +template <int AS> +void invalidFirst() { + // The type location is filled from the second attribute; the first one is + // malformed and produced no type. + void *v __attribute__((address_space)) __attribute__((address_space(AS))); // expected-error {{'address_space' attribute takes one argument}} +} } >From 1a75159eeaaca5a0f9f9a5c7e8e61c2ed5e01ffd Mon Sep 17 00:00:00 2001 From: Akash Manna <[email protected]> Date: Wed, 19 Aug 2026 17:48:54 +0530 Subject: [PATCH 5/5] [clang][Sema] Update release notes for address_space attribute fixes and add test for dependent address space usage --- clang/docs/ReleaseNotes.md | 2 +- clang/test/SemaTemplate/address_space-dependent.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index 3647cfe20af91..d78f72cb2c0bf 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -443,7 +443,7 @@ features cannot lower the translation-unit ABI level; - Fixed a crash when an `address_space` attribute with a dependent argument was written after the declarator-id, where it appertains to the declared entity - rather than to a declarator chunk. (#GH196982) + rather than to a declarator chunk. (#GH196982, #GH111463) #### Bug Fixes to C++ Support diff --git a/clang/test/SemaTemplate/address_space-dependent.cpp b/clang/test/SemaTemplate/address_space-dependent.cpp index f3f418cd16251..f3655760be17d 100644 --- a/clang/test/SemaTemplate/address_space-dependent.cpp +++ b/clang/test/SemaTemplate/address_space-dependent.cpp @@ -151,3 +151,10 @@ void invalidFirst() { void *v __attribute__((address_space)) __attribute__((address_space(AS))); // expected-error {{'address_space' attribute takes one argument}} } } + +namespace gh111463 { +template <int I> +void func() { + int *y __attribute__((address_space(I))); +} +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
