clang 22.0.0git
SemaTemplateDeduction.cpp File Reference
#include "TreeTransform.h"
#include "TypeLocBuilder.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTLambda.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclAccessPair.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/DeclarationName.h"
#include "clang/AST/DynamicRecursiveASTVisitor.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/NestedNameSpecifier.h"
#include "clang/AST/TemplateBase.h"
#include "clang/AST/TemplateName.h"
#include "clang/AST/Type.h"
#include "clang/AST/TypeLoc.h"
#include "clang/AST/TypeOrdering.h"
#include "clang/AST/UnresolvedSet.h"
#include "clang/Basic/AddressSpaces.h"
#include "clang/Basic/ExceptionSpecificationType.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/Specifiers.h"
#include "clang/Basic/TemplateKinds.h"
#include "clang/Sema/EnterExpressionEvaluationContext.h"
#include "clang/Sema/Ownership.h"
#include "clang/Sema/Sema.h"
#include "clang/Sema/Template.h"
#include "clang/Sema/TemplateDeduction.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/SaveAndRestore.h"
#include <algorithm>
#include <cassert>
#include <optional>
#include <tuple>
#include <type_traits>
#include <utility>
#include "clang/AST/TypeNodes.inc"

Go to the source code of this file.

Classes

class  NonTypeOrVarTemplateParmDecl
struct  clang::DeducedPack
 A pack that we're currently deducing. More...
struct  IsPartialSpecialization< T >
struct  IsPartialSpecialization< ClassTemplatePartialSpecializationDecl >
struct  IsPartialSpecialization< VarTemplatePartialSpecializationDecl >

Namespaces

namespace  clang
 The JSON file list parser is used to communicate input to InstallAPI.

Macros

#define NON_CANONICAL_TYPE(Class, Base)
#define TYPE(Class, Base)
#define TYPE(Class, Base)
#define ABSTRACT_TYPE(Class, Base)
#define DEPENDENT_TYPE(Class, Base)
#define NON_CANONICAL_TYPE(Class, Base)

Enumerations

enum  clang::TemplateDeductionFlags {
  clang::TDF_None = 0 , clang::TDF_ParamWithReferenceType = 0x1 , clang::TDF_IgnoreQualifiers = 0x02 , clang::TDF_DerivedClass = 0x04 ,
  clang::TDF_SkipNonDependent = 0x08 , clang::TDF_TopLevelParameterTypeList = 0x10 , clang::TDF_AllowCompatibleFunctionType = 0x20 , clang::TDF_ArgWithReferenceType = 0x40
}
 Various flags that control template argument deduction. More...
enum class  PartialOrderingKind { None , NonCall , Call }
 The kind of PartialOrdering we're performing template argument deduction for (C++11 [temp.deduct.partial]). More...
enum class  PackFold { ParameterToArgument , ArgumentToParameter , Both }
 What directions packs are allowed to match non-packs. More...
enum class  MoreSpecializedTrailingPackTieBreakerResult { Equal , Less , More }

Functions

static TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch (Sema &S, TemplateParameterList *TemplateParams, QualType P, QualType A, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned TDF, PartialOrderingKind POK, bool DeducedFromArrayBound, bool *HasDeducedAnyParam)
 Deduce the template arguments by comparing the parameter type and the argument type (C++ [temp.deduct.type]).
static TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
static void MarkUsedTemplateParameters (ASTContext &Ctx, const TemplateArgument &TemplateArg, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
 Mark the template parameters that are used by this template argument.
static void MarkUsedTemplateParameters (ASTContext &Ctx, QualType T, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
 Mark the template parameters that are used by the given type.
static const ExprunwrapExpressionForDeduction (const Expr *E)
static NonTypeOrVarTemplateParmDecl getDeducedNTTParameterFromExpr (const Expr *E, unsigned Depth)
 If the given expression is of a form that permits the deduction of a non-type template parameter, return the declaration of that non-type template parameter.
static const NonTypeOrVarTemplateParmDecl getDeducedNTTParameterFromExpr (TemplateDeductionInfo &Info, Expr *E)
static bool isSameDeclaration (Decl *X, Decl *Y)
 Determine whether two declaration pointers refer to the same declaration.
static DeducedTemplateArgument checkDeducedTemplateArguments (ASTContext &Context, const DeducedTemplateArgument &X, const DeducedTemplateArgument &Y, bool AggregateCandidateDeduction=false)
 Verify that the given, deduced template arguments are compatible.
static TemplateDeductionResult DeduceNonTypeTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, const NonTypeOrVarTemplateParmDecl NTTP, const DeducedTemplateArgument &NewDeduced, QualType ValueType, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
 Deduce the value of the given non-type template parameter as the given deduced template argument.
static TemplateDeductionResult DeduceNonTypeTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeOrVarTemplateParmDecl NTTP, const llvm::APSInt &Value, QualType ValueType, bool DeducedFromArrayBound, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
 Deduce the value of the given non-type template parameter from the given integral constant.
static TemplateDeductionResult DeduceNullPtrTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeOrVarTemplateParmDecl NTTP, QualType NullPtrType, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
 Deduce the value of the given non-type template parameter from the given null pointer template argument type.
static TemplateDeductionResult DeduceNonTypeTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeOrVarTemplateParmDecl NTTP, Expr *Value, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
 Deduce the value of the given non-type template parameter from the given type- or value-dependent expression.
static TemplateDeductionResult DeduceNonTypeTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeOrVarTemplateParmDecl NTTP, ValueDecl *D, QualType T, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
 Deduce the value of the given non-type template parameter from the given declaration.
static TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, TemplateName Param, TemplateName Arg, TemplateDeductionInfo &Info, ArrayRef< TemplateArgument > DefaultArguments, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
static const TemplateSpecializationType * getLastTemplateSpecType (QualType QT)
 Deduce the template arguments by comparing the template parameter type (which is a template-id) with the template argument type.
static TemplateDeductionResult DeduceTemplateSpecArguments (Sema &S, TemplateParameterList *TemplateParams, const QualType P, QualType A, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
static bool IsPossiblyOpaquelyQualifiedTypeInternal (const Type *T)
static bool IsPossiblyOpaquelyQualifiedType (QualType T)
 Determines whether the given type is an opaque type that might be more qualified when instantiated.
static TemplateParameter makeTemplateParameter (Decl *D)
 Helper function to build a TemplateParameter when we don't know its type statically.
template<class T>
static TemplateDeductionResult DeduceForEachType (Sema &S, TemplateParameterList *TemplateParams, ArrayRef< QualType > Params, ArrayRef< QualType > Args, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, PartialOrderingKind POK, bool FinishingDeduction, T &&DeductFunc)
static TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, ArrayRef< QualType > Params, ArrayRef< QualType > Args, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned TDF, PartialOrderingKind POK, bool *HasDeducedAnyParam, llvm::SmallBitVector *HasDeducedParam)
 Deduce the template arguments by comparing the list of parameter types to the list of argument types, as in the parameter-type-lists of function types (C++ [temp.deduct.type]p10).
static bool hasInconsistentOrSupersetQualifiersOf (QualType ParamType, QualType ArgType)
 Determine whether the parameter has qualifiers that the argument lacks.
static unsigned getFirstInnerIndex (FunctionTemplateDecl *FTD)
 Get the index of the first template parameter that was originally from the innermost template-parameter-list.
static bool isForwardingReference (QualType Param, unsigned FirstInnerIndex)
 Determine whether a type denotes a forwarding reference.
static TemplateDeductionResult DeduceTemplateBases (Sema &S, const CXXRecordDecl *RD, TemplateParameterList *TemplateParams, QualType P, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
 Attempt to deduce the template arguments by checking the base types according to (C++20 [temp.deduct.call] p4b3.
static PartialOrderingKind degradeCallPartialOrderingKind (PartialOrderingKind POK)
 When propagating a partial ordering kind into a NonCall context, this is used to downgrade a 'Call' into a 'NonCall', so that the kind still reflects whether we are in a partial ordering context.
static TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, const TemplateArgument &P, TemplateArgument A, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
static bool hasTemplateArgumentForDeduction (ArrayRef< TemplateArgument > &Args, unsigned &ArgIdx)
 Determine whether there is a template argument to be used for deduction.
static bool hasPackExpansionBeforeEnd (ArrayRef< TemplateArgument > Args)
 Determine whether the given set of template arguments has a pack expansion that is not the last template argument.
static bool ConvertDeducedTemplateArgument (Sema &S, NamedDecl *Param, DeducedTemplateArgument Arg, NamedDecl *Template, TemplateDeductionInfo &Info, bool IsDeduced, Sema::CheckTemplateArgumentInfo &CTAI)
 Convert the given deduced template argument and add it to the set of fully-converted template arguments.
static TemplateDeductionResult ConvertDeducedTemplateArguments (Sema &S, NamedDecl *Template, TemplateParameterList *TemplateParams, bool IsDeduced, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info, Sema::CheckTemplateArgumentInfo &CTAI, LocalInstantiationScope *CurrentInstantiationScope, unsigned NumAlreadyConverted, bool *IsIncomplete)
static DeclContextgetAsDeclContextOrEnclosing (Decl *D)
static TemplateDeductionResult CheckDeducedArgumentConstraints (Sema &S, NamedDecl *Template, ArrayRef< TemplateArgument > SugaredDeducedArgs, ArrayRef< TemplateArgument > CanonicalDeducedArgs, TemplateDeductionInfo &Info)
static TemplateDeductionResult FinishTemplateArgumentDeduction (Sema &S, NamedDecl *Entity, TemplateParameterList *EntityTPL, TemplateDecl *Template, bool PartialOrdering, ArrayRef< TemplateArgumentLoc > Ps, ArrayRef< TemplateArgument > As, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info, bool CopyDeducedArgs)
 Complete template argument deduction.
static TemplateDeductionResult FinishTemplateArgumentDeduction (Sema &S, NamedDecl *Entity, TemplateParameterList *EntityTPL, TemplateDecl *Template, bool PartialOrdering, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info, bool CopyDeducedArgs)
static TemplateDeductionResult FinishTemplateArgumentDeduction (Sema &S, TemplateDecl *TD, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info)
 Complete template argument deduction for DeduceTemplateArgumentsFromType.
template<typename T>
static std::enable_if_t< IsPartialSpecialization< T >::value, TemplateDeductionResultDeduceTemplateArguments (Sema &S, T *Partial, ArrayRef< TemplateArgument > TemplateArgs, TemplateDeductionInfo &Info)
 Perform template argument deduction to determine whether the given template arguments match the given class or variable template partial specialization per C++ [temp.class.spec.match].
static bool isSimpleTemplateIdType (QualType T)
 Determine whether the given type T is a simple-template-id type.
static TemplateDeductionResult CheckOriginalCallArgDeduction (Sema &S, TemplateDeductionInfo &Info, Sema::OriginalCallArg OriginalArg, QualType DeducedA)
 Check whether the deduced argument type for a call to a function template matches the actual argument type per C++ [temp.deduct.call]p4.
static UnsignedOrNone getPackIndexForParam (Sema &S, FunctionTemplateDecl *FunctionTemplate, const MultiLevelTemplateArgumentList &Args, unsigned ParamIdx)
 Find the pack index for a particular parameter index in an instantiation of a function template with specific arguments.
static TemplateDeductionResult instantiateExplicitSpecifierDeferred (Sema &S, FunctionDecl *Specialization, const MultiLevelTemplateArgumentList &SubstArgs, TemplateDeductionInfo &Info, FunctionTemplateDecl *FunctionTemplate, ArrayRef< TemplateArgument > DeducedArgs)
static QualType GetTypeOfFunction (Sema &S, const OverloadExpr::FindResult &R, FunctionDecl *Fn)
 Gets the type of a function for template-argument-deducton purposes when it's considered as part of an overload set.
static QualType ResolveOverloadForDeduction (Sema &S, TemplateParameterList *TemplateParams, Expr *Arg, QualType ParamType, bool ParamWasReference, TemplateSpecCandidateSet *FailedTSC=nullptr)
 Apply the deduction rules for overload sets.
static bool AdjustFunctionParmAndArgTypesForDeduction (Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex, QualType &ParamType, QualType &ArgType, Expr::Classification ArgClassification, Expr *Arg, unsigned &TDF, TemplateSpecCandidateSet *FailedTSC=nullptr)
 Perform the adjustments to the parameter and argument types described in C++ [temp.deduct.call].
static bool hasDeducibleTemplateParameters (Sema &S, FunctionTemplateDecl *FunctionTemplate, QualType T)
static TemplateDeductionResult DeduceTemplateArgumentsFromCallArgument (Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex, QualType ParamType, QualType ArgType, Expr::Classification ArgClassification, Expr *Arg, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, SmallVectorImpl< Sema::OriginalCallArg > &OriginalCallArgs, bool DecomposedParam, unsigned ArgIdx, unsigned TDF, TemplateSpecCandidateSet *FailedTSC)
 Perform template argument deduction per [temp.deduct.call] for a single parameter / argument pair.
static TemplateDeductionResult DeduceFromInitializerList (Sema &S, TemplateParameterList *TemplateParams, QualType AdjustedParamType, InitListExpr *ILE, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, SmallVectorImpl< Sema::OriginalCallArg > &OriginalCallArgs, unsigned ArgIdx, unsigned TDF)
 Attempt template argument deduction from an initializer list deemed to be an argument in a function call.
static bool CheckDeducedPlaceholderConstraints (Sema &S, const AutoType &Type, AutoTypeLoc TypeLoc, QualType Deduced)
static QualType GetImplicitObjectParameterType (ASTContext &Context, const CXXMethodDecl *Method, QualType RawType, bool IsOtherRvr)
static TemplateDeductionResult CheckDeductionConsistency (Sema &S, FunctionTemplateDecl *FTD, UnsignedOrNone ArgIdx, QualType P, QualType A, ArrayRef< TemplateArgument > DeducedArgs, bool CheckConsistency)
template<class T>
static TemplateDeductionResult FinishTemplateArgumentDeduction (Sema &S, FunctionTemplateDecl *FTD, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info, T &&CheckDeductionConsistency)
static bool isAtLeastAsSpecializedAs (Sema &S, SourceLocation Loc, FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, TemplatePartialOrderingContext TPOC, ArrayRef< QualType > Args1, ArrayRef< QualType > Args2, bool Args1Offset)
 Determine whether the function template FT1 is at least as specialized as FT2.
static MoreSpecializedTrailingPackTieBreakerResult getMoreSpecializedTrailingPackTieBreaker (const TemplateSpecializationType *TST1, const TemplateSpecializationType *TST2)
template<typename TemplateLikeDecl>
static bool isAtLeastAsSpecializedAs (Sema &S, QualType T1, QualType T2, TemplateLikeDecl *P2, TemplateDecl *Template, TemplateDeductionInfo &Info)
 Determine whether one template specialization, P1, is at least as specialized than another, P2.
template<typename TemplateLikeDecl, typename PrimaryDel>
static TemplateLikeDecl * getMoreSpecialized (Sema &S, QualType T1, QualType T2, TemplateLikeDecl *P1, PrimaryDel *P2, TemplateDeductionInfo &Info)
 Returns the more specialized template specialization between T1/P1 and T2/P2.
static void MarkUsedTemplateParameters (ASTContext &Ctx, const Expr *E, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
 Mark the template parameters that are used by the given expression.
static void MarkUsedTemplateParameters (ASTContext &Ctx, NestedNameSpecifier NNS, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
 Mark the template parameters that are used by the given nested name specifier.
static void MarkUsedTemplateParameters (ASTContext &Ctx, TemplateName Name, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
 Mark the template parameters that are used by the given template name.

Macro Definition Documentation

◆ ABSTRACT_TYPE

#define ABSTRACT_TYPE ( Class,
Base )

◆ DEPENDENT_TYPE

#define DEPENDENT_TYPE ( Class,
Base )

◆ NON_CANONICAL_TYPE [1/2]

#define NON_CANONICAL_TYPE ( Class,
Base )
Value:
case Type::Class: llvm_unreachable("deducing non-canonical type: " #Class);

◆ NON_CANONICAL_TYPE [2/2]

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

◆ TYPE [1/2]

#define TYPE ( Class,
Base )

◆ TYPE [2/2]

#define TYPE ( Class,
Base )

Enumeration Type Documentation

◆ MoreSpecializedTrailingPackTieBreakerResult

Enumerator
Equal 
Less 
More 

Definition at line 5863 of file SemaTemplateDeduction.cpp.

◆ PackFold

enum class PackFold
strong

What directions packs are allowed to match non-packs.

Enumerator
ParameterToArgument 
ArgumentToParameter 
Both 

Definition at line 130 of file SemaTemplateDeduction.cpp.

◆ PartialOrderingKind

enum class PartialOrderingKind
strong

The kind of PartialOrdering we're performing template argument deduction for (C++11 [temp.deduct.partial]).

Enumerator
None 
NonCall 
Call 

Definition at line 120 of file SemaTemplateDeduction.cpp.

Function Documentation

◆ AdjustFunctionParmAndArgTypesForDeduction()

◆ CheckDeducedArgumentConstraints()

◆ CheckDeducedPlaceholderConstraints()

◆ checkDeducedTemplateArguments()

DeducedTemplateArgument checkDeducedTemplateArguments ( ASTContext & Context,
const DeducedTemplateArgument & X,
const DeducedTemplateArgument & Y,
bool AggregateCandidateDeduction = false )
static

Verify that the given, deduced template arguments are compatible.

Returns
The deduced template argument, or a NULL template argument if the deduced template arguments were incompatible.

Definition at line 282 of file SemaTemplateDeduction.cpp.

References checkDeducedTemplateArguments(), clang::TemplateArgument::CreatePackCopy(), clang::TemplateArgument::Declaration, clang::TemplateArgument::Expression, clang::TemplateArgument::getAsDecl(), clang::TemplateArgument::getAsExpr(), clang::TemplateArgument::getAsIntegral(), clang::TemplateArgument::getAsTemplate(), clang::TemplateArgument::getAsTemplateOrTemplatePattern(), clang::TemplateArgument::getAsType(), clang::TemplateArgument::getKind(), clang::TemplateArgument::getNonTypeTemplateArgumentType(), clang::TemplateArgument::getNullPtrType(), clang::Expr::getType(), clang::TemplateArgument::Integral, clang::QualType::isNull(), clang::TemplateArgument::isNull(), isSameDeclaration(), clang::TemplateArgument::Null, clang::TemplateArgument::NullPtr, clang::TemplateArgument::Pack, clang::TemplateArgument::pack_begin(), clang::TemplateArgument::pack_end(), clang::TemplateArgument::pack_size(), clang::Stmt::Profile(), clang::TemplateArgument::StructuralValue, clang::TemplateArgument::Template, clang::TemplateArgument::TemplateExpansion, clang::TemplateArgument::Type, clang::DeducedTemplateArgument::wasDeducedFromArrayBound(), and X.

Referenced by checkDeducedTemplateArguments(), DeduceNonTypeTemplateArgument(), DeduceTemplateArguments(), and DeduceTemplateArgumentsByTypeMatch().

◆ CheckDeductionConsistency()

◆ CheckOriginalCallArgDeduction()

TemplateDeductionResult CheckOriginalCallArgDeduction ( Sema & S,
TemplateDeductionInfo & Info,
Sema::OriginalCallArg OriginalArg,
QualType DeducedA )
static

◆ ConvertDeducedTemplateArgument()

◆ ConvertDeducedTemplateArguments()

TemplateDeductionResult ConvertDeducedTemplateArguments ( Sema & S,
NamedDecl * Template,
TemplateParameterList * TemplateParams,
bool IsDeduced,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
TemplateDeductionInfo & Info,
Sema::CheckTemplateArgumentInfo & CTAI,
LocalInstantiationScope * CurrentInstantiationScope,
unsigned NumAlreadyConverted,
bool * IsIncomplete )
static
Parameters
IsIncompleteWhen used, we only consider template parameters that were deduced, disregarding any default arguments. After the function finishes, the object pointed at will contain a value indicating if the conversion was actually incomplete.

Definition at line 3053 of file SemaTemplateDeduction.cpp.

References _2, clang::Sema::CheckTemplateArgumentInfo::CanonicalConverted, clang::Sema::CheckTemplateArgument(), clang::Sema::Context, ConvertDeducedTemplateArgument(), clang::TemplateArgumentList::CreateCopy(), clang::Sema::CTAK_Specified, clang::TemplateArgumentLoc::getArgument(), clang::ASTContext::getCanonicalTemplateArgument(), clang::Decl::getDeclContext(), clang::SourceRange::getEnd(), clang::Sema::getLangOpts(), clang::Decl::getLocation(), clang::TemplateParameterList::getParam(), clang::DeclContext::getParent(), clang::LocalInstantiationScope::getPartiallySubstitutedPack(), clang::TemplateDecl::getSourceRange(), clang::Incomplete, clang::isa(), clang::TemplateArgument::isNull(), makeTemplateParameter(), clang::Sema::CheckTemplateArgumentInfo::MatchingTTP, clang::sema::TemplateDeductionInfo::Param, clang::Sema::CheckTemplateArgumentInfo::PartialOrdering, clang::sema::TemplateDeductionInfo::reset(), clang::LocalInstantiationScope::ResetPartiallySubstitutedPack(), clang::TemplateParameterList::size(), clang::Sema::CheckTemplateArgumentInfo::StrictPackMatch, clang::Sema::SubstDefaultTemplateArgumentIfAvailable(), clang::SubstitutionFailure, clang::Success, clang::Sema::CheckTemplateArgumentInfo::SugaredConverted, and clang::Template.

Referenced by clang::Sema::FinishTemplateArgumentDeduction(), FinishTemplateArgumentDeduction(), FinishTemplateArgumentDeduction(), and FinishTemplateArgumentDeduction().

◆ DeduceForEachType()

template<class T>
TemplateDeductionResult DeduceForEachType ( Sema & S,
TemplateParameterList * TemplateParams,
ArrayRef< QualType > Params,
ArrayRef< QualType > Args,
TemplateDeductionInfo & Info,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
PartialOrderingKind POK,
bool FinishingDeduction,
T && DeductFunc )
static

◆ DeduceFromInitializerList()

◆ DeduceNonTypeTemplateArgument() [1/4]

TemplateDeductionResult DeduceNonTypeTemplateArgument ( Sema & S,
TemplateParameterList * TemplateParams,
const NonTypeOrVarTemplateParmDecl NTTP,
const DeducedTemplateArgument & NewDeduced,
QualType ValueType,
TemplateDeductionInfo & Info,
bool PartialOrdering,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
bool * HasDeducedAnyParam )
static

◆ DeduceNonTypeTemplateArgument() [2/4]

TemplateDeductionResult DeduceNonTypeTemplateArgument ( Sema & S,
TemplateParameterList * TemplateParams,
NonTypeOrVarTemplateParmDecl NTTP,
const llvm::APSInt & Value,
QualType ValueType,
bool DeducedFromArrayBound,
TemplateDeductionInfo & Info,
bool PartialOrdering,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
bool * HasDeducedAnyParam )
static

Deduce the value of the given non-type template parameter from the given integral constant.

Definition at line 523 of file SemaTemplateDeduction.cpp.

References clang::Sema::Context, DeduceNonTypeTemplateArgument(), and clang::PartialOrdering.

◆ DeduceNonTypeTemplateArgument() [3/4]

TemplateDeductionResult DeduceNonTypeTemplateArgument ( Sema & S,
TemplateParameterList * TemplateParams,
NonTypeOrVarTemplateParmDecl NTTP,
Expr * Value,
TemplateDeductionInfo & Info,
bool PartialOrdering,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
bool * HasDeducedAnyParam )
static

Deduce the value of the given non-type template parameter from the given type- or value-dependent expression.

Returns
true if deduction succeeded, false otherwise.

Definition at line 562 of file SemaTemplateDeduction.cpp.

References DeduceNonTypeTemplateArgument(), clang::Value::getType(), and clang::PartialOrdering.

◆ DeduceNonTypeTemplateArgument() [4/4]

TemplateDeductionResult DeduceNonTypeTemplateArgument ( Sema & S,
TemplateParameterList * TemplateParams,
NonTypeOrVarTemplateParmDecl NTTP,
ValueDecl * D,
QualType T,
TemplateDeductionInfo & Info,
bool PartialOrdering,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
bool * HasDeducedAnyParam )
static

Deduce the value of the given non-type template parameter from the given declaration.

Returns
true if deduction succeeded, false otherwise.

Definition at line 577 of file SemaTemplateDeduction.cpp.

References DeduceNonTypeTemplateArgument(), New, clang::PartialOrdering, and clang::T.

◆ DeduceNullPtrTemplateArgument()

TemplateDeductionResult DeduceNullPtrTemplateArgument ( Sema & S,
TemplateParameterList * TemplateParams,
NonTypeOrVarTemplateParmDecl NTTP,
QualType NullPtrType,
TemplateDeductionInfo & Info,
bool PartialOrdering,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
bool * HasDeducedAnyParam )
static

◆ DeduceTemplateArguments() [1/5]

template<typename T>
std::enable_if_t< IsPartialSpecialization< T >::value, TemplateDeductionResult > DeduceTemplateArguments ( Sema & S,
T * Partial,
ArrayRef< TemplateArgument > TemplateArgs,
TemplateDeductionInfo & Info )
static

Perform template argument deduction to determine whether the given template arguments match the given class or variable template partial specialization per C++ [temp.class.spec.match].

Definition at line 3428 of file SemaTemplateDeduction.cpp.

References DeduceTemplateArguments(), clang::sema::TemplateDeductionInfo::getLocation(), clang::Sema::SFINAETrap::hasErrorOccurred(), clang::InstantiationDepth, clang::Invalid, clang::Sema::InstantiatingTemplate::isInvalid(), ParameterToArgument, clang::Sema::runWithSufficientStackSpace(), clang::SubstitutionFailure, clang::Success, clang::T, clang::Sema::Unevaluated, and clang::Unevaluated.

◆ DeduceTemplateArguments() [2/5]

TemplateDeductionResult DeduceTemplateArguments ( Sema & S,
TemplateParameterList * TemplateParams,
ArrayRef< QualType > Params,
ArrayRef< QualType > Args,
TemplateDeductionInfo & Info,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
unsigned TDF,
PartialOrderingKind POK,
bool * HasDeducedAnyParam,
llvm::SmallBitVector * HasDeducedParam )
static

Deduce the template arguments by comparing the list of parameter types to the list of argument types, as in the parameter-type-lists of function types (C++ [temp.deduct.type]p10).

Parameters
SThe semantic analysis object within which we are deducing
TemplateParamsThe template parameters that we are deducing
ParamsThe list of parameter types
ArgsThe list of argument types
Infoinformation about the template argument deduction itself
Deducedthe deduced template arguments
TDFbitwise OR of the TemplateDeductionFlags bits that describe how template argument deduction is performed.
PartialOrderingIf true, we are performing template argument deduction for during partial ordering for a call (C++0x [temp.deduct.partial]).
HasDeducedAnyParamIf set, the object pointed at will indicate whether any template parameter was deduced.
HasDeducedParamIf set, the bit vector will be used to represent which template parameters were deduced, in order.
Returns
the result of template argument deduction so far. Note that a "success" result means that template argument deduction has not yet failed, but it may still fail, later, for other reasons.

Definition at line 1352 of file SemaTemplateDeduction.cpp.

References DeduceTemplateArgumentsByTypeMatch().

◆ DeduceTemplateArguments() [3/5]

◆ DeduceTemplateArguments() [4/5]

TemplateDeductionResult DeduceTemplateArguments ( Sema & S,
TemplateParameterList * TemplateParams,
const TemplateArgument & P,
TemplateArgument A,
TemplateDeductionInfo & Info,
bool PartialOrdering,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
bool * HasDeducedAnyParam )
static

◆ DeduceTemplateArguments() [5/5]

◆ DeduceTemplateArgumentsByTypeMatch()

TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch ( Sema & S,
TemplateParameterList * TemplateParams,
QualType P,
QualType A,
TemplateDeductionInfo & Info,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
unsigned TDF,
PartialOrderingKind POK,
bool DeducedFromArrayBound,
bool * HasDeducedAnyParam )
static

Deduce the template arguments by comparing the parameter type and the argument type (C++ [temp.deduct.type]).

Parameters
Sthe semantic analysis object within which we are deducing
TemplateParamsthe template parameters that we are deducing
Pthe parameter type
Athe argument type
Infoinformation about the template argument deduction itself
Deducedthe deduced template arguments
TDFbitwise OR of the TemplateDeductionFlags bits that describe how template argument deduction is performed.
PartialOrderingWhether we're performing template argument deduction in the context of partial ordering (C++0x [temp.deduct.partial]).
Returns
the result of template argument deduction so far. Note that a "success" result means that template argument deduction has not yet failed, but it may still fail, later, for other reasons.

Definition at line 1605 of file SemaTemplateDeduction.cpp.

References clang::Sema::adjustMemberFunctionCC(), clang::ASTContext::BoolTy, Call, clang::cast(), clang::Type::castAs(), checkDeducedTemplateArguments(), clang::Qualifiers::compatiblyIncludes(), clang::Sema::Context, clang::CT_Can, clang::CT_Cannot, clang::CT_Dependent, DeduceNonTypeTemplateArgument(), DeduceTemplateArguments(), DeduceTemplateArgumentsByTypeMatch(), DeduceTemplateBases(), DeduceTemplateSpecArguments(), degradeCallPartialOrderingKind(), clang::sema::TemplateDeductionInfo::FirstArg, clang::QualType::getAddressSpace(), clang::Type::getAs(), clang::ASTContext::getAsArrayType(), clang::Type::getAsCanonical(), clang::ASTContext::getAsConstantArrayType(), clang::Type::getAsCXXRecordDecl(), clang::ASTContext::getAsDependentSizedArrayType(), clang::ASTContext::getAsIncompleteArrayType(), clang::Sema::getASTContext(), clang::ASTContext::getCanonicalTagType(), clang::QualType::getCanonicalType(), clang::Type::getCanonicalTypeInternal(), clang::DependentSizedMatrixType::getColumnExpr(), clang::Qualifiers::getCVRQualifiers(), clang::QualType::getCVRQualifiers(), clang::sema::TemplateDeductionInfo::getDeducedDepth(), getDeducedNTTParameterFromExpr(), NonTypeOrVarTemplateParmDecl::getDepth(), clang::MatrixType::getElementType(), clang::Expr::getIntegerConstantExpr(), clang::Decl::getKind(), clang::Sema::getLangOpts(), clang::sema::TemplateDeductionInfo::getLocation(), clang::ConstantMatrixType::getNumColumns(), clang::ConstantMatrixType::getNumRows(), clang::TemplateParameterList::getParam(), clang::PointerType::getPointeeType(), clang::ReferenceType::getPointeeType(), clang::Type::getPointeeType(), clang::ASTContext::getQualifiedType(), clang::QualType::getQualifiers(), clang::DependentSizedMatrixType::getRowExpr(), clang::ASTContext::getSizeType(), clang::Type::getTypeClass(), clang::ASTContext::getTypeSize(), clang::ASTContext::getUnqualifiedArrayType(), clang::QualType::getUnqualifiedType(), clang::Qualifiers::hasAddressSpace(), hasInconsistentOrSupersetQualifiersOf(), clang::Qualifiers::hasNonTrivialObjCLifetime(), clang::Qualifiers::hasObjCGCAttr(), clang::Qualifiers::hasObjCLifetime(), clang::QualType::hasQualifiers(), clang::ASTContext::hasSameType(), clang::ASTContext::hasSameUnqualifiedType(), clang::IncompletePack, clang::Inconsistent, clang::ASTContext::IntTy, clang::Invalid, clang::isa(), clang::Type::isArrayType(), clang::Sema::isCompleteType(), clang::Type::isDependentType(), isForwardingReference(), clang::Type::isFunctionType(), clang::Decl::isInvalidDecl(), clang::Type::isLValueReferenceType(), clang::QualType::isNull(), clang::Type::isObjCLifetimeType(), clang::Type::isPlaceholderType(), IsPossiblyOpaquelyQualifiedType(), clang::Type::isRecordType(), clang::Sema::isSameOrCompatibleFunctionType(), clang::Qualifiers::isStrictSupersetOf(), clang::isTargetAddressSpace(), clang::Noexcept, clang::NonDeducedMismatch, None, clang::Qualifiers::OCL_ExplicitNone, clang::Qualifiers::OCL_Strong, clang::ASTContext::OverloadTy, clang::sema::TemplateDeductionInfo::Param, clang::Qualifiers::removeAddressSpace(), clang::ASTContext::removeAddrSpaceQualType(), clang::Qualifiers::removeCVRQualifiers(), clang::Qualifiers::removeObjCGCAttr(), clang::Qualifiers::removeObjCLifetime(), clang::sema::TemplateDeductionInfo::SecondArg, clang::Qualifiers::setCVRQualifiers(), clang::Qualifiers::setObjCLifetime(), clang::Success, clang::TDF_AllowCompatibleFunctionType, clang::TDF_ArgWithReferenceType, clang::TDF_DerivedClass, clang::TDF_IgnoreQualifiers, clang::TDF_ParamWithReferenceType, clang::TDF_SkipNonDependent, clang::TDF_TopLevelParameterTypeList, clang::toTargetAddressSpace(), clang::Underqualified, clang::ASTContext::UnsignedIntTy, and clang::Qualifiers::withoutObjCLifetime().

Referenced by DeduceNonTypeTemplateArgument(), clang::Sema::DeduceTemplateArguments(), clang::Sema::DeduceTemplateArguments(), DeduceTemplateArguments(), DeduceTemplateArguments(), DeduceTemplateArgumentsByTypeMatch(), DeduceTemplateArgumentsFromCallArgument(), isAtLeastAsSpecializedAs(), isAtLeastAsSpecializedAs(), and ResolveOverloadForDeduction().

◆ DeduceTemplateArgumentsFromCallArgument()

TemplateDeductionResult DeduceTemplateArgumentsFromCallArgument ( Sema & S,
TemplateParameterList * TemplateParams,
unsigned FirstInnerIndex,
QualType ParamType,
QualType ArgType,
Expr::Classification ArgClassification,
Expr * Arg,
TemplateDeductionInfo & Info,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
SmallVectorImpl< Sema::OriginalCallArg > & OriginalCallArgs,
bool DecomposedParam,
unsigned ArgIdx,
unsigned TDF,
TemplateSpecCandidateSet * FailedTSC = nullptr )
static

◆ DeduceTemplateBases()

TemplateDeductionResult DeduceTemplateBases ( Sema & S,
const CXXRecordDecl * RD,
TemplateParameterList * TemplateParams,
QualType P,
TemplateDeductionInfo & Info,
bool PartialOrdering,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
bool * HasDeducedAnyParam )
static

Attempt to deduce the template arguments by checking the base types according to (C++20 [temp.deduct.call] p4b3.

Parameters
Sthe semantic analysis object within which we are deducing.
RDthe top level record object we are deducing against.
TemplateParamsthe template parameters that we are deducing.
Pthe template specialization parameter type.
Infoinformation about the template argument deduction itself.
Deducedthe deduced template arguments.
Returns
the result of template argument deduction with the bases. "invalid" means no matches, "success" found a single item, and the "MiscellaneousDeductionFailure" result happens when the match is ambiguous.

Definition at line 1470 of file SemaTemplateDeduction.cpp.

References clang::CXXRecordDecl::bases(), DeduceTemplateSpecArguments(), clang::sema::TemplateDeductionInfo::ForBase, clang::Type::getAsCXXRecordDecl(), clang::Invalid, clang::Match, clang::MiscellaneousDeductionFailure, clang::PartialOrdering, clang::Success, and clang::T.

Referenced by DeduceTemplateArgumentsByTypeMatch().

◆ DeduceTemplateSpecArguments()

◆ degradeCallPartialOrderingKind()

PartialOrderingKind degradeCallPartialOrderingKind ( PartialOrderingKind POK)
static

When propagating a partial ordering kind into a NonCall context, this is used to downgrade a 'Call' into a 'NonCall', so that the kind still reflects whether we are in a partial ordering context.

Definition at line 1577 of file SemaTemplateDeduction.cpp.

References NonCall.

Referenced by DeduceTemplateArgumentsByTypeMatch().

◆ FinishTemplateArgumentDeduction() [1/4]

◆ FinishTemplateArgumentDeduction() [2/4]

◆ FinishTemplateArgumentDeduction() [3/4]

TemplateDeductionResult FinishTemplateArgumentDeduction ( Sema & S,
NamedDecl * Entity,
TemplateParameterList * EntityTPL,
TemplateDecl * Template,
bool PartialOrdering,
ArrayRef< TemplateArgumentLoc > Ps,
ArrayRef< TemplateArgument > As,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
TemplateDeductionInfo & Info,
bool CopyDeducedArgs )
static

◆ FinishTemplateArgumentDeduction() [4/4]

TemplateDeductionResult FinishTemplateArgumentDeduction ( Sema & S,
TemplateDecl * TD,
SmallVectorImpl< DeducedTemplateArgument > & Deduced,
TemplateDeductionInfo & Info )
static

Complete template argument deduction for DeduceTemplateArgumentsFromType.

FIXME: this is mostly duplicated with the above two versions. Deduplicate the three implementations.

Definition at line 3396 of file SemaTemplateDeduction.cpp.

References clang::Sema::CheckTemplateArgumentInfo::CanonicalConverted, ConvertDeducedTemplateArguments(), getAsDeclContextOrEnclosing(), clang::TemplateDecl::getTemplateParameters(), clang::Success, clang::Sema::CheckTemplateArgumentInfo::SugaredConverted, clang::Sema::Unevaluated, and clang::Unevaluated.

◆ getAsDeclContextOrEnclosing()

◆ getDeducedNTTParameterFromExpr() [1/2]

NonTypeOrVarTemplateParmDecl getDeducedNTTParameterFromExpr ( const Expr * E,
unsigned Depth )
static

If the given expression is of a form that permits the deduction of a non-type template parameter, return the declaration of that non-type template parameter.

Definition at line 241 of file SemaTemplateDeduction.cpp.

References unwrapExpressionForDeduction().

Referenced by DeduceFromInitializerList(), DeduceTemplateArguments(), DeduceTemplateArgumentsByTypeMatch(), getDeducedNTTParameterFromExpr(), and MarkUsedTemplateParameters().

◆ getDeducedNTTParameterFromExpr() [2/2]

const NonTypeOrVarTemplateParmDecl getDeducedNTTParameterFromExpr ( TemplateDeductionInfo & Info,
Expr * E )
static

◆ getFirstInnerIndex()

unsigned getFirstInnerIndex ( FunctionTemplateDecl * FTD)
static

Get the index of the first template parameter that was originally from the innermost template-parameter-list.

This is 0 except when we concatenate the template parameter lists of a class template and a constructor template when forming an implicit deduction guide.

Definition at line 1428 of file SemaTemplateDeduction.cpp.

References clang::FunctionTemplateDecl::getTemplatedDecl().

Referenced by clang::Sema::DeduceTemplateArguments(), and clang::Sema::DeduceTemplateArguments().

◆ GetImplicitObjectParameterType()

QualType GetImplicitObjectParameterType ( ASTContext & Context,
const CXXMethodDecl * Method,
QualType RawType,
bool IsOtherRvr )
static

◆ getLastTemplateSpecType()

const TemplateSpecializationType * getLastTemplateSpecType ( QualType QT)
static

Deduce the template arguments by comparing the template parameter type (which is a template-id) with the template argument type.

Parameters
Sthe Sema
TemplateParamsthe template parameters that we are deducing
Pthe parameter type
Athe argument type
Infoinformation about the template argument deduction itself
Deducedthe deduced template arguments
Returns
the result of template argument deduction so far. Note that a "success" result means that template argument deduction has not yet failed, but it may still fail, later, for other reasons.

Definition at line 674 of file SemaTemplateDeduction.cpp.

References clang::QualType::getTypePtr(), and clang::T.

Referenced by DeduceTemplateSpecArguments().

◆ getMoreSpecialized()

template<typename TemplateLikeDecl, typename PrimaryDel>
TemplateLikeDecl * getMoreSpecialized ( Sema & S,
QualType T1,
QualType T2,
TemplateLikeDecl * P1,
PrimaryDel * P2,
TemplateDeductionInfo & Info )
static

Returns the more specialized template specialization between T1/P1 and T2/P2.

  • If IsMoreSpecialThanPrimaryCheck is true, T1/P1 is the partial specialization and T2/P2 is the primary template.
  • otherwise, both T1/P1 and T2/P2 are the partial specialization.
Parameters
T1the type of the first template partial specialization
T2if IsMoreSpecialThanPrimaryCheck is true, the type of the second template partial specialization; otherwise, the type of the primary template.
P1the first template partial specialization
P2if IsMoreSpecialThanPrimaryCheck is true, the second template partial specialization; otherwise, the primary template.
Returns
- If IsMoreSpecialThanPrimaryCheck is true, returns P1 if P1 is more specialized, returns nullptr if P1 is not more specialized.
  • otherwise, returns the more specialized template partial specialization. If neither partial specialization is more specialized, returns NULL.

Definition at line 6385 of file SemaTemplateDeduction.cpp.

References clang::cast(), clang::Sema::Context, Equal, clang::Sema::getASTContext(), clang::ASTContext::getLangOpts(), getMoreSpecializedTrailingPackTieBreaker(), clang::Sema::IsAtLeastAsConstrained(), isAtLeastAsSpecializedAs(), Less, More, clang::TemplateParameterList::size(), clang::Sema::TemplateParameterListsAreEqual(), and clang::Sema::TPL_TemplateParamsEquivalent.

Referenced by clang::Sema::getMoreSpecializedPartialSpecialization(), clang::Sema::getMoreSpecializedPartialSpecialization(), clang::Sema::isMoreSpecializedThanPrimary(), and clang::Sema::isMoreSpecializedThanPrimary().

◆ getMoreSpecializedTrailingPackTieBreaker()

MoreSpecializedTrailingPackTieBreakerResult getMoreSpecializedTrailingPackTieBreaker ( const TemplateSpecializationType * TST1,
const TemplateSpecializationType * TST2 )
static

◆ getPackIndexForParam()

UnsignedOrNone getPackIndexForParam ( Sema & S,
FunctionTemplateDecl * FunctionTemplate,
const MultiLevelTemplateArgumentList & Args,
unsigned ParamIdx )
static

Find the pack index for a particular parameter index in an instantiation of a function template with specific arguments.

Returns
The pack index for whichever pack produced this parameter, or -1 if this was not produced by a parameter. Intended to be used as the ArgumentPackSubstitutionIndex for further substitutions.

Definition at line 3884 of file SemaTemplateDeduction.cpp.

References clang::FunctionTemplate, and clang::Sema::getNumArgumentsInExpansion().

Referenced by CheckDeductionConsistency(), and clang::Sema::FinishTemplateArgumentDeduction().

◆ GetTypeOfFunction()

◆ hasDeducibleTemplateParameters()

◆ hasInconsistentOrSupersetQualifiersOf()

bool hasInconsistentOrSupersetQualifiersOf ( QualType ParamType,
QualType ArgType )
static

Determine whether the parameter has qualifiers that the argument lacks.

Put another way, determine whether there is no way to add a deduced set of qualifiers to the ParamType that would result in its qualifiers matching those of the ArgType.

Definition at line 1381 of file SemaTemplateDeduction.cpp.

References clang::Qualifiers::getAddressSpace(), clang::Qualifiers::getCVRQualifiers(), clang::Qualifiers::getObjCGCAttr(), clang::Qualifiers::getObjCLifetime(), clang::QualType::getQualifiers(), clang::Qualifiers::hasAddressSpace(), clang::Qualifiers::hasObjCGCAttr(), and clang::Qualifiers::hasObjCLifetime().

Referenced by DeduceTemplateArgumentsByTypeMatch().

◆ hasPackExpansionBeforeEnd()

bool hasPackExpansionBeforeEnd ( ArrayRef< TemplateArgument > Args)
static

Determine whether the given set of template arguments has a pack expansion that is not the last template argument.

Definition at line 2740 of file SemaTemplateDeduction.cpp.

References hasPackExpansionBeforeEnd(), and clang::TemplateArgument::Pack.

Referenced by DeduceTemplateArguments(), hasPackExpansionBeforeEnd(), clang::Sema::MarkUsedTemplateParameters(), and MarkUsedTemplateParameters().

◆ hasTemplateArgumentForDeduction()

bool hasTemplateArgumentForDeduction ( ArrayRef< TemplateArgument > & Args,
unsigned & ArgIdx )
static

Determine whether there is a template argument to be used for deduction.

This routine "expands" argument packs in-place, overriding its input parameters so that Args[ArgIdx] will be the available template argument.

Returns
true if there is another template argument (which will be at Args[ArgIdx]), false otherwise.

Definition at line 2723 of file SemaTemplateDeduction.cpp.

References clang::TemplateArgument::getKind(), clang::TemplateArgument::Pack, and clang::TemplateArgument::pack_elements().

Referenced by DeduceTemplateArguments().

◆ instantiateExplicitSpecifierDeferred()

◆ isAtLeastAsSpecializedAs() [1/2]

template<typename TemplateLikeDecl>
bool isAtLeastAsSpecializedAs ( Sema & S,
QualType T1,
QualType T2,
TemplateLikeDecl * P2,
TemplateDecl * Template,
TemplateDeductionInfo & Info )
static

Determine whether one template specialization, P1, is at least as specialized than another, P2.

Template Parameters
TemplateLikeDeclThe kind of P2, which must be a TemplateDecl or {Class,Var}TemplatePartialSpecializationDecl.
Parameters
T1The injected-class-name of P1 (faked for a variable template).
T2The injected-class-name of P2 (faked for a variable template).
TemplateThe primary template of P2, in case it is a partial specialization, the same as P2 otherwise.

Definition at line 6230 of file SemaTemplateDeduction.cpp.

References Call, clang::cast(), DeduceTemplateArgumentsByTypeMatch(), clang::sema::TemplateDeductionInfo::getLocation(), clang::Sema::SFINAETrap::hasErrorOccurred(), clang::Sema::InstantiatingTemplate::isInvalid(), clang::Sema::runWithSufficientStackSpace(), clang::Success, clang::TDF_None, and clang::Template.

◆ isAtLeastAsSpecializedAs() [2/2]

◆ isForwardingReference()

bool isForwardingReference ( QualType Param,
unsigned FirstInnerIndex )
static

Determine whether a type denotes a forwarding reference.

Definition at line 1436 of file SemaTemplateDeduction.cpp.

Referenced by AdjustFunctionParmAndArgTypesForDeduction(), and DeduceTemplateArgumentsByTypeMatch().

◆ IsPossiblyOpaquelyQualifiedType()

bool IsPossiblyOpaquelyQualifiedType ( QualType T)
static

Determines whether the given type is an opaque type that might be more qualified when instantiated.

Definition at line 817 of file SemaTemplateDeduction.cpp.

References IsPossiblyOpaquelyQualifiedTypeInternal(), and clang::T.

Referenced by DeduceTemplateArgumentsByTypeMatch().

◆ IsPossiblyOpaquelyQualifiedTypeInternal()

bool IsPossiblyOpaquelyQualifiedTypeInternal ( const Type * T)
static

◆ isSameDeclaration()

bool isSameDeclaration ( Decl * X,
Decl * Y )
static

Determine whether two declaration pointers refer to the same declaration.

Definition at line 268 of file SemaTemplateDeduction.cpp.

References clang::Decl::getCanonicalDecl(), and X.

Referenced by checkDeducedTemplateArguments(), DeduceTemplateArguments(), and clang::Sema::FinishTemplateArgumentDeduction().

◆ isSimpleTemplateIdType()

bool isSimpleTemplateIdType ( QualType T)
static

Determine whether the given type T is a simple-template-id type.

Definition at line 3553 of file SemaTemplateDeduction.cpp.

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

Referenced by AdjustFunctionParmAndArgTypesForDeduction(), and CheckOriginalCallArgDeduction().

◆ makeTemplateParameter()

TemplateParameter makeTemplateParameter ( Decl * D)
static

Helper function to build a TemplateParameter when we don't know its type statically.

Definition at line 824 of file SemaTemplateDeduction.cpp.

References clang::cast().

Referenced by ConvertDeducedTemplateArguments(), FinishTemplateArgumentDeduction(), and clang::Sema::SubstituteExplicitTemplateArguments().

◆ MarkUsedTemplateParameters() [1/5]

◆ MarkUsedTemplateParameters() [2/5]

◆ MarkUsedTemplateParameters() [3/5]

void MarkUsedTemplateParameters ( ASTContext & Ctx,
NestedNameSpecifier NNS,
bool OnlyDeduced,
unsigned Depth,
llvm::SmallBitVector & Used )
static

Mark the template parameters that are used by the given nested name specifier.

Definition at line 6789 of file SemaTemplateDeduction.cpp.

References clang::NestedNameSpecifier::getAsType(), clang::NestedNameSpecifier::getKind(), MarkUsedTemplateParameters(), clang::NestedNameSpecifier::Type, and Used.

◆ MarkUsedTemplateParameters() [4/5]

◆ MarkUsedTemplateParameters() [5/5]

void MarkUsedTemplateParameters ( ASTContext & Ctx,
TemplateName Name,
bool OnlyDeduced,
unsigned Depth,
llvm::SmallBitVector & Used )
static

◆ ResolveOverloadForDeduction()

◆ unwrapExpressionForDeduction()

const Expr * unwrapExpressionForDeduction ( const Expr * E)
static