clang 19.0.0git
Macros | Functions | Variables
SemaLookup.cpp File Reference
#include "clang/AST/ASTContext.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclLookups.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Lex/HeaderSearch.h"
#include "clang/Lex/ModuleLoader.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/Overload.h"
#include "clang/Sema/RISCVIntrinsicManager.h"
#include "clang/Sema/Scope.h"
#include "clang/Sema/ScopeInfo.h"
#include "clang/Sema/Sema.h"
#include "clang/Sema/SemaInternal.h"
#include "clang/Sema/TemplateDeduction.h"
#include "clang/Sema/TypoCorrection.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/TinyPtrVector.h"
#include "llvm/ADT/edit_distance.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include <algorithm>
#include <iterator>
#include <list>
#include <optional>
#include <set>
#include <utility>
#include <vector>
#include "OpenCLBuiltins.inc"
#include "clang/AST/TypeNodes.inc"

Go to the source code of this file.

Macros

#define TYPE(Class, Base)
 
#define DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define NON_CANONICAL_TYPE(Class, Base)   case Type::Class:
 
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define ABSTRACT_TYPE(Class, Base)
 

Functions

static unsigned getIDNS (Sema::LookupNameKind NameKind, bool CPlusPlus, bool Redeclaration)
 
static const DeclContextgetContextForScopeMatching (const Decl *D)
 Get a representative context for a declaration such that two declarations will have the same context if they were found within the same scope.
 
static bool isPreferredLookupResult (Sema &S, Sema::LookupNameKind Kind, const NamedDecl *D, const NamedDecl *Existing)
 Determine whether D is a better lookup result than Existing, given that they declare the same entity.
 
static bool canHideTag (const NamedDecl *D)
 Determine whether D can hide a tag declaration.
 
static QualType diagOpenCLBuiltinTypeError (Sema &S, llvm::StringRef TypeClass, llvm::StringRef Name)
 Diagnose a missing builtin type.
 
static QualType getOpenCLEnumType (Sema &S, llvm::StringRef Name)
 Lookup an OpenCL enum type.
 
static QualType getOpenCLTypedefType (Sema &S, llvm::StringRef Name)
 Lookup an OpenCL typedef type.
 
static void GetQualTypesForOpenCLBuiltin (Sema &S, const OpenCLBuiltinStruct &OpenCLBuiltin, unsigned &GenTypeMaxCnt, SmallVector< QualType, 1 > &RetTypes, SmallVector< SmallVector< QualType, 1 >, 5 > &ArgTypes)
 Get the QualType instances of the return type and arguments for an OpenCL builtin function signature.
 
static void GetOpenCLBuiltinFctOverloads (ASTContext &Context, unsigned GenTypeMaxCnt, std::vector< QualType > &FunctionList, SmallVector< QualType, 1 > &RetTypes, SmallVector< SmallVector< QualType, 1 >, 5 > &ArgTypes)
 Create a list of the candidate function overloads for an OpenCL builtin function.
 
static void InsertOCLBuiltinDeclarationsFromTable (Sema &S, LookupResult &LR, IdentifierInfo *II, const unsigned FctIndex, const unsigned Len)
 When trying to resolve a function name, if isOpenCLBuiltin() returns a non-null <Index, Len> pair, then the name is referencing an OpenCL builtin function.
 
static void LookupPredefedObjCSuperType (Sema &Sema, Scope *S)
 Looks up the declaration of "struct objc_super" and saves it for later use in building builtin declaration of objc_msgSendSuper and objc_msgSendSuper_stret.
 
static bool CanDeclareSpecialMemberFunction (const CXXRecordDecl *Class)
 Determine whether we can declare a special member function within the class at this point.
 
static bool isImplicitlyDeclaredMemberFunctionName (DeclarationName Name)
 Determine whether this is the name of an implicitly-declared special member function.
 
static void DeclareImplicitMemberFunctionsWithName (Sema &S, DeclarationName Name, SourceLocation Loc, const DeclContext *DC)
 If there are any implicit member functions with the given name that need to be declared in the given declaration context, do so.
 
