From: Fariborz Jahanian Date: Mon, 6 Apr 2015 16:56:39 +0000 (+0000) Subject: [Objective-C patch] Patch to fix a crash in IRGen because X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=38bc66da56b5700fa307621e725275969a372b09;p=clang [Objective-C patch] Patch to fix a crash in IRGen because of incorrect AST when a compound literal of Objective-C property access is used to initialize a vertor of floats. rdar://20407999 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234176 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp index b3efa70b43..212c554715 100644 --- a/lib/Sema/SemaExprMember.cpp +++ b/lib/Sema/SemaExprMember.cpp @@ -1519,7 +1519,15 @@ static ExprResult LookupMemberExpr(Sema &S, LookupResult &R, if (BaseType->isExtVectorType()) { // FIXME: this expr should store IsArrow. IdentifierInfo *Member = MemberName.getAsIdentifierInfo(); - ExprValueKind VK = (IsArrow ? VK_LValue : BaseExpr.get()->getValueKind()); + ExprValueKind VK; + if (IsArrow) + VK = VK_LValue; + else { + if (PseudoObjectExpr *POE = dyn_cast(BaseExpr.get())) + VK = POE->getSyntacticForm()->getValueKind(); + else + VK = BaseExpr.get()->getValueKind(); + } QualType ret = CheckExtVectorComponent(S, BaseType, VK, OpLoc, Member, MemberLoc); if (ret.isNull()) diff --git a/test/CodeGenObjC/compound-literal-property-access.m b/test/CodeGenObjC/compound-literal-property-access.m new file mode 100644 index 0000000000..bc1bd78e0c --- /dev/null +++ b/test/CodeGenObjC/compound-literal-property-access.m @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 %s -emit-llvm -triple x86_64-apple-darwin -o - | FileCheck %s +// rdar://20407999 + +typedef __attribute__((__ext_vector_type__(2))) float vector_float2; + +@interface GPAgent2D +@property (nonatomic, assign) vector_float2 position; +@end + +@interface GPGoal @end + +@implementation GPGoal +-(void)getForce { + GPAgent2D* targetAgent; + (vector_float2){targetAgent.position.x, targetAgent.position.y}; +} +@end + +// CHECK: [[CL:%.*]] = alloca <2 x float>, align 8 +// CHECK: store <2 x float> [[VECINIT:%.*]], <2 x float>* [[CL]] +// CHECK: [[FOURTEEN:%.*]] = load <2 x float>, <2 x float>* [[CL]]