diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 5 | ||||
-rw-r--r-- | clang/test/CodeGenObjC/encode-test-6.m | 11 | ||||
-rw-r--r-- | clang/test/SemaObjC/encode-typeof-test.m | 26 |
3 files changed, 41 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index bce0475cbc0..4e615922fe2 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -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. diff --git a/clang/test/CodeGenObjC/encode-test-6.m b/clang/test/CodeGenObjC/encode-test-6.m index 54a4eb03d5c..4e9c4222033 100644 --- a/clang/test/CodeGenObjC/encode-test-6.m +++ b/clang/test/CodeGenObjC/encode-test-6.m @@ -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) diff --git a/clang/test/SemaObjC/encode-typeof-test.m b/clang/test/SemaObjC/encode-typeof-test.m new file mode 100644 index 00000000000..2cda9739681 --- /dev/null +++ b/clang/test/SemaObjC/encode-typeof-test.m @@ -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}} +} |