Skip to content

Commit

Permalink
[clang-tidy][NFC] Expose HeuristicResolver::lookupDependentName() and…
Browse files Browse the repository at this point in the history
… use it in StandaloneEmptyCheck

The use replaces CXXRecordDecl::lookupDependentName() which
HeuristicResolver aims to supersede.
  • Loading branch information
HighCommander4 committed Feb 23, 2025
1 parent ccad5e7 commit b44bc0b
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 14 deletions.
1 change: 1 addition & 0 deletions clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ clang_target_link_libraries(clangTidyBugproneModule
clangASTMatchers
clangBasic
clangLex
clangSema
clangTooling
clangTransformer
)
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Lex/Lexer.h"
#include "clang/Sema/HeuristicResolver.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Casting.h"
Expand Down Expand Up @@ -125,8 +126,8 @@ void StandaloneEmptyCheck::check(const MatchFinder::MatchResult &Result) {
DeclarationName Name =
Context.DeclarationNames.getIdentifier(&Context.Idents.get("clear"));

auto Candidates = MemberCall->getRecordDecl()->lookupDependentName(
Name, [](const NamedDecl *ND) {
auto Candidates = HeuristicResolver(Context).lookupDependentName(
MemberCall->getRecordDecl(), Name, [](const NamedDecl *ND) {
return isa<CXXMethodDecl>(ND) &&
llvm::cast<CXXMethodDecl>(ND)->getMinRequiredArguments() ==
0 &&
Expand Down Expand Up @@ -174,8 +175,8 @@ void StandaloneEmptyCheck::check(const MatchFinder::MatchResult &Result) {
DeclarationName Name =
Context.DeclarationNames.getIdentifier(&Context.Idents.get("clear"));

auto Candidates =
ArgRecordDecl->lookupDependentName(Name, [](const NamedDecl *ND) {
auto Candidates = HeuristicResolver(Context).lookupDependentName(
ArgRecordDecl, Name, [](const NamedDecl *ND) {
return isa<CXXMethodDecl>(ND) &&
llvm::cast<CXXMethodDecl>(ND)->getMinRequiredArguments() ==
0 &&
Expand Down
7 changes: 7 additions & 0 deletions clang/include/clang/Sema/HeuristicResolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ class HeuristicResolver {
QualType
resolveNestedNameSpecifierToType(const NestedNameSpecifier *NNS) const;

// Perform an imprecise lookup of a dependent name in `RD`.
// This function does not follow strict semantic rules and should be used
// only when lookup rules can be relaxed, e.g. indexing.
std::vector<const NamedDecl *>
lookupDependentName(CXXRecordDecl *RD, DeclarationName Name,
llvm::function_ref<bool(const NamedDecl *ND)> Filter);

// Given the type T of a dependent expression that appears of the LHS of a
// "->", heuristically find a corresponding pointee type in whose scope we
// could look up the name appearing on the RHS.
Expand Down
18 changes: 8 additions & 10 deletions clang/lib/Sema/HeuristicResolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ class HeuristicResolverImpl {
const DependentTemplateSpecializationType *DTST);
QualType resolveNestedNameSpecifierToType(const NestedNameSpecifier *NNS);
QualType getPointeeType(QualType T);
std::vector<const NamedDecl *>
lookupDependentName(CXXRecordDecl *RD, DeclarationName Name,
llvm::function_ref<bool(const NamedDecl *ND)> Filter);

private:
ASTContext &Ctx;
Expand Down Expand Up @@ -83,16 +86,6 @@ class HeuristicResolverImpl {
// during simplification, and the operation fails if no pointer type is found.
QualType simplifyType(QualType Type, const Expr *E, bool UnwrapPointer);

// This is a reimplementation of CXXRecordDecl::lookupDependentName()
// so that the implementation can call into other HeuristicResolver helpers.
// FIXME: Once HeuristicResolver is upstreamed to the clang libraries
// (https://github.com/clangd/clangd/discussions/1662),
// CXXRecordDecl::lookupDepenedentName() can be removed, and its call sites
// can be modified to benefit from the more comprehensive heuristics offered
// by HeuristicResolver instead.
std::vector<const NamedDecl *>
lookupDependentName(CXXRecordDecl *RD, DeclarationName Name,
llvm::function_ref<bool(const NamedDecl *ND)> Filter);
bool findOrdinaryMemberInDependentClasses(const CXXBaseSpecifier *Specifier,
CXXBasePath &Path,
DeclarationName Name);
Expand Down Expand Up @@ -539,6 +532,11 @@ QualType HeuristicResolver::resolveNestedNameSpecifierToType(
const NestedNameSpecifier *NNS) const {
return HeuristicResolverImpl(Ctx).resolveNestedNameSpecifierToType(NNS);
}
std::vector<const NamedDecl *> HeuristicResolver::lookupDependentName(
CXXRecordDecl *RD, DeclarationName Name,
llvm::function_ref<bool(const NamedDecl *ND)> Filter) {
return HeuristicResolverImpl(Ctx).lookupDependentName(RD, Name, Filter);
}
const QualType HeuristicResolver::getPointeeType(QualType T) const {
return HeuristicResolverImpl(Ctx).getPointeeType(T);
}
Expand Down

0 comments on commit b44bc0b

Please sign in to comment.