From f4ace8fccc14952df1f3f2b009cf092e9dff1794 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Thu, 2 Feb 2017 00:03:28 +0200 Subject: [PATCH] Checked all redeclarations when parsing function bodies which is back on. --- src/CppParser/Parser.cpp | 28 ++++++++++++++++++---------- src/CppParser/Parser.h | 1 + src/Generator.Tests/AST/TestAST.cs | 2 +- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 11e83a1f88..8138fef3ab 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2844,6 +2844,22 @@ Parameter* Parser::WalkParameter(const clang::ParmVarDecl* PVD, return P; } +void Parser::SetBody(const clang::FunctionDecl* FD, Function* F) +{ + F->Body = GetFunctionBody(FD); + F->isInline = FD->isInlined(); + if (!F->Body.empty() && F->isInline) + return; + for (const auto& R : FD->redecls()) + { + if (F->Body.empty()) + F->Body = GetFunctionBody(R); + F->isInline |= R->isInlined(); + if (!F->Body.empty() && F->isInline) + break; + } +} + void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F, bool IsDependent) { @@ -2859,18 +2875,10 @@ void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F, F->_namespace = NS; F->isConstExpr = FD->isConstexpr(); F->isVariadic = FD->isVariadic(); - F->isInline = FD->isInlined(); - for (const auto& R : FD->redecls()) - { - if (R->isInlined()) - { - F->isInline = true; - break; - } - } F->isDependent = FD->isDependentContext(); F->isPure = FD->isPure(); F->isDeleted = FD->isDeleted(); + SetBody(FD, F); if (auto InstantiatedFrom = FD->getTemplateInstantiationPattern()) F->instantiatedFrom = static_cast(WalkDeclaration(InstantiatedFrom)); @@ -3920,7 +3928,7 @@ ParserResult* Parser::ParseHeader(const std::vector& SourceFiles, P clang::DiagnosticConsumer* client = c->getDiagnostics().getClient(); client->BeginSourceFile(c->getLangOpts(), &c->getPreprocessor()); - ParseAST(c->getSema(), /*PrintStats=*/false, /*SkipFunctionBodies=*/true); + ParseAST(c->getSema()); client->EndSourceFile(); diff --git a/src/CppParser/Parser.h b/src/CppParser/Parser.h index 0192e68176..e6afd9acf1 100644 --- a/src/CppParser/Parser.h +++ b/src/CppParser/Parser.h @@ -122,6 +122,7 @@ class Parser bool CanCheckCodeGenInfo(clang::Sema & S, const clang::Type * Ty); Parameter* WalkParameter(const clang::ParmVarDecl* PVD, const clang::SourceLocation& ParamStartLoc); + void SetBody(const clang::FunctionDecl* FD, Function* F); void WalkFunction(const clang::FunctionDecl* FD, Function* F, bool IsDependent = false); void HandlePreprocessedEntities(Declaration* Decl); diff --git a/src/Generator.Tests/AST/TestAST.cs b/src/Generator.Tests/AST/TestAST.cs index 7b98e97dc6..1288abc6ce 100644 --- a/src/Generator.Tests/AST/TestAST.cs +++ b/src/Generator.Tests/AST/TestAST.cs @@ -302,7 +302,7 @@ public void TestLineNumberOfFriend() public void TestSignature() { Assert.AreEqual("void testSignature()", AstContext.FindFunction("testSignature").Single().Signature); - Assert.AreEqual("void testImpl()", AstContext.FindFunction("testImpl").Single().Signature); + Assert.AreEqual("void testImpl()\r\n{\r\n}", AstContext.FindFunction("testImpl").Single().Signature); Assert.AreEqual("void testConstSignature() const", AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstSignature").Signature); Assert.AreEqual("void testConstSignatureWithTrailingMacro() const",