static bool LookupDirect (Sema &S, LookupResult &R, const DeclContext *DC)
 
static bool CppNamespaceLookup (Sema &S, LookupResult &R, ASTContext &Context, const DeclContext *NS, UnqualUsingDirectiveSet &UDirs)
 
static bool isNamespaceOrTranslationUnitScope (Scope *S)
 
static DeclContextfindOuterContext (Scope *S)
 Find the outer declaration context from this scope.
 
static ModulegetDefiningModule (Sema &S, Decl *Entity)
 Find the module in which the given declaration was defined.
 
template<typename ParmDecl >
static bool hasAcceptableDefaultArgument (Sema &S, const ParmDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Sema::AcceptableKind Kind)
 
template<typename Filter >
static bool hasAcceptableDeclarationImpl (Sema &S, const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Filter F, Sema::AcceptableKind Kind)
 
static bool hasAcceptableExplicitSpecialization (Sema &S, const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Sema::AcceptableKind Kind)
 
static bool hasAcceptableMemberSpecialization (Sema &S, const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules, Sema::AcceptableKind Kind)
 
static NamedDeclfindAcceptableDecl (Sema &SemaRef, NamedDecl *D, unsigned IDNS)
 Retrieve the visible declaration corresponding to D, if any.
 
static bool LookupQualifiedNameInUsingDirectives (Sema &S, LookupResult &R, DeclContext *StartDC)
 Perform qualified name lookup in the namespaces nominated by using directives by the given context.
 
static void addAssociatedClassesAndNamespaces (AssociatedLookup &Result, QualType T)
 
static void CollectEnclosingNamespace (Sema::AssociatedNamespaceSet &Namespaces, DeclContext *Ctx)
 
static void addAssociatedClassesAndNamespaces (AssociatedLookup &Result, const TemplateArgument &Arg)
 
static void addAssociatedClassesAndNamespaces (AssociatedLookup &Result, CXXRecordDecl *Class)
 
static bool isCandidateViable (CorrectionCandidateCallback &CCC, TypoCorrection &Candidate)
 
static void LookupPotentialTypoResult (Sema &SemaRef, LookupResult &Res, IdentifierInfo *Name, Scope *S, CXXScopeSpec *SS, DeclContext *MemberContext, bool EnteringContext, bool isObjCIvarLookup, bool FindHidden)
 Perform name lookup for a possible result for typo correction.
 
static void checkCorrectionVisibility (Sema &SemaRef, TypoCorrection &TC)
 Check whether the declarations found for a typo correction are visible.
 
static void getNestedNameSpecifierIdentifiers (NestedNameSpecifier *NNS, SmallVectorImpl< const IdentifierInfo * > &Identifiers)
 
static void AddKeywordsToConsumer (Sema &SemaRef, TypoCorrectionConsumer &Consumer, Scope *S, CorrectionCandidateCallback &CCC, bool AfterNestedNameSpecifier)
 Add keywords to the consumer as possible typo corrections.
 
static const NamedDeclgetDefinitionToImport (const NamedDecl *D)
 Find which declaration we should import to provide the definition of the given declaration.
 
static std::string getHeaderNameForHeader (Preprocessor &PP, FileEntryRef E, llvm::StringRef IncludingFile)
 Get a "quoted.h" or <angled.h> include path to use in a diagnostic suggesting the addition of a #include of the specified file.
 

Variables

static const unsigned MaxTypoDistanceResultSets = 5
 

Macro Definition Documentation

◆ ABSTRACT_TYPE

#define ABSTRACT_TYPE (   Class,
  Base 
)

◆ DEPENDENT_TYPE

#define DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:

◆ NON_CANONICAL_TYPE

#define NON_CANONICAL_TYPE (   Class,
  Base 
)    case Type::Class:

◆ NON_CANONICAL_UNLESS_DEPENDENT_TYPE

