Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
clang/test/CodeGenCXX/exceptions.cpp
Show First 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | A *c() { | ||||
// CHECK: ret [[A]]* [[CAST]] | // CHECK: ret [[A]]* [[CAST]] | ||||
// CHECK: [[ISACTIVE:%.*]] = load i1, i1* [[ACTIVE]] | // CHECK: [[ISACTIVE:%.*]] = load i1, i1* [[ACTIVE]] | ||||
// CHECK-NEXT: br i1 [[ISACTIVE]] | // CHECK-NEXT: br i1 [[ISACTIVE]] | ||||
// CHECK: call void @_ZdlPv(i8* [[NEW]]) | // CHECK: call void @_ZdlPv(i8* [[NEW]]) | ||||
return new A(B().x); | return new A(B().x); | ||||
} | } | ||||
// rdar://11904428 | |||||
jroelofs: FWI(was)W, this radar points at: https://bugs.llvm.org/show_bug.cgi?id=11893 | |||||
// Terminate landing pads should call __cxa_begin_catch first. | |||||
// CHECK98: define linkonce_odr hidden void @__clang_call_terminate(i8* %0) [[NI_NR_NUW:#[0-9]+]] comdat | |||||
// CHECK98-NEXT: [[T0:%.*]] = call i8* @__cxa_begin_catch(i8* %0) [[NUW:#[0-9]+]] | |||||
// CHECK98-NEXT: call void @_ZSt9terminatev() [[NR_NUW:#[0-9]+]] | |||||
// CHECK98-NEXT: unreachable | |||||
A *d() { | A *d() { | ||||
// CHECK: define{{( dso_local)?}} [[A:%.*]]* @_ZN5test11dEv() | // CHECK: define{{( dso_local)?}} [[A:%.*]]* @_ZN5test11dEv() | ||||
// CHECK: [[ACTIVE:%.*]] = alloca i1 | // CHECK: [[ACTIVE:%.*]] = alloca i1 | ||||
// CHECK-NEXT: [[NEW:%.*]] = call noalias nonnull i8* @_Znwm(i64 8) | // CHECK-NEXT: [[NEW:%.*]] = call noalias nonnull i8* @_Znwm(i64 8) | ||||
// CHECK-NEXT: store i1 true, i1* [[ACTIVE]] | // CHECK-NEXT: store i1 true, i1* [[ACTIVE]] | ||||
// CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* | // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* | ||||
// CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* {{[^,]*}} [[T0:%.*]]) | // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* {{[^,]*}} [[T0:%.*]]) | ||||
// CHECK: [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* {{[^,]*}} [[T0]]) | // CHECK: [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* {{[^,]*}} [[T0]]) | ||||
▲ Show 20 Lines • Show All 85 Lines • ▼ Show 20 Lines | namespace test2 { | ||||
A *a() { | A *a() { | ||||
// CHECK: define{{( dso_local)?}} [[A:%.*]]* @_ZN5test21aEv() | // CHECK: define{{( dso_local)?}} [[A:%.*]]* @_ZN5test21aEv() | ||||
// CHECK: [[NEW:%.*]] = call i8* @_ZN5test21AnwEm(i64 8) | // CHECK: [[NEW:%.*]] = call i8* @_ZN5test21AnwEm(i64 8) | ||||
// CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* | // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* | ||||
// CHECK-NEXT: invoke void @_ZN5test21AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 5) | // CHECK-NEXT: invoke void @_ZN5test21AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 5) | ||||
// CHECK: ret [[A]]* [[CAST]] | // CHECK: ret [[A]]* [[CAST]] | ||||
// CHECK98: invoke void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8) | // CHECK98: call unwindabort void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8) | ||||
// CHECK11: call void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8) | // CHECK11: call void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8) | ||||
// CHECK98: call void @__clang_call_terminate(i8* {{%.*}}) [[NR_NUW]] | |||||
return new A(5); | return new A(5); | ||||
} | } | ||||
} | } | ||||
namespace test3 { | namespace test3 { | ||||
struct A { | struct A { | ||||
A(int); A(int, int); A(const A&); ~A(); | A(int); A(int, int); A(const A&); ~A(); | ||||
void *p; | void *p; | ||||
Show All 9 Lines | A *a() { | ||||
// CHECK: define{{( dso_local)?}} [[A:%.*]]* @_ZN5test31aEv() | // CHECK: define{{( dso_local)?}} [[A:%.*]]* @_ZN5test31aEv() | ||||
// CHECK: [[FOO:%.*]] = call i8* @_ZN5test33fooEv() | // CHECK: [[FOO:%.*]] = call i8* @_ZN5test33fooEv() | ||||
// CHECK: [[BAR:%.*]] = call double @_ZN5test33barEv() | // CHECK: [[BAR:%.*]] = call double @_ZN5test33barEv() | ||||
// CHECK: [[NEW:%.*]] = call i8* @_ZN5test31AnwEmPvd(i64 8, i8* [[FOO]], double [[BAR]]) | // CHECK: [[NEW:%.*]] = call i8* @_ZN5test31AnwEmPvd(i64 8, i8* [[FOO]], double [[BAR]]) | ||||
// CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* | // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* | ||||
// CHECK-NEXT: invoke void @_ZN5test31AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 5) | // CHECK-NEXT: invoke void @_ZN5test31AC1Ei([[A]]* {{[^,]*}} [[CAST]], i32 5) | ||||
// CHECK: ret [[A]]* [[CAST]] | // CHECK: ret [[A]]* [[CAST]] | ||||
// CHECK98: invoke void @_ZN5test31AdlEPvS1_d(i8* [[NEW]], i8* [[FOO]], double [[BAR]]) | // CHECK98: call unwindabort void @_ZN5test31AdlEPvS1_d(i8* [[NEW]], i8* [[FOO]], double [[BAR]]) | ||||
// CHECK11: call void @_ZN5test31AdlEPvS1_d(i8* [[NEW]], i8* [[FOO]], double [[BAR]]) | // CHECK11: call void @_ZN5test31AdlEPvS1_d(i8* [[NEW]], i8* [[FOO]], double [[BAR]]) | ||||
// CHECK98: call void @__clang_call_terminate(i8* {{%.*}}) [[NR_NUW]] | |||||
return new(foo(),bar()) A(5); | return new(foo(),bar()) A(5); | ||||
} | } | ||||
// rdar://problem/8439196 | // rdar://problem/8439196 | ||||
A *b(bool cond) { | A *b(bool cond) { | ||||
// CHECK: define{{( dso_local)?}} [[A:%.*]]* @_ZN5test31bEb(i1 zeroext | // CHECK: define{{( dso_local)?}} [[A:%.*]]* @_ZN5test31bEb(i1 zeroext | ||||
// CHECK: [[SAVED0:%.*]] = alloca i8* | // CHECK: [[SAVED0:%.*]] = alloca i8* | ||||
Show All 26 Lines | A *b(bool cond) { | ||||
// CHECK: ret [[A]]* [[RESULT]] | // CHECK: ret [[A]]* [[RESULT]] | ||||
// in the EH path: | // in the EH path: | ||||
// CHECK: [[ISACTIVE:%.*]] = load i1, i1* [[CLEANUPACTIVE]] | // CHECK: [[ISACTIVE:%.*]] = load i1, i1* [[CLEANUPACTIVE]] | ||||
// CHECK-NEXT: br i1 [[ISACTIVE]] | // CHECK-NEXT: br i1 [[ISACTIVE]] | ||||
// CHECK: [[V0:%.*]] = load i8*, i8** [[SAVED0]] | // CHECK: [[V0:%.*]] = load i8*, i8** [[SAVED0]] | ||||
// CHECK-NEXT: [[V1:%.*]] = load i8*, i8** [[SAVED1]] | // CHECK-NEXT: [[V1:%.*]] = load i8*, i8** [[SAVED1]] | ||||
// CHECK98-NEXT: invoke void @_ZN5test31AdlEPvS1_d(i8* [[V0]], i8* [[V1]], double [[CONST]]) | // CHECK98-NEXT: call unwindabort void @_ZN5test31AdlEPvS1_d(i8* [[V0]], i8* [[V1]], double [[CONST]]) | ||||
// CHECK11-NEXT: call void @_ZN5test31AdlEPvS1_d(i8* [[V0]], i8* [[V1]], double [[CONST]]) | // CHECK11-NEXT: call void @_ZN5test31AdlEPvS1_d(i8* [[V0]], i8* [[V1]], double [[CONST]]) | ||||
} | } | ||||
} | } | ||||
namespace test4 { | namespace test4 { | ||||
struct A { | struct A { | ||||
A(int); A(int, int); ~A(); | A(int); A(int, int); ~A(); | ||||
void *p; | void *p; | ||||
Show All 30 Lines | namespace test5 { | ||||
// CHECK: [[EXNSLOT:%.*]] = alloca i8* | // CHECK: [[EXNSLOT:%.*]] = alloca i8* | ||||
// CHECK-NEXT: [[SELECTORSLOT:%.*]] = alloca i32 | // CHECK-NEXT: [[SELECTORSLOT:%.*]] = alloca i32 | ||||
// CHECK-NEXT: [[A:%.*]] = alloca [[A_T:%.*]], align 1 | // CHECK-NEXT: [[A:%.*]] = alloca [[A_T:%.*]], align 1 | ||||
// CHECK-NEXT: [[T:%.*]] = alloca [[T_T:%.*]], align 1 | // CHECK-NEXT: [[T:%.*]] = alloca [[T_T:%.*]], align 1 | ||||
// CHECK-NEXT: invoke void @_ZN5test53fooEv() | // CHECK-NEXT: invoke void @_ZN5test53fooEv() | ||||
// CHECK: [[EXN:%.*]] = load i8*, i8** [[EXNSLOT]] | // CHECK: [[EXN:%.*]] = load i8*, i8** [[EXNSLOT]] | ||||
// CHECK-NEXT: [[ADJ:%.*]] = call i8* @__cxa_get_exception_ptr(i8* [[EXN]]) | // CHECK-NEXT: [[ADJ:%.*]] = call i8* @__cxa_get_exception_ptr(i8* [[EXN]]) | ||||
// CHECK-NEXT: [[SRC:%.*]] = bitcast i8* [[ADJ]] to [[A_T]]* | // CHECK-NEXT: [[SRC:%.*]] = bitcast i8* [[ADJ]] to [[A_T]]* | ||||
// CHECK-NEXT: invoke void @_ZN5test51TC1Ev([[T_T]]* {{[^,]*}} [[T]]) | // CHECK-NEXT: call unwindabort void @_ZN5test51TC1Ev([[T_T]]* {{[^,]*}} [[T]]) | ||||
// CHECK: invoke void @_ZN5test51AC1ERKS0_RKNS_1TE([[A_T]]* {{[^,]*}} [[A]], [[A_T]]* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[SRC]], [[T_T]]* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[T]]) | // CHECK: call unwindabort void @_ZN5test51AC1ERKS0_RKNS_1TE([[A_T]]* {{[^,]*}} [[A]], [[A_T]]* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[SRC]], [[T_T]]* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[T]]) | ||||
// CHECK98: invoke void @_ZN5test51TD1Ev([[T_T]]* {{[^,]*}} [[T]]) | // CHECK98: call unwindabort void @_ZN5test51TD1Ev([[T_T]]* {{[^,]*}} [[T]]) | ||||
// CHECK11: call void @_ZN5test51TD1Ev([[T_T]]* {{[^,]*}} [[T]]) | // CHECK11: call void @_ZN5test51TD1Ev([[T_T]]* {{[^,]*}} [[T]]) | ||||
// CHECK98: call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]] | // CHECK98: call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW:#[0-9]+]] | ||||
// CHECK98-NEXT: invoke void @_ZN5test51AD1Ev([[A_T]]* {{[^,]*}} [[A]]) | // CHECK98-NEXT: invoke void @_ZN5test51AD1Ev([[A_T]]* {{[^,]*}} [[A]]) | ||||
// CHECK: call void @__cxa_end_catch() | // CHECK: call void @__cxa_end_catch() | ||||
void test() { | void test() { | ||||
try { | try { | ||||
foo(); | foo(); | ||||
} catch (A a) { | } catch (A a) { | ||||
} | } | ||||
▲ Show 20 Lines • Show All 149 Lines • ▼ Show 20 Lines | namespace test10 { | ||||
// CHECK-NOT: rethrow | // CHECK-NOT: rethrow | ||||
// CHECK: ret void | // CHECK: ret void | ||||
struct B { ~B(); }; | struct B { ~B(); }; | ||||
B::~B() try { cleanup(); } catch (...) {} | B::~B() try { cleanup(); } catch (...) {} | ||||
// CHECK-LABEL: define{{.*}} void @_ZN6test101BD1Ev( | // CHECK-LABEL: define{{.*}} void @_ZN6test101BD1Ev( | ||||
// CHECK: invoke void @_ZN6test107cleanupEv() | // CHECK: invoke void @_ZN6test107cleanupEv() | ||||
// CHECK: call i8* @__cxa_begin_catch | // CHECK: call i8* @__cxa_begin_catch | ||||
// CHECK-NEXT: invoke void @__cxa_rethrow() | // CHECK98-NEXT: invoke void @__cxa_rethrow() | ||||
// CHECK11-NEXT: call unwindabort void @__cxa_rethrow() | |||||
// CHECK: unreachable | // CHECK: unreachable | ||||
struct C { ~C(); }; | struct C { ~C(); }; | ||||
C::~C() try { cleanup(); } catch (...) { if (suppress) return; } | C::~C() try { cleanup(); } catch (...) { if (suppress) return; } | ||||
// CHECK-LABEL: define{{.*}} void @_ZN6test101CD1Ev( | // CHECK-LABEL: define{{.*}} void @_ZN6test101CD1Ev( | ||||
// CHECK: invoke void @_ZN6test107cleanupEv() | // CHECK: invoke void @_ZN6test107cleanupEv() | ||||
// CHECK: call i8* @__cxa_begin_catch | // CHECK: call i8* @__cxa_begin_catch | ||||
// CHECK-NEXT: load i8, i8* @_ZN6test108suppressE, align 1 | // CHECK-NEXT: load i8, i8* @_ZN6test108suppressE, align 1 | ||||
// CHECK-NEXT: trunc | // CHECK-NEXT: trunc | ||||
// CHECK-NEXT: br i1 | // CHECK-NEXT: br i1 | ||||
// CHECK98: call void @__cxa_end_catch() | // CHECK98: call void @__cxa_end_catch() | ||||
// CHECK98-NEXT: br label | // CHECK98-NEXT: br label | ||||
// CHECK11: invoke void @__cxa_end_catch() | // CHECK11: call unwindabort void @__cxa_end_catch() | ||||
// CHECK11-NEXT: to label | |||||
// CHECK: invoke void @__cxa_rethrow() | // CHECK98: invoke void @__cxa_rethrow() | ||||
// CHECK11: call unwindabort void @__cxa_rethrow() | |||||
// CHECK: unreachable | // CHECK: unreachable | ||||
} | } | ||||
// Ensure that an exception in a constructor destroys | // Ensure that an exception in a constructor destroys | ||||
// already-constructed array members. PR14514 | // already-constructed array members. PR14514 | ||||
namespace test11 { | namespace test11 { | ||||
struct A { | struct A { | ||||
A(); | A(); | ||||
Show All 30 Lines | namespace test11 { | ||||
// Landing pad 1, from constructor in array-initialization loop: | // Landing pad 1, from constructor in array-initialization loop: | ||||
// CHECK: landingpad | // CHECK: landingpad | ||||
// - First, destroy already-constructed bits of array. | // - First, destroy already-constructed bits of array. | ||||
// CHECK: [[EMPTY:%.*]] = icmp eq [[A]]* [[ARRAYBEGIN]], [[CUR]] | // CHECK: [[EMPTY:%.*]] = icmp eq [[A]]* [[ARRAYBEGIN]], [[CUR]] | ||||
// CHECK-NEXT: br i1 [[EMPTY]] | // CHECK-NEXT: br i1 [[EMPTY]] | ||||
// CHECK: [[AFTER:%.*]] = phi [[A]]* [ [[CUR]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ] | // CHECK: [[AFTER:%.*]] = phi [[A]]* [ [[CUR]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ] | ||||
// CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1 | // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1 | ||||
// CHECK98-NEXT: invoke void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]]) | // CHECK98-NEXT: call unwindabort void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]]) | ||||
// CHECK11-NEXT: call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]]) | // CHECK11-NEXT: call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]]) | ||||
// CHECK: [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]] | // CHECK: [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]] | ||||
// CHECK-NEXT: br i1 [[DONE]], | // CHECK-NEXT: br i1 [[DONE]], | ||||
// - Next, chain to cleanup for single. | // - Next, chain to cleanup for single. | ||||
// CHECK: br label | // CHECK: br label | ||||
// Landing pad 2, from throw site. | // Landing pad 2, from throw site. | ||||
// CHECK: landingpad | // CHECK: landingpad | ||||
// - First, destroy all of array. | // - First, destroy all of array. | ||||
// CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]], [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0 | // CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]], [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0 | ||||
// CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ARRAYBEGIN]], i64 6 | // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ARRAYBEGIN]], i64 6 | ||||
// CHECK-NEXT: br label | // CHECK-NEXT: br label | ||||
// CHECK: [[AFTER:%.*]] = phi [[A]]* [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ] | // CHECK: [[AFTER:%.*]] = phi [[A]]* [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ] | ||||
// CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1 | // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1 | ||||
// CHECK98-NEXT: invoke void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]]) | // CHECK98-NEXT: call unwindabort void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]]) | ||||
// CHECK11-NEXT: call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]]) | // CHECK11-NEXT: call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[ELT]]) | ||||
// CHECK: [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]] | // CHECK: [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]] | ||||
// CHECK-NEXT: br i1 [[DONE]], | // CHECK-NEXT: br i1 [[DONE]], | ||||
// - Next, chain to cleanup for single. | // - Next, chain to cleanup for single. | ||||
// CHECK: br label | // CHECK: br label | ||||
// Finally, the cleanup for single. | // Finally, the cleanup for single. | ||||
// CHECK98: invoke void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[SINGLE]]) | // CHECK98: call unwindabort void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[SINGLE]]) | ||||
// CHECK11: call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[SINGLE]]) | // CHECK11: call void @_ZN6test111AD1Ev([[A]]* {{[^,]*}} [[SINGLE]]) | ||||
// CHECK: br label | // CHECK: br label | ||||
// CHECK: resume | // CHECK: resume | ||||
// (After this is a terminate landingpad.) | // (After this is a terminate landingpad.) | ||||
} | } | ||||
namespace test12 { | namespace test12 { | ||||
struct A { | struct A { | ||||
void operator delete(void *, void *); | void operator delete(void *, void *); | ||||
A(); | A(); | ||||
}; | }; | ||||
A *test(void *ptr) { | A *test(void *ptr) { | ||||
return new (ptr) A(); | return new (ptr) A(); | ||||
} | } | ||||
// CHECK-LABEL: define {{.*}} @_ZN6test124testEPv( | // CHECK-LABEL: define {{.*}} @_ZN6test124testEPv( | ||||
// CHECK: [[PTR:%.*]] = load i8*, i8* | // CHECK: [[PTR:%.*]] = load i8*, i8* | ||||
// CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[PTR]] to [[A:%.*]]* | // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[PTR]] to [[A:%.*]]* | ||||
// CHECK-NEXT: invoke void @_ZN6test121AC1Ev([[A]]* {{[^,]*}} [[CAST]]) | // CHECK-NEXT: invoke void @_ZN6test121AC1Ev([[A]]* {{[^,]*}} [[CAST]]) | ||||
// CHECK: ret [[A]]* [[CAST]] | // CHECK: ret [[A]]* [[CAST]] | ||||
// CHECK98: invoke void @_ZN6test121AdlEPvS1_(i8* [[PTR]], i8* [[PTR]]) | // CHECK98: call unwindabort void @_ZN6test121AdlEPvS1_(i8* [[PTR]], i8* [[PTR]]) | ||||
// CHECK11: call void @_ZN6test121AdlEPvS1_(i8* [[PTR]], i8* [[PTR]]) | // CHECK11: call void @_ZN6test121AdlEPvS1_(i8* [[PTR]], i8* [[PTR]]) | ||||
} | } | ||||
namespace test13 { | namespace test13 { | ||||
struct A { | struct A { | ||||
A(); | A(); | ||||
~A(); | ~A(); | ||||
Show All 24 Lines | |||||
// CHECK: void @_ZN6test131AD1Ev(%[[STRUCT_TEST13_A]]* {{[^,]*}} %[[REF_TMP]]) | // CHECK: void @_ZN6test131AD1Ev(%[[STRUCT_TEST13_A]]* {{[^,]*}} %[[REF_TMP]]) | ||||
void test(int c) { | void test(int c) { | ||||
const A &s = c ? static_cast<const A &>(A()) : static_cast<const A &>(A()); | const A &s = c ? static_cast<const A &>(A()) : static_cast<const A &>(A()); | ||||
} | } | ||||
} | } | ||||
// CHECK98: attributes [[NI_NR_NUW]] = { noinline noreturn nounwind {{.*}} } | // CHECK98: attributes [[NUW]] = { nounwind } |
FWI(was)W, this radar points at: https://bugs.llvm.org/show_bug.cgi?id=11893