blob: 2e60ac6889a24f3eeaeb1a645f1628c5917df78e [file] [edit]
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -emit-llvm %s -triple x86_64-unknown-linux-gnu -o - | FileCheck %s
// musttail in noexcept functions should work when the callee is also noexcept.
int NoexceptCallee(int) noexcept;
int ThrowingFunc(int);
// CHECK-LABEL: define {{.*}} @_Z12TestNoexcepti(
// CHECK: musttail call {{.*}} @_Z14NoexceptCalleei(
// CHECK-NEXT: ret i32
int TestNoexcept(int x) noexcept {
[[clang::musttail]] return NoexceptCallee(x);
}
// Noexcept caller with regular call to non-noexcept, then musttail to noexcept.
// CHECK-LABEL: define {{.*}} @_Z21TestMixedCallNoexcepti(
// CHECK: invoke {{.*}} @_Z12ThrowingFunci(
// CHECK-NEXT: to label %{{.*}} unwind label %terminate.lpad
// CHECK: musttail call {{.*}} @_Z14NoexceptCalleei(
// CHECK-NEXT: ret i32
// CHECK: terminate.lpad:
// CHECK: call void @__clang_call_terminate(
int TestMixedCallNoexcept(int x) noexcept {
int y = ThrowingFunc(x);
[[clang::musttail]] return NoexceptCallee(y);
}
// Noexcept caller musttails to itself (recursive).
// CHECK-LABEL: define {{.*}} @_Z13TestRecursivei(
// CHECK: musttail call {{.*}} @_Z13TestRecursivei(
// CHECK-NEXT: ret i32
int TestRecursive(int x) noexcept {
[[clang::musttail]] return TestRecursive(x);
}