[clang] [Clang][Sema] fix crash of attribute transform (PR #78088)
Qizhi Hu via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 16 18:04:30 PST 2024
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/78088
>From d040754092faa2106dc0b63af5e8bc7d7e1e47c2 Mon Sep 17 00:00:00 2001
From: huqizhi <huqizhi at 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 <836744285 at 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 <836744285 at 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
+}
More information about the cfe-commits
mailing list