clang  6.0.0svn
Classes | Namespaces | Macros | Enumerations | Functions
SemaTemplateDeduction.cpp File Reference
#include "clang/Sema/TemplateDeduction.h"
#include "TreeTransform.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTLambda.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/StmtVisitor.h"
#include "clang/AST/TypeOrdering.h"
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/Sema.h"
#include "clang/Sema/Template.h"
#include "llvm/ADT/SmallBitVector.h"
#include <algorithm>
#include "clang/AST/TypeNodes.def"
Include dependency graph for SemaTemplateDeduction.cpp:

Go to the source code of this file.

Classes

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

Namespaces

 clang
 Dataflow Directional Tag Classes.
 

Macros

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

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
}
 Various flags that control template argument deduction. More...
 

Functions

static bool hasSameExtendedValue (llvm::APSInt X, llvm::APSInt Y)
 Compare two APSInts, extending and switching the sign as necessary to compare their values regardless of underlying type. More...
 
static Sema::TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, const TemplateArgument &Param, TemplateArgument Arg, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 
static Sema::TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch (Sema &S, TemplateParameterList *TemplateParams, QualType ParamIn, QualType ArgIn, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned TDF, bool PartialOrdering, bool DeducedFromArrayBound)
 Deduce the template arguments by comparing the parameter type and the argument type (C++ [temp.deduct.type]). More...
 
static Sema::TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Params, ArrayRef< TemplateArgument > Args, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch)
 
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. More...
 
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. More...
 
static NonTypeTemplateParmDeclgetDeducedParameterFromExpr (TemplateDeductionInfo &Info, Expr *E)
 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. More...
 
static bool isSameDeclaration (Decl *X, Decl *Y)
 Determine whether two declaration pointers refer to the same declaration. More...
 
static DeducedTemplateArgument checkDeducedTemplateArguments (ASTContext &Context, const DeducedTemplateArgument &X, const DeducedTemplateArgument &Y)
 Verify that the given, deduced template arguments are compatible. More...
 
static Sema::TemplateDeductionResult DeduceNonTypeTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeTemplateParmDecl *NTTP, const DeducedTemplateArgument &NewDeduced, QualType ValueType, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 Deduce the value of the given non-type template parameter as the given deduced template argument. More...
 
static Sema::TemplateDeductionResult DeduceNonTypeTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeTemplateParmDecl *NTTP, const llvm::APSInt &Value, QualType ValueType, bool DeducedFromArrayBound, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 Deduce the value of the given non-type template parameter from the given integral constant. More...
 
static Sema::TemplateDeductionResult DeduceNullPtrTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeTemplateParmDecl *NTTP, QualType NullPtrType, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 Deduce the value of the given non-type template parameter from the given null pointer template argument type. More...
 
static Sema::TemplateDeductionResult DeduceNonTypeTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeTemplateParmDecl *NTTP, Expr *Value, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 Deduce the value of the given non-type template parameter from the given type- or value-dependent expression. More...
 
static Sema::TemplateDeductionResult DeduceNonTypeTemplateArgument (Sema &S, TemplateParameterList *TemplateParams, NonTypeTemplateParmDecl *NTTP, ValueDecl *D, QualType T, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 Deduce the value of the given non-type template parameter from the given declaration. More...
 
static Sema::TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, TemplateName Param, TemplateName Arg, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 
static Sema::TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, const TemplateSpecializationType *Param, QualType Arg, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 Deduce the template arguments by comparing the template parameter type (which is a template-id) with the template argument type. More...
 
static bool IsPossiblyOpaquelyQualifiedType (QualType T)
 Determines whether the given type is an opaque type that might be more qualified when instantiated. More...
 
static std::pair< unsigned, unsigned > getDepthAndIndex (NamedDecl *ND)
 Retrieve the depth and index of a template parameter. More...
 
static std::pair< unsigned, unsigned > getDepthAndIndex (UnexpandedParameterPack UPP)
 Retrieve the depth and index of an unexpanded parameter pack. More...
 
static TemplateParameter makeTemplateParameter (Decl *D)
 Helper function to build a TemplateParameter when we don't know its type statically. More...
 
static Sema::TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, const QualType *Params, unsigned NumParams, const QualType *Args, unsigned NumArgs, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned TDF, bool PartialOrdering=false)
 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). More...
 
static bool hasInconsistentOrSupersetQualifiersOf (QualType ParamType, QualType ArgType)
 Determine whether the parameter has qualifiers that are either inconsistent with or a superset of the argument's qualifiers. More...
 
static unsigned getFirstInnerIndex (FunctionTemplateDecl *FTD)
 Get the index of the first template parameter that was originally from the innermost template-parameter-list. More...
 
static bool isForwardingReference (QualType Param, unsigned FirstInnerIndex)
 Determine whether a type denotes a forwarding reference. More...
 
static bool hasTemplateArgumentForDeduction (ArrayRef< TemplateArgument > &Args, unsigned &ArgIdx)
 Determine whether there is a template argument to be used for deduction. More...
 
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. More...
 
static Sema::TemplateDeductionResult DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams, const TemplateArgumentList &ParamList, const TemplateArgumentList &ArgList, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced)
 
static bool isSameTemplateArg (ASTContext &Context, TemplateArgument X, const TemplateArgument &Y, bool PackExpansionMatchesPack=false)
 Determine whether two template arguments are the same. More...
 
static bool ConvertDeducedTemplateArgument (Sema &S, NamedDecl *Param, DeducedTemplateArgument Arg, NamedDecl *Template, TemplateDeductionInfo &Info, bool IsDeduced, SmallVectorImpl< TemplateArgument > &Output)
 Convert the given deduced template argument and add it to the set of fully-converted template arguments. More...
 
template<typename TemplateDeclT >
static Sema::TemplateDeductionResult ConvertDeducedTemplateArguments (Sema &S, TemplateDeclT *Template, bool IsDeduced, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info, SmallVectorImpl< TemplateArgument > &Builder, LocalInstantiationScope *CurrentInstantiationScope=nullptr, unsigned NumAlreadyConverted=0, bool PartialOverloading=false)
 
static DeclContextgetAsDeclContextOrEnclosing (Decl *D)
 
template<typename T >
static std::enable_if< IsPartialSpecialization< T >::value, Sema::TemplateDeductionResult >::type FinishTemplateArgumentDeduction (Sema &S, T *Partial, bool IsPartialOrdering, const TemplateArgumentList &TemplateArgs, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info)
 Complete template argument deduction for a partial specialization. More...
 
static Sema::TemplateDeductionResult FinishTemplateArgumentDeduction (Sema &S, TemplateDecl *Template, bool PartialOrdering, const TemplateArgumentList &TemplateArgs, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info)
 Complete template argument deduction for a class or variable template, when partial ordering against a partial specialization. More...
 
static bool isSimpleTemplateIdType (QualType T)
 Determine whether the given type T is a simple-template-id type. More...
 
static Sema::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. More...
 
static unsigned 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. More...
 
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. More...
 
static QualType ResolveOverloadForDeduction (Sema &S, TemplateParameterList *TemplateParams, Expr *Arg, QualType ParamType, bool ParamWasReference)
 Apply the deduction rules for overload sets. More...
 
static bool AdjustFunctionParmAndArgTypesForDeduction (Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex, QualType &ParamType, QualType &ArgType, Expr *Arg, unsigned &TDF)
 Perform the adjustments to the parameter and argument types described in C++ [temp.deduct.call]. More...
 
static bool hasDeducibleTemplateParameters (Sema &S, FunctionTemplateDecl *FunctionTemplate, QualType T)
 
static Sema::TemplateDeductionResult DeduceTemplateArgumentsFromCallArgument (Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex, QualType ParamType, Expr *Arg, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, SmallVectorImpl< Sema::OriginalCallArg > &OriginalCallArgs, bool DecomposedParam, unsigned ArgIdx, unsigned TDF)
 Perform template argument deduction per [temp.deduct.call] for a single parameter / argument pair. More...
 
static Sema::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. More...
 
