Author: Nathan Ridge Date: 2023-07-21T23:16:51-04:00 New Revision: 2e7d711a106170185e9bbbf15115613d9a5854c5
URL: https://github.com/llvm/llvm-project/commit/2e7d711a106170185e9bbbf15115613d9a5854c5 DIFF: https://github.com/llvm/llvm-project/commit/2e7d711a106170185e9bbbf15115613d9a5854c5.diff LOG: [clang] Add serialization support for the DynamicAllocLValue variant of APValue::LValueBase::Ptr Differential Revision: https://reviews.llvm.org/D154471 Added: clang/test/AST/dynamic-alloc-lvalue.cpp Modified: clang/include/clang/AST/PropertiesBase.td Removed: ################################################################################ diff --git a/clang/include/clang/AST/PropertiesBase.td b/clang/include/clang/AST/PropertiesBase.td index f289c9582c2328..cd8b95b02b7b41 100644 --- a/clang/include/clang/AST/PropertiesBase.td +++ b/clang/include/clang/AST/PropertiesBase.td @@ -450,10 +450,13 @@ let Class = PropertyTypeCase<APValue, "LValue"> in { lvalueBase ? lvalueBase.dyn_cast<const Expr *>() : nullptr; bool lvalueBaseIsExpr = (bool) expr; bool lvalueBaseIsTypeInfo = lvalueBase.is<TypeInfoLValue>(); + bool lvalueBaseIsDynamicAlloc = lvalueBase.is<DynamicAllocLValue>(); QualType elemTy; if (lvalueBase) { if (lvalueBaseIsTypeInfo) { elemTy = lvalueBase.getTypeInfoType(); + } else if (lvalueBaseIsDynamicAlloc) { + elemTy = lvalueBase.getDynamicAllocType(); } else if (lvalueBaseIsExpr) { elemTy = expr->getType(); } else { @@ -473,6 +476,9 @@ let Class = PropertyTypeCase<APValue, "LValue"> in { def : Property<"isTypeInfo", Bool> { let Read = [{ lvalueBaseIsTypeInfo }]; } + def : Property<"isDynamicAlloc", Bool> { + let Read = [{ lvalueBaseIsDynamicAlloc }]; + } def : Property<"hasBase", Bool> { let Read = [{ static_cast<bool>(lvalueBase) }]; } @@ -485,9 +491,17 @@ let Class = PropertyTypeCase<APValue, "LValue"> in { QualType(node.getLValueBase().get<TypeInfoLValue>().getType(), 0) }]; } + def : Property<"dynamicAlloc", UInt32> { + let Conditional = [{ hasBase && isDynamicAlloc }]; + let Read = [{ node.getLValueBase().get<DynamicAllocLValue>().getIndex() }]; + } def : Property<"type", QualType> { - let Conditional = [{ hasBase && isTypeInfo }]; - let Read = [{ node.getLValueBase().getTypeInfoType() }]; + let Conditional = [{ hasBase && (isTypeInfo || isDynamicAlloc) }]; + let Read = [{ + isTypeInfo + ? node.getLValueBase().getTypeInfoType() + : node.getLValueBase().getDynamicAllocType() + }]; } def : Property<"callIndex", UInt32> { let Conditional = [{ hasBase && !isTypeInfo }]; @@ -502,7 +516,7 @@ let Class = PropertyTypeCase<APValue, "LValue"> in { let Read = [{ const_cast<Expr *>(expr) }]; } def : Property<"decl", DeclRef> { - let Conditional = [{ hasBase && !isTypeInfo && !isExpr }]; + let Conditional = [{ hasBase && !isTypeInfo && !isDynamicAlloc && !isExpr }]; let Read = [{ lvalueBase.get<const ValueDecl *>() }]; } def : Property<"offsetQuantity", UInt32> { @@ -521,6 +535,9 @@ let Class = PropertyTypeCase<APValue, "LValue"> in { if (isTypeInfo) { base = APValue::LValueBase::getTypeInfo( TypeInfoLValue(typeInfo->getTypePtr()), *type); + } else if (isDynamicAlloc) { + base = APValue::LValueBase::getDynamicAlloc( + DynamicAllocLValue(*dynamicAlloc), *type); } else if (isExpr) { base = APValue::LValueBase(cast<Expr>(*stmt), *callIndex, *version); diff --git a/clang/test/AST/dynamic-alloc-lvalue.cpp b/clang/test/AST/dynamic-alloc-lvalue.cpp new file mode 100644 index 00000000000000..2a426638d0b793 --- /dev/null +++ b/clang/test/AST/dynamic-alloc-lvalue.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -emit-pch -o %t %s + +// Test that serialization/deserialization of a DynamicAllocLValue +// variant of APValue does not crash. + +#ifndef HEADER +#define HEADER + +struct A { int *p; }; +const A &w = A{ new int(10) }; + +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits