diff options
author | Eduardo Caldas <ecaldas@google.com> | 2020-08-03 18:29:12 +0000 |
---|---|---|
committer | Eduardo Caldas <ecaldas@google.com> | 2020-08-04 14:31:12 +0000 |
commit | 8ce15f7eeb122c0bba4b676d797217359dd57c30 (patch) | |
tree | 56e2cdabb7da2fa74571d2320bfd89a9909b4e26 /clang/lib/Tooling/Syntax/BuildTree.cpp | |
parent | 2d0b05969bc01a2fda14b8dc3e8c26c81efe9c6f (diff) | |
download | llvm-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.cpp | 12 |
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), |