From: Akira Hatanaka Date: Wed, 29 May 2019 21:23:30 +0000 (+0000) Subject: [ObjC] Fix encoding of ObjC pointer types that are pointers to typedefs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d64e6eeea912442cc75aa09d187bbdb9340d7fb7;p=clang [ObjC] Fix encoding of ObjC pointer types that are pointers to typedefs clang was encoding pointers to typedefs as if they were pointers to structs because that is apparently what gcc is doing. For example: ``` @class Class1; typedef NSArray MyArray; void foo1(void) { const char *s0 = @encode(MyArray *); // "^{NSArray=#}" const char *s1 = @encode(NSArray *); // "@" } ``` This commit removes the code that was there to make clang compatible with gcc and make clang emit the correct encoding for ObjC pointers, which is "@". rdar://problem/50563529 Differential Revision: https://reviews.llvm.org/D61974 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@362034 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index 6856cb6585..93d93841b8 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -2897,7 +2897,6 @@ private: V(IsStructField, 4) \ V(EncodeBlockParameters, 5) \ V(EncodeClassNames, 6) \ - V(EncodePointerToObjCTypedef, 7) #define V(N,I) ObjCEncOptions& set##N() { Bits |= 1 << I; return *this; } OPT_LIST(V) @@ -2916,8 +2915,7 @@ OPT_LIST(V) LLVM_NODISCARD ObjCEncOptions forComponentType() const { ObjCEncOptions Mask = ObjCEncOptions() .setIsOutermostType() - .setIsStructField() - .setEncodePointerToObjCTypedef(); + .setIsStructField(); return Bits & ~Mask.Bits; } }; diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index c3a09723ef..87ecb5a57b 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -6927,13 +6927,10 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S, getObjCEncodingForTypeImpl(Field->getType(), S, ObjCEncOptions().setExpandStructures(), Field); - else { - ObjCEncOptions NewOptions = ObjCEncOptions().setExpandStructures(); - if (Options.EncodePointerToObjCTypedef()) - NewOptions.setEncodePointerToObjCTypedef(); - getObjCEncodingForTypeImpl(Field->getType(), S, NewOptions, FD, + else + getObjCEncodingForTypeImpl(Field->getType(), S, + ObjCEncOptions().setExpandStructures(), FD, NotEncodedT); - } } } S += '}'; @@ -6976,36 +6973,6 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S, return; } - QualType PointeeTy = OPT->getPointeeType(); - if (!Options.EncodingProperty() && - isa(PointeeTy.getTypePtr()) && - !Options.EncodePointerToObjCTypedef()) { - // Another historical/compatibility reason. - // We encode the underlying type which comes out as - // {...}; - S += '^'; - if (FD && OPT->getInterfaceDecl()) { - // Prevent recursive encoding of fields in some rare cases. - ObjCInterfaceDecl *OI = OPT->getInterfaceDecl(); - SmallVector Ivars; - DeepCollectObjCIvars(OI, true, Ivars); - for (unsigned i = 0, e = Ivars.size(); i != e; ++i) { - if (Ivars[i] == FD) { - S += '{'; - S += OI->getObjCRuntimeNameAsString(); - S += '}'; - return; - } - } - } - ObjCEncOptions NewOptions = - ObjCEncOptions().setEncodePointerToObjCTypedef(); - if (Options.ExpandPointedToStructures()) - NewOptions.setExpandStructures(); - getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions, /*Field=*/nullptr); - return; - } - S += '@'; if (OPT->getInterfaceDecl() && (FD || Options.EncodingProperty() || Options.EncodeClassNames())) { diff --git a/test/CodeGenObjC/encode-test-6.m b/test/CodeGenObjC/encode-test-6.m index 583ba5ab4d..99f53a5059 100644 --- a/test/CodeGenObjC/encode-test-6.m +++ b/test/CodeGenObjC/encode-test-6.m @@ -34,7 +34,7 @@ typedef BABugExample BABugExampleRedefinition; @synthesize property = _property; @end -// CHECK: private unnamed_addr constant [24 x i8] c"^{BABugExample=@}16 +// CHECK: private unnamed_addr constant [8 x i8] c"@16 // rdar://14408244 @class SCNCamera; @@ -52,7 +52,7 @@ typedef struct C3DCameraStorage _storage; } @end -// CHECK: private unnamed_addr constant [39 x i8] c"{?=\22presentationInstance\22^{SCNCamera}}\00" +// CHECK: private unnamed_addr constant [39 x i8] c"{?=\22presentationInstance\22@\22SCNCamera\22}\00" // rdar://16655340 int i; diff --git a/test/CodeGenObjC/encode-test.m b/test/CodeGenObjC/encode-test.m index 113dbef95f..bf5340c5c5 100644 --- a/test/CodeGenObjC/encode-test.m +++ b/test/CodeGenObjC/encode-test.m @@ -107,7 +107,7 @@ const char g3[] = @encode(const struct S *); // CHECK: @g4 = constant [6 x i8] c"{S=i}\00" const char g4[] = @encode(const struct S); -// CHECK: @g5 = constant [12 x i8] c"^{Object=#}\00" +// CHECK: @g5 = constant [2 x i8] c"@\00" const char g5[] = @encode(MyObj * const); //// diff --git a/test/CodeGenObjCXX/encode.mm b/test/CodeGenObjCXX/encode.mm index e4c7618f50..7bc64dafb4 100644 --- a/test/CodeGenObjCXX/encode.mm +++ b/test/CodeGenObjCXX/encode.mm @@ -242,6 +242,6 @@ struct S { @end const char *expand_struct() { - // CHECK: @{{.*}} = private unnamed_addr constant [16 x i8] c"{N={S=^{N}}}\00" + // CHECK: @{{.*}} = private unnamed_addr constant [13 x i8] c"{N={S=@}}\00" return @encode(N); }