clang 22.0.0git
SemaOverload.cpp File Reference
#include "CheckExprLifetime.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/Type.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/DiagnosticOptions.h"
#include "clang/Basic/OperatorKinds.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Sema/EnterExpressionEvaluationContext.h"
#include "clang/Sema/Initialization.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/Overload.h"
#include "clang/Sema/SemaARM.h"
#include "clang/Sema/SemaCUDA.h"
#include "clang/Sema/SemaObjC.h"
#include "clang/Sema/Template.h"
#include "clang/Sema/TemplateDeduction.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdlib>
#include <optional>

Go to the source code of this file.

Typedefs

using AllowedExplicit = Sema::AllowedExplicit

Enumerations

enum  {
  ft_default , ft_different_class , ft_parameter_arity , ft_parameter_mismatch ,
  ft_return_type , ft_qualifer_mismatch , ft_noexcept
}
enum class  FixedEnumPromotion { None , ToUnderlyingType , ToPromotedUnderlyingType }

Functions

static bool functionHasPassObjectSizeParams (const FunctionDecl *FD)
static ExprResult CreateFunctionRefExpr (Sema &S, FunctionDecl *Fn, NamedDecl *FoundDecl, const Expr *Base, bool HadMultipleCandidates, SourceLocation Loc=SourceLocation(), const DeclarationNameLoc &LocInfo=DeclarationNameLoc())
 A convenience routine for creating a decayed reference to a function.
static bool IsStandardConversion (Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle, bool AllowObjCWritebackConversion)
 IsStandardConversion - Determines whether there is a standard conversion sequence (C++ [conv], C++ [over.ics.scs]) from the expression From to the type ToType.
