[clang] b58927e - [test] Test __attribute__((noreturn)), _Noreturn, and [[return]] with conditional operator

Fangrui Song via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 5 11:18:22 PST 2023


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);
+}


        


More information about the cfe-commits mailing list