aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorEduardo Caldas <ecaldas@google.com>2020-09-07 17:47:09 +0000
committerEduardo Caldas <ecaldas@google.com>2020-09-08 09:49:30 +0000
commitf5087d5c7248104b6580c7b079ed5f227332c2ef (patch)
tree19128937cbd784d9970adf6a4643b65251c63636 /clang/lib
parent134455a07c1f1de4cff62a6afb4ccd98b98343ec (diff)
downloadllvm-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.cpp15
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) {