static void SubstAutoWithinFunctionReturnType (FunctionDecl *F, QualType TypeToReplaceAutoWith, Sema &S)
 Given a function declaration (e.g. More...
 
static Sema::TemplateDeductionResult SpecializeCorrespondingLambdaCallOperatorAndInvoker (CXXConversionDecl *ConversionSpecialized, SmallVectorImpl< DeducedTemplateArgument > &DeducedArguments, QualType ReturnTypeOfDestFunctionPtr, TemplateDeductionInfo &TDInfo, Sema &S)
 Given a specialized conversion operator of a generic lambda create the corresponding specializations of the call operator and the static-invoker. More...
 
static bool diagnoseAutoDeductionFailure (Sema &S, Sema::TemplateDeductionResult TDK, TemplateDeductionInfo &Info, ArrayRef< SourceRange > Ranges)
 Attempt to produce an informative diagostic explaining why auto deduction failed. More...
 
static void AddImplicitObjectParameterType (ASTContext &Context, CXXMethodDecl *Method, SmallVectorImpl< QualType > &ArgTypes)
 If this is a non-static member function,. More...
 
static bool isAtLeastAsSpecializedAs (Sema &S, SourceLocation Loc, FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1)
 Determine whether the function template FT1 is at least as specialized as FT2. More...
 
static bool isVariadicFunctionTemplate (FunctionTemplateDecl *FunTmpl)
 Determine whether this a function template whose parameter-type-list ends with a function parameter pack. More...
 
static bool isSameTemplate (TemplateDecl *T1, TemplateDecl *T2)
 Determine if the two templates are equivalent. More...
 
template<typename TemplateLikeDecl >
static bool isAtLeastAsSpecializedAs (Sema &S, QualType T1, QualType T2, TemplateLikeDecl *P2, TemplateDeductionInfo &Info)
 Determine whether one partial specialization, P1, is at least as specialized than another, P2. More...
 
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. More...
 
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. More...
 
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. More...
 

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 
)    case Type::Class: llvm_unreachable("deducing non-canonical type: " #Class);

◆ NON_CANONICAL_TYPE [2/2]

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

◆ TYPE [1/2]

#define TYPE (   Class,
  Base 
)

◆ TYPE [2/2]

#define TYPE (   Class,
  Base 
)

Function Documentation

◆ AddImplicitObjectParameterType()

static void AddImplicitObjectParameterType ( ASTContext Context,
CXXMethodDecl Method,
SmallVectorImpl< QualType > &  ArgTypes 
)
static

If this is a non-static member function,.

Definition at line 4552 of file SemaTemplateDeduction.cpp.

Referenced by isAtLeastAsSpecializedAs().

◆ AdjustFunctionParmAndArgTypesForDeduction()

static bool AdjustFunctionParmAndArgTypesForDeduction ( Sema S,
TemplateParameterList TemplateParams,
unsigned  FirstInnerIndex,
QualType ParamType,
QualType ArgType,
Expr Arg,
unsigned &  TDF 
)
static

◆ checkDeducedTemplateArguments()

static DeducedTemplateArgument checkDeducedTemplateArguments ( ASTContext Context,
const DeducedTemplateArgument X,
const DeducedTemplateArgument Y 
)
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 169 of file SemaTemplateDeduction.cpp.

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

◆ CheckOriginalCallArgDeduction()

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

Check whether the deduced argument type for a call to a function template matches the actual argument type per C++ [temp.deduct.call]p4.

Definition at line 2975 of file SemaTemplateDeduction.cpp.

◆ ConvertDeducedTemplateArgument()

static bool ConvertDeducedTemplateArgument ( Sema S,
NamedDecl Param,
DeducedTemplateArgument  Arg,
NamedDecl Template,
TemplateDeductionInfo &  Info,
bool  IsDeduced,
SmallVectorImpl< TemplateArgument > &  Output 
)
static

◆ ConvertDeducedTemplateArguments()

template<typename TemplateDeclT >
static Sema::TemplateDeductionResult ConvertDeducedTemplateArguments ( Sema S,
TemplateDeclT *  Template,
bool  IsDeduced,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced,
TemplateDeductionInfo &  Info,
SmallVectorImpl< TemplateArgument > &  Builder,
LocalInstantiationScope CurrentInstantiationScope = nullptr,
unsigned  NumAlreadyConverted = 0,
bool  PartialOverloading = false 
)
static

Definition at line 2400 of file SemaTemplateDeduction.cpp.

◆ DeduceFromInitializerList()

static Sema::TemplateDeductionResult DeduceFromInitializerList ( Sema S,
TemplateParameterList TemplateParams,
QualType  AdjustedParamType,
InitListExpr ILE,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced,
SmallVectorImpl< Sema::OriginalCallArg > &  OriginalCallArgs,
unsigned  ArgIdx,
unsigned  TDF 
)
static

