File: attr-noreturn.c

package info (click to toggle)
llvm-toolchain-16 1%3A16.0.6-15~deb11u2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,634,820 kB
  • sloc: cpp: 6,179,261; ansic: 1,216,205; asm: 741,319; python: 196,614; objc: 75,325; f90: 49,640; lisp: 32,396; pascal: 12,286; sh: 9,394; perl: 7,442; ml: 5,494; awk: 3,523; makefile: 2,723; javascript: 1,206; xml: 886; fortran: 581; cs: 573
file content (56 lines) | stat: -rw-r--r-- 1,927 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 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));

void __attribute__((noreturn)) f(void) {
  p[0]();
}
// 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:         call void %cond2(
// 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);
}