diff options
-rw-r--r-- | Driver/RewriteTest.cpp | 5 | ||||
-rw-r--r-- | include/clang/AST/Expr.h | 1 | ||||
-rw-r--r-- | test/Sema/objc-ivar-receiver-1.m | 23 |
3 files changed, 29 insertions, 0 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index eca9349fb6..4a67be7f73 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -705,6 +705,10 @@ Stmt *RewriteTest::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) { delete IV; return Replacement; } else { +#if 0 + /// This code is not right. It seems unnecessary. It breaks use of + /// ivar reference used as 'receiver' of an expression; as in: + /// [newInv->_container addObject:0]; if (CurMethodDecl) { if (const PointerType *pType = IV->getBase()->getType()->getAsPointerType()) { ObjCInterfaceType *intT = dyn_cast<ObjCInterfaceType>(pType->getPointeeType()); @@ -729,6 +733,7 @@ Stmt *RewriteTest::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) { } } } +#endif return IV; } } diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 3771c00281..4eb4072a87 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -1389,6 +1389,7 @@ public: const ObjCIvarDecl *getDecl() const { return D; } virtual SourceRange getSourceRange() const { return SourceRange(Loc); } Expr *const getBase() const { return Base; } + void setBase(Expr * base) { Base = base; } const bool isArrow() const { return IsArrow; } const bool isFreeIvar() const { return IsFreeIvar; } diff --git a/test/Sema/objc-ivar-receiver-1.m b/test/Sema/objc-ivar-receiver-1.m new file mode 100644 index 0000000000..c7df1787b0 --- /dev/null +++ b/test/Sema/objc-ivar-receiver-1.m @@ -0,0 +1,23 @@ +// RUN: clang -rewrite-test %s | clang +// RUN: clang -rewrite-test %s | grep 'newInv->_container' + +@interface NSMutableArray +- (void)addObject:(id)addObject; +@end + +@interface NSInvocation { +@private + id _container; +} ++ (NSInvocation *)invocationWithMethodSignature; + +@end + +@implementation NSInvocation + ++ (NSInvocation *)invocationWithMethodSignature { + NSInvocation *newInv; + [newInv->_container addObject:0]; + return 0; +} +@end |