Attempt template argument deduction from an initializer list deemed to be an argument in a function call.

Definition at line 3497 of file SemaTemplateDeduction.cpp.

References clang::Sema::Context, clang::ASTContext::getAsArrayType(), clang::InitListExpr::getNumInits(), clang::Type::isDependentType(), clang::Sema::isStdInitializerList(), and clang::Sema::TDK_Success.

Referenced by DeduceTemplateArgumentsFromCallArgument().

◆ DeduceNonTypeTemplateArgument() [1/4]

static Sema::TemplateDeductionResult DeduceNonTypeTemplateArgument ( Sema S,
TemplateParameterList TemplateParams,
NonTypeTemplateParmDecl NTTP,
const DeducedTemplateArgument NewDeduced,
QualType  ValueType,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced 
)
static

◆ DeduceNonTypeTemplateArgument() [2/4]

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

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

Definition at line 375 of file SemaTemplateDeduction.cpp.

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

◆ DeduceNonTypeTemplateArgument() [3/4]

static Sema::TemplateDeductionResult DeduceNonTypeTemplateArgument ( Sema S,
TemplateParameterList TemplateParams,
NonTypeTemplateParmDecl NTTP,
Expr Value,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced 
)
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 408 of file SemaTemplateDeduction.cpp.

References DeduceNonTypeTemplateArgument(), and clang::Expr::getType().

◆ DeduceNonTypeTemplateArgument() [4/4]

static Sema::TemplateDeductionResult DeduceNonTypeTemplateArgument ( Sema S,
TemplateParameterList TemplateParams,
NonTypeTemplateParmDecl NTTP,
ValueDecl D,
QualType  T,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced 
)
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 421 of file SemaTemplateDeduction.cpp.

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

◆ DeduceNullPtrTemplateArgument()

static Sema::TemplateDeductionResult DeduceNullPtrTemplateArgument ( Sema S,
TemplateParameterList TemplateParams,
NonTypeTemplateParmDecl NTTP,
QualType  NullPtrType,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced 
)
static

Deduce the value of the given non-type template parameter from the given null pointer template argument type.

Definition at line 389 of file SemaTemplateDeduction.cpp.

References clang::Sema::Context, DeduceNonTypeTemplateArgument(), clang::ActionResult< PtrTy, CompressInvalid >::get(), clang::Decl::getLocation(), clang::Expr::getType(), clang::Sema::ImpCastExprToType(), and clang::ASTContext::NullPtrTy.

Referenced by DeduceTemplateArguments().

◆ DeduceTemplateArguments() [1/6]

static Sema::TemplateDeductionResult DeduceTemplateArguments ( Sema S,
TemplateParameterList TemplateParams,
const TemplateArgument Param,
TemplateArgument  Arg,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced 
)
static

◆ DeduceTemplateArguments() [2/6]

static Sema::TemplateDeductionResult DeduceTemplateArguments ( Sema S,
TemplateParameterList TemplateParams,
ArrayRef< TemplateArgument Params,
ArrayRef< TemplateArgument Args,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced,
bool  NumberOfArgumentsMustMatch 
)
static

◆ DeduceTemplateArguments() [3/6]

static Sema::TemplateDeductionResult DeduceTemplateArguments ( Sema S,
TemplateParameterList TemplateParams,
TemplateName  Param,
TemplateName  Arg,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced 
)
static

◆ DeduceTemplateArguments() [4/6]

static Sema::TemplateDeductionResult DeduceTemplateArguments ( Sema S,
TemplateParameterList TemplateParams,
const TemplateSpecializationType Param,
QualType  Arg,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced 
)
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
Paramthe parameter type
Argthe 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 496 of file SemaTemplateDeduction.cpp.

References clang::TemplateArgumentList::asArray(), DeduceTemplateArguments(), clang::ClassTemplateSpecializationDecl::getSpecializedTemplate(), clang::ClassTemplateSpecializationDecl::getTemplateArgs(), clang::TemplateSpecializationType::getTemplateName(), clang::QualType::isCanonical(), clang::Sema::TDK_NonDeducedMismatch, and clang::TemplateSpecializationType::template_arguments().

