1// RUN: %clang_cc1 %s -triple %itanium_abi_triple -Wno-unused-value -emit-llvm -o - -std=c++11 | FileCheck %s 2namespace std { 3struct type_info; 4} 5 6struct A { 7 virtual ~A(); 8 operator bool(); 9}; 10struct B : A {}; 11 12void f1(A *x) { typeid(false, *x); } 13// CHECK-LABEL: define {{.*}}void @_Z2f1P1A 14// CHECK: icmp eq {{.*}}, null 15// CHECK-NEXT: br i1 16 17void 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 22void 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 27void 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 32void f5(volatile A *x) { typeid(*x); } 33// CHECK-LABEL: define {{.*}}void @_Z2f5PV1A 34// CHECK: icmp eq {{.*}}, null 35// CHECK-NEXT: br i1 36 37void f6(A *x) { typeid((B &)*(B *)x); } 38// CHECK-LABEL: define {{.*}}void @_Z2f6P1A 39// CHECK: icmp eq {{.*}}, null 40// CHECK-NEXT: br i1 41 42void f7(A *x) { typeid((*x)); } 43// CHECK-LABEL: define {{.*}}void @_Z2f7P1A 44// CHECK: icmp eq {{.*}}, null 45// CHECK-NEXT: br i1 46 47void f8(A *x) { typeid(x[0]); } 48// CHECK-LABEL: define {{.*}}void @_Z2f8P1A 49// CHECK: icmp eq {{.*}}, null 50// CHECK-NEXT: br i1 51 52void f9(A *x) { typeid(0[x]); } 53// CHECK-LABEL: define {{.*}}void @_Z2f9P1A 54// CHECK: icmp eq {{.*}}, null 55// CHECK-NEXT: br i1 56 57void 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 62void 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 67void 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 72void f13(A &x, A &y) { typeid(x ?: y); } 73// CHECK-LABEL: define {{.*}}void @_Z3f13R1AS0_ 74// CHECK-NOT: icmp eq {{.*}}, null 75 76void f14(A *x) { typeid((const A &)(A)*x); } 77// CHECK-LABEL: define {{.*}}void @_Z3f14P1A 78// CHECK-NOT: icmp eq {{.*}}, null 79 80void f15(A *x) { typeid((A &&)*(A *)nullptr); } 81// CHECK-LABEL: define {{.*}}void @_Z3f15P1A 82// CHECK-NOT: icmp eq {{.*}}, null 83