1 // RUN: %clang_cc1 -std=c++1z -mqualified-function-type-info -I%S %s -triple x86_64-linux-gnu -emit-llvm -o - -fcxx-exceptions | FileCheck %s 2 3 #include "typeinfo" 4 5 struct A {}; 6 7 // CHECK-DAG: @_ZTIKFvvE = [[QFTI:linkonce_odr constant { i8\*, i8\*, i8\*, i32 } { i8\* bitcast \(i8\*\* getelementptr inbounds \(i8\*, i8\*\* @_ZTVN10__cxxabiv130__qualified_function_type_infoE, i64 2\) to i8\*\),]] i8* getelementptr inbounds ([6 x i8], [6 x i8]* @_ZTSKFvvE, i32 0, i32 0), i8* bitcast ({ i8*, i8* }* @_ZTIFvvE to i8*), i32 1 }, comdat 8 // CHECK-DAG: @_ZTIM1AKFvvE = [[PMFTI:linkonce_odr constant { i8\*, i8\*, i32, i8\*, i8\* } { i8\* bitcast \(i8\*\* getelementptr inbounds \(i8\*, i8\*\* @_ZTVN10__cxxabiv129__pointer_to_member_type_infoE, i64 2\) to i8\*\),]] i8* getelementptr inbounds ([9 x i8], [9 x i8]* @_ZTSM1AKFvvE, i32 0, i32 0), i32 0, i8* bitcast ({ i8*, i8*, i8*, i32 }* @_ZTIKFvvE to i8*), i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*) }, comdat 9 auto &ti_const = typeid(void (A::*)() const); 10 11 // CHECK-DAG: @_ZTIVFvvE = [[QFTI]] {{.*}} @_ZTIFvvE {{.*}}, i32 2 }, comdat 12 // CHECK-DAG: @_ZTIM1AVFvvE = [[PMFTI]] {{.*}}), i32 0, {{.*}} @_ZTIVFvvE 13 auto &ti_volatile = typeid(void (A::*)() volatile); 14 15 // CHECK-DAG: @_ZTIrFvvE = [[QFTI]] {{.*}} @_ZTIFvvE {{.*}}, i32 4 }, comdat 16 // CHECK-DAG: @_ZTIM1ArFvvE = [[PMFTI]] {{.*}}), i32 0, {{.*}} @_ZTIrFvvE 17 auto &ti_restrict = typeid(void (A::*)() __restrict); 18 19 // CHECK-DAG: @_ZTIFvvRE = [[QFTI]] {{.*}} @_ZTIFvvE {{.*}}, i32 8 }, comdat 20 // CHECK-DAG: @_ZTIM1AFvvRE = [[PMFTI]] {{.*}}), i32 0, {{.*}} @_ZTIFvvRE 21 auto &ti_lref = typeid(void (A::*)() &); 22 23 // CHECK-DAG: @_ZTIFvvOE = [[QFTI]] {{.*}} @_ZTIFvvE {{.*}}, i32 16 }, comdat 24 // CHECK-DAG: @_ZTIM1AFvvOE = [[PMFTI]] {{.*}}), i32 0, {{.*}} @_ZTIFvvOE 25 auto &ti_rref = typeid(void (A::*)() &&); 26 27 // CHECK-DAG: @_ZTIDoFvvE = [[QFTI]] {{.*}} @_ZTIFvvE {{.*}}, i32 32 }, comdat 28 // CHECK-DAG: @_ZTIM1ADoFvvE = [[PMFTI]] {{.*}}), i32 0, {{.*}} @_ZTIDoFvvE 29 auto &ti_noexcept = typeid(void (A::*)() noexcept); 30 31 //auto &ti_txsafe = typeid(void (A::*)() transaction_safe); 32 33 // FIXME: Produce the typeinfo for a noreturn function type here? 34 // CHECK-DAG: @_ZTIM1AFvvE = [[PMFTI]] {{.*}}), i32 0, {{.*}} @_ZTIFvvE 35 auto &ti_noreturn = typeid(void __attribute__((noreturn)) (A::*)()); 36 37 // CHECK-DAG: @_ZTIrVKDoFvvRE = [[QFTI]] {{.*}} @_ZTIFvvE {{.*}}, i32 47 }, comdat 38 // CHECK-DAG: @_ZTIM1ArVKDoFvvRE = [[PMFTI]] {{.*}}), i32 0, {{.*}} @_ZTIrVKDoFvvRE 39 auto &ti_rainbow = typeid(void (A::*)() const volatile __restrict & noexcept); 40 41 // CHECK-LABEL: define void @_Z1fv( 42 __attribute__((noreturn)) void f() noexcept { 43 // CHECK: call void @__cxa_throw({{.*}}@_ZTIPDoFvvE 44 throw f; 45 } 46 47 // CHECK-LABEL: define void @_Z1gM1ADoFvvE( 48 void g(__attribute__((noreturn)) void (A::*p)() noexcept) { 49 // CHECK: call void @__cxa_throw({{.*}}@_ZTIM1ADoFvvE 50 throw p; 51 } 52