r175298 - objective-C: Fixes a compiler crash when encoding

Fariborz Jahanian fjahanian at apple.com
Fri Feb 15 13:14:50 PST 2013


Author: fjahanian
Date: Fri Feb 15 15:14:50 2013
New Revision: 175298

URL: http://llvm.org/viewvc/llvm-project?rev=175298&view=rev
Log:
objective-C: Fixes a compiler crash when encoding
an ivar of type pointer to a typedef'ed object.
// rdar://13190095

Modified:
    cfe/trunk/include/clang/AST/ASTContext.h
    cfe/trunk/lib/AST/ASTContext.cpp
    cfe/trunk/test/CodeGenObjC/encode-test-6.m

Modified: cfe/trunk/include/clang/AST/ASTContext.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=175298&r1=175297&r2=175298&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/ASTContext.h (original)
+++ cfe/trunk/include/clang/AST/ASTContext.h Fri Feb 15 15:14:50 2013
@@ -2119,7 +2119,8 @@ private:
                                   bool EncodingProperty = false,
                                   bool StructField = false,
                                   bool EncodeBlockParameters = false,
-                                  bool EncodeClassNames = false) const;
+                                  bool EncodeClassNames = false,
+                                  bool EncodePointerToObjCTypedef = false) const;
 
   // Adds the encoding of the structure's members.
   void getObjCEncodingForStructureImpl(RecordDecl *RD, std::string &S,

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=175298&r1=175297&r2=175298&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Fri Feb 15 15:14:50 2013
@@ -4994,7 +4994,8 @@ void ASTContext::getObjCEncodingForTypeI
                                             bool EncodingProperty,
                                             bool StructField,
                                             bool EncodeBlockParameters,
-                                            bool EncodeClassNames) const {
+                                            bool EncodeClassNames,
+                                            bool EncodePointerToObjCTypedef) const {
   CanQualType CT = getCanonicalType(T);
   switch (CT->getTypeClass()) {
   case Type::Builtin:
@@ -5244,7 +5245,9 @@ void ASTContext::getObjCEncodingForTypeI
       if (Field->isBitField())
         getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field);
       else
-        getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD);
+        getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD,
+                                   false, false, false, false, false,
+                                   EncodePointerToObjCTypedef);
     }
     S += '}';
     return;
@@ -5286,14 +5289,17 @@ void ASTContext::getObjCEncodingForTypeI
 
     QualType PointeeTy = OPT->getPointeeType();
     if (!EncodingProperty &&
-        isa<TypedefType>(PointeeTy.getTypePtr())) {
+        isa<TypedefType>(PointeeTy.getTypePtr()) &&
+        !EncodePointerToObjCTypedef) {
       // Another historical/compatibility reason.
       // We encode the underlying type which comes out as
       // {...};
       S += '^';
       getObjCEncodingForTypeImpl(PointeeTy, S,
                                  false, ExpandPointedToStructures,
-                                 NULL);
+                                 NULL,
+                                 false, false, false, false, false,
+                                 /*EncodePointerToObjCTypedef*/true);
       return;
     }
 

Modified: cfe/trunk/test/CodeGenObjC/encode-test-6.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/encode-test-6.m?rev=175298&r1=175297&r2=175298&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/encode-test-6.m (original)
+++ cfe/trunk/test/CodeGenObjC/encode-test-6.m Fri Feb 15 15:14:50 2013
@@ -17,3 +17,21 @@ typedef struct {} Z;
 // CHECK: internal global [14 x i8] c"v16 at 0:8{?=}16
 // CHECK: internal global [26 x i8] c"v32 at 0:8{?=}16*16{?=}24d24
 
+
+// rdar://13190095
+ at interface NSObject @end
+
+ at class BABugExample;
+typedef BABugExample BABugExampleRedefinition;
+
+ at interface BABugExample : NSObject {
+    BABugExampleRedefinition *_property; // .asciz   "^{BABugExample=^{BABugExample}}"
+}
+ at property (copy) BABugExampleRedefinition *property;
+ at end
+
+ at implementation BABugExample
+ at synthesize property = _property;
+ at end
+
+// CHECK: internal global [24 x i8] c"^{BABugExample=@}16





More information about the cfe-commits mailing list