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