summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clangd/XRefs.cpp5
-rw-r--r--clang-tools-extra/clangd/unittests/XRefsTests.cpp12
2 files changed, 17 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp
index 5dd5186879d..829fdf43b66 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -187,6 +187,11 @@ public:
// experssion is impossible to write down.
if (const auto *CtorExpr = dyn_cast<CXXConstructExpr>(E))
return CtorExpr->getParenOrBraceRange().isInvalid();
+ // Ignore implicit conversion-operator AST node.
+ if (const auto *ME = dyn_cast<MemberExpr>(E)) {
+ if (isa<CXXConversionDecl>(ME->getMemberDecl()))
+ return ME->getMemberLoc().isInvalid();
+ }
return isa<ImplicitCastExpr>(E);
};
diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp
index 1079eeaaa70..877bfaa5c1d 100644
--- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -2069,6 +2069,18 @@ TEST(FindReferences, ExplicitSymbols) {
using ::[[fo^o]];
}
)cpp",
+
+ R"cpp(
+ struct X {
+ operator bool();
+ };
+
+ int test() {
+ X [[a]];
+ [[a]].operator bool();
+ if ([[a^]]) {} // ignore implicit conversion-operator AST node
+ }
+ )cpp",
};
for (const char *Test : Tests) {
Annotations T(Test);
OpenPOWER on IntegriCloud