]> granicus.if.org Git - clang/commitdiff
Strangely enough, name of ObjC class is not encoded into the
authorFariborz Jahanian <fjahanian@apple.com>
Sat, 20 Dec 2008 19:17:01 +0000 (19:17 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Sat, 20 Dec 2008 19:17:01 +0000 (19:17 +0000)
full encoding of the class which has an ivar of pointer to this
class. Its name is encoded in the type for the ivar in the
ivar-list metadata. This patch conforms to the above rule.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61282 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
test/CodeGenObjC/encode-test.m

index c50a02102821b28880089e1736f6aad66ad6fd06..d03ed41a152fb5335ee088b6e1d96e377b02105f 100644 (file)
@@ -1795,10 +1795,12 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
     }
     else if (PointeeTy->isObjCInterfaceType()) {
       S += '@';
-      ObjCInterfaceDecl *OI = PointeeTy->getAsObjCInterfaceType()->getDecl();
-      S += '"';
-      S += OI->getNameAsCString();
-      S += '"';
+      if (FD) {
+        ObjCInterfaceDecl *OI = PointeeTy->getAsObjCInterfaceType()->getDecl();
+        S += '"';
+        S += OI->getNameAsCString();
+        S += '"';
+      }
       return;
     } else if (isObjCClassType(PointeeTy)) {
       S += '#';
index 982faf03bad6c1ca5095e658274c211af11edd16..109f0573e522f1d47d13a06df794835c971ccbfd 100644 (file)
@@ -1,6 +1,7 @@
 // RUN: clang -fnext-runtime -emit-llvm -o %t %s &&
 // RUN: grep -e "\^{Innermost=CC}" %t | count 1 &&
-// RUN: grep -e "{Derived=#ib32b8b3b8sb16b8b8b2b8ccb6}" %t | count 1
+// RUN: grep -e "{Derived=#ib32b8b3b8sb16b8b8b2b8ccb6}" %t | count 1 &&
+// RUN: grep -e "{B1=#@c}" %t | count 1
 
 @class Int1;
 
@@ -48,8 +49,20 @@ struct Innermost {
 @implementation Derived
 @end
 
+@interface B1 
+{
+    struct objc_class *isa;
+    Int1 *sBase;
+    char c;
+}
+@end
+
+@implementation B1
+@end
+
 int main()
 {
        const char *en = @encode(Derived);
+       const char *eb = @encode(B1);
 }