blob: 7517bd70fef35b01ff833b53c770980b42f11fb5 [file] [edit]
// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu -fclangir -emit-cir -std=c++11 -fcxx-exceptions -fexceptions -o %t.cir
// RUN: FileCheck -check-prefixes=CIR --input-file=%t.cir %s
// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu -fclangir -emit-llvm -std=c++11 -fcxx-exceptions -fexceptions -o %t-cir.ll
// RUN: FileCheck -check-prefixes=LLVM --input-file=%t-cir.ll %s
// RUN: %clang_cc1 -no-enable-noundef-analysis %s -triple=x86_64-linux-gnu -emit-llvm -std=c++11 -fcxx-exceptions -fexceptions -o %t.ll
// RUN: FileCheck -check-prefixes=OGCG --input-file=%t.ll %s
struct A {
A(int);
~A();
};
struct B {
B();
~B();
operator int();
int x;
};
B makeB();
A *deact_simple() { return new A(makeB()); }
// CIR-LABEL: cir.func {{.*}} @_Z12deact_simplev() -> !cir.ptr<!rec_A>{{.*}} {
// CIR: %[[RETVAL:.*]] = cir.alloca "__retval" {{.*}} : !cir.ptr<!cir.ptr<!rec_A>>
// CIR: %[[NEW_RESULT:.*]] = cir.alloca "__new_result" {{.*}} : !cir.ptr<!cir.ptr<!rec_A>>
// CIR: %[[TMP:.*]] = cir.alloca "ref.tmp0" {{.*}} : !cir.ptr<!rec_B>
// CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool>
// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin}
// CIR: cir.cleanup.scope {
// CIR: %[[TRUE:.*]] = cir.const #true
// CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: %[[MAKEB:.*]] = cir.call @_Z5makeBv() : () -> !rec_B
// CIR: cir.store{{.*}} %[[MAKEB]], %[[TMP]] : !rec_B, !cir.ptr<!rec_B>
// CIR: cir.cleanup.scope {
// CIR: %[[CONV:.*]] = cir.call @_ZN1BcviEv(%[[TMP]])
// CIR: cir.call @_ZN1AC1Ei({{.*}})
// CIR: %[[FALSE:.*]] = cir.const #false
// CIR: cir.store %[[FALSE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: } cleanup all {
// CIR: cir.call @_ZN1BD1Ev(%[[TMP]]) nothrow
// CIR: }
// CIR: } cleanup eh {
// CIR: %[[IS_ACTIVE:.*]] = cir.load{{.*}} %[[ACTIVE]] : !cir.ptr<!cir.bool>, !cir.bool
// CIR: cir.if %[[IS_ACTIVE]] {
// CIR: cir.call @_ZdlPv(%[[PTR]]) nothrow {builtin}
// CIR: }
// CIR: }
// LLVM-LABEL: define dso_local ptr @_Z12deact_simplev() {{.*}} personality ptr @__gxx_personality_v0 {
// LLVM: %[[TMP:.*]] = alloca %struct.B
// LLVM: %[[ACTIVE:.*]] = alloca i8
// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW:.*]]
// LLVM: store i8 1, ptr %[[ACTIVE]]
// LLVM: %[[MAKEB:.*]] = invoke %struct.B @_Z5makeBv()
// LLVM: to label %[[INVOKE_CONT:.*]] unwind label %[[UNWIND_OUTER:.*]]
// LLVM: [[INVOKE_CONT]]:
// LLVM: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// LLVM: to label %[[INVOKE_CONT2:.*]] unwind label %[[UNWIND_INNER:.*]]
// LLVM: [[INVOKE_CONT2]]:
// LLVM: store i8 0, ptr %[[ACTIVE]]
// LLVM: call void @_ZN1BD1Ev(ptr {{.*}} %[[TMP]]) #[[ATTR_NOUNWIND:.*]]
// LLVM: [[UNWIND_INNER]]:
// LLVM: %[[EXN_INNER:.*]] = landingpad { ptr, i32 }
// LLVM: cleanup
// LLVM: call void @_ZN1BD1Ev(ptr {{.*}} %[[TMP]]) #[[ATTR_NOUNWIND]]
// LLVM: [[UNWIND_OUTER]]:
// LLVM: %[[EXN_OUTER:.*]] = landingpad { ptr, i32 }
// LLVM: cleanup
// LLVM: [[EH_CLEANUP:.*]]:
// LLVM: %[[IS_ACTIVE_I8:.*]] = load i8, ptr %[[ACTIVE]]
// LLVM: %[[IS_ACTIVE:.*]] = trunc i8 %[[IS_ACTIVE_I8]] to i1
// LLVM: br i1 %[[IS_ACTIVE]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// LLVM: [[DO_DELETE]]:
// LLVM: call void @_ZdlPv(ptr %[[PTR]]) #[[ATTR_BUILTIN_DEL:.*]]
// OGCG-LABEL: define dso_local ptr @_Z12deact_simplev() {{.*}} personality ptr @__gxx_personality_v0 {
// OGCG: entry:
// OGCG: %[[TMP:.*]] = alloca %struct.B
// OGCG: %[[EXN_SLOT:.*]] = alloca ptr
// OGCG: %[[EHSEL_SLOT:.*]] = alloca i32
// OGCG: %[[ACTIVE:.*]] = alloca i1
// OGCG: %[[PTR:.*]] = call {{.*}} ptr @_Znwm(i64 1) #[[OGCG_ATTR_BUILTIN_NEW:.*]]
// OGCG: store i1 true, ptr %[[ACTIVE]]
// OGCG: invoke void @_Z5makeBv(ptr {{.*}} %[[TMP]])
// OGCG: to label %[[INVOKE_CONT:.*]] unwind label %[[LPAD_OUTER:.*]]
// OGCG: [[INVOKE_CONT]]:
// OGCG: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// OGCG: to label %[[INVOKE_CONT2:.*]] unwind label %[[LPAD_INNER:.*]]
// OGCG: [[INVOKE_CONT2]]:
// OGCG: store i1 false, ptr %[[ACTIVE]]
// OGCG: call void @_ZN1BD1Ev(ptr {{.*}} %[[TMP]]) #[[OGCG_ATTR_NOUNWIND:.*]]
// OGCG: [[LPAD_INNER]]:
// OGCG: call void @_ZN1BD1Ev(ptr {{.*}} %[[TMP]]) #[[OGCG_ATTR_NOUNWIND]]
// OGCG: [[EH_CLEANUP:.*]]:
// OGCG: %[[IS_ACTIVE:.*]] = load i1, ptr %[[ACTIVE]]
// OGCG: br i1 %[[IS_ACTIVE]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// OGCG: [[DO_DELETE]]:
// OGCG: call void @_ZdlPv(ptr %[[PTR]]) #[[OGCG_ATTR_BUILTIN_DEL:.*]]
A *deact_if(bool cond) {
if (cond)
return new A(makeB());
return 0;
}
// CIR-LABEL: cir.func {{.*}} @_Z8deact_ifb
// CIR: cir.if {{.*}} {
// CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool>
// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin}
// CIR: cir.cleanup.scope {
// CIR: %[[TRUE:.*]] = cir.const #true
// CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: cir.call @_ZN1AC1Ei({{.*}})
// CIR: %[[FALSE:.*]] = cir.const #false
// CIR: cir.store %[[FALSE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: } cleanup eh {
// CIR: %[[IS_ACTIVE:.*]] = cir.load{{.*}} %[[ACTIVE]] : !cir.ptr<!cir.bool>, !cir.bool
// CIR: cir.if %[[IS_ACTIVE]] {
// CIR: cir.call @_ZdlPv(%[[PTR]]) nothrow {builtin}
// CIR: }
// CIR: }
// CIR: }
// LLVM-LABEL: define dso_local ptr @_Z8deact_ifb(i1 %0) {{.*}} personality ptr @__gxx_personality_v0 {
// LLVM: br i1 %{{.*}}, label %[[THEN:.*]], label %[[END:.*]]
// LLVM: [[THEN]]:
// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]]
// LLVM: store i8 1, ptr %[[ACTIVE:.*]]
// LLVM: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// LLVM: to label %[[CONT:.*]] unwind label %[[UNWIND_INNER:.*]]
// LLVM: [[CONT]]:
// LLVM: store i8 0, ptr %[[ACTIVE]]
// LLVM: [[UNWIND_INNER]]:
// LLVM: landingpad { ptr, i32 }
// LLVM: cleanup
// LLVM: [[EH_CLEANUP:.*]]:
// LLVM: %[[ACTIVE_I8:.*]] = load i8, ptr %[[ACTIVE]]
// LLVM: %[[ACTIVE_I1:.*]] = trunc i8 %[[ACTIVE_I8]] to i1
// LLVM: br i1 %[[ACTIVE_I1]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// LLVM: [[DO_DELETE]]:
// LLVM: call void @_ZdlPv(ptr %[[PTR]])
// LLVM: [[END]]:
// OGCG-LABEL: define dso_local ptr @_Z8deact_ifb(i1 zeroext %cond) {{.*}} personality ptr @__gxx_personality_v0 {
// OGCG: if.then:
// OGCG: %[[PTR:.*]] = call {{.*}} ptr @_Znwm(i64 1) #[[OGCG_ATTR_BUILTIN_NEW]]
// OGCG: store i1 true, ptr %[[ACTIVE:.*]]
// OGCG: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// OGCG: to label %[[CONT:.*]] unwind label %[[LPAD_INNER:.*]]
// OGCG: [[CONT]]:
// OGCG: store i1 false, ptr %[[ACTIVE]]
// OGCG: [[LPAD_INNER]]:
// OGCG: landingpad { ptr, i32 }
// OGCG: cleanup
// OGCG: [[EH_CLEANUP:.*]]:
// OGCG: %[[IS_ACTIVE:.*]] = load i1, ptr %[[ACTIVE]]
// OGCG: br i1 %[[IS_ACTIVE]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// OGCG: [[DO_DELETE]]:
// OGCG: call void @_ZdlPv(ptr %[[PTR]])
A *deact_ternary(bool cond) { return (new A(makeB()), cond) ? nullptr : nullptr; }
// CIR-LABEL: cir.func {{.*}} @_Z13deact_ternaryb
// CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool>
// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin}
// CIR: cir.cleanup.scope {
// CIR: %[[TRUE:.*]] = cir.const #true
// CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: cir.call @_ZN1AC1Ei({{.*}})
// CIR: %[[FALSE:.*]] = cir.const #false
// CIR: cir.store %[[FALSE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: } cleanup eh {
// CIR: %[[IS_ACTIVE:.*]] = cir.load{{.*}} %[[ACTIVE]] : !cir.ptr<!cir.bool>, !cir.bool
// CIR: cir.if %[[IS_ACTIVE]] {
// CIR: cir.call @_ZdlPv(%[[PTR]]) nothrow {builtin}
// CIR: }
// CIR: }
// LLVM-LABEL: define dso_local ptr @_Z13deact_ternaryb(i1 %0) {{.*}} personality ptr @__gxx_personality_v0 {
// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]]
// LLVM: store i8 1, ptr %[[ACTIVE:.*]]
// LLVM: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// LLVM: to label %[[CONT:.*]] unwind label %[[UNWIND_INNER:.*]]
// LLVM: [[CONT]]:
// LLVM: store i8 0, ptr %[[ACTIVE]]
// LLVM: [[UNWIND_INNER]]:
// LLVM: landingpad { ptr, i32 }
// LLVM: cleanup
// LLVM: [[EH_CLEANUP:.*]]:
// LLVM: %[[ACTIVE_I8:.*]] = load i8, ptr %[[ACTIVE]]
// LLVM: %[[ACTIVE_I1:.*]] = trunc i8 %[[ACTIVE_I8]] to i1
// LLVM: br i1 %[[ACTIVE_I1]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// LLVM: [[DO_DELETE]]:
// LLVM: call void @_ZdlPv(ptr %[[PTR]])
// OGCG-LABEL: define dso_local ptr @_Z13deact_ternaryb(i1 zeroext %cond) {{.*}} personality ptr @__gxx_personality_v0 {
// OGCG: entry:
// OGCG: %[[PTR:.*]] = call {{.*}} ptr @_Znwm(i64 1) #[[OGCG_ATTR_BUILTIN_NEW]]
// OGCG: store i1 true, ptr %[[ACTIVE:.*]]
// OGCG: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// OGCG: to label %[[CONT:.*]] unwind label %[[LPAD_INNER:.*]]
// OGCG: [[CONT]]:
// OGCG: store i1 false, ptr %[[ACTIVE]]
// OGCG: [[LPAD_INNER]]:
// OGCG: landingpad { ptr, i32 }
// OGCG: cleanup
// OGCG: [[EH_CLEANUP:.*]]:
// OGCG: %[[IS_ACTIVE:.*]] = load i1, ptr %[[ACTIVE]]
// OGCG: br i1 %[[IS_ACTIVE]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// OGCG: [[DO_DELETE]]:
// OGCG: call void @_ZdlPv(ptr %[[PTR]])
A *deact_while_cond(int n) {
while ((new A(makeB()), n > 0))
--n;
return 0;
}
// CIR-LABEL: cir.func {{.*}} @_Z16deact_while_condi
// CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool>
// CIR: cir.while {
// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin}
// CIR: cir.cleanup.scope {
// CIR: %[[TRUE:.*]] = cir.const #true
// CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: cir.call @_ZN1AC1Ei({{.*}})
// CIR: %[[FALSE:.*]] = cir.const #false
// CIR: cir.store %[[FALSE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: } cleanup eh {
// CIR: %[[IS_ACTIVE:.*]] = cir.load{{.*}} %[[ACTIVE]] : !cir.ptr<!cir.bool>, !cir.bool
// CIR: cir.if %[[IS_ACTIVE]] {
// CIR: cir.call @_ZdlPv(%[[PTR]]) nothrow {builtin}
// CIR: }
// CIR: }
// CIR: cir.condition({{.*}})
// CIR: } do {
// LLVM-LABEL: define dso_local ptr @_Z16deact_while_condi(i32 %0) {{.*}} personality ptr @__gxx_personality_v0 {
// LLVM: %[[TMP:.*]] = alloca %struct.B
// LLVM: %[[ACTIVE:.*]] = alloca i8
// LLVM: br label %[[WHILE_COND:.*]]
// LLVM: [[WHILE_COND]]:
// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]]
// LLVM: store i8 1, ptr %[[ACTIVE]]
// LLVM: invoke %struct.B @_Z5makeBv()
// LLVM: to label %[[INVOKE_CONT:.*]] unwind label %[[UNWIND_OUTER:.*]]
// LLVM: [[INVOKE_CONT]]:
// LLVM: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// LLVM: to label %[[INVOKE_CONT2:.*]] unwind label %[[UNWIND_INNER:.*]]
// LLVM: [[INVOKE_CONT2]]:
// LLVM: store i8 0, ptr %[[ACTIVE]]
// LLVM: br label %[[NORMAL_CLEANUP:.*]]
// LLVM: [[NORMAL_CLEANUP]]:
// LLVM: call void @_ZN1BD1Ev(ptr {{.*}} %[[TMP]]) #[[ATTR_NOUNWIND]]
// LLVM: [[UNWIND_INNER]]:
// LLVM: landingpad { ptr, i32 }
// LLVM: cleanup
// LLVM: call void @_ZN1BD1Ev(ptr {{.*}} %[[TMP]]) #[[ATTR_NOUNWIND]]
// LLVM: [[UNWIND_OUTER]]:
// LLVM: landingpad { ptr, i32 }
// LLVM: cleanup
// LLVM: [[EH_CLEANUP:.*]]:
// LLVM: %[[IS_ACTIVE_I8:.*]] = load i8, ptr %[[ACTIVE]]
// LLVM: %[[IS_ACTIVE:.*]] = trunc i8 %[[IS_ACTIVE_I8]] to i1
// LLVM: br i1 %[[IS_ACTIVE]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// LLVM: [[DO_DELETE]]:
// LLVM: call void @_ZdlPv(ptr %[[PTR]]) #[[ATTR_BUILTIN_DEL]]
// LLVM: [[SKIP_DELETE]]:
// LLVM: resume { ptr, i32 } {{.*}}
// OGCG-LABEL: define dso_local ptr @_Z16deact_while_condi(i32 %n) {{.*}} personality ptr @__gxx_personality_v0 {
// OGCG: while.cond:
// OGCG: %[[PTR:.*]] = call {{.*}} ptr @_Znwm(i64 1) #[[OGCG_ATTR_BUILTIN_NEW]]
// OGCG: store i1 true, ptr %[[ACTIVE:.*]]
// OGCG: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// OGCG: to label %[[CONT:.*]] unwind label %[[LPAD_INNER:.*]]
// OGCG: [[CONT]]:
// OGCG: store i1 false, ptr %[[ACTIVE]]
// OGCG: br i1 %{{.*}}, label %[[BODY:.*]], label %[[END:.*]]
// OGCG: [[LPAD_INNER]]:
// OGCG: landingpad { ptr, i32 }
// OGCG: cleanup
// OGCG: [[EH_CLEANUP:.*]]:
// OGCG: %[[IS_ACTIVE:.*]] = load i1, ptr %[[ACTIVE]]
// OGCG: br i1 %[[IS_ACTIVE]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// OGCG: [[DO_DELETE]]:
// OGCG: call void @_ZdlPv(ptr %[[PTR]])
A *deact_switch(int kind) {
switch (kind) {
case 1:
return new A(makeB());
default:
return 0;
}
}
// CIR-LABEL: cir.func {{.*}} @_Z12deact_switchi
// CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool>
// CIR: cir.switch({{.*}}) {
// CIR: cir.case(equal, [#cir.int<1> : !s32i]) {
// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin}
// CIR: cir.cleanup.scope {
// CIR: %[[TRUE:.*]] = cir.const #true
// CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: cir.call @_ZN1AC1Ei({{.*}})
// CIR: %[[FALSE:.*]] = cir.const #false
// CIR: cir.store %[[FALSE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool>
// CIR: } cleanup eh {
// CIR: %[[IS_ACTIVE:.*]] = cir.load{{.*}} %[[ACTIVE]] : !cir.ptr<!cir.bool>, !cir.bool
// CIR: cir.if %[[IS_ACTIVE]] {
// CIR: cir.call @_ZdlPv(%[[PTR]]) nothrow {builtin}
// CIR: }
// CIR: }
// CIR: }
// CIR: }
// LLVM-LABEL: define dso_local ptr @_Z12deact_switchi(i32 %0) {{.*}} personality ptr @__gxx_personality_v0 {
// LLVM: switch i32 %{{.*}}, label %[[DEFAULT:.*]] [
// LLVM: i32 1, label %[[CASE1:.*]]
// LLVM: ]
// LLVM: [[CASE1]]:
// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]]
// LLVM: store i8 1, ptr %[[ACTIVE:.*]]
// LLVM: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// LLVM: to label %[[CONT:.*]] unwind label %[[UNWIND_INNER:.*]]
// LLVM: [[CONT]]:
// LLVM: store i8 0, ptr %[[ACTIVE]]
// LLVM: [[UNWIND_INNER]]:
// LLVM: landingpad { ptr, i32 }
// LLVM: cleanup
// LLVM: [[EH_CLEANUP:.*]]:
// LLVM: %[[ACTIVE_I8:.*]] = load i8, ptr %[[ACTIVE]]
// LLVM: %[[ACTIVE_I1:.*]] = trunc i8 %[[ACTIVE_I8]] to i1
// LLVM: br i1 %[[ACTIVE_I1]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// LLVM: [[DO_DELETE]]:
// LLVM: call void @_ZdlPv(ptr %[[PTR]])
// LLVM: [[DEFAULT]]:
// OGCG-LABEL: define dso_local ptr @_Z12deact_switchi(i32 %kind) {{.*}} personality ptr @__gxx_personality_v0 {
// OGCG: entry:
// OGCG: switch i32 %{{.*}}, label %[[DEFAULT:.*]] [
// OGCG: i32 1, label %[[CASE1:.*]]
// OGCG: ]
// OGCG: [[CASE1]]:
// OGCG: %[[PTR:.*]] = call {{.*}} ptr @_Znwm(i64 1) #[[OGCG_ATTR_BUILTIN_NEW]]
// OGCG: store i1 true, ptr %[[ACTIVE:.*]]
// OGCG: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}})
// OGCG: to label %[[CONT:.*]] unwind label %[[LPAD_INNER:.*]]
// OGCG: [[CONT]]:
// OGCG: store i1 false, ptr %[[ACTIVE]]
// OGCG: [[LPAD_INNER]]:
// OGCG: landingpad { ptr, i32 }
// OGCG: cleanup
// OGCG: [[EH_CLEANUP:.*]]:
// OGCG: %[[IS_ACTIVE:.*]] = load i1, ptr %[[ACTIVE]]
// OGCG: br i1 %[[IS_ACTIVE]], label %[[DO_DELETE:.*]], label %[[SKIP_DELETE:.*]]
// OGCG: [[DO_DELETE]]:
// OGCG: call void @_ZdlPv(ptr %[[PTR]])
// LLVM-DAG: attributes #[[ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}}
// LLVM-DAG: attributes #[[ATTR_BUILTIN_DEL]] = {{{.*}}builtin{{.*}}}
// LLVM-DAG: attributes #[[ATTR_NOUNWIND]] = {{{.*}}nounwind{{.*}}}
// OGCG-DAG: attributes #[[OGCG_ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}}
// OGCG-DAG: attributes #[[OGCG_ATTR_BUILTIN_DEL]] = {{{.*}}builtin{{.*}}}
// OGCG-DAG: attributes #[[OGCG_ATTR_NOUNWIND]] = {{{.*}}nounwind{{.*}}}