Fixed a nasty bug which took a while to come up with a test case, 
diagnose, and took even longer to fix. It has to do with rewriting of a message
receiver which is an 'ivar' reference. Fix, however, is to remove a code which
was not doing the right thing and no longer needed.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46279 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index eca9349..4a67be7 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -705,6 +705,10 @@
     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 @@
         }
       }
     }
+#endif
     return IV;
   }
 }
diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h
index 3771c00..4eb4072 100644
--- a/include/clang/AST/Expr.h
+++ b/include/clang/AST/Expr.h
@@ -1389,6 +1389,7 @@
   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 0000000..c7df178
--- /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