aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Tooling/Syntax/BuildTree.cpp
diff options
context:
space:
mode:
authorEduardo Caldas <ecaldas@google.com>2020-08-03 18:29:12 +0000
committerEduardo Caldas <ecaldas@google.com>2020-08-04 14:31:12 +0000
commit8ce15f7eeb122c0bba4b676d797217359dd57c30 (patch)
tree56e2cdabb7da2fa74571d2320bfd89a9909b4e26 /clang/lib/Tooling/Syntax/BuildTree.cpp
parent2d0b05969bc01a2fda14b8dc3e8c26c81efe9c6f (diff)
downloadllvm-8ce15f7eeb122c0bba4b676d797217359dd57c30.zip
llvm-8ce15f7eeb122c0bba4b676d797217359dd57c30.tar.gz
llvm-8ce15f7eeb122c0bba4b676d797217359dd57c30.tar.bz2
[SyntaxTree] Fix crash on pointer to member function
Differential Revision: https://reviews.llvm.org/D85146
Diffstat (limited to 'clang/lib/Tooling/Syntax/BuildTree.cpp')
-rw-r--r--clang/lib/Tooling/Syntax/BuildTree.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp
index 1f19218..15b7c8fa 100644
--- a/clang/lib/Tooling/Syntax/BuildTree.cpp
+++ b/clang/lib/Tooling/Syntax/BuildTree.cpp
@@ -939,6 +939,8 @@ public:
return true;
}
+ // FIXME: Deleting the `TraverseParenTypeLoc` override doesn't change test
+ // results. Find test coverage or remove it.
bool TraverseParenTypeLoc(ParenTypeLoc L) {
// We reverse order of traversal to get the proper syntax structure.
if (!WalkUpFromParenTypeLoc(L))
@@ -987,6 +989,16 @@ public:
return WalkUpFromFunctionTypeLoc(L);
}
+ bool TraverseMemberPointerTypeLoc(MemberPointerTypeLoc L) {
+ // In the source code "void (Y::*mp)()" `MemberPointerTypeLoc` corresponds
+ // to "Y::*" but it points to a `ParenTypeLoc` that corresponds to
+ // "(Y::*mp)" We thus reverse the order of traversal to get the proper
+ // syntax structure.
+ if (!WalkUpFromMemberPointerTypeLoc(L))
+ return false;
+ return TraverseTypeLoc(L.getPointeeLoc());
+ }
+
bool WalkUpFromMemberPointerTypeLoc(MemberPointerTypeLoc L) {
auto SR = L.getLocalSourceRange();
Builder.foldNode(Builder.getRange(SR),