diff --git a/clang/lib/CodeGen/CGRtti.cpp b/clang/lib/CodeGen/CGRtti.cpp index 5ac2095c2514..de26f543f634 100644 --- a/clang/lib/CodeGen/CGRtti.cpp +++ b/clang/lib/CodeGen/CGRtti.cpp @@ -253,6 +253,19 @@ public: // We expect all type_info objects for builtin types to be in the library. return BuildTypeRef(Ty); } + + case Type::Pointer: { + QualType PTy = Ty->getPointeeType(); + Qualifiers Q = PTy.getQualifiers(); + Q.removeConst(); + // T* and const T* for all builtin types T are expected in the library. + if (isa(PTy) && Q.empty()) + return BuildTypeRef(Ty); + + assert(0 && "typeid expression"); + const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext); + return llvm::Constant::getNullValue(Int8PtrTy); + } } } }; diff --git a/clang/test/CodeGenCXX/rtti.cpp b/clang/test/CodeGenCXX/rtti.cpp index adb9d2e20f7a..8af77de1c280 100644 --- a/clang/test/CodeGenCXX/rtti.cpp +++ b/clang/test/CodeGenCXX/rtti.cpp @@ -106,6 +106,8 @@ void test2_2(test1_D *dp) { test2_1(); if (typeid(int) == typeid(float)) test2_1(); + if (typeid(int*) == typeid(const int *)) + test2_1(); } // CHECK-LL:define void @_Z7test2_2P7test1_D(%class.test1_B7* %dp) nounwind { @@ -130,4 +132,6 @@ void test2_2(test1_D *dp) { // CHECK-LL-NEXT: %8 = load %"class.std::type_info"** %7 // CHECK-LL-NEXT: %call7 = call zeroext i1 @_ZNKSt9type_infoeqERKS_(%"class.std::type_info"* %8, %"class.std::type_info"* bitcast (%1* @_ZTI7test1_D to %"class.std::type_info"*)) -// CHECK-LL: %call10 = call zeroext i1 @_ZNKSt9type_infoeqERKS_(%"class.std::type_info"* bitcast (i8** @_ZTIi to %"class.std::type_info"*), %"class.std::type_info"* bitcast (i8** @_ZTIf to %"class.std::type_info"*)) ; [#uses=1] +// CHECK-LL: %call10 = call zeroext i1 @_ZNKSt9type_infoeqERKS_(%"class.std::type_info"* bitcast (i8** @_ZTIi to %"class.std::type_info"*), %"class.std::type_info"* bitcast (i8** @_ZTIf to %"class.std::type_info"*)) + +// CHECK-LL: %call13 = call zeroext i1 @_ZNKSt9type_infoeqERKS_(%"class.std::type_info"* bitcast (i8** @_ZTIPi to %"class.std::type_info"*), %"class.std::type_info"* bitcast (i8** @_ZTIPKi to %"class.std::type_info"*))