Skip to content

Commit 175a4d2

Browse files
committed
skip parsing function bodies
1 parent b81ac4a commit 175a4d2

File tree

3 files changed

+45
-21
lines changed

3 files changed

+45
-21
lines changed

source/AST/ASTVisitor.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,124 +1474,124 @@ TraverseDecl(
14741474
switch(D->getKind())
14751475
{
14761476
case Decl::Namespace:
1477-
this->Traverse(static_cast<
1477+
Traverse(static_cast<
14781478
NamespaceDecl*>(D),
14791479
std::forward<Args>(args)...);
14801480
break;
14811481
case Decl::CXXRecord:
1482-
this->Traverse(static_cast<
1482+
Traverse(static_cast<
14831483
CXXRecordDecl*>(D),
14841484
access,
14851485
std::forward<Args>(args)...);
14861486
break;
14871487
case Decl::CXXMethod:
1488-
this->Traverse(static_cast<
1488+
Traverse(static_cast<
14891489
CXXMethodDecl*>(D),
14901490
access,
14911491
std::forward<Args>(args)...);
14921492
break;
14931493
case Decl::CXXConstructor:
1494-
this->Traverse(static_cast<
1494+
Traverse(static_cast<
14951495
CXXConstructorDecl*>(D),
14961496
access,
14971497
std::forward<Args>(args)...);
14981498
break;
14991499
case Decl::CXXConversion:
1500-
this->Traverse(static_cast<
1500+
Traverse(static_cast<
15011501
CXXConversionDecl*>(D),
15021502
access,
15031503
std::forward<Args>(args)...);
15041504
break;
15051505
case Decl::CXXDestructor:
1506-
this->Traverse(static_cast<
1506+
Traverse(static_cast<
15071507
CXXDestructorDecl*>(D),
15081508
access,
15091509
std::forward<Args>(args)...);
15101510
break;
15111511
case Decl::CXXDeductionGuide:
1512-
this->Traverse(static_cast<
1512+
Traverse(static_cast<
15131513
CXXDeductionGuideDecl*>(D),
15141514
access,
15151515
std::forward<Args>(args)...);
15161516
break;
15171517
case Decl::Function:
1518-
this->Traverse(static_cast<
1518+
Traverse(static_cast<
15191519
FunctionDecl*>(D),
15201520
access,
15211521
std::forward<Args>(args)...);
15221522
break;
15231523
case Decl::Friend:
1524-
this->Traverse(static_cast<
1524+
Traverse(static_cast<
15251525
FriendDecl*>(D),
15261526
std::forward<Args>(args)...);
15271527
break;
15281528
case Decl::TypeAlias:
1529-
this->Traverse(static_cast<
1529+
Traverse(static_cast<
15301530
TypeAliasDecl*>(D),
15311531
access,
15321532
std::forward<Args>(args)...);
15331533
break;
15341534
case Decl::Typedef:
1535-
this->Traverse(static_cast<
1535+
Traverse(static_cast<
15361536
TypedefDecl*>(D),
15371537
access,
15381538
std::forward<Args>(args)...);
15391539
break;
15401540
case Decl::Enum:
1541-
this->Traverse(static_cast<
1541+
Traverse(static_cast<
15421542
EnumDecl*>(D),
15431543
access,
15441544
std::forward<Args>(args)...);
15451545
break;
15461546
case Decl::Field:
1547-
this->Traverse(static_cast<
1547+
Traverse(static_cast<
15481548
FieldDecl*>(D),
15491549
access,
15501550
std::forward<Args>(args)...);
15511551
break;
15521552
case Decl::Var:
1553-
this->Traverse(static_cast<
1553+
Traverse(static_cast<
15541554
VarDecl*>(D),
15551555
access,
15561556
std::forward<Args>(args)...);
15571557
break;
15581558
case Decl::ClassTemplate:
1559-
this->Traverse(static_cast<
1559+
Traverse(static_cast<
15601560
ClassTemplateDecl*>(D),
15611561
access,
15621562
std::forward<Args>(args)...);
15631563
break;
15641564
case Decl::ClassTemplatePartialSpecialization:
15651565
case Decl::ClassTemplateSpecialization:
1566-
this->Traverse(static_cast<
1566+
Traverse(static_cast<
15671567
ClassTemplateSpecializationDecl*>(D),
15681568
std::forward<Args>(args)...);
15691569
break;
15701570
case Decl::VarTemplate:
1571-
this->Traverse(static_cast<
1571+
Traverse(static_cast<
15721572
VarTemplateDecl*>(D),
15731573
access,
15741574
std::forward<Args>(args)...);
15751575
break;
15761576
case Decl::VarTemplatePartialSpecialization:
15771577
case Decl::VarTemplateSpecialization:
1578-
this->Traverse(static_cast<
1578+
Traverse(static_cast<
15791579
VarTemplateSpecializationDecl*>(D),
15801580
std::forward<Args>(args)...);
15811581
break;
15821582
case Decl::FunctionTemplate:
1583-
this->Traverse(static_cast<
1583+
Traverse(static_cast<
15841584
FunctionTemplateDecl*>(D),
15851585
access,
15861586
std::forward<Args>(args)...);
15871587
break;
15881588
case Decl::ClassScopeFunctionSpecialization:
1589-
this->Traverse(static_cast<
1589+
Traverse(static_cast<
15901590
ClassScopeFunctionSpecializationDecl*>(D),
15911591
std::forward<Args>(args)...);
15921592
break;
15931593
case Decl::TypeAliasTemplate:
1594-
this->Traverse(static_cast<
1594+
Traverse(static_cast<
15951595
TypeAliasTemplateDecl*>(D),
15961596
access,
15971597
std::forward<Args>(args)...);

source/AST/ASTVisitor.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,19 @@ class ASTVisitor
273273
bool TraverseContext(DeclContext* D);
274274

275275
void HandleTranslationUnit(ASTContext& Context) override;
276+
277+
278+
/** Skip function bodies
279+
280+
This is called by Sema when parsing a function that has a body and:
281+
- is constexpr, or
282+
- uses a placeholder for a deduced return type
283+
284+
We always return `true` because whenever this function *is* called,
285+
it will be for a function that cannot be used in a constant expression,
286+
nor one that introduces a new type via returning a local class.
287+
*/
288+
bool shouldSkipFunctionBody(Decl* D) override { return true; }
276289
};
277290

278291
} // mrdox

source/AST/FrontendAction.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "ASTVisitor.hpp"
1313
#include "FrontendAction.hpp"
1414
#include <clang/Tooling/Tooling.h>
15+
#include <clang/Frontend/CompilerInstance.h>
1516

1617
namespace clang {
1718
namespace mrdox {
@@ -29,6 +30,16 @@ struct Action
2930
{
3031
}
3132

33+
bool
34+
PrepareToExecuteAction(
35+
CompilerInstance& Compiler) override
36+
{
37+
FrontendOptions& fe_opts =
38+
Compiler.getFrontendOpts();
39+
fe_opts.SkipFunctionBodies = true;
40+
return true;
41+
}
42+
3243
std::unique_ptr<clang::ASTConsumer>
3344
CreateASTConsumer(
3445
clang::CompilerInstance& Compiler,

0 commit comments

Comments
 (0)