Skip to content

Commit f4ace8f

Browse files
committed
Checked all redeclarations when parsing function bodies which is back on.
1 parent ac6be2e commit f4ace8f

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

src/CppParser/Parser.cpp

+18-10
Original file line numberDiff line numberDiff line change
@@ -2844,6 +2844,22 @@ Parameter* Parser::WalkParameter(const clang::ParmVarDecl* PVD,
28442844
return P;
28452845
}
28462846

2847+
void Parser::SetBody(const clang::FunctionDecl* FD, Function* F)
2848+
{
2849+
F->Body = GetFunctionBody(FD);
2850+
F->isInline = FD->isInlined();
2851+
if (!F->Body.empty() && F->isInline)
2852+
return;
2853+
for (const auto& R : FD->redecls())
2854+
{
2855+
if (F->Body.empty())
2856+
F->Body = GetFunctionBody(R);
2857+
F->isInline |= R->isInlined();
2858+
if (!F->Body.empty() && F->isInline)
2859+
break;
2860+
}
2861+
}
2862+
28472863
void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F,
28482864
bool IsDependent)
28492865
{
@@ -2859,18 +2875,10 @@ void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F,
28592875
F->_namespace = NS;
28602876
F->isConstExpr = FD->isConstexpr();
28612877
F->isVariadic = FD->isVariadic();
2862-
F->isInline = FD->isInlined();
2863-
for (const auto& R : FD->redecls())
2864-
{
2865-
if (R->isInlined())
2866-
{
2867-
F->isInline = true;
2868-
break;
2869-
}
2870-
}
28712878
F->isDependent = FD->isDependentContext();
28722879
F->isPure = FD->isPure();
28732880
F->isDeleted = FD->isDeleted();
2881+
SetBody(FD, F);
28742882
if (auto InstantiatedFrom = FD->getTemplateInstantiationPattern())
28752883
F->instantiatedFrom = static_cast<Function*>(WalkDeclaration(InstantiatedFrom));
28762884

@@ -3920,7 +3928,7 @@ ParserResult* Parser::ParseHeader(const std::vector<std::string>& SourceFiles, P
39203928
clang::DiagnosticConsumer* client = c->getDiagnostics().getClient();
39213929
client->BeginSourceFile(c->getLangOpts(), &c->getPreprocessor());
39223930

3923-
ParseAST(c->getSema(), /*PrintStats=*/false, /*SkipFunctionBodies=*/true);
3931+
ParseAST(c->getSema());
39243932

39253933
client->EndSourceFile();
39263934

src/CppParser/Parser.h

+1
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ class Parser
122122
bool CanCheckCodeGenInfo(clang::Sema & S, const clang::Type * Ty);
123123
Parameter* WalkParameter(const clang::ParmVarDecl* PVD,
124124
const clang::SourceLocation& ParamStartLoc);
125+
void SetBody(const clang::FunctionDecl* FD, Function* F);
125126
void WalkFunction(const clang::FunctionDecl* FD, Function* F,
126127
bool IsDependent = false);
127128
void HandlePreprocessedEntities(Declaration* Decl);

src/Generator.Tests/AST/TestAST.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ public void TestLineNumberOfFriend()
302302
public void TestSignature()
303303
{
304304
Assert.AreEqual("void testSignature()", AstContext.FindFunction("testSignature").Single().Signature);
305-
Assert.AreEqual("void testImpl()", AstContext.FindFunction("testImpl").Single().Signature);
305+
Assert.AreEqual("void testImpl()\r\n{\r\n}", AstContext.FindFunction("testImpl").Single().Signature);
306306
Assert.AreEqual("void testConstSignature() const",
307307
AstContext.FindClass("HasConstFunction").Single().FindMethod("testConstSignature").Signature);
308308
Assert.AreEqual("void testConstSignatureWithTrailingMacro() const",

0 commit comments

Comments
 (0)