◆ DeduceTemplateArguments() [5/6]

static Sema::TemplateDeductionResult DeduceTemplateArguments ( Sema S,
TemplateParameterList TemplateParams,
const QualType Params,
unsigned  NumParams,
const QualType Args,
unsigned  NumArgs,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced,
unsigned  TDF,
bool  PartialOrdering = false 
)
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
NumParamsThe number of types in Params
ArgsThe list of argument types
NumArgsThe number of types in Args
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]).
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 885 of file SemaTemplateDeduction.cpp.

References DeduceTemplateArgumentsByTypeMatch(), clang::PackExpansionType::getPattern(), clang::Sema::TDK_MiscellaneousDeductionFailure, and clang::Sema::TDK_Success.

◆ DeduceTemplateArguments() [6/6]

static Sema::TemplateDeductionResult DeduceTemplateArguments ( Sema S,
TemplateParameterList TemplateParams,
const TemplateArgumentList ParamList,
const TemplateArgumentList ArgList,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced 
)
static

◆ DeduceTemplateArgumentsByTypeMatch()

static Sema::TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch ( Sema S,
TemplateParameterList TemplateParams,
QualType  ParamIn,
QualType  ArgIn,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced,
unsigned  TDF,
bool  PartialOrdering,
bool  DeducedFromArrayBound 
)
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
ParamInthe parameter type
ArgInthe 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 1084 of file SemaTemplateDeduction.cpp.

References clang::ASTContext::BoolTy, clang::FunctionProtoType::canThrow(), checkDeducedTemplateArguments(), clang::Sema::Context, clang::CT_Can, clang::CT_Cannot, clang::CT_Dependent, DeduceNonTypeTemplateArgument(), DeduceTemplateArguments(), clang::Type::getAs(), clang::ASTContext::getAsArrayType(), clang::ASTContext::getAsConstantArrayType(), clang::ASTContext::getAsDependentSizedArrayType(), clang::ASTContext::getAsIncompleteArrayType(), clang::ASTContext::getCanonicalType(), clang::Qualifiers::getCVRQualifiers(), clang::QualType::getCVRQualifiers(), getDeducedParameterFromExpr(), clang::TemplateParmPosition::getDepth(), clang::ArrayType::getElementType(), clang::Sema::getLangOpts(), clang::FunctionProtoType::getNoexceptExpr(), clang::FunctionProtoType::getNumParams(), clang::Qualifiers::getObjCLifetime(), clang::TemplateParameterList::getParam(), clang::Type::getPointeeType(), clang::ReferenceType::getPointeeType(), clang::ASTContext::getQualifiedType(), clang::QualType::getQualifiers(), clang::FunctionProtoType::getRefQualifier(), clang::FunctionType::getReturnType(), clang::ConstantArrayType::getSize(), clang::DependentSizedArrayType::getSizeExpr(), clang::ASTContext::getSizeType(), clang::Type::getTypeClass(), clang::FunctionProtoType::getTypeQuals(), clang::ASTContext::getUnqualifiedArrayType(), clang::CanQual< T >::getUnqualifiedType(), clang::QualType::getUnqualifiedType(), clang::Qualifiers::hasAddressSpace(), hasInconsistentOrSupersetQualifiersOf(), clang::Qualifiers::hasNonTrivialObjCLifetime(), clang::Qualifiers::hasObjCGCAttr(), clang::Qualifiers::hasObjCLifetime(), clang::ASTContext::hasSameUnqualifiedType(), clang::Sema::isCompleteType(), clang::Type::isDependentType(), isForwardingReference(), clang::Type::isFunctionType(), clang::Type::isLValueReferenceType(), clang::TemplateArgument::isNull(), clang::Type::isObjCLifetimeType(), clang::Type::isPlaceholderType(), IsPossiblyOpaquelyQualifiedType(), clang::Sema::isSameOrCompatibleFunctionType(), clang::Qualifiers::isStrictSupersetOf(), clang::FunctionProtoType::isVariadic(), clang::Qualifiers::OCL_ExplicitNone, clang::Qualifiers::OCL_Strong, clang::ASTContext::OverloadTy, clang::FunctionProtoType::param_type_begin(), clang::Qualifiers::removeAddressSpace(), clang::Qualifiers::removeCVRQualifiers(), clang::Qualifiers::removeObjCGCAttr(), clang::Qualifiers::removeObjCLifetime(), clang::Qualifiers::setCVRQualifiers(), clang::Qualifiers::setObjCLifetime(), clang::TDF_AllowCompatibleFunctionType, clang::TDF_DerivedClass, clang::TDF_IgnoreQualifiers, clang::TDF_ParamWithReferenceType, clang::TDF_SkipNonDependent, clang::TDF_TopLevelParameterTypeList, clang::Sema::TDK_Inconsistent, clang::Sema::TDK_MiscellaneousDeductionFailure, clang::Sema::TDK_NonDeducedMismatch, clang::Sema::TDK_Success, clang::Sema::TDK_Underqualified, and clang::Qualifiers::withoutObjCLifetime().

