Author: Haojian Wu Date: 2019-12-05T15:03:30+01:00 New Revision: 7f93cb62280a73e3e899d49c45be8bfbac634b7d
URL: https://github.com/llvm/llvm-project/commit/7f93cb62280a73e3e899d49c45be8bfbac634b7d DIFF: https://github.com/llvm/llvm-project/commit/7f93cb62280a73e3e899d49c45be8bfbac634b7d.diff LOG: [AST] Traverse the class type loc inside the member type loc. Summary: We are missing this currently. This would fix https://github.com/clangd/clangd/issues/216. Reviewers: ilya-biryukov Subscribers: mgorny, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D70849 Added: clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp Modified: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp clang/include/clang/AST/RecursiveASTVisitor.h clang/unittests/Tooling/CMakeLists.txt Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp index 5b844462e839..0f688656b767 100644 --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -407,8 +407,8 @@ TEST(SemanticHighlighting, GetsCorrectTokens) { } )cpp", R"cpp( - template<typename $TemplateParameter[[T]], - void (T::*$TemplateParameter[[method]])(int)> + template<typename $TemplateParameter[[T]], + void ($TemplateParameter[[T]]::*$TemplateParameter[[method]])(int)> struct $Class[[G]] { void $Method[[foo]]( $TemplateParameter[[T]] *$Parameter[[O]]) { diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 1b6bb7193321..b30a3937abe4 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1162,11 +1162,12 @@ DEF_TRAVERSE_TYPELOC(LValueReferenceType, DEF_TRAVERSE_TYPELOC(RValueReferenceType, { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); }) -// FIXME: location of base class? // We traverse this in the type case as well, but how is it not reached through // the pointee type? DEF_TRAVERSE_TYPELOC(MemberPointerType, { - TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0))); + auto *TSI = TL.getClassTInfo(); + assert(TSI); + TRY_TO(TraverseTypeLoc(TSI->getTypeLoc())); TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); }) diff --git a/clang/unittests/Tooling/CMakeLists.txt b/clang/unittests/Tooling/CMakeLists.txt index 5cef154926ae..be641845558b 100644 --- a/clang/unittests/Tooling/CMakeLists.txt +++ b/clang/unittests/Tooling/CMakeLists.txt @@ -42,6 +42,7 @@ add_clang_unittest(ToolingTests RecursiveASTVisitorTests/LambdaDefaultCapture.cpp RecursiveASTVisitorTests/LambdaExpr.cpp RecursiveASTVisitorTests/LambdaTemplateParams.cpp + RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp RecursiveASTVisitorTests/NestedNameSpecifiers.cpp RecursiveASTVisitorTests/ParenExpr.cpp RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp new file mode 100644 index 000000000000..851c33dcf5a3 --- /dev/null +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp @@ -0,0 +1,47 @@ +//===- unittest/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp -===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "TestVisitor.h" + +using namespace clang; + +namespace { + +class MemberPointerTypeLocVisitor + : public ExpectedLocationVisitor<MemberPointerTypeLocVisitor> { +public: + bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { + if (!TL) + return true; + Match(TL.getDecl()->getName(), TL.getNameLoc()); + return true; + } + bool VisitRecordTypeLoc(RecordTypeLoc RTL) { + if (!RTL) + return true; + Match(RTL.getDecl()->getName(), RTL.getNameLoc()); + return true; + } +}; + +TEST(RecursiveASTVisitor, VisitTypeLocInMemberPointerTypeLoc) { + MemberPointerTypeLocVisitor Visitor; + Visitor.ExpectMatch("Bar", 4, 36); + Visitor.ExpectMatch("T", 7, 23); + EXPECT_TRUE(Visitor.runOver(R"cpp( + class Bar { void func(int); }; + class Foo { + void bind(const char*, void(Bar::*Foo)(int)) {} + + template<typename T> + void test(void(T::*Foo)()); + }; + )cpp")); +} + +} // end anonymous namespace _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits