]> granicus.if.org Git - clang/commitdiff
[CodeGen][ObjC] Fix a bug where the type of an ivar wasn't encoded
authorAkira Hatanaka <ahatanaka@apple.com>
Tue, 14 Mar 2017 04:00:52 +0000 (04:00 +0000)
committerAkira Hatanaka <ahatanaka@apple.com>
Tue, 14 Mar 2017 04:00:52 +0000 (04:00 +0000)
correctly.

This fixes PR30413.

Patch by David Lobron.

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

lib/CodeGen/CGObjCGNU.cpp
test/CodeGenObjC/ivar-type-encoding.m [new file with mode: 0644]

index ce39bd1c94773f0623763dc4f71c398ec87d500a..9f6ccb4b5d2660539b25628d2da4332a127fd092 100644 (file)
@@ -2207,7 +2207,7 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) {
       IvarNames.push_back(MakeConstantString(IVD->getNameAsString()));
       // Get the type encoding for this ivar
       std::string TypeStr;
-      Context.getObjCEncodingForType(IVD->getType(), TypeStr);
+      Context.getObjCEncodingForType(IVD->getType(), TypeStr, IVD);
       IvarTypes.push_back(MakeConstantString(TypeStr));
       // Get the offset
       uint64_t BaseOffset = ComputeIvarBaseOffset(CGM, OID, IVD);
diff --git a/test/CodeGenObjC/ivar-type-encoding.m b/test/CodeGenObjC/ivar-type-encoding.m
new file mode 100644 (file)
index 0000000..ffa5e0d
--- /dev/null
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -S -emit-llvm -fobjc-runtime=gcc -o - %s | FileCheck %s
+
+@protocol NSCopying
+@end
+
+@interface NSObject {
+  struct objc_object *isa;
+}
++ (id) new;
+- (id) init;
+@end
+
+@interface NSString : NSObject <NSCopying>
++ (NSString *)foo;
+@end
+
+@interface TestClass : NSObject {
+@public
+  NSString    *_stringIvar;
+  int         _intIvar;
+}
+@end
+@implementation TestClass
+
+@end
+
+int main() {
+  TestClass *c = [TestClass new];
+  return 0;
+}
+
+// CHECK: @0 = private unnamed_addr constant [12 x i8] c"_stringIvar\00"
+// CHECK: @1 = private unnamed_addr constant [12 x i8] c"@\22NSString\22\00"
+// CHECK: @2 = private unnamed_addr constant [9 x i8] c"_intIvar\00"
+// CHECK: @3 = private unnamed_addr constant [2 x i8] c"i\00"