aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2012-02-12 04:48:45 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2012-02-12 04:48:45 +0000
commit9335df324951c022bc696e64b5fe9f66a8ad5222 (patch)
tree845090ab42e825aa75c6f7cf5599ae76b329e459
parent5b9cc5df25c2198f270dd1d5c438fdce70d4051d (diff)
Fix the rewriter that broke with r149987.
r149987 changed the way parsing happens inside an @implementation; it aggregates the declarations inside and reports them together as a DeclGroup. This had the side effect that function declarations were reported together with their definition, while the rewriter expected for function declarations to be reported immediately to the consumer and thus not have a body. Fix this by having the rewriter actually check with isThisDeclarationADefinition() to make sure the body comes from the current decl before rewriting it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150325 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Rewrite/RewriteModernObjC.cpp3
-rw-r--r--lib/Rewrite/RewriteObjC.cpp3
-rw-r--r--test/Rewriter/func-in-impl.m29
3 files changed, 35 insertions, 0 deletions
diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp
index a981ffdf6e..26646901f0 100644
--- a/lib/Rewrite/RewriteModernObjC.cpp
+++ b/lib/Rewrite/RewriteModernObjC.cpp
@@ -4834,6 +4834,9 @@ void RewriteModernObjC::HandleDeclInMainFile(Decl *D) {
// definitions using the same code.
RewriteBlocksInFunctionProtoType(FD->getType(), FD);
+ if (!FD->isThisDeclarationADefinition())
+ break;
+
// FIXME: If this should support Obj-C++, support CXXTryStmt
if (CompoundStmt *Body = dyn_cast_or_null<CompoundStmt>(FD->getBody())) {
CurFunctionDef = FD;
diff --git a/lib/Rewrite/RewriteObjC.cpp b/lib/Rewrite/RewriteObjC.cpp
index 5018112699..6e8789f6db 100644
--- a/lib/Rewrite/RewriteObjC.cpp
+++ b/lib/Rewrite/RewriteObjC.cpp
@@ -4922,6 +4922,9 @@ void RewriteObjC::HandleDeclInMainFile(Decl *D) {
// definitions using the same code.
RewriteBlocksInFunctionProtoType(FD->getType(), FD);
+ if (!FD->isThisDeclarationADefinition())
+ break;
+
// FIXME: If this should support Obj-C++, support CXXTryStmt
if (CompoundStmt *Body = dyn_cast_or_null<CompoundStmt>(FD->getBody())) {
CurFunctionDef = FD;
diff --git a/test/Rewriter/func-in-impl.m b/test/Rewriter/func-in-impl.m
new file mode 100644
index 0000000000..6242c7ea77
--- /dev/null
+++ b/test/Rewriter/func-in-impl.m
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -rewrite-objc %s -o - | FileCheck %s
+
+@interface I {
+ id _delegate;
+}
+-(void)foo;
+@end
+
+@implementation I
+
+static void KKKK(int w);
+
+-(void) foo {
+ KKKK(0);
+}
+
+static void KKKK(int w) {
+ I *self = (I *)0;
+ if ([self->_delegate respondsToSelector:@selector(handlePortMessage:)]) {
+ }
+}
+
+-(void) foo2 {
+ KKKK(0);
+}
+
+@end
+
+// CHECK: if (((id (*)(id, SEL, ...))(void *)objc_msgSend)((id)((struct I_IMPL *)self)->_delegate, sel_registerName("respondsToSelector:"), sel_registerName("handlePortMessage:")))