Akira Hatanaka 8fc3d719ee Stop wrapping GCCAsmStmts inside StmtExprs to destruct temporaries
Instead, just pop the cleanups at the end of the asm statement.

This fixes an assertion failure in BuildStmtExpr. It also fixes a bug
where blocks and C compound literals were destructed at the end of the
asm statement instead of at the end of the enclosing scope.

Differential Revision: https://reviews.llvm.org/D125936
2022-06-17 17:28:00 -07:00

26 lines
865 B
Objective-C

// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fblocks -fobjc-arc -emit-llvm -o - %s | FileCheck %s
// CHECK: %[[STRUCT_A:.*]] = type { ptr }
typedef struct {
id f;
} A;
id a;
// Check that the compound literal is destructed at the end of the enclosing scope.
// CHECK-LABEL: define void @foo0()
// CHECK: %[[_COMPOUNDLITERAL:.*]] = alloca %[[STRUCT_A]], align 8
// CHECK: getelementptr inbounds %[[STRUCT_A]], ptr %[[_COMPOUNDLITERAL]], i32 0, i32 0
// CHECK: %[[F1:.*]] = getelementptr inbounds %[[STRUCT_A]], ptr %[[_COMPOUNDLITERAL]], i32 0, i32 0
// CHECK: %[[V2:.*]] = load ptr, ptr %[[F1]], align 8
// CHECK: call void asm sideeffect "", "r,~{dirflag},~{fpsr},~{flags}"(ptr %[[V2]])
// CHECK: call void asm sideeffect "",
// CHECK: call void @__destructor_8_s0(ptr %[[_COMPOUNDLITERAL]])
void foo0() {
asm("" : : "r"(((A){a}).f) );
asm("");
}