diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-02-07 02:30:55 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-02-07 02:30:55 +0000 |
commit | 407f36bde94d10fd462c1aa2e195dc91db45720d (patch) | |
tree | 9fbae69ed996a191425bb92335163f55e168bf95 | |
parent | 905a646c248fc7a603d9cd038b07a4b875abceb8 (diff) | |
download | bcm5719-llvm-407f36bde94d10fd462c1aa2e195dc91db45720d.tar.gz bcm5719-llvm-407f36bde94d10fd462c1aa2e195dc91db45720d.zip |
Sema: handle typo correction with ARC'ed objc properties
We would previously assert in findCapturingExpr when performing a typo
correction resulting in an assignment of an ObjC property with a strong lifetype
specifier due to the expression not being rooted in the file (invalid SLoc)
during the retain cycle check on the typo-corrected expression. Handle the
expression type appropriately during the TreeTransform to ensure that we have a
source location associated with the expression.
Fixes PR26486.
llvm-svn: 260016
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaObjC/typo-correction-arc.m | 24 |
2 files changed, 28 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 32aa5a69d07..3083a1f50df 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -6586,6 +6586,10 @@ public: ExprResult TransformBlockExpr(BlockExpr *E) { return Owned(E); } + ExprResult TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { + return Owned(E); + } + ExprResult Transform(Expr *E) { ExprResult Res; while (true) { diff --git a/clang/test/SemaObjC/typo-correction-arc.m b/clang/test/SemaObjC/typo-correction-arc.m new file mode 100644 index 00000000000..9131ca86dc9 --- /dev/null +++ b/clang/test/SemaObjC/typo-correction-arc.m @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -triple i386-apple-macosx10.10 -fobjc-arc -fsyntax-only -Wno-objc-root-class %s -verify + +typedef unsigned long NSUInteger; + +@interface NSArray +- (instancetype)initWithObjects:(const id[])objects count:(NSUInteger)count; +@end + +@interface I +@property NSArray *array; +@end + +@interface J +- (void)setArray:(id)array; +@end + +@implementation J { + I *i; +} +- (void)setArray:(id)array { // expected-note{{'array' declared here}} + i.array = aray; // expected-error{{use of undeclared identifier 'aray'; did you mean 'array'}} +} +@end + |