#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:

◆ TYPE

#define TYPE (   Class,
  Base 
)

Function Documentation

◆ addAssociatedClassesAndNamespaces() [1/3]

static void addAssociatedClassesAndNamespaces ( AssociatedLookup &  Result,
const TemplateArgument Arg 
)
static

◆ addAssociatedClassesAndNamespaces() [2/3]

static void addAssociatedClassesAndNamespaces ( AssociatedLookup &  Result,
CXXRecordDecl Class 
)
static

◆ addAssociatedClassesAndNamespaces() [3/3]

static void addAssociatedClassesAndNamespaces ( AssociatedLookup &  Result,
QualType  T 
)
static

◆ AddKeywordsToConsumer()

static void AddKeywordsToConsumer ( Sema SemaRef,
TypoCorrectionConsumer Consumer,
Scope S,
CorrectionCandidateCallback CCC,
bool  AfterNestedNameSpecifier 
)
static

◆ CanDeclareSpecialMemberFunction()

static bool CanDeclareSpecialMemberFunction ( const CXXRecordDecl Class)
static

Determine whether we can declare a special member function within the class at this point.

Definition at line 999 of file SemaLookup.cpp.

References clang::Class.

Referenced by DeclareImplicitMemberFunctionsWithName(), clang::Sema::ForceDeclarationOfImplicitMembers(), clang::Sema::LookupConstructors(), and clang::Sema::LookupSpecialMember().

◆ canHideTag()

static bool canHideTag ( const NamedDecl D)
static

Determine whether D can hide a tag declaration.

Definition at line 464 of file SemaLookup.cpp.

References clang::NamedDecl::getUnderlyingDecl().

Referenced by clang::LookupResult::resolveKind().

◆ checkCorrectionVisibility()

static void checkCorrectionVisibility ( Sema SemaRef,
TypoCorrection TC 
)
static

Check whether the declarations found for a typo correction are visible.

Set the correction's RequiresImport flag to true if none of the declarations are visible, false otherwise.

Definition at line 4529 of file SemaLookup.cpp.

References clang::TypoCorrection::begin(), clang::TypoCorrection::end(), clang::LookupResult::isVisible(), clang::TypoCorrection::setCorrectionDecls(), and clang::TypoCorrection::setRequiresImport().

Referenced by clang::TypoCorrectionConsumer::addCorrection(), and clang::Sema::CorrectTypo().

◆ CollectEnclosingNamespace()

static void CollectEnclosingNamespace ( Sema::AssociatedNamespaceSet Namespaces,
DeclContext Ctx 
)
static

◆ CppNamespaceLookup()

static bool CppNamespaceLookup ( Sema S,
LookupResult R,
ASTContext Context,
const DeclContext NS,
UnqualUsingDirectiveSet &  UDirs 
)
static

◆ DeclareImplicitMemberFunctionsWithName()

static void DeclareImplicitMemberFunctionsWithName ( Sema S,
DeclarationName  Name,
SourceLocation  Loc,
const DeclContext DC 
)
static

◆ diagOpenCLBuiltinTypeError()

static QualType diagOpenCLBuiltinTypeError ( Sema S,
llvm::StringRef  TypeClass,
llvm::StringRef  Name 
)
static

Diagnose a missing builtin type.

Definition at line 698 of file SemaLookup.cpp.

References clang::Sema::Context, clang::SemaBase::Diag(), and clang::ASTContext::VoidTy.

Referenced by getOpenCLEnumType(), and getOpenCLTypedefType().

◆ findAcceptableDecl()

static NamedDecl * findAcceptableDecl ( Sema SemaRef,
NamedDecl D,
unsigned  IDNS 
)
static

Retrieve the visible declaration corresponding to D, if any.

This routine determines whether the declaration D is visible in the current module, with the current imports. If not, it checks whether any redeclaration of D is visible, and if so, returns that declaration.

Returns
D, or a visible previous declaration of D, whichever is more recent and visible. If no declaration of D is visible, returns null.

