llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) <details> <summary>Changes</summary> When we get to this point, the pointer might _not_ be backed by a primitive array, so the later code will fail. Fixes #<!-- -->155144 --- Full diff: https://github.com/llvm/llvm-project/pull/155152.diff 2 Files Affected: - (modified) clang/lib/AST/ByteCode/Pointer.cpp (+4-1) - (modified) clang/test/AST/ByteCode/c.c (+4) ``````````diff diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp index 7dc6b0c6d437b..2f67c5e3e3479 100644 --- a/clang/lib/AST/ByteCode/Pointer.cpp +++ b/clang/lib/AST/ByteCode/Pointer.cpp @@ -785,8 +785,11 @@ std::optional<APValue> Pointer::toRValue(const Context &Ctx, // Complex types. if (const auto *CT = Ty->getAs<ComplexType>()) { - QualType ElemTy = CT->getElementType(); + // Can happen via C casts. + if (!Ptr.getFieldDesc()->isPrimitiveArray()) + return false; + QualType ElemTy = CT->getElementType(); if (ElemTy->isIntegerType()) { OptPrimType ElemT = Ctx.classify(ElemTy); assert(ElemT); diff --git a/clang/test/AST/ByteCode/c.c b/clang/test/AST/ByteCode/c.c index 73469d7fd6cc4..eb46330c7d35f 100644 --- a/clang/test/AST/ByteCode/c.c +++ b/clang/test/AST/ByteCode/c.c @@ -173,6 +173,10 @@ _Static_assert(CTB3, ""); // pedantic-ref-warning {{GNU extension}} \ // pedantic-expected-warning {{GNU extension}} +void nonComplexToComplexCast(void) { + _Complex double z = *(_Complex double *)&(struct { double r, i; }){0.0, 1.0}; +} + int t1 = sizeof(int); void test4(void) { t1 = sizeof(int); `````````` </details> https://github.com/llvm/llvm-project/pull/155152 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits