]> granicus.if.org Git - clang/commitdiff
Add typeinfo support for T* and const T* for all builtin types T.
authorMike Stump <mrs@apple.com>
Tue, 17 Nov 2009 02:57:13 +0000 (02:57 +0000)
committerMike Stump <mrs@apple.com>
Tue, 17 Nov 2009 02:57:13 +0000 (02:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89030 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGRtti.cpp
test/CodeGenCXX/rtti.cpp

index 5ac2095c251496c994874890043ed6c5537cb23b..de26f543f6349ba23a08f3f6ec0598a89aec24ec 100644 (file)
@@ -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<BuiltinType>(PTy) && Q.empty())
+        return BuildTypeRef(Ty);
+
+      assert(0 && "typeid expression");
+      const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext);
+      return llvm::Constant::getNullValue(Int8PtrTy);
+    }
     }
   }
 };
index adb9d2e20f7a3fc8bba14dcab05298178c5baa12..8af77de1c280bd3b0caea88c7527492c6776923a 100644 (file)
@@ -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"*)) ; <i1> [#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"*))