Author: Fangrui Song Date: 2023-01-05T11:18:17-08:00 New Revision: b58927ec0c4e57e24d5868802bd3ee119e552454
URL: https://github.com/llvm/llvm-project/commit/b58927ec0c4e57e24d5868802bd3ee119e552454 DIFF: https://github.com/llvm/llvm-project/commit/b58927ec0c4e57e24d5868802bd3ee119e552454.diff LOG: [test] Test __attribute__((noreturn)), _Noreturn, and [[return]] with conditional operator Added: Modified: clang/test/CodeGen/attr-noreturn.c Removed: ################################################################################ diff --git a/clang/test/CodeGen/attr-noreturn.c b/clang/test/CodeGen/attr-noreturn.c index b4420bd5678c3..d6f21c61ba436 100644 --- a/clang/test/CodeGen/attr-noreturn.c +++ b/clang/test/CodeGen/attr-noreturn.c @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -emit-llvm -std=c2x %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple %itanium_abi_triple -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-CXX typedef void (*fptrs_t[4])(void); fptrs_t p __attribute__((noreturn)); @@ -8,3 +9,47 @@ void __attribute__((noreturn)) f(void) { } // CHECK: call void // CHECK-NEXT: unreachable + +// CHECK-LABEL: @test_conditional_gnu( +// CHECK: %cond = select i1 %tobool, ptr @t1, ptr @t2 +// CHECK: call void %cond( +// CHECK-NEXT: unreachable + +// CHECK-CXX-LABEL: @_Z20test_conditional_gnui( +// CHECK-CXX: %cond{{.*}} = phi ptr [ @_Z2t1i, %{{.*}} ], [ @_Z2t2i, %{{.*}} ] +// CHECK-CXX: call void %cond{{.*}}( +// CHECK-CXX: %cond{{.*}} = phi ptr [ @_Z2t1i, %{{.*}} ], [ @_Z2t1i, %{{.*}} ] +// CHECK-CXX: call void %cond{{.*}}( +// CHECK-CXX-NEXT: unreachable +void t1(int) __attribute__((noreturn)); +void t2(int); +__attribute__((noreturn)) void test_conditional_gnu(int a) { + // The conditional operator isn't noreturn because t2 isn't. + (a ? t1 : t2)(a); + // The conditional operator is noreturn. + (a ? t1 : t1)(a); +} + +// CHECK-LABEL: @test_conditional_Noreturn( +// CHECK: %cond = select i1 %tobool, ptr @t3, ptr @t2 +// CHECK: call void %cond( +// CHECK: %cond2 = select i1 %tobool1, ptr @t3, ptr @t3 +// CHECK: call void %cond2( +// CHECK-NEXT: ret void +_Noreturn void t3(int); +_Noreturn void test_conditional_Noreturn(int a) { + (a ? t3 : t2)(a); + (a ? t3 : t3)(a); +} + +// CHECK-LABEL: @test_conditional_std( +// CHECK: %cond = select i1 %tobool, ptr @t4, ptr @t2 +// CHECK: call void %cond( +// CHECK: %cond2 = select i1 %tobool1, ptr @t4, ptr @t4 +// CHECK: call void %cond2( +// CHECK-NEXT: ret void +[[noreturn]] void t4(int); +[[noreturn]] void test_conditional_std(int a) { + (a ? t4 : t2)(a); + (a ? t4 : t4)(a); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits