diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 0d859f385abb175463cd5aeafca68258c6acaf18..266d49c999a5b60f99d32b78070c80a1b219e51f 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -2398,21 +2398,9 @@ unsigned ObjCMethodDeclarationAST::lastToken() const
 {
     if (semicolon_token)
         return semicolon_token + 1;
-    else
-        return method_prototype->lastToken();
-}
-
-unsigned ObjCMethodDefinitionAST::firstToken() const
-{
-    return method_prototype->firstToken();
-}
-
-unsigned ObjCMethodDefinitionAST::lastToken() const
-{
     if (function_body)
         return function_body->lastToken();
-    else
-        return method_prototype->lastToken();
+    return method_prototype->lastToken();
 }
 
 unsigned ObjCClassImplementationAST::firstToken() const
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index dcdf5abee256be64199122e4d509738ab63f11b2..f7e483f88182973b1aa2904b9895f0f3b29f7c03 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -222,7 +222,6 @@ public:
     virtual ObjCMessageArgumentDeclarationListAST *asObjCMessageArgumentDeclarationList() { return 0; }
     virtual ObjCMethodPrototypeAST *asObjCMethodPrototype() { return 0; }
     virtual ObjCMethodDeclarationAST *asObjCMethodDeclaration() { return 0; }
-    virtual ObjCMethodDefinitionAST *asObjCMethodDefinition() { return 0; }
     virtual ObjCClassImplementationAST *asObjCClassImplementation() { return 0; }
     virtual ObjCCategoryImplementationAST *asObjCCategoryImplementation() { return 0; }
     virtual ObjCSynthesizedPropertyAST *asObjCSynthesizedProperty() { return 0; }
@@ -3040,6 +3039,7 @@ class CPLUSPLUS_EXPORT ObjCMethodDeclarationAST: public DeclarationAST
 {
 public:
     ObjCMethodPrototypeAST *method_prototype;
+    StatementAST *function_body;
     unsigned semicolon_token;
 
 public:
@@ -3055,25 +3055,6 @@ protected:
     virtual void accept0(ASTVisitor *visitor);
 };
 
-class CPLUSPLUS_EXPORT ObjCMethodDefinitionAST: public DeclarationAST
-{
-public:
-    ObjCMethodPrototypeAST *method_prototype;
-    StatementAST *function_body;
-
-public:
-    virtual ObjCMethodDefinitionAST *asObjCMethodDefinition()
-    { return this; }
-
-    virtual unsigned firstToken() const;
-    virtual unsigned lastToken() const;
-
-    virtual ObjCMethodDefinitionAST *clone(MemoryPool *pool) const;
-
-protected:
-    virtual void accept0(ASTVisitor *visitor);
-};
-
 class CPLUSPLUS_EXPORT ObjCClassImplementationAST: public DeclarationAST
 {
 public:
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index a5167a59d41946372f77076b61971c181d96b229..de0be8287da9505b5b5b1afa03296cc01aaec4ac 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -1461,15 +1461,8 @@ ObjCMethodDeclarationAST *ObjCMethodDeclarationAST::clone(MemoryPool *pool) cons
 {
     ObjCMethodDeclarationAST *ast = new (pool) ObjCMethodDeclarationAST;
     if (method_prototype) ast->method_prototype = method_prototype->clone(pool);
-    ast->semicolon_token = semicolon_token;
-    return ast;
-}
-
-ObjCMethodDefinitionAST *ObjCMethodDefinitionAST::clone(MemoryPool *pool) const
-{
-    ObjCMethodDefinitionAST *ast = new (pool) ObjCMethodDefinitionAST;
-    if (method_prototype) ast->method_prototype = method_prototype->clone(pool);
     if (function_body) ast->function_body = function_body->clone(pool);
+    ast->semicolon_token = semicolon_token;
     return ast;
 }
 
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index de05b380c13b12788aa00baed884d5db7a0817d7..2d4b4c2cc2bf7b216e706b24f6019305abf9665e 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -1406,16 +1406,6 @@ void ObjCMethodDeclarationAST::accept0(ASTVisitor *visitor)
     if (visitor->visit(this)) {
         // visit ObjCMethodDeclarationAST
         accept(method_prototype, visitor);
-        // visit DeclarationAST
-    }
-    visitor->endVisit(this);
-}
-
-void ObjCMethodDefinitionAST::accept0(ASTVisitor *visitor)
-{
-    if (visitor->visit(this)) {
-        // visit ObjCMethodDefinitionAST
-        accept(method_prototype, visitor);
         accept(function_body, visitor);
         // visit DeclarationAST
     }
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 6a7c72068629a8bfb60a7e24bd6b00ac7af00fa6..661874cc07307fdb23caf7c6d0996850e912b41a 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -221,7 +221,6 @@ public:
     virtual bool visit(ObjCPropertyDeclarationAST *) { return true; }
     virtual bool visit(ObjCMethodPrototypeAST *) { return true; }
     virtual bool visit(ObjCMethodDeclarationAST *) { return true; }
-    virtual bool visit(ObjCMethodDefinitionAST *) { return true; }
     virtual bool visit(ObjCMessageArgumentDeclarationListAST *) { return true; }
     virtual bool visit(ObjCMessageArgumentDeclarationAST *) { return true; }
     virtual bool visit(ObjCClassImplementationAST *) { return true; }
@@ -363,7 +362,6 @@ public:
     virtual void endVisit(ObjCPropertyDeclarationAST *) { }
     virtual void endVisit(ObjCMethodPrototypeAST *) { }
     virtual void endVisit(ObjCMethodDeclarationAST *) { }
-    virtual void endVisit(ObjCMethodDefinitionAST *) { }
     virtual void endVisit(ObjCMessageArgumentDeclarationListAST *) { }
     virtual void endVisit(ObjCMessageArgumentDeclarationAST *) { }
     virtual void endVisit(ObjCClassImplementationAST *) { }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index a269713e9b679f25e6235bab725def87f9db2ac8..c336650dae1a1bf1fba5e95a312a35e39db97498 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -195,7 +195,6 @@ class ObjCPropertyAttributeListAST;
 class ObjCPropertyAttributeAST;
 class ObjCMethodPrototypeAST;
 class ObjCMethodDeclarationAST;
-class ObjCMethodDefinitionAST;
 class ObjCMessageArgumentDeclarationListAST;
 class ObjCMessageArgumentDeclarationAST;
 class ObjCCategoryImplementationAST;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index f3157e7bc673b5d3a802a337e2673b09119bf87e..f82394548c4aaf40dfcac3415e204867913b5778 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -595,33 +595,7 @@ bool CheckDeclaration::visit(ObjCMethodDeclarationAST *ast)
 
     _scope->enterSymbol(symbol);
 
-    return false;
-}
-
-bool CheckDeclaration::visit(ObjCMethodDefinitionAST *ast)
-{
-    if (!ast->method_prototype)
-        return false;
-
-    FullySpecifiedType ty = semantic()->check(ast->method_prototype, _scope);
-    Function *fun = ty.type()->asFunctionType();
-    if (!fun)
-        return false;
-
-    Declaration *symbol = control()->newDeclaration(ast->firstToken(), fun->name());
-    symbol->setStartOffset(tokenAt(ast->firstToken()).offset);
-    symbol->setEndOffset(tokenAt(ast->lastToken()).offset);
-
-    symbol->setType(fun->returnType());
-
-    symbol->setVisibility(semantic()->currentVisibility());
-
-    if (semantic()->isObjCClassMethod(ast->method_prototype->method_type_token))
-        symbol->setStorage(Symbol::Static);
-
-    _scope->enterSymbol(symbol);
-
-     if (! semantic()->skipFunctionBodies()) {
+    if (ast->function_body && !semantic()->skipFunctionBodies()) {
         semantic()->check(ast->function_body, fun->members());
     }
 
diff --git a/src/shared/cplusplus/CheckDeclaration.h b/src/shared/cplusplus/CheckDeclaration.h
index b1880c5377f405ed2c9446f647c294655e113be2..97c4d5ff449021aa30d173faf2e8b59b417cf540 100644
--- a/src/shared/cplusplus/CheckDeclaration.h
+++ b/src/shared/cplusplus/CheckDeclaration.h
@@ -96,7 +96,6 @@ protected:
     virtual bool visit(ObjCClassDeclarationAST *ast);
     virtual bool visit(ObjCClassInterfaceDefinitionAST *ast);
     virtual bool visit(ObjCMethodDeclarationAST *ast);
-    virtual bool visit(ObjCMethodDefinitionAST *ast);
     virtual bool visit(ObjCVisibilityDeclarationAST *ast);
 
 private:
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 70bc64ae3d5a0739007c121bfb11a31f86059cc9..c4eb17ab64e6618f0235eb9f6bf3e3db1f328552 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -4321,20 +4321,18 @@ bool Parser::parseObjCMethodDefinition(DeclarationAST *&node)
     if (! parseObjCMethodPrototype(method_prototype))
         return false;
 
+    ObjCMethodDeclarationAST *ast = new (_pool) ObjCMethodDeclarationAST;
+    ast->method_prototype = method_prototype;
+
     if (LA() == T_SEMICOLON) {
         // method declaration:
-        ObjCMethodDeclarationAST *ast = new (_pool) ObjCMethodDeclarationAST;
-        ast->method_prototype = method_prototype;
         ast->semicolon_token = consumeToken();
-        node = ast;
     } else {
         // method definition:
-        ObjCMethodDefinitionAST *ast = new (_pool) ObjCMethodDefinitionAST;
-        ast->method_prototype = method_prototype;
         parseFunctionBody(ast->function_body);
-        node = ast;
     }
 
+    node = ast;
     return true;
 }
 
@@ -4567,10 +4565,14 @@ bool Parser::parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node)
             DeclarationAST *parameter_declaration = 0;
             parseParameterDeclaration(parameter_declaration);
         }
+
+        node = ast;
     } else if (lookAtObjCSelector()) {
         ObjCSelectorWithoutArgumentsAST *sel = new (_pool) ObjCSelectorWithoutArgumentsAST;
         parseObjCSelector(sel->name_token);
         ast->selector = sel;
+
+        node = ast;
     } else {
         _translationUnit->error(cursor(), "expected a selector");
     }
@@ -4579,7 +4581,6 @@ bool Parser::parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node)
     while (parseAttributeSpecifier(*attr))
         attr = &(*attr)->next;
 
-    node = ast;
     return true;
 }