From: Fariborz Jahanian Date: Wed, 23 Jan 2008 20:34:40 +0000 (+0000) Subject: Fixed a nasty bug which took a while to come up with a test case, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7da8d94cb79f311c5b126483b8edfe5dc70d6c8f;p=clang 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 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(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