Definition at line 2031 of file SemaLookup.cpp.

References clang::LookupResult::isAvailableForLookup(), and clang::Decl::redecls().

Referenced by argumentDependentLookup().

◆ findOuterContext()

static DeclContext * findOuterContext ( Scope S)
static

Find the outer declaration context from this scope.

This indicates the context that we should search up to (exclusive) before considering the parent of the specified scope.

Definition at line 1244 of file SemaLookup.cpp.

◆ getContextForScopeMatching()

static const DeclContext * getContextForScopeMatching ( const Decl D)
static

Get a representative context for a declaration such that two declarations will have the same context if they were found within the same scope.

Definition at line 355 of file SemaLookup.cpp.

References clang::Decl::getDeclContext(), clang::Decl::getLexicalDeclContext(), clang::DeclContext::getRedeclContext(), and clang::DeclContext::isFunctionOrMethod().

Referenced by clang::LookupResult::resolveKind().

◆ getDefiningModule()

static Module * getDefiningModule ( Sema S,
Decl Entity 
)
static

◆ getDefinitionToImport()

static const NamedDecl * getDefinitionToImport ( const NamedDecl D)
static

Find which declaration we should import to provide the definition of the given declaration.

Definition at line 5710 of file SemaLookup.cpp.

References getDefinitionToImport().

Referenced by clang::Sema::diagnoseMissingImport(), and getDefinitionToImport().

◆ getHeaderNameForHeader()

static std::string getHeaderNameForHeader ( Preprocessor PP,
FileEntryRef  E,
llvm::StringRef  IncludingFile 
)
static

Get a "quoted.h" or <angled.h> include path to use in a diagnostic suggesting the addition of a #include of the specified file.

Definition at line 5749 of file SemaLookup.cpp.

References clang::Preprocessor::getHeaderSearchInfo(), and clang::HeaderSearch::suggestPathToFileForDiagnostics().

Referenced by clang::Sema::diagnoseMissingImport().

◆ getIDNS()

static unsigned getIDNS ( Sema::LookupNameKind  NameKind,
bool  CPlusPlus,
bool  Redeclaration 
)
inlinestatic

◆ getNestedNameSpecifierIdentifiers()

static void getNestedNameSpecifierIdentifiers ( NestedNameSpecifier NNS,
SmallVectorImpl< const IdentifierInfo * > &  Identifiers 
)
static

◆ GetOpenCLBuiltinFctOverloads()

static void GetOpenCLBuiltinFctOverloads ( ASTContext Context,
unsigned  GenTypeMaxCnt,
std::vector< QualType > &  FunctionList,
SmallVector< QualType, 1 > &  RetTypes,
SmallVector< SmallVector< QualType, 1 >, 5 > &  ArgTypes 
)
static

Create a list of the candidate function overloads for an OpenCL builtin function.

Parameters
Context(in) The ASTContext instance.
GenTypeMaxCnt(in) Maximum number of types contained in a generic type used as return type or as argument. Only meaningful for generic types, otherwise equals 1.
FunctionList(out) List of FunctionTypes.
RetTypes(in) List of the possible return types.
ArgTypes(in) List of the possible types for the arguments.

Definition at line 771 of file SemaLookup.cpp.

References clang::ASTContext::getDefaultCallingConvention(), clang::ASTContext::getFunctionType(), and clang::FunctionProtoType::ExtProtoInfo::Variadic.

Referenced by InsertOCLBuiltinDeclarationsFromTable().

◆ getOpenCLEnumType()

static QualType getOpenCLEnumType ( Sema S,
llvm::StringRef  Name 
)
static

◆ getOpenCLTypedefType()

static QualType getOpenCLTypedefType ( Sema S,
llvm::StringRef  Name 
)
static

◆ GetQualTypesForOpenCLBuiltin()

