diff options
author | Eduardo Caldas <ecaldas@google.com> | 2020-09-07 17:47:09 +0000 |
---|---|---|
committer | Eduardo Caldas <ecaldas@google.com> | 2020-09-08 09:49:30 +0000 |
commit | f5087d5c7248104b6580c7b079ed5f227332c2ef (patch) | |
tree | 19128937cbd784d9970adf6a4643b65251c63636 /clang/lib | |
parent | 134455a07c1f1de4cff62a6afb4ccd98b98343ec (diff) | |
download | llvm-f5087d5c7248104b6580c7b079ed5f227332c2ef.zip llvm-f5087d5c7248104b6580c7b079ed5f227332c2ef.tar.gz llvm-f5087d5c7248104b6580c7b079ed5f227332c2ef.tar.bz2 |
[SyntaxTree] Fix crash on functions with default arguments.
* Do not visit `CXXDefaultArgExpr`
* To build `CallArguments` nodes, just go through non-default arguments
Differential Revision: https://reviews.llvm.org/D87249
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Tooling/Syntax/BuildTree.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp index bb2b149..1942290 100644 --- a/clang/lib/Tooling/Syntax/BuildTree.cpp +++ b/clang/lib/Tooling/Syntax/BuildTree.cpp @@ -154,6 +154,13 @@ private: }; } // namespace +static CallExpr::arg_range dropDefaultArgs(CallExpr::arg_range Args) { + auto firstDefaultArg = std::find_if(Args.begin(), Args.end(), [](auto it) { + return isa<CXXDefaultArgExpr>(it); + }); + return llvm::make_range(Args.begin(), firstDefaultArg); +} + static syntax::NodeKind getOperatorNodeKind(const CXXOperatorCallExpr &E) { switch (E.getOperator()) { // Comparison @@ -1111,7 +1118,11 @@ public: return true; } - syntax::CallArguments *buildCallArguments(CallExpr::arg_range Args) { + /// Builds `CallArguments` syntax node from arguments that appear in source + /// code, i.e. not default arguments. + syntax::CallArguments * + buildCallArguments(CallExpr::arg_range ArgsAndDefaultArgs) { + auto Args = dropDefaultArgs(ArgsAndDefaultArgs); for (const auto &Arg : Args) { Builder.markExprChild(Arg, syntax::NodeRole::ListElement); const auto *DelimiterToken = @@ -1233,6 +1244,8 @@ public: } } + bool WalkUpFromCXXDefaultArgExpr(CXXDefaultArgExpr *S) { return true; } + bool WalkUpFromNamespaceDecl(NamespaceDecl *S) { auto Tokens = Builder.getDeclarationRange(S); if (Tokens.front().kind() == tok::coloncolon) { |