Objective-C [IRGen]. Fixes a crash in IRGen involving use of

'typeof' to extract type of an @encode expression used
in an initializer. // rdar://16655340

llvm-svn: 207004
This commit is contained in:
Fariborz Jahanian 2014-04-23 17:44:58 +00:00
parent eb08c4f038
commit 9da2a799ab
3 changed files with 41 additions and 1 deletions

View File

@ -836,7 +836,10 @@ public:
// as an inline array.
std::string Str;
CGM.getContext().getObjCEncodingForType(E->getEncodedType(), Str);
const ConstantArrayType *CAT = cast<ConstantArrayType>(E->getType());
QualType T = E->getType();
if (T->getTypeClass() == Type::TypeOfExpr)
T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType();
const ConstantArrayType *CAT = cast<ConstantArrayType>(T);
// Resize the string to the right size, adding zeros at the end, or
// truncating as needed.

View File

@ -53,3 +53,14 @@ typedef struct
}
@end
// CHECK: private global [39 x i8] c"{?=\22presentationInstance\22^{SCNCamera}}\00"
// rdar://16655340
int i;
typeof(@encode(typeof(i))) e = @encode(typeof(i));
const char * Test()
{
return e;
}
// CHECK: @e = global [2 x i8] c"i\00", align 1
// CHECK: define i8* @Test()
// CHECK: ret i8* getelementptr inbounds ([2 x i8]* @e, i32 0, i32 0)

View File

@ -0,0 +1,26 @@
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
// rdar://16655340
@protocol X, Y, Z;
@class Foo;
@protocol Proto
@end
@interface Intf <Proto>
{
id <X> IVAR_x;
id <X, Y> IVAR_xy;
id <X, Y, Z> IVAR_xyz;
Foo <X, Y, Z> *IVAR_Fooxyz;
Class <X> IVAR_Classx;
}
@end
@implementation Intf
@end
int main()
{
int i;
typeof(@encode(typeof(i))) e = @encode(typeof(Intf)); // expected-warning {{initializer-string for char array is too long}}
}