clang  9.0.0svn
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/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/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/SmallPtrSet.h"
#include "llvm/ADT/TinyPtrVector.h"
#include "llvm/ADT/edit_distance.h"
#include "llvm/Support/ErrorHandling.h"
#include <algorithm>
#include <iterator>
#include <list>
#include <set>
#include <utility>
#include <vector>
#include "clang/AST/TypeNodes.def"
Include dependency graph for SemaLookup.cpp:

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 DeclContextgetContextForScopeMatching (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. More...
 
static bool isPreferredLookupResult (Sema &S, Sema::LookupNameKind Kind, NamedDecl *D, NamedDecl *Existing)
 Determine whether D is a better lookup result than Existing, given that they declare the same entity. More...
 
static bool canHideTag (NamedDecl *D)
 Determine whether D can hide a tag declaration. More...
 
static bool LookupBuiltin (Sema &S, LookupResult &R)
 Lookup a builtin function, when name lookup would otherwise fail. More...
 
static bool CanDeclareSpecialMemberFunction (const CXXRecordDecl *Class)
 Determine whether we can declare a special member function within the class at this point. More...
 
static bool isImplicitlyDeclaredMemberFunctionName (DeclarationName Name)
 Determine whether this is the name of an implicitly-declared special member function. More...
 
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. More...
 
static bool LookupDirect (Sema &S, LookupResult &R, const DeclContext *DC)
 
static bool CppNamespaceLookup (Sema &S, LookupResult &R, ASTContext &Context, DeclContext *NS, UnqualUsingDirectiveSet &UDirs)
 
static bool isNamespaceOrTranslationUnitScope (Scope *S)
 
static std::pair< DeclContext *, boolfindOuterContext (Scope *S)
 
static ModulegetDefiningModule (Sema &S, Decl *Entity)
 Find the module in which the given declaration was defined. More...
 
static bool isInCurrentModule (const Module *M, const LangOptions &LangOpts)
 Determine whether the module M is part of the current module from the perspective of a module-private visibility check. More...
 
template<typename ParmDecl >
static bool hasVisibleDefaultArgument (Sema &S, const ParmDecl *D, llvm::SmallVectorImpl< Module *> *Modules)
 
template<typename Filter >
static bool hasVisibleDeclarationImpl (Sema &S, const NamedDecl *D, llvm::SmallVectorImpl< Module *> *Modules, Filter F)
 
static NamedDeclfindAcceptableDecl (Sema &SemaRef, NamedDecl *D, unsigned IDNS)
 Retrieve the visible declaration corresponding to D, if any. More...
 
static bool LookupQualifiedNameInUsingDirectives (Sema &S, LookupResult &R, DeclContext *StartDC)
 Perform qualified name lookup in the namespaces nominated by using directives by the given context. More...
 
static bool LookupAnyMember (const CXXBaseSpecifier *Specifier, CXXBasePath &Path, DeclarationName Name)
 Callback that looks for any member of a class with the given name. More...
 
template<typename InputIterator >
static bool HasOnlyStaticMembers (InputIterator First, InputIterator Last)
 Determine whether the given set of member declarations contains only static members, nested types, and enumerators. More...
 
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 void LookupVisibleDecls (DeclContext *Ctx, LookupResult &Result, bool QualifiedNameLookup, bool InBaseClass, VisibleDeclConsumer &Consumer, VisibleDeclsRecord &Visited, bool IncludeDependentBases, bool LoadExternal)
 
static void LookupVisibleDecls (Scope *S, LookupResult &Result, UnqualUsingDirectiveSet &UDirs, VisibleDeclConsumer &Consumer, VisibleDeclsRecord &Visited, bool LoadExternal)
 
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. More...
 
static void checkCorrectionVisibility (Sema &SemaRef, TypoCorrection &TC)
 Check whether the declarations found for a typo correction are visible. More...
 
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. More...
 
static NamedDeclgetDefinitionToImport (NamedDecl *D)
 Find which declaration we should import to provide the definition of the given declaration. More...
 
static std::string getIncludeStringForHeader (Preprocessor &PP, const FileEntry *E)
 Get a "quoted.h" or <angled.h> include path to use in a diagnostic suggesting the addition of a #include of the specified file. More...
 

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,
QualType  T 
)
static

◆ addAssociatedClassesAndNamespaces() [2/3]

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

◆ addAssociatedClassesAndNamespaces() [3/3]

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

