https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/78088
>From d040754092faa2106dc0b63af5e8bc7d7e1e47c2 Mon Sep 17 00:00:00 2001 From: huqizhi <huqi...@feysh.com> Date: Sun, 14 Jan 2024 15:07:26 +0800 Subject: [PATCH 1/3] [Clang][Sema] fix crash of attribute transform --- clang/include/clang/AST/TypeLoc.h | 4 ++++ clang/lib/Sema/TreeTransform.h | 11 ++++++++--- clang/test/Sema/attr-lifetimebound-no-crash.cpp | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 clang/test/Sema/attr-lifetimebound-no-crash.cpp diff --git a/clang/include/clang/AST/TypeLoc.h b/clang/include/clang/AST/TypeLoc.h index 471deb14aba51fc..04780fdeae3bc10 100644 --- a/clang/include/clang/AST/TypeLoc.h +++ b/clang/include/clang/AST/TypeLoc.h @@ -884,6 +884,10 @@ class AttributedTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, return getInnerTypeLoc(); } + TypeLoc getEquivalentTypeLoc() const { + return TypeLoc(getTypePtr()->getEquivalentType(), getNonLocalData()); + } + /// The type attribute. const Attr *getAttr() const { return getLocalData()->TypeAttr; diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 1a1bc87d2b3203c..be5ba2000de197e 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6124,7 +6124,11 @@ QualType TreeTransform<Derived>::TransformFunctionProtoType( // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq // and the end of the function-definition, member-declarator, or // declarator. - Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); + auto *RD = + dyn_cast_or_null<CXXRecordDecl>(SemaRef.getCurLexicalContext()); + Sema::CXXThisScopeRAII ThisScope( + SemaRef, ThisContext == nullptr && nullptr != RD ? RD : ThisContext, + ThisTypeQuals); ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); if (ResultType.isNull()) @@ -7083,8 +7087,9 @@ QualType TreeTransform<Derived>::TransformAttributedType( modifiedType != oldType->getModifiedType()) { // TODO: this is really lame; we should really be rebuilding the // equivalent type from first principles. - QualType equivalentType - = getDerived().TransformType(oldType->getEquivalentType()); + TypeLocBuilder AuxiliaryTLB; + QualType equivalentType = + getDerived().TransformType(AuxiliaryTLB, TL.getEquivalentTypeLoc()); if (equivalentType.isNull()) return QualType(); diff --git a/clang/test/Sema/attr-lifetimebound-no-crash.cpp b/clang/test/Sema/attr-lifetimebound-no-crash.cpp new file mode 100644 index 000000000000000..5b873fa30c6ff22 --- /dev/null +++ b/clang/test/Sema/attr-lifetimebound-no-crash.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only + +// expected-no-diagnostics + +template<typename T> +struct Bar { + int* data; + + auto operator[](const int index) const [[clang::lifetimebound]] -> decltype(data[index]) { + return data[index]; + } +}; + +int main() { + Bar<int> b; + (void)b[2]; +} \ No newline at end of file >From 3a87a52ada005e9fa4d77d990f5c233c646c35c0 Mon Sep 17 00:00:00 2001 From: Qizhi Hu <836744...@qq.com> Date: Wed, 17 Jan 2024 10:03:52 +0800 Subject: [PATCH 2/3] Update TreeTransform.h --- clang/lib/Sema/TreeTransform.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index be5ba2000de197e..c8653017a034e71 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -7085,9 +7085,8 @@ QualType TreeTransform<Derived>::TransformAttributedType( // FIXME: dependent operand expressions? if (getDerived().AlwaysRebuild() || modifiedType != oldType->getModifiedType()) { - // TODO: this is really lame; we should really be rebuilding the - // equivalent type from first principles. TypeLocBuilder AuxiliaryTLB; + AuxiliaryTLB.reserve(TL.getFullDataSize()); QualType equivalentType = getDerived().TransformType(AuxiliaryTLB, TL.getEquivalentTypeLoc()); if (equivalentType.isNull()) >From fb6aaee1834820dd4deb643c0f8f11f63020758c Mon Sep 17 00:00:00 2001 From: Qizhi Hu <836744...@qq.com> Date: Wed, 17 Jan 2024 10:04:22 +0800 Subject: [PATCH 3/3] Update attr-lifetimebound-no-crash.cpp --- clang/test/Sema/attr-lifetimebound-no-crash.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Sema/attr-lifetimebound-no-crash.cpp b/clang/test/Sema/attr-lifetimebound-no-crash.cpp index 5b873fa30c6ff22..e668a78790defd7 100644 --- a/clang/test/Sema/attr-lifetimebound-no-crash.cpp +++ b/clang/test/Sema/attr-lifetimebound-no-crash.cpp @@ -14,4 +14,4 @@ struct Bar { int main() { Bar<int> b; (void)b[2]; -} \ No newline at end of file +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits