From: Fariborz Jahanian Date: Tue, 28 Jan 2014 20:41:15 +0000 (+0000) Subject: Objective-C. provide legacy encoding of *id and *Class types X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7c447ca017b674be488acbbeda972c3dfe0b5aa3;p=clang Objective-C. provide legacy encoding of *id and *Class types instead of crashing. // rdar://15824769. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@200338 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index ad3bf5105d..9ee624c98b 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -5440,7 +5440,19 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, return; } - case Type::ObjCObject: + case Type::ObjCObject: { + // hack to match legacy encoding of *id and *Class + QualType Ty = getObjCObjectPointerType(CT); + if (Ty->isObjCIdType()) { + S += "{objc_object=}"; + return; + } + else if (Ty->isObjCClassType()) { + S += "{objc_class=}"; + return; + } + } + case Type::ObjCInterface: { // Ignore protocol qualifiers when mangling at this level. T = T->castAs()->getBaseType(); diff --git a/test/CodeGenObjC/encode-test.m b/test/CodeGenObjC/encode-test.m index d6e7b6dfcc..a310a621ec 100644 --- a/test/CodeGenObjC/encode-test.m +++ b/test/CodeGenObjC/encode-test.m @@ -169,3 +169,11 @@ const char g11[] = @encode(void); // PR14628 // CHECK: @g12 = constant [3 x i8] c"Ai\00" const char g12[] = @encode(_Atomic(int)); + +// rdar://15824769 +id test_id = 0; +Class test_class = 0; +const char g13[] = @encode(__typeof__(*test_class)); +const char g14[] = @encode(__typeof__(*test_id)); +// CHECK: constant [14 x i8] c"{objc_class=}\00" +// CHECK: constant [15 x i8] c"{objc_object=}\00"