Referenced by DeduceNonTypeTemplateArgument(), DeduceTemplateArguments(), DeduceTemplateArgumentsFromCallArgument(), and isAtLeastAsSpecializedAs().

◆ DeduceTemplateArgumentsFromCallArgument()

static Sema::TemplateDeductionResult DeduceTemplateArgumentsFromCallArgument ( Sema S,
TemplateParameterList TemplateParams,
unsigned  FirstInnerIndex,
QualType  ParamType,
Expr Arg,
TemplateDeductionInfo &  Info,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced,
SmallVectorImpl< Sema::OriginalCallArg > &  OriginalCallArgs,
bool  DecomposedParam,
unsigned  ArgIdx,
unsigned  TDF 
)
static

Perform template argument deduction per [temp.deduct.call] for a single parameter / argument pair.

Definition at line 3558 of file SemaTemplateDeduction.cpp.

References AdjustFunctionParmAndArgTypesForDeduction(), DeduceFromInitializerList(), DeduceTemplateArgumentsByTypeMatch(), clang::Expr::getType(), and clang::Sema::TDK_Success.

Referenced by AdjustFunctionParmAndArgTypesForDeduction().

◆ diagnoseAutoDeductionFailure()

static bool diagnoseAutoDeductionFailure ( Sema S,
Sema::TemplateDeductionResult  TDK,
TemplateDeductionInfo &  Info,
ArrayRef< SourceRange Ranges 
)
static

Attempt to produce an informative diagostic explaining why auto deduction failed.

Returns
true if diagnosed, false if not.

Definition at line 4306 of file SemaTemplateDeduction.cpp.

References clang::Sema::Diag(), and clang::Sema::TDK_Inconsistent.

◆ FinishTemplateArgumentDeduction() [1/2]

template<typename T >
static std::enable_if<IsPartialSpecialization<T>::value, Sema::TemplateDeductionResult>::type FinishTemplateArgumentDeduction ( Sema S,
T *  Partial,
bool  IsPartialOrdering,
const TemplateArgumentList TemplateArgs,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced,
TemplateDeductionInfo &  Info 
)
static

Complete template argument deduction for a partial specialization.

Definition at line 2542 of file SemaTemplateDeduction.cpp.

References getAsDeclContextOrEnclosing(), and clang::Sema::Unevaluated.

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

◆ FinishTemplateArgumentDeduction() [2/2]

static Sema::TemplateDeductionResult FinishTemplateArgumentDeduction ( Sema S,
TemplateDecl Template,
bool  PartialOrdering,
const TemplateArgumentList TemplateArgs,
SmallVectorImpl< DeducedTemplateArgument > &  Deduced,
TemplateDeductionInfo &  Info 
)
static

Complete template argument deduction for a class or variable template, when partial ordering against a partial specialization.

Definition at line 2621 of file SemaTemplateDeduction.cpp.

References getAsDeclContextOrEnclosing(), and clang::Sema::Unevaluated.

◆ getAsDeclContextOrEnclosing()

static DeclContext* getAsDeclContextOrEnclosing ( Decl D)
static

◆ getDeducedParameterFromExpr()

static NonTypeTemplateParmDecl* getDeducedParameterFromExpr ( TemplateDeductionInfo &  Info,
Expr E 
)
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 132 of file SemaTemplateDeduction.cpp.

Referenced by DeduceTemplateArguments(), and DeduceTemplateArgumentsByTypeMatch().