static void GetQualTypesForOpenCLBuiltin ( Sema S,
const OpenCLBuiltinStruct &  OpenCLBuiltin,
unsigned GenTypeMaxCnt,
SmallVector< QualType, 1 > &  RetTypes,
SmallVector< SmallVector< QualType, 1 >, 5 > &  ArgTypes 
)
static

Get the QualType instances of the return type and arguments for an OpenCL builtin function signature.

Parameters
S(in) The Sema instance.
OpenCLBuiltin(in) The signature currently handled.
GenTypeMaxCnt(out) Maximum number of types contained in a generic type used as return type or as argument. Only meaningful for generic types, otherwise equals 1.
RetTypes(out) List of the possible return types.
ArgTypes(out) List of the possible argument types. For each argument, ArgTypes contains QualTypes for the Cartesian product of (vector sizes) x (types) .

Definition at line 742 of file SemaLookup.cpp.

Referenced by InsertOCLBuiltinDeclarationsFromTable().

◆ hasAcceptableDeclarationImpl()

template<typename Filter >
static bool hasAcceptableDeclarationImpl ( Sema S,
const NamedDecl D,
llvm::SmallVectorImpl< Module * > *  Modules,
Filter  F,
Sema::AcceptableKind  Kind 
)
static

◆ hasAcceptableDefaultArgument()

template<typename ParmDecl >
static bool hasAcceptableDefaultArgument ( Sema S,
const ParmDecl *  D,
llvm::SmallVectorImpl< Module * > *  Modules,
Sema::AcceptableKind  Kind 
)
static

◆ hasAcceptableExplicitSpecialization()

static bool hasAcceptableExplicitSpecialization ( Sema S,
const NamedDecl D,
llvm::SmallVectorImpl< Module * > *  Modules,
Sema::AcceptableKind  Kind 
)
static

◆ hasAcceptableMemberSpecialization()

static bool hasAcceptableMemberSpecialization ( Sema S,
const NamedDecl D,
llvm::SmallVectorImpl< Module * > *  Modules,
Sema::AcceptableKind  Kind 
)
static

◆ InsertOCLBuiltinDeclarationsFromTable()

static void InsertOCLBuiltinDeclarationsFromTable ( Sema S,
LookupResult LR,
IdentifierInfo II,
const unsigned  FctIndex,
const unsigned  Len 
)
static

When trying to resolve a function name, if isOpenCLBuiltin() returns a non-null <Index, Len> pair, then the name is referencing an OpenCL builtin function.

Add all candidate signatures to the LookUpResult.

Parameters
S(in) The Sema instance.
LR(inout) The LookupResult instance.
II(in) The identifier being resolved.
FctIndex(in) Starting index in the BuiltinTable.
Len(in) The signature list has Len elements.

Definition at line 816 of file SemaLookup.cpp.

References clang::Decl::addAttr(), clang::LookupResult::addDecl(), clang::Sema::Context, clang::ParmVarDecl::Create(), clang::FunctionDecl::Create(), clang::Sema::getCurFPFeatures(), clang::ASTContext::getLangOpts(), clang::Sema::getLangOpts(), clang::LookupResult::getNameLoc(), GetOpenCLBuiltinFctOverloads(), clang::Sema::getPreprocessor(), GetQualTypesForOpenCLBuiltin(), clang::ASTContext::getTranslationUnitDecl(), clang::FPOptions::isFPConstrained(), clang::Preprocessor::isMacroDefined(), Loc, Parent, clang::LookupResult::resolveKind(), clang::SC_Extern, clang::SC_None, clang::Decl::setImplicit(), and clang::ParmVarDecl::setScopeInfo().

Referenced by clang::Sema::LookupBuiltin().

◆ isCandidateViable()

static bool isCandidateViable ( CorrectionCandidateCallback CCC,
TypoCorrection Candidate 
)
static

◆ isImplicitlyDeclaredMemberFunctionName()

static bool isImplicitlyDeclaredMemberFunctionName ( DeclarationName  Name)
static

Determine whether this is the name of an implicitly-declared special member function.

