aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Driver/RewriteTest.cpp5
-rw-r--r--include/clang/AST/Expr.h1
-rw-r--r--test/Sema/objc-ivar-receiver-1.m23
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