1 | // RUN: %clang_cc1 %s -triple %itanium_abi_triple -Wno-unused-value -emit-llvm -o - -std=c++11 | FileCheck %s |
2 | namespace std { |
3 | struct type_info; |
4 | } |
5 | |
6 | struct A { |
7 | virtual ~A(); |
8 | operator bool(); |
9 | }; |
10 | struct B : A {}; |
11 | |
12 | void f1(A *x) { typeid(false, *x); } |
13 | // CHECK-LABEL: define {{.*}}void @_Z2f1P1A |
14 | // CHECK: icmp eq {{.*}}, null |
15 | // CHECK-NEXT: br i1 |
16 | |
17 | void f2(bool b, A *x, A *y) { typeid(b ? *x : *y); } |
18 | // CHECK-LABEL: define {{.*}}void @_Z2f2bP1AS0_ |
19 | // CHECK: icmp eq {{.*}}, null |
20 | // CHECK-NEXT: br i1 |
21 | |
22 | void f3(bool b, A *x, A &y) { typeid(b ? *x : y); } |
23 | // CHECK-LABEL: define {{.*}}void @_Z2f3bP1ARS_ |
24 | // CHECK: icmp eq {{.*}}, null |
25 | // CHECK-NEXT: br i1 |
26 | |
27 | void f4(bool b, A &x, A *y) { typeid(b ? x : *y); } |
28 | // CHECK-LABEL: define {{.*}}void @_Z2f4bR1APS_ |
29 | // CHECK: icmp eq {{.*}}, null |
30 | // CHECK-NEXT: br i1 |
31 | |
32 | void f5(volatile A *x) { typeid(*x); } |
33 | // CHECK-LABEL: define {{.*}}void @_Z2f5PV1A |
34 | // CHECK: icmp eq {{.*}}, null |
35 | // CHECK-NEXT: br i1 |
36 | |
37 | void f6(A *x) { typeid((B &)*(B *)x); } |
38 | // CHECK-LABEL: define {{.*}}void @_Z2f6P1A |
39 | // CHECK: icmp eq {{.*}}, null |
40 | // CHECK-NEXT: br i1 |
41 | |
42 | void f7(A *x) { typeid((*x)); } |
43 | // CHECK-LABEL: define {{.*}}void @_Z2f7P1A |
44 | // CHECK: icmp eq {{.*}}, null |
45 | // CHECK-NEXT: br i1 |
46 | |
47 | void f8(A *x) { typeid(x[0]); } |
48 | // CHECK-LABEL: define {{.*}}void @_Z2f8P1A |
49 | // CHECK: icmp eq {{.*}}, null |
50 | // CHECK-NEXT: br i1 |
51 | |
52 | void f9(A *x) { typeid(0[x]); } |
53 | // CHECK-LABEL: define {{.*}}void @_Z2f9P1A |
54 | // CHECK: icmp eq {{.*}}, null |
55 | // CHECK-NEXT: br i1 |
56 | |
57 | void f10(A *x, A *y) { typeid(*y ?: *x); } |
58 | // CHECK-LABEL: define {{.*}}void @_Z3f10P1AS0_ |
59 | // CHECK: icmp eq {{.*}}, null |
60 | // CHECK-NEXT: br i1 |
61 | |
62 | void f11(A *x, A &y) { typeid(*x ?: y); } |
63 | // CHECK-LABEL: define {{.*}}void @_Z3f11P1ARS_ |
64 | // CHECK: icmp eq {{.*}}, null |
65 | // CHECK-NEXT: br i1 |
66 | |
67 | void f12(A &x, A *y) { typeid(x ?: *y); } |
68 | // CHECK-LABEL: define {{.*}}void @_Z3f12R1APS_ |
69 | // CHECK: icmp eq {{.*}}, null |
70 | // CHECK-NEXT: br i1 |
71 | |
72 | void f13(A &x, A &y) { typeid(x ?: y); } |
73 | // CHECK-LABEL: define {{.*}}void @_Z3f13R1AS0_ |
74 | // CHECK-NOT: icmp eq {{.*}}, null |
75 | |
76 | void f14(A *x) { typeid((const A &)(A)*x); } |
77 | // CHECK-LABEL: define {{.*}}void @_Z3f14P1A |
78 | // CHECK-NOT: icmp eq {{.*}}, null |
79 | |
80 | void f15(A *x) { typeid((A &&)*(A *)nullptr); } |
81 | // CHECK-LABEL: define {{.*}}void @_Z3f15P1A |
82 | // CHECK-NOT: icmp eq {{.*}}, null |
83 | |