From c3f48cd3f08c384de50a3eeceaa79f4800a35f19 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 14 Sep 2009 16:40:48 +0000 Subject: [PATCH] Using the property dot-syntax to invoke a non-eixsting structure-valued setter should cause a user error instead of crash. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81769 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/Expr.cpp | 19 ++++++++------- .../SemaObjC/property-error-readonly-assign.m | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index fa020de7a3..620b5b8901 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1061,12 +1061,18 @@ Expr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const { // void takeclosure(void (^C)(void)); // void func() { int x = 1; takeclosure(^{ x = 7; }); } // - if (isa(this)) { - const BlockDeclRefExpr *BDR = cast(this); + if (const BlockDeclRefExpr *BDR = dyn_cast(this)) { if (!BDR->isByRef() && isa(BDR->getDecl())) return MLV_NotBlockQualified; } - + + // Assigning to an 'implicit' property? + if (const ObjCImplicitSetterGetterRefExpr* Expr = + dyn_cast(this)) { + if (Expr->getSetterMethod() == 0) + return MLV_NoSetterProperty; + } + QualType CT = Ctx.getCanonicalType(getType()); if (CT.isConstQualified()) @@ -1081,13 +1087,6 @@ Expr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const { return MLV_ConstQualified; } - // Assigning to an 'implicit' property? - else if (isa(this)) { - const ObjCImplicitSetterGetterRefExpr* Expr = - cast(this); - if (Expr->getSetterMethod() == 0) - return MLV_NoSetterProperty; - } return MLV_Valid; } diff --git a/test/SemaObjC/property-error-readonly-assign.m b/test/SemaObjC/property-error-readonly-assign.m index edeff09dfa..d5cef78f18 100644 --- a/test/SemaObjC/property-error-readonly-assign.m +++ b/test/SemaObjC/property-error-readonly-assign.m @@ -19,3 +19,26 @@ void f0(A *a, B* b) { b.ok = 20; } +typedef struct { + int i1, i2; +} NSRect; + +NSRect NSMakeRect(); + +@interface NSWindow +{ + NSRect _frame; +} +- (NSRect)frame; +@end + +@interface NSWindow (Category) +-(void)methodToMakeClangCrash; +@end + +@implementation NSWindow (Category) +-(void)methodToMakeClangCrash +{ + self.frame = NSMakeRect(); // expected-error {{setter method is needed to assign to object using property assignment syntax}} +} +@end -- 2.40.0