static bool IsTransparentUnionStandardConversion (Sema &S, Expr *From, QualType &ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static OverloadingResult IsUserDefinedConversion (Sema &S, Expr *From, QualType ToType, UserDefinedConversionSequence &User, OverloadCandidateSet &CandidateSet, AllowedExplicit AllowExplicit, bool AllowObjCConversionOnExplicit)
 Determines whether there is a user-defined conversion sequence (C++ [over.ics.user]) that converts expression From to the type ToType.
static ImplicitConversionSequence::CompareKind CompareStandardConversionSequences (Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
 CompareStandardConversionSequences - Compare two standard conversion sequences to determine whether one is better than the other or if they are indistinguishable (C++ 13.3.3.2p3).
static ImplicitConversionSequence::CompareKind CompareQualificationConversions (Sema &S, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
 CompareQualificationConversions - Compares two standard conversion sequences to determine whether they can be ranked based on their qualification conversions (C++ 13.3.3.2p3 bullet 3).
static ImplicitConversionSequence::CompareKind CompareDerivedToBaseConversions (Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
 CompareDerivedToBaseConversions - Compares two standard conversion sequences to determine whether they can be ranked based on their various kinds of derived-to-base conversions (C++ [over.ics.rank]p4b3).
static const char * GetImplicitConversionName (ImplicitConversionKind Kind)
 GetImplicitConversionName - Return the name of this kind of implicit conversion.
static const ExprIgnoreNarrowingConversion (ASTContext &Ctx, const Expr *Converted)
 Skip any implicit casts which could be either part of a narrowing conversion or after one in an implicit conversion.
static bool FunctionsCorrespond (ASTContext &Ctx, const FunctionDecl *X, const FunctionDecl *Y)
static bool shouldAddReversedEqEq (Sema &S, SourceLocation OpLoc, Expr *FirstOperand, FunctionDecl *EqFD)
static bool checkPlaceholderForOverload (Sema &S, Expr *&E, UnbridgedCastsSet *unbridgedCasts=nullptr)
 checkPlaceholderForOverload - Do any interesting placeholder-like preprocessing on the given expression.
static bool checkArgPlaceholdersForOverload (Sema &S, MultiExprArg Args, UnbridgedCastsSet &unbridged)
 checkArgPlaceholdersForOverload - Check a set of call operands for placeholders.
template<typename AttrT>
static bool hasExplicitAttr (const FunctionDecl *D)
static bool IsOverloadOrOverrideImpl (Sema &SemaRef, FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs, bool UseOverrideRules=false)
static ImplicitConversionSequence TryUserDefinedConversion (Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion, bool AllowObjCConversionOnExplicit)
 Tries a user-defined conversion from From to ToType.
static ImplicitConversionSequence TryImplicitConversion (Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion, bool AllowObjCConversionOnExplicit)
 TryImplicitConversion - Attempt to perform an implicit conversion from the given expression (Expr) to the given type (ToType).
static bool IsFloatingPointConversion (Sema &S, QualType FromType, QualType ToType)
 Determine whether the conversion from FromType to ToType is a valid floating point conversion.
static bool IsVectorElementConversion (Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, Expr *From)
static bool IsVectorConversion (Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, ImplicitConversionKind &ElConv, Expr *From, bool InOverloadResolution, bool CStyle)
 Determine whether the conversion from FromType to ToType is a valid vector conversion.
static bool tryAtomicConversion (Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static QualType BuildSimilarlyQualifiedPointerType (const Type *FromPtr, QualType ToPointee, QualType ToType, ASTContext &Context, bool StripObjCLifetime=false)
 BuildSimilarlyQualifiedPointerType - In a pointer conversion from the pointer type FromPtr to a pointer to type ToPointee, with the same type qualifiers as FromPtr has on its pointee type.
static bool isNullPointerConstantForConversion (Expr *Expr, bool InOverloadResolution, ASTContext &Context)
static QualType AdoptQualifiers (ASTContext &Context, QualType T, Qualifiers Qs)
 Adopt the given qualifiers for the given type.
static const FunctionProtoTypetryGetFunctionProtoType (QualType FromType)
 Attempts to get the FunctionProtoType from a Type.
static bool isNonTrivialObjCLifetimeConversion (Qualifiers FromQuals, Qualifiers ToQuals)
 Determine whether the lifetime conversion between the two given qualifiers sets is nontrivial.
static bool isQualificationConversionStep (QualType FromType, QualType ToType, bool CStyle, bool IsTopLevel, bool &PreviousToQualsIncludeConst, bool &ObjCLifetimeConversion, const ASTContext &Ctx)
 Perform a single iteration of the loop for checking if a qualification conversion is valid.
static bool isFirstArgumentCompatibleWithType (ASTContext &Context, CXXConstructorDecl *Constructor, QualType Type)
static OverloadingResult IsInitializerListConstructorConversion (Sema &S, Expr *From, QualType ToType, CXXRecordDecl *To, UserDefinedConversionSequence &User, OverloadCandidateSet &CandidateSet, bool AllowExplicit)
static const FunctionTypegetConversionOpReturnTyAsFunction (CXXConversionDecl *Conv)
static ImplicitConversionSequence::CompareKind compareConversionFunctions (Sema &S, FunctionDecl *Function1, FunctionDecl *Function2)
 Compare the user-defined conversion functions or constructors of two user-defined conversion sequences to determine whether any ordering is possible.
static bool hasDeprecatedStringLiteralToCharPtrConversion (const ImplicitConversionSequence &ICS)
static ImplicitConversionSequence::CompareKind CompareImplicitConversionSequences (Sema &S, SourceLocation Loc, const ImplicitConversionSequence &ICS1, const ImplicitConversionSequence &ICS2)
 CompareImplicitConversionSequences - Compare two implicit conversion sequences to determine whether one is better than the other or if they are indistinguishable (C++ 13.3.3.2).
static ImplicitConversionSequence::CompareKind compareStandardConversionSubsets (ASTContext &Context, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
static bool isBetterReferenceBindingKind (const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
 Determine whether one of the given reference bindings is better than the other based on what kind of bindings they are.
static FixedEnumPromotion getFixedEnumPromtion (Sema &S, const StandardConversionSequence &SCS)
 Returns kind of fixed enum promotion the SCS uses.
static QualType withoutUnaligned (ASTContext &Ctx, QualType T)
static bool FindConversionForRefInit (Sema &S, ImplicitConversionSequence &ICS, QualType DeclType, SourceLocation DeclLoc, Expr *Init, QualType T2, bool AllowRvalues, bool AllowExplicit)
 Look for a user-defined conversion to a value reference-compatible with DeclType.
static ImplicitConversionSequence TryReferenceInit (Sema &S, Expr *Init, QualType DeclType, SourceLocation DeclLoc, bool SuppressUserConversions, bool AllowExplicit)
 Compute an implicit conversion sequence for reference initialization.
static ImplicitConversionSequence TryCopyInitialization (Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion, bool AllowExplicit)
 TryCopyInitialization - Try to copy-initialize a value of type ToType from the expression From.
static ImplicitConversionSequence TryListConversion (Sema &S, InitListExpr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion)
 TryListConversion - Try to copy-initialize a value of type ToType from the initializer list From.
static bool TryCopyInitialization (const CanQualType FromQTy, const CanQualType ToQTy, Sema &S, SourceLocation Loc, ExprValueKind FromVK)
static ImplicitConversionSequence TryObjectArgumentInitialization (Sema &S, SourceLocation Loc, QualType FromType, Expr::Classification FromClassification, CXXMethodDecl *Method, const CXXRecordDecl *ActingContext, bool InOverloadResolution=false, QualType ExplicitParameterType=QualType(), bool SuppressUserConversion=false)
 TryObjectArgumentInitialization - Try to initialize the object parameter of the given member function (Method) from the expression From.
static ImplicitConversionSequence TryContextuallyConvertToBool (Sema &S, Expr *From)
 TryContextuallyConvertToBool - Attempt to contextually convert the expression From to bool (C++0x [conv]p3).
static bool CheckConvertedConstantConversions (Sema &S, StandardConversionSequence &SCS)
 Check that the specified conversion is permitted in a converted constant expression, according to C++11 [expr.const]p3.
static ExprResult BuildConvertedConstantExpression (Sema &S, Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest, APValue &PreNarrowingValue)
 BuildConvertedConstantExpression - Check that the expression From is a converted constant expression of type T, perform the conversion but does not evaluate the expression.
static ExprResult CheckConvertedConstantExpression (Sema &S, Expr *From, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, NamedDecl *Dest)
 CheckConvertedConstantExpression - Check that the expression From is a converted constant expression of type T, perform the conversion and produce the converted expression, per C++11 [expr.const]p3.
static void dropPointerConversion (StandardConversionSequence &SCS)
 dropPointerConversions - If the given standard conversion sequence involves any pointer conversions, remove them.
static ImplicitConversionSequence TryContextuallyConvertToObjCPointer (Sema &S, Expr *From)
 TryContextuallyConvertToObjCPointer - Attempt to contextually convert the expression From to an Objective-C pointer type.
static QualType GetExplicitObjectType (Sema &S, const Expr *MemExprE)
static ExprGetExplicitObjectExpr (Sema &S, Expr *Obj, const FunctionDecl *Fun)
static bool PrepareExplicitObjectArgument (Sema &S, CXXMethodDecl *Method, Expr *Object, MultiExprArg &Args, SmallVectorImpl< Expr * > &NewArgs)
static ExprResult diagnoseAmbiguousConversion (Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter, QualType T, UnresolvedSetImpl &ViableConversions)
static bool diagnoseNoViableConversion (Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, UnresolvedSetImpl &ExplicitConversions)
static bool recordConversion (Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, DeclAccessPair &Found)
static ExprResult finishContextualImplicitConversion (Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter)
static void collectViableConversionCandidates (Sema &SemaRef, Expr *From, QualType ToType, UnresolvedSetImpl &ViableConversions, OverloadCandidateSet &CandidateSet)
static bool IsAcceptableNonMemberOperatorCandidate (ASTContext &Context, FunctionDecl *Fn, ArrayRef< Expr * > Args)
 IsAcceptableNonMemberOperatorCandidate - Determine whether Fn is an acceptable non-member overloaded operator for a call whose arguments have types T1 (and, if non-empty, T2).
static bool isNonViableMultiVersionOverload (FunctionDecl *FD)
static bool convertArgsForAvailabilityChecks (Sema &S, FunctionDecl *Function, Expr *ThisArg, SourceLocation CallLoc, ArrayRef< Expr * > Args, Sema::SFINAETrap &Trap, bool MissingImplicitThis, Expr *&ConvertedThis, SmallVectorImpl< Expr * > &ConvertedArgs)
template<typename CheckFn>
static bool diagnoseDiagnoseIfAttrsWith (Sema &S, const NamedDecl *ND, bool ArgDependent, SourceLocation Loc, CheckFn &&IsSuccessful)
static void AddMethodTemplateCandidateImmediately (Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, OverloadCandidateParamOrder PO)
static bool isNonDependentlyExplicit (FunctionTemplateDecl *FTD)
 Determine whether a given function template has a simple explicit specifier or a non-value-dependent explicit-specification that evaluates to true.
static bool hasDependentExplicit (FunctionTemplateDecl *FTD)
static void AddTemplateOverloadCandidateImmediately (Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, Sema::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
static bool isAllowableExplicitConversion (Sema &S, QualType ConvType, QualType ToType, bool AllowObjCPointerConversion)
 Determine whether this is an allowable conversion from the result of an explicit conversion operator to the expected type, per C++ [over.match.conv]p1 and [over.match.ref]p1.
static void AddTemplateConversionCandidateImmediately (Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion)
static QualType AdjustAddressSpaceForBuiltinOperandType (Sema &S, QualType T, Expr *Arg)
 Helper function for adjusting address spaces for the pointer or reference operands of builtin operators depending on the argument.
static void AddBuiltinAssignmentOperatorCandidates (Sema &S, QualType T, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
 Helper function for AddBuiltinOperatorCandidates() that adds the volatile- and non-volatile-qualified assignment operators for the given type to the candidate set.
static Qualifiers CollectVRQualifiers (ASTContext &Context, Expr *ArgExpr)
 CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers, if any, found in visible type conversion functions found in ArgExpr's type.
static void forAllQualifierCombinationsImpl (QualifiersAndAtomic Available, QualifiersAndAtomic Applied, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static void forAllQualifierCombinations (QualifiersAndAtomic Quals, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static QualType makeQualifiedLValueReferenceType (QualType Base, QualifiersAndAtomic Quals, Sema &S)
static Comparison compareEnableIfAttrs (const Sema &S, const FunctionDecl *Cand1, const FunctionDecl *Cand2)
 Compares the enable_if attributes of two FunctionDecls, for the purposes of overload resolution.
static Comparison isBetterMultiversionCandidate (const OverloadCandidate &Cand1, const OverloadCandidate &Cand2)
static std::optional< QualTypegetImplicitObjectParamType (ASTContext &Context, const FunctionDecl *F)
 Compute the type of the implicit object parameter for the given function, if any.
static bool allowAmbiguity (ASTContext &Context, const FunctionDecl *F1, const FunctionDecl *F2)
static bool sameFunctionParameterTypeLists (Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
 We're allowed to use constraints partial ordering only if the candidates have the same parameter types: [over.match.best.general]p2.6 F1 and F2 are non-template functions with the same non-object-parameter-type-lists, and F1 is more constrained than F2 [...].
static FunctionDeclgetMorePartialOrderingConstrained (Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
static void AddTemplateOverloadCandidate (Sema &S, OverloadCandidateSet &CandidateSet, DeferredMethodTemplateOverloadCandidate &C)
static void AddTemplateOverloadCandidate (Sema &S, OverloadCandidateSet &CandidateSet, DeferredFunctionTemplateOverloadCandidate &C)
static void AddTemplateOverloadCandidate (Sema &S, OverloadCandidateSet &CandidateSet, DeferredConversionTemplateOverloadCandidate &C)
static bool isFunctionAlwaysEnabled (const ASTContext &Ctx, const FunctionDecl *FD)
static bool checkAddressOfFunctionIsAvailable (Sema &S, const FunctionDecl *FD, bool Complain, bool InOverloadResolution, SourceLocation Loc)
 Returns true if we can take the address of the function.
static bool checkAddressOfCandidateIsAvailable (Sema &S, const FunctionDecl *FD)
static bool shouldSkipNotingLambdaConversionDecl (const FunctionDecl *Fn)
static void MaybeDiagnoseAmbiguousConstraints (Sema &S, ArrayRef< OverloadCandidate > Cands)
static void DiagnoseBadConversion (Sema &S, OverloadCandidate *Cand, unsigned I, bool TakingCandidateAddress)
static bool CheckArityMismatch (Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool IsAddressOf=false)
 Additional arity mismatch diagnosis specific to a function overload candidates.
static void DiagnoseArityMismatch (Sema &S, NamedDecl *Found, Decl *D, unsigned NumFormalArgs, bool IsAddressOf=false)
 General arity mismatch diagnosis over a candidate in a candidate set.
static void DiagnoseArityMismatch (Sema &S, OverloadCandidate *Cand, unsigned NumFormalArgs)
 Arity mismatch diagnosis specific to a function overload candidate.
static TemplateDeclgetDescribedTemplate (Decl *Templated)
static void DiagnoseBadDeduction (Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress)
 Diagnose a failed template-argument deduction.
static void DiagnoseBadDeduction (Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress)
 Diagnose a failed template-argument deduction, for function calls.
static void DiagnoseBadTarget (Sema &S, OverloadCandidate *Cand)
 CUDA: diagnose an invalid call across targets.
static void DiagnoseFailedEnableIfAttr (Sema &S, OverloadCandidate *Cand)
static void DiagnoseFailedExplicitSpec (Sema &S, OverloadCandidate *Cand)
static void NoteImplicitDeductionGuide (Sema &S, FunctionDecl *Fn)
static void NoteFunctionCandidate (Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress, LangAS CtorDestAS=LangAS::Default)
 Generates a 'note' diagnostic for an overload candidate.
static void NoteSurrogateCandidate (Sema &S, OverloadCandidate *Cand)
static void NoteBuiltinOperatorCandidate (Sema &S, StringRef Opc, SourceLocation OpLoc, OverloadCandidate *Cand)
static void NoteAmbiguousUserConversions (Sema &S, SourceLocation OpLoc, OverloadCandidate *Cand)
static SourceLocation GetLocationForCandidate (const OverloadCandidate *Cand)
static unsigned RankDeductionFailure (const DeductionFailureInfo &DFI)
static void CompleteNonViableCandidate (Sema &S, OverloadCandidate *Cand, ArrayRef< Expr * > Args, OverloadCandidateSet::CandidateSetKind CSK)
 CompleteNonViableCandidate - Normally, overload resolution only computes up to the first bad conversion.
static SourceLocation GetLocationForCandidate (const TemplateSpecCandidate *Cand)
static bool completeFunctionType (Sema &S, FunctionDecl *FD, SourceLocation Loc, bool Complain=true)
static void AddOverloadedCallCandidate (Sema &S, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading, bool KnownValid)
 Add a single candidate to the overload set.
static bool canBeDeclaredInNamespace (const DeclarationName &Name)
 Determine whether a declaration with the specified name could be moved into a different namespace.
static bool DiagnoseTwoPhaseLookup (Sema &SemaRef, SourceLocation FnLoc, const CXXScopeSpec &SS, LookupResult &R, OverloadCandidateSet::CandidateSetKind CSK, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, CXXRecordDecl **FoundInClass=nullptr)
 Attempt to recover from an ill-formed use of a non-dependent name in a template, where the non-dependent name was declared after the template was defined.
static bool DiagnoseTwoPhaseOperatorLookup (Sema &SemaRef, OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args)
 Attempt to recover from ill-formed use of a non-dependent operator in a template, where the non-dependent operator was declared after the template was defined.
static ExprResult BuildRecoveryCallExpr (Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MutableArrayRef< Expr * > Args, SourceLocation RParenLoc, bool EmptyLookup, bool AllowTypoCorrection)
 Attempts to recover from a call where no functions were found.
static QualType chooseRecoveryType (OverloadCandidateSet &CS, OverloadCandidateSet::iterator *Best)
static ExprResult FinishOverloadedCallExpr (Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, OverloadCandidateSet *CandidateSet, OverloadCandidateSet::iterator *Best, OverloadingResult OverloadResult, bool AllowTypoCorrection)
 FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns the completed call expression.
static void markUnaddressableCandidatesUnviable (Sema &S, OverloadCandidateSet &CS)
static bool PrepareArgumentsForCallToObjectOfClassType (Sema &S, SmallVectorImpl< Expr * > &MethodArgs, CXXMethodDecl *Method, MultiExprArg Args, SourceLocation LParenLoc)

Typedef Documentation

◆ AllowedExplicit

Definition at line 53 of file SemaOverload.cpp.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
ft_default 
ft_different_class 
ft_parameter_arity 
ft_parameter_mismatch 
ft_return_type 
ft_qualifer_mismatch 
ft_noexcept 

Definition at line 3314 of file SemaOverload.cpp.

◆ FixedEnumPromotion

enum class FixedEnumPromotion
strong
Enumerator
None 
ToUnderlyingType 
ToPromotedUnderlyingType 

Definition at line 4498 of file SemaOverload.cpp.

Function Documentation

◆ AddBuiltinAssignmentOperatorCandidates()

void AddBuiltinAssignmentOperatorCandidates ( Sema & S,
QualType T,
ArrayRef< Expr * > Args,
OverloadCandidateSet & CandidateSet )
static

Helper function for AddBuiltinOperatorCandidates() that adds the volatile- and non-volatile-qualified assignment operators for the given type to the candidate set.

Definition at line 9116 of file SemaOverload.cpp.

References clang::Sema::AddBuiltinCandidate(), AdjustAddressSpaceForBuiltinOperandType(), clang::Sema::Context, clang::ASTContext::getCanonicalType(), clang::ASTContext::getLValueReferenceType(), clang::ASTContext::getVolatileType(), clang::CanQual< T >::isVolatileQualified(), and clang::T.

◆ AddMethodTemplateCandidateImmediately()

void AddMethodTemplateCandidateImmediately ( Sema & S,
OverloadCandidateSet & CandidateSet,
FunctionTemplateDecl * MethodTmpl,
DeclAccessPair FoundDecl,
CXXRecordDecl * ActingContext,
TemplateArgumentListInfo * ExplicitTemplateArgs,
QualType ObjectType,
Expr::Classification ObjectClassification,
ArrayRef< Expr * > Args,
bool SuppressUserConversions,
bool PartialOverloading,
OverloadCandidateParamOrder PO )
static

◆ AddOverloadedCallCandidate()

void AddOverloadedCallCandidate ( Sema & S,
DeclAccessPair FoundDecl,
TemplateArgumentListInfo * ExplicitTemplateArgs,
ArrayRef< Expr * > Args,
OverloadCandidateSet & CandidateSet,
bool PartialOverloading,
bool KnownValid )
static

◆ AddTemplateConversionCandidateImmediately()

◆ AddTemplateOverloadCandidate() [1/3]

void AddTemplateOverloadCandidate ( Sema & S,
OverloadCandidateSet & CandidateSet,
DeferredConversionTemplateOverloadCandidate & C )
static

Definition at line 11255 of file SemaOverload.cpp.

References AddTemplateConversionCandidateImmediately(), and clang::C.

◆ AddTemplateOverloadCandidate() [2/3]

void AddTemplateOverloadCandidate ( Sema & S,
OverloadCandidateSet & CandidateSet,
DeferredFunctionTemplateOverloadCandidate & C )
static

Definition at line 11245 of file SemaOverload.cpp.

References AddTemplateOverloadCandidateImmediately(), and clang::C.

◆ AddTemplateOverloadCandidate() [3/3]

◆ AddTemplateOverloadCandidateImmediately()

◆ AdjustAddressSpaceForBuiltinOperandType()

QualType AdjustAddressSpaceForBuiltinOperandType ( Sema & S,
QualType T,
Expr * Arg )
static

Helper function for adjusting address spaces for the pointer or reference operands of builtin operators depending on the argument.

Definition at line 9108 of file SemaOverload.cpp.

References clang::Sema::Context, clang::QualType::getAddressSpace(), clang::ASTContext::getAddrSpaceQualType(), clang::Expr::getType(), and clang::T.

Referenced by AddBuiltinAssignmentOperatorCandidates().

◆ AdoptQualifiers()

QualType AdoptQualifiers ( ASTContext & Context,
QualType T,
Qualifiers Qs )
static

Adopt the given qualifiers for the given type.

Definition at line 3037 of file SemaOverload.cpp.

References clang::Qualifiers::compatiblyIncludes(), and clang::T.

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

◆ allowAmbiguity()

◆ BuildConvertedConstantExpression()

ExprResult BuildConvertedConstantExpression ( Sema & S,
Expr * From,
QualType T,
CCEKind CCE,
NamedDecl * Dest,
APValue & PreNarrowingValue )
static

BuildConvertedConstantExpression - Check that the expression From is a converted constant expression of type T, perform the conversion but does not evaluate the expression.

Definition at line 6268 of file SemaOverload.cpp.

References clang::Sema::ActOnFinishFullExpr(), clang::UserDefinedConversionSequence::After, clang::ImplicitConversionSequence::AmbiguousConversion, clang::ArrayBound, clang::ImplicitConversionSequence::BadConversion, clang::UserDefinedConversionSequence::Before, clang::cast(), CheckConvertedConstantConversions(), checkPlaceholderForOverload(), clang::Sema::Context, clang::Converting, clang::SemaBase::Diag(), clang::Sema::DiagnoseMultipleUserDefinedConversion(), clang::StandardConversionSequence::DirectBinding, clang::ImplicitConversionSequence::EllipsisConversion, clang::ExplicitBool, clang::ExprError(), clang::APValue::getAsString(), clang::Stmt::getBeginLoc(), clang::Expr::getExprLoc(), clang::ImplicitConversionSequence::getKind(), clang::Sema::getLangOpts(), clang::StandardConversionSequence::getNarrowingKind(), clang::Stmt::getSourceRange(), clang::Expr::getType(), clang::InitializedEntity::InitializeTemplateParameter(), clang::APValue::isInt(), clang::Type::isIntegralOrEnumerationType(), clang::NK_Constant_Narrowing, clang::NK_Dependent_Narrowing, clang::NK_Not_Narrowing, clang::NK_Type_Narrowing, clang::NK_Variable_Narrowing, clang::Noexcept, clang::Sema::PerformCopyInitialization(), clang::Sema::PerformImplicitConversion(), clang::StandardConversionSequence::ReferenceBinding, clang::Expr::refersToBitField(), clang::ImplicitConversionSequence::Standard, clang::ImplicitConversionSequence::StandardConversion, clang::ImplicitConversionSequence::StaticObjectArgumentConversion, clang::T, clang::TempArgStrict, clang::TemplateArg, TryContextuallyConvertToBool(), TryCopyInitialization(), clang::ImplicitConversionSequence::UserDefined, and clang::ImplicitConversionSequence::UserDefinedConversion.

Referenced by CheckConvertedConstantExpression().

◆ BuildRecoveryCallExpr()

ExprResult BuildRecoveryCallExpr ( Sema & SemaRef,
Scope * S,
Expr * Fn,
UnresolvedLookupExpr * ULE,
SourceLocation LParenLoc,
MutableArrayRef< Expr * > Args,
SourceLocation RParenLoc,
bool EmptyLookup,
bool AllowTypoCorrection )
static

◆ BuildSimilarlyQualifiedPointerType()

QualType BuildSimilarlyQualifiedPointerType ( const Type * FromPtr,
QualType ToPointee,
QualType ToType,
ASTContext & Context,
bool StripObjCLifetime = false )
static

BuildSimilarlyQualifiedPointerType - In a pointer conversion from the pointer type FromPtr to a pointer to type ToPointee, with the same type qualifiers as FromPtr has on its pointee type.

ToType, if non-empty, will be a pointer to ToType that may or may not have the right set of qualifiers on its pointee.

Conversions to 'id' subsume cv-qualifier conversions.

Definition at line 2846 of file SemaOverload.cpp.

References clang::QualType::getCanonicalType(), clang::QualType::getLocalQualifiers(), clang::QualType::getLocalUnqualifiedType(), clang::Type::getPointeeType(), clang::QualType::getQualifiers(), clang::Type::getTypeClass(), clang::QualType::getUnqualifiedType(), clang::isa(), clang::QualType::isNull(), clang::Type::isObjCIdType(), clang::Type::isObjCQualifiedIdType(), and clang::Qualifiers::removeObjCLifetime().

Referenced by clang::Sema::isObjCPointerConversion(), and clang::Sema::IsPointerConversion().

◆ canBeDeclaredInNamespace()

bool canBeDeclaredInNamespace ( const DeclarationName & Name)
static

Determine whether a declaration with the specified name could be moved into a different namespace.

Definition at line 14281 of file SemaOverload.cpp.

References clang::DeclarationName::getCXXOverloadedOperator().

Referenced by DiagnoseTwoPhaseLookup().

◆ checkAddressOfCandidateIsAvailable()

bool checkAddressOfCandidateIsAvailable ( Sema & S,
const FunctionDecl * FD )
static

◆ checkAddressOfFunctionIsAvailable()

bool checkAddressOfFunctionIsAvailable ( Sema & S,
const FunctionDecl * FD,
bool Complain,
bool InOverloadResolution,
SourceLocation Loc )
static

◆ checkArgPlaceholdersForOverload()

bool checkArgPlaceholdersForOverload ( Sema & S,
MultiExprArg Args,
UnbridgedCastsSet & unbridged )
static

checkArgPlaceholdersForOverload - Check a set of call operands for placeholders.

Definition at line 1198 of file SemaOverload.cpp.

References checkPlaceholderForOverload().

Referenced by clang::Sema::BuildCallToMemberFunction(), clang::Sema::BuildCallToObjectOfClassType(), clang::Sema::buildOverloadedCallSet(), and clang::Sema::CreateOverloadedArraySubscriptExpr().

◆ CheckArityMismatch()

bool CheckArityMismatch ( Sema & S,
OverloadCandidate * Cand,
unsigned NumArgs,
bool IsAddressOf = false )
static

◆ CheckConvertedConstantConversions()

bool CheckConvertedConstantConversions ( Sema & S,
StandardConversionSequence & SCS )
static

Check that the specified conversion is permitted in a converted constant expression, according to C++11 [expr.const]p3.

Return true if the conversion is acceptable.

Definition at line 6196 of file SemaOverload.cpp.

References clang::StandardConversionSequence::getFromType(), clang::StandardConversionSequence::getToType(), clang::ICK_Array_To_Pointer, clang::ICK_Block_Pointer_Conversion, clang::ICK_Boolean_Conversion, clang::ICK_C_Only_Conversion, clang::ICK_Compatible_Conversion, clang::ICK_Complex_Conversion, clang::ICK_Complex_Promotion, clang::ICK_Complex_Real, clang::ICK_Derived_To_Base, clang::ICK_Fixed_Point_Conversion, clang::ICK_Floating_Conversion, clang::ICK_Floating_Integral, clang::ICK_Floating_Promotion, clang::ICK_Function_Conversion, clang::ICK_Function_To_Pointer, clang::ICK_HLSL_Array_RValue, clang::ICK_HLSL_Vector_Splat, clang::ICK_HLSL_Vector_Truncation, clang::ICK_Identity, clang::ICK_Incompatible_Pointer_Conversion, clang::ICK_Integral_Conversion, clang::ICK_Integral_Promotion, clang::ICK_Lvalue_To_Rvalue, clang::ICK_Num_Conversion_Kinds, clang::ICK_Pointer_Conversion, clang::ICK_Pointer_Member, clang::ICK_Qualification, clang::ICK_RVV_Vector_Conversion, clang::ICK_SVE_Vector_Conversion, clang::ICK_TransparentUnionConversion, clang::ICK_Vector_Conversion, clang::ICK_Vector_Splat, clang::ICK_Writeback_Conversion, clang::ICK_Zero_Event_Conversion, clang::ICK_Zero_Queue_Conversion, clang::Type::isBooleanType(), clang::Type::isIntegralOrUnscopedEnumerationType(), clang::Type::isNullPtrType(), and clang::StandardConversionSequence::Second.

Referenced by BuildConvertedConstantExpression().

◆ CheckConvertedConstantExpression()

ExprResult CheckConvertedConstantExpression ( Sema & S,
Expr * From,
QualType T,
APValue & Value,
CCEKind CCE,
bool RequireInt,
NamedDecl * Dest )
static

CheckConvertedConstantExpression - Check that the expression From is a converted constant expression of type T, perform the conversion and produce the converted expression, per C++11 [expr.const]p3.

Definition at line 6417 of file SemaOverload.cpp.

References clang::APValue, BuildConvertedConstantExpression(), clang::Sema::EvaluateConvertedConstantExpression(), and clang::T.

Referenced by clang::Sema::CheckConvertedConstantExpression(), and clang::Sema::tryResolveExplicitSpecifier().

◆ checkPlaceholderForOverload()

bool checkPlaceholderForOverload ( Sema & S,
Expr *& E,
UnbridgedCastsSet * unbridgedCasts = nullptr )
static

◆ chooseRecoveryType()

◆ collectViableConversionCandidates()

◆ CollectVRQualifiers()

◆ compareConversionFunctions()

◆ CompareDerivedToBaseConversions()

ImplicitConversionSequence::CompareKind CompareDerivedToBaseConversions ( Sema & S,
SourceLocation Loc,
const StandardConversionSequence & SCS1,
const StandardConversionSequence & SCS2 )
static

CompareDerivedToBaseConversions - Compares two standard conversion sequences to determine whether they can be ranked based on their various kinds of derived-to-base conversions (C++ [over.ics.rank]p4b3).

As part of these checks, we also look at conversions between Objective-C interface types.

Definition at line 4841 of file SemaOverload.cpp.

References clang::ImplicitConversionSequence::Better, clang::ASTContext::canAssignObjCInterfaces(), clang::Type::castAs(), clang::Sema::Context, clang::StandardConversionSequence::First, clang::ASTContext::getArrayDecayedType(), clang::Type::getAs(), clang::ASTContext::getCanonicalType(), clang::StandardConversionSequence::getFromType(), clang::ObjCObjectPointerType::getInterfaceDecl(), clang::MemberPointerType::getMostRecentCXXRecordDecl(), getPointeeType(), clang::StandardConversionSequence::getToType(), clang::QualType::getUnqualifiedType(), clang::ASTContext::hasSameType(), clang::ASTContext::hasSameUnqualifiedType(), clang::ICK_Array_To_Pointer, clang::ICK_Derived_To_Base, clang::ICK_Pointer_Conversion, clang::ICK_Pointer_Member, clang::ImplicitConversionSequence::Indistinguishable, clang::Sema::IsDerivedFrom(), clang::Type::isMemberPointerType(), clang::ObjCObjectPointerType::isObjCClassType(), clang::ObjCObjectPointerType::isObjCIdType(), clang::Type::isPointerType(), clang::ObjCObjectPointerType::isSpecialized(), clang::StandardConversionSequence::Second, and clang::ImplicitConversionSequence::Worse.

Referenced by CompareStandardConversionSequences().

◆ compareEnableIfAttrs()

Comparison compareEnableIfAttrs ( const Sema & S,
const FunctionDecl * Cand1,
const FunctionDecl * Cand2 )
static

Compares the enable_if attributes of two FunctionDecls, for the purposes of overload resolution.

Cand1's set of enable_if attributes are said to be "better" than Cand2's iff Cand1's first N enable_if attributes have precisely the same conditions as Cand2's first N enable_if attributes (where N = the number of enable_if attributes on Cand2), and Cand1 has more than N enable_if attributes.

Note that you can have a pair of candidates such that Cand1's enable_if attributes are worse than Cand2's, and Cand2's enable_if attributes are worse than Cand1's.

Definition at line 10506 of file SemaOverload.cpp.

References clang::Comparison, clang::Sema::getASTContext(), clang::Decl::hasAttr(), and clang::Decl::specific_attrs().

Referenced by clang::isBetterOverloadCandidate().

◆ CompareImplicitConversionSequences()

ImplicitConversionSequence::CompareKind CompareImplicitConversionSequences ( Sema & S,
SourceLocation Loc,
const ImplicitConversionSequence & ICS1,
const ImplicitConversionSequence & ICS2 )
static

◆ CompareQualificationConversions()

◆ CompareStandardConversionSequences()

ImplicitConversionSequence::CompareKind CompareStandardConversionSequences ( Sema & S,
SourceLocation Loc,
const StandardConversionSequence & SCS1,
const StandardConversionSequence & SCS2 )
static

CompareStandardConversionSequences - Compare two standard conversion sequences to determine whether one is better than the other or if they are indistinguishable (C++ 13.3.3.2p3).

Definition at line 4529 of file SemaOverload.cpp.

References clang::ASTContext::areCompatibleRVVTypes(), clang::SemaARM::areCompatibleSveTypes(), clang::ASTContext::areCompatibleVectorTypes(), clang::Sema::ARM(), clang::ImplicitConversionSequence::Better, clang::ASTContext::canAssignObjCInterfaces(), CompareDerivedToBaseConversions(), CompareQualificationConversions(), compareStandardConversionSubsets(), clang::Sema::Context, clang::StandardConversionSequence::First, clang::ASTContext::getArrayDecayedType(), clang::Type::getAs(), clang::Sema::getASTContext(), clang::ASTContext::getCanonicalType(), getFixedEnumPromtion(), clang::StandardConversionSequence::getFromType(), clang::Sema::getLangOpts(), clang::Type::getPointeeType(), clang::ASTContext::getQualifiedType(), clang::StandardConversionSequence::getRank(), clang::StandardConversionSequence::getToType(), clang::ASTContext::getTypeSize(), clang::ASTContext::getUnqualifiedArrayType(), clang::QualType::getUnqualifiedType(), clang::ASTContext::hasSameType(), clang::ICK_Array_To_Pointer, clang::ICK_Floating_Integral, clang::ICK_Integral_Conversion, clang::ICK_RVV_Vector_Conversion, clang::ICK_SVE_Vector_Conversion, clang::ICK_Vector_Conversion, clang::ImplicitConversionSequence::Indistinguishable, clang::isa(), isBetterReferenceBindingKind(), clang::LangOptions::isCompatibleWithMSVC(), clang::Sema::IsDerivedFrom(), clang::QualType::isMoreQualifiedThan(), clang::StandardConversionSequence::isPointerConversionToBool(), clang::StandardConversionSequence::isPointerConversionToVoidPointer(), clang::LangOptionsBase::MSVC2019_8, None, clang::StandardConversionSequence::ObjCLifetimeConversionBinding, clang::StandardConversionSequence::ReferenceBinding, clang::StandardConversionSequence::Second, ToUnderlyingType, and clang::ImplicitConversionSequence::Worse.

Referenced by CompareImplicitConversionSequences(), and clang::isBetterOverloadCandidate().

◆ compareStandardConversionSubsets()

◆ completeFunctionType()

◆ CompleteNonViableCandidate()

◆ convertArgsForAvailabilityChecks()

◆ CreateFunctionRefExpr()

◆ diagnoseAmbiguousConversion()

◆ DiagnoseArityMismatch() [1/2]

void DiagnoseArityMismatch ( Sema & S,
NamedDecl * Found,
Decl * D,
unsigned NumFormalArgs,
bool IsAddressOf = false )
static

General arity mismatch diagnosis over a candidate in a candidate set.

Definition at line 12060 of file SemaOverload.cpp.

References clang::cast(), clang::CRK_None, clang::SemaBase::Diag(), clang::Found, and clang::isa().

Referenced by DiagnoseArityMismatch(), DiagnoseBadDeduction(), and NoteFunctionCandidate().

◆ DiagnoseArityMismatch() [2/2]

void DiagnoseArityMismatch ( Sema & S,
OverloadCandidate * Cand,
unsigned NumFormalArgs )
static

Arity mismatch diagnosis specific to a function overload candidate.

Definition at line 12119 of file SemaOverload.cpp.

References CheckArityMismatch(), DiagnoseArityMismatch(), clang::OverloadCandidate::FoundDecl, clang::OverloadCandidate::Function, and clang::OverloadCandidate::TookAddressOfOverload.

◆ DiagnoseBadConversion()

void DiagnoseBadConversion ( Sema & S,
OverloadCandidate * Cand,
unsigned I,
bool TakingCandidateAddress )
static

Definition at line 11776 of file SemaOverload.cpp.

References clang::ImplicitConversionSequence::Bad, clang::cast(), checkAddressOfCandidateIsAvailable(), clang::Sema::Context, clang::OverloadCandidate::Conversions, clang::SemaBase::Diag(), clang::OverloadCandidate::Fix, clang::OverloadCandidate::FoundDecl, clang::BadConversionSequence::FromExpr, clang::OverloadCandidate::Function, clang::Qualifiers::getAddressSpace(), clang::CanQual< T >::getAs(), clang::Type::getAs(), clang::PointerAuthQualifier::getAsString(), clang::Sema::getASTContext(), clang::ASTContext::getCanonicalType(), clang::Qualifiers::getCVRQualifiers(), clang::BadConversionSequence::getFromType(), clang::QualType::getNonReferenceType(), clang::Qualifiers::getObjCGCAttr(), clang::Qualifiers::getObjCLifetime(), clang::ObjCObjectPointerType::getPointeeType(), clang::Qualifiers::getPointerAuth(), clang::CanQual< T >::getQualifiers(), clang::OverloadCandidate::getRewriteKind(), clang::Stmt::getSourceRange(), clang::BadConversionSequence::getToType(), clang::CanQual< T >::getUnqualifiedType(), clang::ConversionFixItGenerator::Hints, clang::Expr::IgnoreParens(), clang::isa(), clang::CanQual< T >::isAtLeastAsQualifiedAs(), clang::ImplicitConversionSequence::isBad(), clang::Sema::IsDerivedFrom(), clang::PointerAuthQualifier::isEquivalent(), clang::Type::isIncompleteType(), clang::SourceManager::isInSystemHeader(), clang::Type::isReferenceType(), clang::BadConversionSequence::Kind, clang::ConversionFixItGenerator::Kind, clang::BadConversionSequence::lvalue_ref_to_rvalue, clang::ASTContext::OverloadTy, clang::SemaBase::PDiag(), clang::BadConversionSequence::rvalue_ref_to_lvalue, clang::Sema::SourceMgr, clang::BadConversionSequence::too_few_initializers, and clang::BadConversionSequence::too_many_initializers.

Referenced by NoteFunctionCandidate().

◆ DiagnoseBadDeduction() [1/2]

void DiagnoseBadDeduction ( Sema & S,
NamedDecl * Found,
Decl * Templated,
DeductionFailureInfo & DeductionFailure,
unsigned NumArgs,
bool TakingCandidateAddress )
static

Diagnose a failed template-argument deduction.

Definition at line 12136 of file SemaOverload.cpp.

References clang::AlreadyDiagnosed, clang::QualifierCollector::apply(), clang::cast(), checkAddressOfCandidateIsAvailable(), clang::ConstraintsNotSatisfied, clang::Sema::Context, clang::CUDATargetMismatch, clang::DeductionFailureInfo::Data, clang::DeducedMismatch, clang::DeducedMismatchNested, clang::SemaBase::Diag(), DiagnoseArityMismatch(), clang::Sema::DiagnoseUnsatisfiedConstraint(), clang::Found, clang::TemplateArgument::getAsTemplate(), clang::TemplateName::getAsTemplateDecl(), clang::TemplateArgument::getAsType(), clang::DeductionFailureInfo::getCallArgIndex(), clang::NamedDecl::getDeclName(), getDescribedTemplate(), clang::Sema::getDiagnostics(), clang::DeductionFailureInfo::getFirstArg(), clang::TemplateArgument::getKind(), clang::TemplateName::getKind(), clang::Decl::getLocation(), clang::NamedDecl::getName(), clang::TemplateArgument::getNonTypeTemplateArgumentType(), clang::DeductionFailureInfo::getResult(), clang::DeductionFailureInfo::getSecondArg(), clang::DeductionFailureInfo::getSFINAEDiagnostic(), clang::Sema::getTemplateArgumentBindingsText(), clang::DeductionFailureInfo::getTemplateArgumentList(), clang::DeductionFailureInfo::getTemplateParameter(), clang::TypeDecl::getTypeForDecl(), clang::ASTContext::hasSameType(), clang::Incomplete, clang::IncompletePack, clang::Inconsistent, clang::InstantiationDepth, clang::Invalid, clang::InvalidExplicitArguments, clang::isa(), clang::QualType::isNull(), clang::MiscellaneousDeductionFailure, clang::NonDeducedMismatch, clang::NonDependentConversionFailure, clang::TemplateArgument::Pack, clang::TemplateArgument::pack_size(), clang::QualifierCollector::strip(), clang::SubstitutionFailure, clang::Success, clang::TemplateArgument::Template, clang::TemplateName::Template, clang::TooFewArguments, clang::TooManyArguments, and clang::Underqualified.

Referenced by DiagnoseBadDeduction(), clang::TemplateSpecCandidate::NoteDeductionFailure(), and NoteFunctionCandidate().

◆ DiagnoseBadDeduction() [2/2]

void DiagnoseBadDeduction ( Sema & S,
OverloadCandidate * Cand,
unsigned NumArgs,
bool TakingCandidateAddress )
static

◆ DiagnoseBadTarget()

◆ diagnoseDiagnoseIfAttrsWith()

◆ DiagnoseFailedEnableIfAttr()

◆ DiagnoseFailedExplicitSpec()

◆ diagnoseNoViableConversion()

◆ DiagnoseTwoPhaseLookup()

bool DiagnoseTwoPhaseLookup ( Sema & SemaRef,
SourceLocation FnLoc,
const CXXScopeSpec & SS,
LookupResult & R,
OverloadCandidateSet::CandidateSetKind CSK,
TemplateArgumentListInfo * ExplicitTemplateArgs,
ArrayRef< Expr * > Args,
CXXRecordDecl ** FoundInClass = nullptr )
static

◆ DiagnoseTwoPhaseOperatorLookup()

bool DiagnoseTwoPhaseOperatorLookup ( Sema & SemaRef,
OverloadedOperatorKind Op,
SourceLocation OpLoc,
ArrayRef< Expr * > Args )
static

Attempt to recover from ill-formed use of a non-dependent operator in a template, where the non-dependent operator was declared after the template was defined.

Returns true if a viable candidate was found and a diagnostic was issued.

Definition at line 14407 of file SemaOverload.cpp.

References clang::Sema::Context, clang::OverloadCandidateSet::CSK_Operator, clang::ASTContext::DeclarationNames, DiagnoseTwoPhaseLookup(), clang::DeclarationNameTable::getCXXOperatorName(), and clang::Sema::LookupOperatorName.

Referenced by clang::Sema::CreateOverloadedBinOp(), and clang::Sema::CreateOverloadedUnaryOp().

◆ dropPointerConversion()

void dropPointerConversion ( StandardConversionSequence & SCS)
static

dropPointerConversions - If the given standard conversion sequence involves any pointer conversions, remove them.

This may change the result type of the conversion sequence.

Definition at line 6529 of file SemaOverload.cpp.

References clang::StandardConversionSequence::Dimension, clang::ICK_Identity, clang::ICK_Pointer_Conversion, clang::StandardConversionSequence::Second, clang::StandardConversionSequence::Third, and clang::StandardConversionSequence::ToTypePtrs.

Referenced by TryContextuallyConvertToObjCPointer().

◆ FindConversionForRefInit()

bool FindConversionForRefInit ( Sema & S,
ImplicitConversionSequence & ICS,
QualType DeclType,
SourceLocation DeclLoc,
Expr * Init,
QualType T2,
bool AllowRvalues,
bool AllowExplicit )
static

Look for a user-defined conversion to a value reference-compatible with DeclType.

Return true if something definite is found.

Definition at line 5145 of file SemaOverload.cpp.

References clang::AmbiguousConversionSequence::addConversion(), clang::Sema::AddConversionCandidate(), clang::Sema::AddTemplateConversionCandidate(), clang::UserDefinedConversionSequence::After, clang::ImplicitConversionSequence::Ambiguous, clang::UserDefinedConversionSequence::Before, clang::OverloadCandidateSet::begin(), clang::OverloadCandidateSet::BestViableFunction(), clang::cast(), clang::Type::castAsCXXRecordDecl(), clang::Sema::CompareReferenceRelationship(), clang::UserDefinedConversionSequence::ConversionFunction, clang::OverloadCandidateSet::CSK_InitByUserDefinedConversion, clang::StandardConversionSequence::DirectBinding, clang::UserDefinedConversionSequence::EllipsisConversion, clang::OverloadCandidateSet::end(), clang::UserDefinedConversionSequence::FoundConversionFunction, clang::Type::getAs(), clang::CXXConversionDecl::getConversionType(), clang::Decl::getDeclContext(), clang::QualType::getNonReferenceType(), clang::ReferenceType::getPointeeType(), clang::FunctionTemplateDecl::getTemplatedDecl(), clang::QualType::getUnqualifiedType(), clang::UserDefinedConversionSequence::HadMultipleCandidates, clang::Init, clang::isa(), clang::Type::isFunctionType(), clang::Type::isLValueReferenceType(), clang::Type::isRecordType(), clang::Type::isRValueReferenceType(), clang::OR_Ambiguous, clang::OR_Deleted, clang::OR_No_Viable_Function, clang::OR_Success, clang::Sema::Ref_Incompatible, clang::StandardConversionSequence::ReferenceBinding, clang::ImplicitConversionSequence::setAmbiguous(), clang::ImplicitConversionSequence::setUserDefined(), clang::OverloadCandidateSet::size(), and clang::ImplicitConversionSequence::UserDefined.

Referenced by TryReferenceInit().

◆ finishContextualImplicitConversion()

◆ FinishOverloadedCallExpr()

ExprResult FinishOverloadedCallExpr ( Sema & SemaRef,
Scope * S,
Expr * Fn,
UnresolvedLookupExpr * ULE,
SourceLocation LParenLoc,
MultiExprArg Args,
SourceLocation RParenLoc,
Expr * ExecConfig,
OverloadCandidateSet * CandidateSet,
OverloadCandidateSet::iterator * Best,
OverloadingResult OverloadResult,
bool AllowTypoCorrection )
static

◆ forAllQualifierCombinations()

void forAllQualifierCombinations ( QualifiersAndAtomic Quals,
llvm::function_ref< void(QualifiersAndAtomic)> Callback )
static

Definition at line 9215 of file SemaOverload.cpp.

References forAllQualifierCombinationsImpl().

◆ forAllQualifierCombinationsImpl()

◆ functionHasPassObjectSizeParams()

bool functionHasPassObjectSizeParams ( const FunctionDecl * FD)
static

◆ FunctionsCorrespond()

◆ getConversionOpReturnTyAsFunction()

◆ getDescribedTemplate()

TemplateDecl * getDescribedTemplate ( Decl * Templated)
static

Definition at line 12128 of file SemaOverload.cpp.

References clang::Decl::getDescribedTemplate().

Referenced by DiagnoseBadDeduction().

◆ GetExplicitObjectExpr()

◆ GetExplicitObjectType()

QualType GetExplicitObjectType ( Sema & S,
const Expr * MemExprE )
static

◆ getFixedEnumPromtion()

◆ GetImplicitConversionName()

const char * GetImplicitConversionName ( ImplicitConversionKind Kind)
static

GetImplicitConversionName - Return the name of this kind of implicit conversion.

Definition at line 193 of file SemaOverload.cpp.

References clang::ICK_Num_Conversion_Kinds, and int.

Referenced by clang::StandardConversionSequence::dump().

◆ getImplicitObjectParamType()

std::optional< QualType > getImplicitObjectParamType ( ASTContext & Context,
const FunctionDecl * F )
static

Compute the type of the implicit object parameter for the given function, if any.

Returns std::nullopt if there is no implicit object parameter, and a null QualType if there is a 'matches anything' implicit object parameter.

Definition at line 10604 of file SemaOverload.cpp.

References clang::cast(), and clang::isa().

Referenced by allowAmbiguity().

◆ GetLocationForCandidate() [1/2]

◆ GetLocationForCandidate() [2/2]

SourceLocation GetLocationForCandidate ( const TemplateSpecCandidate * Cand)
static

◆ getMorePartialOrderingConstrained()

◆ hasDependentExplicit()

◆ hasDeprecatedStringLiteralToCharPtrConversion()

◆ hasExplicitAttr()

template<typename AttrT>
bool hasExplicitAttr ( const FunctionDecl * D)
static

Definition at line 1320 of file SemaOverload.cpp.

References clang::Decl::getAttr().

◆ IgnoreNarrowingConversion()

const Expr * IgnoreNarrowingConversion ( ASTContext & Ctx,
const Expr * Converted )
static

Skip any implicit casts which could be either part of a narrowing conversion or after one in an implicit conversion.

Definition at line 315 of file SemaOverload.cpp.

References clang::ExprWithCleanups::Create(), and IgnoreNarrowingConversion().

Referenced by clang::StandardConversionSequence::getNarrowingKind(), and IgnoreNarrowingConversion().

◆ IsAcceptableNonMemberOperatorCandidate()

bool IsAcceptableNonMemberOperatorCandidate ( ASTContext & Context,
FunctionDecl * Fn,
ArrayRef< Expr * > Args )
static

IsAcceptableNonMemberOperatorCandidate - Determine whether Fn is an acceptable non-member overloaded operator for a call whose arguments have types T1 (and, if non-empty, T2).

This routine implements the check in C++ [over.match.oper]p3b2 concerning enumeration types.

Definition at line 6984 of file SemaOverload.cpp.

References clang::Type::isDependentType(), clang::Type::isEnumeralType(), clang::QualType::isNull(), and clang::Type::isRecordType().

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

◆ isAllowableExplicitConversion()

bool isAllowableExplicitConversion ( Sema & S,
QualType ConvType,
QualType ToType,
bool AllowObjCPointerConversion )
static

Determine whether this is an allowable conversion from the result of an explicit conversion operator to the expected type, per C++ [over.match.conv]p1 and [over.match.ref]p1.

Parameters
ConvTypeThe return type of the conversion function.
ToTypeThe type we are converting to.
AllowObjCPointerConversionAllow a conversion from one Objective-C pointer to another.
Returns
true if the conversion is allowable, false otherwise.

Definition at line 8240 of file SemaOverload.cpp.

References clang::Sema::Context, clang::QualType::getNonReferenceType(), clang::ASTContext::hasSameUnqualifiedType(), clang::Sema::isObjCPointerConversion(), and clang::Sema::IsQualificationConversion().

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

◆ isBetterMultiversionCandidate()

Comparison isBetterMultiversionCandidate ( const OverloadCandidate & Cand1,
const OverloadCandidate & Cand2 )
static

◆ isBetterReferenceBindingKind()

bool isBetterReferenceBindingKind ( const StandardConversionSequence & SCS1,
const StandardConversionSequence & SCS2 )
static

◆ isFirstArgumentCompatibleWithType()

bool isFirstArgumentCompatibleWithType ( ASTContext & Context,
CXXConstructorDecl * Constructor,
QualType Type )
static

◆ IsFloatingPointConversion()

bool IsFloatingPointConversion ( Sema & S,
QualType FromType,
QualType ToType )
static

Determine whether the conversion from FromType to ToType is a valid floating point conversion.

Definition at line 2043 of file SemaOverload.cpp.

References clang::Sema::Context, clang::ASTContext::getFloatTypeSemantics(), clang::Type::isBFloat16Type(), clang::Type::isFloat16Type(), clang::Type::isHalfType(), and clang::Type::isRealFloatingType().

Referenced by IsStandardConversion(), and IsVectorElementConversion().

◆ isFunctionAlwaysEnabled()

bool isFunctionAlwaysEnabled ( const ASTContext & Ctx,
const FunctionDecl * FD )
static

Definition at line 11537 of file SemaOverload.cpp.

References clang::Decl::specific_attrs().

Referenced by checkAddressOfFunctionIsAvailable().

◆ IsInitializerListConstructorConversion()

◆ isNonDependentlyExplicit()

bool isNonDependentlyExplicit ( FunctionTemplateDecl * FTD)
static

Determine whether a given function template has a simple explicit specifier or a non-value-dependent explicit-specification that evaluates to true.

Definition at line 7973 of file SemaOverload.cpp.

References clang::ExplicitSpecifier::getFromDecl(), clang::FunctionTemplateDecl::getTemplatedDecl(), and clang::ExplicitSpecifier::isExplicit().

Referenced by AddTemplateConversionCandidateImmediately(), and AddTemplateOverloadCandidateImmediately().

◆ isNonTrivialObjCLifetimeConversion()

bool isNonTrivialObjCLifetimeConversion ( Qualifiers FromQuals,
Qualifiers ToQuals )
static

Determine whether the lifetime conversion between the two given qualifiers sets is nontrivial.

Definition at line 3714 of file SemaOverload.cpp.

References clang::Qualifiers::getObjCLifetime(), clang::Qualifiers::hasConst(), and clang::Qualifiers::OCL_ExplicitNone.

Referenced by isQualificationConversionStep().

◆ isNonViableMultiVersionOverload()

◆ isNullPointerConstantForConversion()

◆ IsOverloadOrOverrideImpl()

bool IsOverloadOrOverrideImpl ( Sema & SemaRef,
FunctionDecl * New,
FunctionDecl * Old,
bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs,
bool UseOverrideRules = false )
static

Definition at line 1327 of file SemaOverload.cpp.

References clang::Sema::AreConstraintExpressionsEqual(), clang::AssociatedConstraint::ArgPackSubstIndex, clang::cast(), clang::AssociatedConstraint::ConstraintExpr, clang::Sema::Context, clang::Sema::CUDA(), clang::SemaBase::Diag(), functionHasPassObjectSizeParams(), clang::Sema::FunctionParamTypesAreEqual(), clang::ASTContext::getCanonicalTagType(), clang::ASTContext::getCanonicalType(), clang::FunctionDecl::getDeclaredReturnType(), clang::FunctionDecl::getDescribedFunctionTemplate(), clang::CXXMethodDecl::getFunctionObjectParameterReferenceType(), clang::Sema::getLangOpts(), clang::Decl::getLexicalDeclContext(), clang::TemplateDecl::getTemplateParameters(), clang::DeclaratorDecl::getTrailingRequiresClause(), clang::ValueDecl::getType(), clang::CanQual< T >::getTypePtr(), clang::QualType::getTypePtr(), clang::TemplateParameterList::hasAssociatedConstraints(), hasExplicitAttr(), clang::ASTContext::hasSameType(), clang::SemaCUDA::IdentifyTarget(), clang::InvalidTarget, clang::isa(), clang::FunctionDecl::isConsteval(), clang::FunctionDecl::isConstexpr(), clang::CXXMethodDecl::isExplicitObjectMemberFunction(), clang::FunctionDecl::isMemberLikeConstrainedFriend(), clang::Sema::LangOpts, New, clang::SplitQualType::Quals, clang::Qualifiers::removeVolatile(), clang::RQ_None, clang::Decl::specific_attr_begin(), clang::Decl::specific_attr_end(), clang::Sema::TemplateParameterListsAreEqual(), clang::Sema::TPL_TemplateMatch, clang::TSK_ExplicitSpecialization, and clang::SplitQualType::Ty.

Referenced by clang::Sema::IsOverload(), and clang::Sema::IsOverride().

◆ isQualificationConversionStep()

bool isQualificationConversionStep ( QualType FromType,
QualType ToType,
bool CStyle,
bool IsTopLevel,
bool & PreviousToQualsIncludeConst,
bool & ObjCLifetimeConversion,
const ASTContext & Ctx )
static

◆ IsStandardConversion()

bool IsStandardConversion ( Sema & S,
Expr * From,
QualType ToType,
bool InOverloadResolution,
StandardConversionSequence & SCS,
bool CStyle,
bool AllowObjCWritebackConversion )
static

IsStandardConversion - Determines whether there is a standard conversion sequence (C++ [conv], C++ [over.ics.scs]) from the expression From to the type ToType.

Standard conversion sequences only consider non-class types; for conversions that involve class types, use TryImplicitConversion. If a conversion exists, SCS will contain the standard conversion sequence required to perform this conversion and this routine will return true. Otherwise, this routine will return false and the value of SCS is unspecified.

Definition at line 2239 of file SemaOverload.cpp.

References clang::Sema::AddingCFIUncheckedCallee(), clang::Atomic, clang::ASTContext::BoolTy, clang::Type::canDecayToPointerType(), clang::cast(), clang::Sema::checkAddressOfFunctionIsAvailable(), clang::Sema::CheckSingleAssignmentConstraints(), clang::Compatible, clang::CompatiblePointerDiscardsQualifiers, clang::Sema::Context, clang::StandardConversionSequence::CopyConstructor, clang::StandardConversionSequence::DeprecatedStringLiteralToCharPtr, clang::StandardConversionSequence::Dimension, clang::Expr::EvaluateKnownConstInt(), clang::Sema::ExtractUnqualifiedFunctionType(), clang::StandardConversionSequence::First, clang::ASTContext::getArrayDecayedType(), clang::ASTContext::getArrayParameterType(), clang::Type::getAs(), clang::Sema::getASTContext(), clang::ASTContext::getCanonicalType(), clang::QualType::getCanonicalType(), clang::ArrayParameterType::getConstantArrayType(), clang::Sema::getLangOpts(), clang::QualType::getLocalQualifiers(), clang::QualType::getLocalUnqualifiedType(), clang::ASTContext::getMemberPointerType(), clang::ASTContext::getPointerType(), clang::Expr::getType(), clang::QualType::getUnqualifiedType(), clang::ASTContext::hasSameUnqualifiedType(), clang::ICK_Array_To_Pointer, clang::ICK_Block_Pointer_Conversion, clang::ICK_Boolean_Conversion, clang::ICK_C_Only_Conversion, clang::ICK_Compatible_Conversion, clang::ICK_Complex_Conversion, clang::ICK_Complex_Promotion, clang::ICK_Complex_Real, clang::ICK_Fixed_Point_Conversion, clang::ICK_Floating_Conversion, clang::ICK_Floating_Integral, clang::ICK_Floating_Promotion, clang::ICK_Function_Conversion, clang::ICK_Function_To_Pointer, clang::ICK_HLSL_Array_RValue, clang::ICK_Identity, clang::ICK_Incompatible_Pointer_Conversion, clang::ICK_Integral_Conversion, clang::ICK_Integral_Promotion, clang::ICK_Lvalue_To_Rvalue, clang::ICK_Pointer_Conversion, clang::ICK_Pointer_Member, clang::ICK_Qualification, clang::ICK_TransparentUnionConversion, clang::ICK_Writeback_Conversion, clang::ICK_Zero_Event_Conversion, clang::ICK_Zero_Queue_Conversion, clang::Expr::IgnoreParenCasts(), clang::Expr::IgnoreParens(), clang::StandardConversionSequence::IncompatibleObjC, clang::IncompatiblePointer, clang::IncompatiblePointerSign, clang::isa(), clang::Type::isAnyComplexType(), clang::Type::isAnyPointerType(), clang::Type::isArithmeticType(), clang::Type::isArrayParameterType(), clang::Type::isArrayType(), clang::Sema::IsBlockPointerConversion(), clang::Type::isBlockPointerType(), clang::Type::isBooleanType(), clang::Sema::IsComplexPromotion(), clang::Type::isConstantArrayType(), clang::Type::isConvertibleToFixedPointType(), clang::Type::isEventT(), clang::Type::isFixedPointType(), IsFloatingPointConversion(), clang::Sema::IsFloatingPointPromotion(), clang::Sema::IsFunctionConversion(), clang::Type::isFunctionType(), clang::Expr::isGLValue(), clang::Expr::isIntegerConstantExpr(), clang::Type::isIntegralOrUnscopedEnumerationType(), clang::Sema::IsIntegralPromotion(), clang::Type::isIntegralType(), clang::Sema::IsMemberPointerConversion(), clang::Type::isMemberPointerType(), clang::SemaObjC::isObjCWritebackConversion(), clang::Sema::IsPointerConversion(), clang::Sema::IsQualificationConversion(), clang::Type::isQueueT(), clang::Type::isRealFloatingType(), clang::Type::isRecordType(), clang::Type::isSamplerT(), clang::Sema::IsStringLiteralToNonConstPointerConversion(), IsTransparentUnionStandardConversion(), IsVectorConversion(), clang::Sema::ObjC(), clang::ASTContext::OverloadTy, clang::StandardConversionSequence::QualificationIncludesObjCLifetime, clang::Sema::ResolveAddressOfOverloadedFunction(), clang::StandardConversionSequence::Second, clang::StandardConversionSequence::setAllToTypes(), clang::StandardConversionSequence::setAsIdentityConversion(), clang::StandardConversionSequence::setFromType(), clang::StandardConversionSequence::setToType(), clang::StandardConversionSequence::Third, tryAtomicConversion(), clang::Sema::TryFunctionConversion(), and clang::ASTContext::typesAreCompatible().

Referenced by IsTransparentUnionStandardConversion(), tryAtomicConversion(), and TryImplicitConversion().

◆ IsTransparentUnionStandardConversion()

bool IsTransparentUnionStandardConversion ( Sema & S,
Expr * From,
QualType & ToType,
bool InOverloadResolution,
StandardConversionSequence & SCS,
bool CStyle )
static

◆ IsUserDefinedConversion()

OverloadingResult IsUserDefinedConversion ( Sema & S,
Expr * From,
QualType ToType,
UserDefinedConversionSequence & User,
OverloadCandidateSet & CandidateSet,
AllowedExplicit AllowExplicit,
bool AllowObjCConversionOnExplicit )
static

Determines whether there is a user-defined conversion sequence (C++ [over.ics.user]) that converts expression From to the type ToType.

If such a conversion exists, User will contain the user-defined conversion sequence that performs such a conversion and this routine will return true. Otherwise, this routine returns false and User is unspecified.

Parameters
AllowExplicittrue if the conversion should consider C++0x "explicit" conversion functions as well as non-explicit conversion functions (C++0x [class.conv.fct]p2).
AllowObjCConversionOnExplicittrue if the conversion should allow an extra Objective-C pointer conversion on uses of explicit constructors. Requires AllowExplicit to also be set.

Definition at line 3957 of file SemaOverload.cpp.

References clang::Sema::AddConversionCandidate(), clang::Sema::AddOverloadCandidate(), clang::Sema::AddTemplateConversionCandidate(), clang::Sema::AddTemplateOverloadCandidate(), clang::UserDefinedConversionSequence::After, clang::UserDefinedConversionSequence::Before, clang::OverloadCandidateSet::BestViableFunction(), clang::cast(), clang::OverloadCandidateSet::clear(), clang::Constructor, clang::Sema::Context, clang::UserDefinedConversionSequence::ConversionFunction, clang::OverloadCandidateSet::CSK_InitByUserDefinedConversion, clang::UserDefinedConversionSequence::EllipsisConversion, clang::UserDefinedConversionSequence::FoundConversionFunction, clang::StandardConversionSequence::FromBracedInitList, clang::Type::getAsCanonical(), clang::Stmt::getBeginLoc(), clang::getConstructorInfo(), clang::DeclAccessPair::getDecl(), clang::Decl::getDeclContext(), clang::Expr::getExprLoc(), clang::FunctionTemplateDecl::getTemplatedDecl(), clang::Expr::getType(), clang::UserDefinedConversionSequence::HadMultipleCandidates, clang::ASTContext::hasSameUnqualifiedType(), clang::isa(), clang::Sema::isCompleteType(), clang::Sema::IsDerivedFrom(), isFirstArgumentCompatibleWithType(), IsInitializerListConstructorConversion(), clang::Type::isRecordType(), clang::Sema::LookupConstructors(), clang::OR_Ambiguous, clang::OR_Deleted, clang::OR_No_Viable_Function, clang::OR_Success, clang::StandardConversionSequence::setAllToTypes(), clang::StandardConversionSequence::setAsIdentityConversion(), clang::StandardConversionSequence::setFromType(), and clang::OverloadCandidateSet::size().

Referenced by clang::Sema::DiagnoseMultipleUserDefinedConversion(), and TryUserDefinedConversion().

◆ IsVectorConversion()

bool IsVectorConversion ( Sema & S,
QualType FromType,
QualType ToType,
ImplicitConversionKind & ICK,
ImplicitConversionKind & ElConv,
Expr * From,
bool InOverloadResolution,
bool CStyle )
static

◆ IsVectorElementConversion()

◆ makeQualifiedLValueReferenceType()

◆ markUnaddressableCandidatesUnviable()

◆ MaybeDiagnoseAmbiguousConstraints()

void MaybeDiagnoseAmbiguousConstraints ( Sema & S,
ArrayRef< OverloadCandidate > Cands )
static

◆ NoteAmbiguousUserConversions()

◆ NoteBuiltinOperatorCandidate()

◆ NoteFunctionCandidate()

void NoteFunctionCandidate ( Sema & S,
OverloadCandidate * Cand,
unsigned NumArgs,
bool TakingCandidateAddress,
LangAS CtorDestAS = LangAS::Default )
static

Generates a 'note' diagnostic for an overload candidate.

We've already generated a primary error at the call site.

It really does need to be a single diagnostic with its caret pointed at the candidate declaration. Yes, this creates some major challenges of technical writing. Yes, this makes pointing out problems with specific arguments quite awkward. It's still better than generating twenty screens of text for every failed overload.

It would be great to be able to express per-candidate problems more richly for those diagnostic clients that cared, but we'd still have to be just as careful with the default diagnostics.

Parameters
CtorDestASAddr space of object being constructed (for ctor candidates only).

Definition at line 12596 of file SemaOverload.cpp.

References clang::cast(), checkAddressOfCandidateIsAvailable(), clang::Sema::CheckFunctionConstraints(), clang::OverloadCandidate::Conversions, clang::Default, clang::SemaBase::Diag(), DiagnoseArityMismatch(), DiagnoseBadConversion(), DiagnoseBadDeduction(), DiagnoseBadTarget(), DiagnoseFailedEnableIfAttr(), DiagnoseFailedExplicitSpec(), clang::Sema::DiagnoseUnsatisfiedConstraint(), clang::OverloadCandidate::FailureKind, clang::OverloadCandidate::FoundDecl, clang::OverloadCandidate::Function, clang::Sema::getLangOpts(), clang::OverloadCandidate::getRewriteKind(), clang::OverloadCandidate::IgnoreObjectArgument, NoteImplicitDeductionGuide(), clang::Sema::NoteOverloadCandidate(), clang::ovl_fail_addr_not_available, clang::ovl_fail_bad_conversion, clang::ovl_fail_bad_deduction, clang::ovl_fail_bad_final_conversion, clang::ovl_fail_bad_target, clang::ovl_fail_constraints_not_satisfied, clang::ovl_fail_enable_if, clang::ovl_fail_explicit, clang::ovl_fail_final_conversion_not_exact, clang::ovl_fail_illegal_constructor, clang::ovl_fail_inhctor_slice, clang::ovl_fail_object_addrspace_mismatch, clang::ovl_fail_too_few_arguments, clang::ovl_fail_too_many_arguments, clang::ovl_fail_trivial_conversion, clang::ovl_non_default_multiversion_function, clang::Qualifiers::setAddressSpace(), shouldSkipNotingLambdaConversionDecl(), clang::OverloadCandidate::TookAddressOfOverload, and clang::OverloadCandidate::Viable.

Referenced by clang::OverloadCandidateSet::NoteCandidates().

◆ NoteImplicitDeductionGuide()

◆ NoteSurrogateCandidate()

◆ PrepareArgumentsForCallToObjectOfClassType()

◆ PrepareExplicitObjectArgument()

bool PrepareExplicitObjectArgument ( Sema & S,
CXXMethodDecl * Method,
Expr * Object,
MultiExprArg & Args,
SmallVectorImpl< Expr * > & NewArgs )
static

◆ RankDeductionFailure()

◆ recordConversion()

◆ sameFunctionParameterTypeLists()

bool sameFunctionParameterTypeLists ( Sema & S,
FunctionDecl * Fn1,
FunctionDecl * Fn2,
bool IsFn1Reversed,
bool IsFn2Reversed )
static

We're allowed to use constraints partial ordering only if the candidates have the same parameter types: [over.match.best.general]p2.6 F1 and F2 are non-template functions with the same non-object-parameter-type-lists, and F1 is more constrained than F2 [...].

Definition at line 10663 of file SemaOverload.cpp.

References clang::Sema::FunctionNonObjectParamTypesAreEqual(), clang::Sema::getASTContext(), clang::ASTContext::hasSameType(), and clang::FunctionDecl::isVariadic().

Referenced by getMorePartialOrderingConstrained().

◆ shouldAddReversedEqEq()

◆ shouldSkipNotingLambdaConversionDecl()

◆ tryAtomicConversion()

bool tryAtomicConversion ( Sema & S,
Expr * From,
QualType ToType,
bool InOverloadResolution,
StandardConversionSequence & SCS,
bool CStyle )
static
  • Determine whether this is a conversion from a scalar type to an atomic type.

If successful, updates SCS's second and third steps in the conversion sequence to finish the conversion.

Definition at line 3848 of file SemaOverload.cpp.

References clang::Type::getAs(), clang::StandardConversionSequence::getToType(), clang::AtomicType::getValueType(), IsStandardConversion(), clang::StandardConversionSequence::QualificationIncludesObjCLifetime, clang::StandardConversionSequence::Second, clang::StandardConversionSequence::setToType(), and clang::StandardConversionSequence::Third.

Referenced by IsStandardConversion().

◆ TryContextuallyConvertToBool()

ImplicitConversionSequence TryContextuallyConvertToBool ( Sema & S,
Expr * From )
static

◆ TryContextuallyConvertToObjCPointer()

◆ TryCopyInitialization() [1/2]

bool TryCopyInitialization ( const CanQualType FromQTy,
const CanQualType ToQTy,
Sema & S,
SourceLocation Loc,
ExprValueKind FromVK )
static

◆ TryCopyInitialization() [2/2]

ImplicitConversionSequence TryCopyInitialization ( Sema & S,
Expr * From,
QualType ToType,
bool SuppressUserConversions,
bool InOverloadResolution,
bool AllowObjCWritebackConversion,
bool AllowExplicit )
static

TryCopyInitialization - Try to copy-initialize a value of type ToType from the expression From.

Return the implicit conversion sequence required to pass this argument, which may be a bad conversion sequence (meaning that the argument cannot be passed to a parameter of this type). If SuppressUserConversions, then we do not permit any user-defined conversion sequences.

Definition at line 5861 of file SemaOverload.cpp.

References clang::Stmt::getBeginLoc(), clang::Type::isReferenceType(), TryImplicitConversion(), TryListConversion(), and TryReferenceInit().

Referenced by clang::Sema::AddBuiltinCandidate(), clang::Sema::AddConversionCandidate(), clang::Sema::AddMethodCandidate(), clang::Sema::AddOverloadCandidate(), clang::Sema::AddSurrogateCandidate(), BuildConvertedConstantExpression(), clang::Sema::CheckNonDependentConversions(), CompleteNonViableCandidate(), clang::Sema::SelectBestMethod(), TryCopyInitialization(), TryListConversion(), and TryObjectArgumentInitialization().

◆ tryGetFunctionProtoType()

const FunctionProtoType * tryGetFunctionProtoType ( QualType FromType)
static

Attempts to get the FunctionProtoType from a Type.

Handles MemberFunctionPointers properly.

Definition at line 3326 of file SemaOverload.cpp.

References clang::Type::getAs(), and clang::Type::getPointeeType().

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

◆ TryImplicitConversion()

ImplicitConversionSequence TryImplicitConversion ( Sema & S,
Expr * From,
QualType ToType,
bool SuppressUserConversions,
AllowedExplicit AllowExplicit,
bool InOverloadResolution,
bool CStyle,
bool AllowObjCWritebackConversion,
bool AllowObjCConversionOnExplicit )
static

TryImplicitConversion - Attempt to perform an implicit conversion from the given expression (Expr) to the given type (ToType).

This function returns an implicit conversion sequence that can be used to perform the initialization. Given

void f(float f); void g(int i) { f(i); }

this routine would produce an implicit conversion sequence to describe the initialization of f from i, which will be a standard conversion sequence containing an lvalue-to-rvalue conversion (C++ 4.1) followed by a floating-integral conversion (C++ 4.9). Note that this routine only determines how the conversion can be performed; it does not actually perform the conversion. As such, it will not produce any diagnostics if no conversion is available, but will instead return an implicit conversion sequence of kind "BadConversion".

If SuppressUserConversions, then user-defined conversions are not permitted. If AllowExplicit, then explicit user-defined conversions are permitted.

Parameters
AllowObjCWritebackConversionWhether we allow the Objective-C writeback conversion, which allows __autoreleasing id* parameters to be initialized with __strong id* or __weak id* arguments.

Definition at line 1779 of file SemaOverload.cpp.

References clang::cast(), clang::Sema::Context, clang::StandardConversionSequence::CopyConstructor, clang::Stmt::getBeginLoc(), clang::Sema::getLangOpts(), clang::Expr::getType(), clang::ASTContext::hasSameUnqualifiedType(), clang::ICK_Derived_To_Base, clang::Sema::IsDerivedFrom(), clang::Type::isHLSLAttributedResourceType(), clang::Type::isRecordType(), IsStandardConversion(), clang::BadConversionSequence::no_conversion, clang::StandardConversionSequence::Second, clang::StandardConversionSequence::setAllToTypes(), clang::StandardConversionSequence::setAsIdentityConversion(), clang::ImplicitConversionSequence::setBad(), clang::StandardConversionSequence::setFromType(), clang::ImplicitConversionSequence::setStandard(), clang::ImplicitConversionSequence::Standard, and TryUserDefinedConversion().

Referenced by clang::Sema::PerformImplicitConversion(), TryContextuallyConvertToBool(), TryContextuallyConvertToObjCPointer(), TryCopyInitialization(), and TryReferenceInit().

◆ TryListConversion()

ImplicitConversionSequence TryListConversion ( Sema & S,
InitListExpr * From,
QualType ToType,
bool SuppressUserConversions,
bool InOverloadResolution,
bool AllowObjCWritebackConversion )
static

TryListConversion - Try to copy-initialize a value of type ToType from the initializer list From.

Definition at line 5540 of file SemaOverload.cpp.

References clang::StandardConversionSequence::BindsImplicitObjectArgumentWithoutRefQualifier, clang::StandardConversionSequence::BindsToFunctionLvalue, clang::StandardConversionSequence::BindsToRvalue, clang::Sema::CanPerformAggregateInitializationForOverloadResolution(), clang::Sema::CanPerformCopyInitialization(), clang::Type::castAs(), CompareImplicitConversionSequences(), clang::Sema::CompareReferenceRelationship(), clang::Sema::Context, clang::Found, clang::StandardConversionSequence::FromBracedInitList, clang::ASTContext::getAsArrayType(), clang::InitListExpr::getBeginLoc(), clang::ASTContext::getCanonicalType(), clang::ASTContext::getConstantArrayType(), clang::ArrayType::getElementType(), clang::InitListExpr::getEndLoc(), clang::InitListExpr::getInit(), clang::Sema::getLangOpts(), clang::InitListExpr::getNumInits(), getPointeeType(), clang::ASTContext::getSizeType(), clang::Expr::getType(), clang::ASTContext::getTypeSize(), clang::InitListExpr::hasDesignatedInit(), clang::ASTContext::hasSameUnqualifiedType(), clang::Init, clang::InitializedEntity::InitializeParameter(), clang::isa(), clang::Type::isAggregateType(), clang::ImplicitConversionSequence::isBad(), clang::Sema::isCompleteType(), clang::QualType::isConstQualified(), clang::Sema::IsDerivedFrom(), clang::StandardConversionSequence::IsLvalueReference, clang::Type::isLValueReferenceType(), clang::Type::isRecordType(), clang::Type::isReferenceType(), clang::Type::isRValueReferenceType(), clang::Sema::isStdInitializerList(), clang::Sema::IsStringInit(), clang::QualType::isVolatileQualified(), clang::BadConversionSequence::lvalue_ref_to_rvalue, clang::BadConversionSequence::no_conversion, clang::Normal, clang::StandardConversionSequence::ObjCLifetimeConversionBinding, clang::ASTContext::OverloadTy, clang::Sema::Ref_Related, clang::StandardConversionSequence::ReferenceBinding, clang::Sema::ResolveAddressOfOverloadedFunction(), clang::ImplicitConversionSequence::setBad(), clang::ImplicitConversionSequence::setInitializerListContainerType(), clang::Expr::setType(), clang::BadConversionSequence::too_few_initializers, clang::BadConversionSequence::too_many_initializers, TryCopyInitialization(), TryListConversion(), TryReferenceInit(), TryUserDefinedConversion(), clang::ASTContext::VoidTy, and clang::ImplicitConversionSequence::Worse.

Referenced by TryCopyInitialization(), and TryListConversion().

◆ TryObjectArgumentInitialization()

ImplicitConversionSequence TryObjectArgumentInitialization ( Sema & S,
SourceLocation Loc,
QualType FromType,
Expr::Classification FromClassification,
CXXMethodDecl * Method,
const CXXRecordDecl * ActingContext,
bool InOverloadResolution = false,
QualType ExplicitParameterType = QualType(),
bool SuppressUserConversion = false )
static

TryObjectArgumentInitialization - Try to initialize the object parameter of the given member function (Method) from the expression From.

Definition at line 5899 of file SemaOverload.cpp.

References clang::Qualifiers::addConst(), clang::Qualifiers::addVolatile(), clang::ImplicitConversionSequence::Bad, clang::BadConversionSequence::bad_qualifiers, clang::StandardConversionSequence::BindsImplicitObjectArgumentWithoutRefQualifier, clang::StandardConversionSequence::BindsToFunctionLvalue, clang::StandardConversionSequence::BindsToRvalue, clang::C, clang::Sema::Context, clang::StandardConversionSequence::DirectBinding, clang::StandardConversionSequence::FromBracedInitList, clang::BadConversionSequence::FromExpr, clang::Type::getAs(), clang::Sema::getASTContext(), clang::ASTContext::getCanonicalTagType(), clang::ASTContext::getCanonicalType(), clang::QualType::getCVRQualifiers(), clang::QualType::getLocalCVRQualifiers(), clang::QualType::getLocalUnqualifiedType(), clang::QualType::getNonReferenceType(), clang::Type::getPointeeType(), clang::ASTContext::getQualifiedType(), clang::QualType::getQualifiers(), clang::QualType::hasAddressSpace(), clang::Qualifiers::hasOnlyConst(), clang::ICK_Derived_To_Base, clang::ICK_Identity, clang::isa(), clang::Qualifiers::isAddressSpaceSupersetOf(), clang::QualType::isAtLeastAsQualifiedAs(), clang::ImplicitConversionSequence::isBad(), clang::Sema::IsDerivedFrom(), clang::Expr::Classification::isLValue(), clang::StandardConversionSequence::IsLvalueReference, clang::Type::isRecordType(), clang::Expr::Classification::isRValue(), clang::BadConversionSequence::lvalue_ref_to_rvalue, clang::StandardConversionSequence::ReferenceBinding, clang::RQ_LValue, clang::RQ_None, clang::RQ_RValue, clang::BadConversionSequence::rvalue_ref_to_lvalue, clang::StandardConversionSequence::Second, clang::StandardConversionSequence::setAllToTypes(), clang::StandardConversionSequence::setAsIdentityConversion(), clang::ImplicitConversionSequence::setBad(), clang::StandardConversionSequence::setFromType(), clang::ImplicitConversionSequence::setStandard(), clang::ImplicitConversionSequence::Standard, TryCopyInitialization(), clang::BadConversionSequence::unrelated_class, clang::VK_LValue, clang::VK_PRValue, clang::VK_XValue, and withoutUnaligned().

Referenced by clang::Sema::AddConversionCandidate(), clang::Sema::AddMethodCandidate(), clang::Sema::AddSurrogateCandidate(), clang::Sema::CheckNonDependentConversions(), and clang::Sema::PerformImplicitObjectArgumentInitialization().

◆ TryReferenceInit()

ImplicitConversionSequence TryReferenceInit ( Sema & S,
Expr * Init,
QualType DeclType,
SourceLocation DeclLoc,
bool SuppressUserConversions,
bool AllowExplicit )
static

Compute an implicit conversion sequence for reference initialization.

Definition at line 5264 of file SemaOverload.cpp.

References clang::UserDefinedConversionSequence::After, clang::StandardConversionSequence::BindsImplicitObjectArgumentWithoutRefQualifier, clang::StandardConversionSequence::BindsToFunctionLvalue, clang::StandardConversionSequence::BindsToRvalue, clang::Type::castAs(), clang::Sema::CompareReferenceRelationship(), clang::Qualifiers::compatiblyIncludes(), clang::Sema::Context, clang::UserDefinedConversionSequence::ConversionFunction, clang::StandardConversionSequence::CopyConstructor, clang::StandardConversionSequence::DeprecatedStringLiteralToCharPtr, clang::StandardConversionSequence::Dimension, clang::StandardConversionSequence::DirectBinding, FindConversionForRefInit(), clang::StandardConversionSequence::First, clang::Found, clang::StandardConversionSequence::FromBracedInitList, clang::Type::getAs(), clang::Sema::getASTContext(), clang::ASTContext::getCanonicalType(), clang::Sema::getLangOpts(), getPointeeType(), clang::QualType::getQualifiers(), clang::FunctionDecl::getReturnType(), clang::ICK_Compatible_Conversion, clang::ICK_Derived_To_Base, clang::ICK_Identity, clang::ICK_Lvalue_To_Rvalue, clang::ICK_Qualification, clang::Init, clang::Type::isArrayType(), clang::Sema::isCompleteType(), clang::QualType::isConstQualified(), clang::Type::isFunctionType(), clang::Expr::Classification::isLValue(), clang::StandardConversionSequence::IsLvalueReference, clang::Expr::Classification::isPRValue(), clang::Type::isRecordType(), clang::Type::isReferenceType(), clang::Expr::Classification::isRValue(), clang::Type::isRValueReferenceType(), clang::ImplicitConversionSequence::isStandard(), clang::ImplicitConversionSequence::isUserDefined(), clang::QualType::isVolatileQualified(), clang::Expr::Classification::isXValue(), clang::BadConversionSequence::lvalue_ref_to_rvalue, clang::BadConversionSequence::no_conversion, clang::StandardConversionSequence::ObjCLifetimeConversionBinding, clang::ASTContext::OverloadTy, clang::Sema::Ref_Compatible, clang::Sema::Ref_Incompatible, clang::Sema::Ref_Related, clang::StandardConversionSequence::ReferenceBinding, clang::Qualifiers::removeObjCGCAttr(), clang::Qualifiers::removeObjCLifetime(), clang::Qualifiers::removeUnaligned(), clang::Sema::ResolveAddressOfOverloadedFunction(), clang::BadConversionSequence::rvalue_ref_to_lvalue, clang::StandardConversionSequence::Second, clang::ImplicitConversionSequence::setBad(), clang::StandardConversionSequence::setFromType(), clang::ImplicitConversionSequence::setStandard(), clang::StandardConversionSequence::setToType(), clang::ImplicitConversionSequence::Standard, clang::StandardConversionSequence::Third, TryImplicitConversion(), and clang::ImplicitConversionSequence::UserDefined.

Referenced by TryCopyInitialization(), and TryListConversion().

◆ TryUserDefinedConversion()

ImplicitConversionSequence TryUserDefinedConversion ( Sema & S,
Expr * From,
QualType ToType,
bool SuppressUserConversions,
AllowedExplicit AllowExplicit,
bool InOverloadResolution,
bool CStyle,
bool AllowObjCWritebackConversion,
bool AllowObjCConversionOnExplicit )
static

Tries a user-defined conversion from From to ToType.

Produces an implicit conversion sequence for when a standard conversion is not an option. See TryImplicitConversion for more information.

Definition at line 1656 of file SemaOverload.cpp.

References clang::AmbiguousConversionSequence::addConversion(), clang::ImplicitConversionSequence::Ambiguous, clang::OverloadCandidateSet::begin(), clang::Constructor, clang::Sema::Context, clang::UserDefinedConversionSequence::ConversionFunction, clang::StandardConversionSequence::CopyConstructor, clang::OverloadCandidateSet::CSK_Normal, clang::OverloadCandidateSet::end(), clang::Found, clang::UserDefinedConversionSequence::FoundConversionFunction, clang::StandardConversionSequence::FoundCopyConstructor, clang::StandardConversionSequence::FromBracedInitList, clang::Stmt::getBeginLoc(), clang::ASTContext::getCanonicalType(), clang::Expr::getExprLoc(), clang::Expr::getType(), clang::CanQual< T >::getUnqualifiedType(), clang::QualType::getUnqualifiedType(), clang::ICK_Derived_To_Base, clang::Sema::IsDerivedFrom(), clang::Sema::isInitListConstructor(), IsUserDefinedConversion(), clang::BadConversionSequence::no_conversion, clang::OR_Ambiguous, clang::OR_Deleted, clang::OR_No_Viable_Function, clang::OR_Success, clang::StandardConversionSequence::Second, clang::StandardConversionSequence::setAllToTypes(), clang::ImplicitConversionSequence::setAmbiguous(), clang::StandardConversionSequence::setAsIdentityConversion(), clang::ImplicitConversionSequence::setBad(), clang::AmbiguousConversionSequence::setFromType(), clang::StandardConversionSequence::setFromType(), clang::ImplicitConversionSequence::setStandard(), clang::AmbiguousConversionSequence::setToType(), clang::ImplicitConversionSequence::setUserDefined(), clang::ImplicitConversionSequence::Standard, and clang::ImplicitConversionSequence::UserDefined.

◆ withoutUnaligned()