diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2014-03-06 00:34:05 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-03-06 00:34:05 +0000 |
commit | 47a43526f5dc54337348fa55b9b5524d47872c1c (patch) | |
tree | 7d961582530cc78b40f2cd0d9673bd033c095bd2 /lib/Sema/SemaPseudoObject.cpp | |
parent | 8762737b6a4e12a600066fbde654aa9f05cd2048 (diff) |
Objective-C properties. Fixes a crash in Sema where RHS of
the property assignment is an lvalue for an incomplete type.
// rdar://15118128. Reviewed offline by John McCall.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203043 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaPseudoObject.cpp')
-rw-r--r-- | lib/Sema/SemaPseudoObject.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp index 81657e366e..0f1df58e6d 100644 --- a/lib/Sema/SemaPseudoObject.cpp +++ b/lib/Sema/SemaPseudoObject.cpp @@ -235,7 +235,10 @@ namespace { } /// Return true if assignments have a non-void result. - bool CanCaptureValueOfType(QualType ty) { + bool CanCaptureValue(Expr *exp) { + if (exp->isGLValue()) + return true; + QualType ty = exp->getType(); assert(!ty->isIncompleteType()); assert(!ty->isDependentType()); @@ -461,7 +464,7 @@ PseudoOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc, // That's the postfix result. if (UnaryOperator::isPostfix(opcode) && - (result.get()->isTypeDependent() || CanCaptureValueOfType(resultType))) { + (result.get()->isTypeDependent() || CanCaptureValue(result.get()))) { result = capture(result.take()); setResultToLastSemantic(); } @@ -762,7 +765,7 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, ObjCMessageExpr *msgExpr = cast<ObjCMessageExpr>(msg.get()->IgnoreImplicit()); Expr *arg = msgExpr->getArg(0); - if (CanCaptureValueOfType(arg->getType())) + if (CanCaptureValue(arg)) msgExpr->setArg(0, captureValueAsResult(arg)); } @@ -1368,7 +1371,7 @@ ExprResult ObjCSubscriptOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, ObjCMessageExpr *msgExpr = cast<ObjCMessageExpr>(msg.get()->IgnoreImplicit()); Expr *arg = msgExpr->getArg(0); - if (CanCaptureValueOfType(arg->getType())) + if (CanCaptureValue(arg)) msgExpr->setArg(0, captureValueAsResult(arg)); } |