◆ getDepthAndIndex() [1/2]

static std::pair<unsigned, unsigned> getDepthAndIndex ( NamedDecl ND)
static

Retrieve the depth and index of a template parameter.

Definition at line 584 of file SemaTemplateDeduction.cpp.

Referenced by getDepthAndIndex().

◆ getDepthAndIndex() [2/2]

static std::pair<unsigned, unsigned> getDepthAndIndex ( UnexpandedParameterPack  UPP)
static

Retrieve the depth and index of an unexpanded parameter pack.

Definition at line 597 of file SemaTemplateDeduction.cpp.

References getDepthAndIndex().

◆ getFirstInnerIndex()

static 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 1037 of file SemaTemplateDeduction.cpp.

References clang::CXXDeductionGuideDecl::getDeducedTemplate(), clang::FunctionTemplateDecl::getTemplatedDecl(), clang::TemplateDecl::getTemplateParameters(), and clang::TemplateParameterList::size().

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

◆ getPackIndexForParam()

static unsigned 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 3096 of file SemaTemplateDeduction.cpp.

References clang::Sema::getNumArgumentsInExpansion(), clang::FunctionTemplateDecl::getTemplatedDecl(), and clang::FunctionDecl::parameters().

◆ GetTypeOfFunction()

static QualType GetTypeOfFunction ( Sema S,
const OverloadExpr::FindResult R,
FunctionDecl Fn 
)
static

◆ hasDeducibleTemplateParameters()

bool hasDeducibleTemplateParameters ( Sema S,
FunctionTemplateDecl FunctionTemplate,
QualType  T 
)
static

◆ hasInconsistentOrSupersetQualifiersOf()

static bool hasInconsistentOrSupersetQualifiersOf ( QualType  ParamType,
QualType  ArgType 
)
static

◆ hasPackExpansionBeforeEnd()

static 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 2056 of file SemaTemplateDeduction.cpp.

References clang::TemplateArgument::Pack.

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

◆ hasSameExtendedValue()

static bool hasSameExtendedValue ( llvm::APSInt  X,
llvm::APSInt  Y 
)
static

Compare two APSInts, extending and switching the sign as necessary to compare their values regardless of underlying type.

Definition at line 72 of file SemaTemplateDeduction.cpp.

References DeduceTemplateArguments().

Referenced by DeduceTemplateArguments().

◆ hasTemplateArgumentForDeduction()

static 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 2039 of file SemaTemplateDeduction.cpp.

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

Referenced by DeduceTemplateArguments().

◆ isAtLeastAsSpecializedAs() [1/2]

static bool isAtLeastAsSpecializedAs ( Sema S,
SourceLocation  Loc,
FunctionTemplateDecl FT1,
FunctionTemplateDecl FT2,
TemplatePartialOrderingContext  TPOC,
unsigned  NumCallArguments1 
)
static

◆ isAtLeastAsSpecializedAs() [2/2]

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

Determine whether one partial 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).

Definition at line 4910 of file SemaTemplateDeduction.cpp.

References DeduceTemplateArgumentsByTypeMatch(), FinishTemplateArgumentDeduction(), clang::TemplateArgumentList::OnStack, and clang::TDF_None.

◆ isForwardingReference()

static bool isForwardingReference ( QualType  Param,
unsigned  FirstInnerIndex 
)
static

Determine whether a type denotes a forwarding reference.

Definition at line 1045 of file SemaTemplateDeduction.cpp.

References clang::Type::getAs(), and clang::TemplateTypeParmType::getIndex().

Referenced by AdjustFunctionParmAndArgTypesForDeduction(), and DeduceTemplateArgumentsByTypeMatch().

◆ IsPossiblyOpaquelyQualifiedType()

static bool IsPossiblyOpaquelyQualifiedType ( QualType  T)
static

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

Definition at line 560 of file SemaTemplateDeduction.cpp.

References clang::Type::getTypeClass().

Referenced by DeduceTemplateArgumentsByTypeMatch().

◆ isSameDeclaration()

static bool isSameDeclaration ( Decl X,
Decl Y 
)
static

Determine whether two declaration pointers refer to the same declaration.

Definition at line 155 of file SemaTemplateDeduction.cpp.

References clang::Decl::getCanonicalDecl().

Referenced by DeduceTemplateArguments().