Definition at line 1041 of file SemaLookup.cpp.

References clang::DeclarationName::CXXConstructorName, clang::DeclarationName::CXXDestructorName, and clang::DeclarationName::CXXOperatorName.

◆ isNamespaceOrTranslationUnitScope()

static bool isNamespaceOrTranslationUnitScope ( Scope S)
static

Definition at line 1235 of file SemaLookup.cpp.

References clang::DeclContext::isFileContext().

Referenced by clang::Sema::LookupName().

◆ isPreferredLookupResult()

static bool isPreferredLookupResult ( Sema S,
Sema::LookupNameKind  Kind,
const NamedDecl D,
const NamedDecl Existing 
)
static

◆ LookupDirect()

static bool LookupDirect ( Sema S,
LookupResult R,
const DeclContext DC 
)
static

◆ LookupPotentialTypoResult()

static void LookupPotentialTypoResult ( Sema SemaRef,
LookupResult Res,
IdentifierInfo Name,
Scope S,
CXXScopeSpec SS,
DeclContext MemberContext,
bool  EnteringContext,
bool  isObjCIvarLookup,
bool  FindHidden 
)
static

◆ LookupPredefedObjCSuperType()

static void LookupPredefedObjCSuperType ( Sema Sema,
Scope S 
)
static

Looks up the declaration of "struct objc_super" and saves it for later use in building builtin declaration of objc_msgSendSuper and objc_msgSendSuper_stret.

Definition at line 982 of file SemaLookup.cpp.

References clang::Sema::Context, clang::LookupResult::Found, clang::IdentifierTable::get(), clang::ASTContext::getTagDeclType(), clang::ASTContext::Idents, clang::Sema::LookupName(), clang::Sema::LookupTagName, clang::Result, and clang::ASTContext::setObjCSuperType().

Referenced by clang::Sema::LookupNecessaryTypesForBuiltin().

◆ LookupQualifiedNameInUsingDirectives()

static bool LookupQualifiedNameInUsingDirectives ( Sema S,
LookupResult R,
DeclContext StartDC 
)
static

Perform qualified name lookup in the namespaces nominated by using directives by the given context.

C++98 [namespace.qual]p2: Given X::m (where X is a user-declared namespace), or given ::m (where X is the global namespace), let S be the set of all declarations of m in X and in the transitive closure of all namespaces nominated by using-directives in X and its used namespaces, except that using-directives are ignored in any namespace, including X, directly containing one or more declarations of m. No namespace is searched more than once in the lookup of a name. If S is the empty set, the program is ill-formed. Otherwise, if S has exactly one member, or if the context of the reference is a using-declaration (namespace.udecl), S is the required set of declarations of m. Otherwise if the use of m is not one that allows a unique declaration to be chosen from S, the program is ill-formed.

C++98 [namespace.qual]p5: During the lookup of a qualified namespace member name, if the lookup finds more than one declaration of the member, and if one declaration introduces a class name or enumeration name and the other declarations either introduce the same object, the same enumerator or a set of functions, the non-type name hides the class or enumeration name if and only if the declarations are from the same namespace; otherwise (the declarations are from different namespaces), the program is ill-formed.

Definition at line 2333 of file SemaLookup.cpp.

References clang::LookupResult::addAllDecls(), clang::LookupResult::clear(), clang::LookupResult::empty(), clang::DeclContext::isFileContext(), clang::LookupResult::isSingleTagDecl(), clang::Sema::isVisible(), LookupDirect(), clang::LookupResult::resolveKind(), clang::LookupResult::setAmbiguousQualifiedTagHiding(), clang::LookupResult::Temporary, clang::DeclContext::using_directives(), and Visited.

Referenced by clang::Sema::LookupQualifiedName().

Variable Documentation

◆ MaxTypoDistanceResultSets

const unsigned MaxTypoDistanceResultSets = 5
static

Definition at line 4660 of file SemaLookup.cpp.

Referenced by clang::TypoCorrectionConsumer::addCorrection().