◆ AddKeywordsToConsumer()

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

◆ CanDeclareSpecialMemberFunction()

static bool CanDeclareSpecialMemberFunction ( const CXXRecordDecl Class)
static

◆ canHideTag()

static bool canHideTag ( NamedDecl D)
static

Determine whether D can hide a tag declaration.

Definition at line 452 of file SemaLookup.cpp.

References clang::NamedDecl::getUnderlyingDecl().

◆ 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 3905 of file SemaLookup.cpp.

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

◆ CollectEnclosingNamespace()

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

◆ CppNamespaceLookup()

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

Definition at line 937 of file SemaLookup.cpp.

◆ DeclareImplicitMemberFunctionsWithName()

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

◆ 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 1672 of file SemaLookup.cpp.

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

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

◆ findOuterContext()

static std::pair<DeclContext *, bool> findOuterContext ( Scope S)
static

◆ getContextForScopeMatching()

static DeclContext* getContextForScopeMatching ( 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 347 of file SemaLookup.cpp.

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

◆ getDefiningModule()

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

◆ getDefinitionToImport()

static NamedDecl* getDefinitionToImport ( NamedDecl D)
static

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

Definition at line 5065 of file SemaLookup.cpp.

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

◆ getIDNS()

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

◆ getIncludeStringForHeader()

static std::string getIncludeStringForHeader ( Preprocessor PP,
const FileEntry E 
)
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 5103 of file SemaLookup.cpp.

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

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

◆ getNestedNameSpecifierIdentifiers()

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

◆ HasOnlyStaticMembers()

template<typename InputIterator >
static bool HasOnlyStaticMembers ( InputIterator  First,
InputIterator  Last 
)
static

Determine whether the given set of member declarations contains only static members, nested types, and enumerators.

Definition at line 1978 of file SemaLookup.cpp.

References clang::NamedDecl::getUnderlyingDecl().

◆ hasVisibleDeclarationImpl()

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

◆ hasVisibleDefaultArgument()

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

◆ isCandidateViable()

static bool isCandidateViable ( CorrectionCandidateCallback CCC,
TypoCorrection Candidate 
)
static

◆ isImplicitlyDeclaredMemberFunctionName()

static bool isImplicitlyDeclaredMemberFunctionName ( DeclarationName  Name)
static

◆ isInCurrentModule()

static bool isInCurrentModule ( const Module M,
const LangOptions LangOpts 
)
static

Determine whether the module M is part of the current module from the perspective of a module-private visibility check.

Definition at line 1398 of file SemaLookup.cpp.

References clang::LangOptions::CurrentModule, clang::Module::getTopLevelModuleName(), clang::Module::GlobalModuleFragment, clang::Module::Kind, and clang::Module::Parent.

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

◆ isNamespaceOrTranslationUnitScope()

static bool isNamespaceOrTranslationUnitScope ( Scope S)
static

◆ isPreferredLookupResult()

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

◆ LookupAnyMember()

static bool LookupAnyMember ( const CXXBaseSpecifier Specifier,
CXXBasePath Path,
DeclarationName  Name 
)
static

Callback that looks for any member of a class with the given name.

Definition at line 1967 of file SemaLookup.cpp.

References clang::CXXBasePath::Decls, clang::DeclContextLookupResult::empty(), clang::Type::getAs(), clang::CXXBaseSpecifier::getType(), and clang::DeclContext::lookup().

◆ LookupBuiltin()

static bool LookupBuiltin ( Sema S,
LookupResult R 
)
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

◆ 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 1887 of file SemaLookup.cpp.

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

◆ LookupVisibleDecls() [1/2]

static void LookupVisibleDecls ( DeclContext Ctx,
LookupResult Result,
bool  QualifiedNameLookup,
bool  InBaseClass,
VisibleDeclConsumer Consumer,
VisibleDeclsRecord &  Visited,
bool  IncludeDependentBases,
bool  LoadExternal 
)
static

◆ LookupVisibleDecls() [2/2]

static void LookupVisibleDecls ( Scope S,
LookupResult Result,
UnqualUsingDirectiveSet &  UDirs,
VisibleDeclConsumer Consumer,
VisibleDeclsRecord &  Visited,
bool  LoadExternal 
)
static

Variable Documentation

◆ MaxTypoDistanceResultSets

const unsigned MaxTypoDistanceResultSets = 5
static

Definition at line 4036 of file SemaLookup.cpp.