◆ isSameTemplate()

static bool isSameTemplate ( TemplateDecl T1,
TemplateDecl T2 
)
static

Determine if the two templates are equivalent.

Definition at line 4792 of file SemaTemplateDeduction.cpp.

References clang::Decl::getCanonicalDecl().

◆ isSameTemplateArg()

static bool isSameTemplateArg ( ASTContext Context,
TemplateArgument  X,
const TemplateArgument Y,
bool  PackExpansionMatchesPack = false 
)
static

Determine whether two template arguments are the same.

Definition at line 2170 of file SemaTemplateDeduction.cpp.

◆ isSimpleTemplateIdType()

static bool isSimpleTemplateIdType ( QualType  T)
static

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

Definition at line 2746 of file SemaTemplateDeduction.cpp.

References clang::Type::getAs().

Referenced by AdjustFunctionParmAndArgTypesForDeduction().

◆ isVariadicFunctionTemplate()

static bool isVariadicFunctionTemplate ( FunctionTemplateDecl FunTmpl)
static

Determine whether this a function template whose parameter-type-list ends with a function parameter pack.

Definition at line 4725 of file SemaTemplateDeduction.cpp.

References clang::FunctionDecl::getNumParams(), clang::FunctionDecl::getParamDecl(), clang::FunctionTemplateDecl::getTemplatedDecl(), clang::ParmVarDecl::isParameterPack(), and clang::Last.

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

◆ makeTemplateParameter()

static TemplateParameter makeTemplateParameter ( Decl D)
static

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

Definition at line 607 of file SemaTemplateDeduction.cpp.

◆ MarkUsedTemplateParameters() [1/5]

static void MarkUsedTemplateParameters ( ASTContext Ctx,
const TemplateArgument TemplateArg,
bool  OnlyDeduced,
unsigned  Depth,
llvm::SmallBitVector &  Used 
)
static

◆ MarkUsedTemplateParameters() [2/5]

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

◆ MarkUsedTemplateParameters() [3/5]

static void MarkUsedTemplateParameters ( ASTContext Ctx,
const Expr E,
bool  OnlyDeduced,
unsigned  Depth,
llvm::SmallBitVector &  Used 
)
static

Mark the template parameters that are used by the given expression.

Definition at line 5119 of file SemaTemplateDeduction.cpp.

◆ MarkUsedTemplateParameters() [4/5]

static 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 5163 of file SemaTemplateDeduction.cpp.

References Depth, clang::NestedNameSpecifier::getAsType(), clang::NestedNameSpecifier::getPrefix(), MarkUsedTemplateParameters(), and Used.

◆ MarkUsedTemplateParameters() [5/5]

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

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

Definition at line 5180 of file SemaTemplateDeduction.cpp.

◆ ResolveOverloadForDeduction()

static QualType ResolveOverloadForDeduction ( Sema S,
TemplateParameterList TemplateParams,
Expr Arg,
QualType  ParamType,
bool  ParamWasReference 
)
static

◆ SpecializeCorrespondingLambdaCallOperatorAndInvoker()

static Sema::TemplateDeductionResult SpecializeCorrespondingLambdaCallOperatorAndInvoker ( CXXConversionDecl ConversionSpecialized,
SmallVectorImpl< DeducedTemplateArgument > &  DeducedArguments,
QualType  ReturnTypeOfDestFunctionPtr,
TemplateDeductionInfo &  TDInfo,
Sema S 
)
inlinestatic

◆ SubstAutoWithinFunctionReturnType()

static void SubstAutoWithinFunctionReturnType ( FunctionDecl F,
QualType  TypeToReplaceAutoWith,
Sema S 
)
inlinestatic

Given a function declaration (e.g.

a generic lambda conversion function) that contains an 'auto' in its result type, substitute it with TypeToReplaceAutoWith. Be careful to pass in the type you want to replace 'auto' with and not the actual result type you want to set the function to.

Definition at line 3948 of file SemaTemplateDeduction.cpp.

References clang::ASTContext::adjustDeducedFunctionResultType(), clang::Sema::Context, clang::Type::getContainedAutoType(), clang::FunctionDecl::getReturnType(), and clang::Sema::SubstAutoType().

Referenced by SpecializeCorrespondingLambdaCallOperatorAndInvoker().