clang
6.0.0
|
#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"
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 NonTypeTemplateParmDecl * | getDeducedParameterFromExpr (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 DeclContext * | getAsDeclContextOrEnclosing (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 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... | |
#define ABSTRACT_TYPE | ( | Class, | |
Base | |||
) |
#define DEPENDENT_TYPE | ( | Class, | |
Base | |||
) |
#define NON_CANONICAL_TYPE | ( | Class, | |
Base | |||
) | case Type::Class: llvm_unreachable("deducing non-canonical type: " #Class); |
#define NON_CANONICAL_TYPE | ( | Class, | |
Base | |||
) | case Type::Class: |
#define TYPE | ( | Class, | |
Base | |||
) |
#define TYPE | ( | Class, | |
Base | |||
) |
|
static |
If this is a non-static member function,.
Definition at line 4454 of file SemaTemplateDeduction.cpp.
Referenced by isAtLeastAsSpecializedAs().
|
static |
Perform the adjustments to the parameter and argument types described in C++ [temp.deduct.call].
Definition at line 3399 of file SemaTemplateDeduction.cpp.
References clang::Sema::completeExprArrayBound(), clang::Sema::Context, DeduceTemplateArgumentsFromCallArgument(), clang::ASTContext::getArrayDecayedType(), clang::Type::getAs(), clang::ASTContext::getLValueReferenceType(), clang::PointerType::getPointeeType(), clang::ReferenceType::getPointeeType(), clang::ASTContext::getPointerType(), clang::Expr::getType(), clang::QualType::getUnqualifiedType(), hasDeducibleTemplateParameters(), clang::QualType::hasQualifiers(), clang::Type::isArrayType(), isForwardingReference(), clang::Type::isFunctionType(), clang::Type::isIncompleteArrayType(), clang::Expr::isLValue(), clang::Type::isMemberPointerType(), clang::QualType::isNull(), clang::Type::isObjCObjectPointerType(), clang::Type::isPointerType(), isSimpleTemplateIdType(), clang::ASTContext::OverloadTy, ResolveOverloadForDeduction(), clang::TDF_DerivedClass, clang::TDF_IgnoreQualifiers, clang::TDF_ParamWithReferenceType, and clang::TDF_SkipNonDependent.
Referenced by DeduceTemplateArgumentsFromCallArgument().
|
static |
Verify that the given, deduced template arguments are compatible.
Definition at line 169 of file SemaTemplateDeduction.cpp.
Referenced by DeduceNonTypeTemplateArgument(), DeduceTemplateArguments(), and DeduceTemplateArgumentsByTypeMatch().
|
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 2980 of file SemaTemplateDeduction.cpp.
|
static |
Convert the given deduced template argument and add it to the set of fully-converted template arguments.
Definition at line 2314 of file SemaTemplateDeduction.cpp.
References clang::Sema::CheckTemplateArgument(), clang::Sema::Context, clang::TemplateArgument::CreatePackCopy(), clang::Sema::CTAK_Deduced, clang::Sema::CTAK_DeducedFromArrayBound, clang::Sema::CTAK_Specified, clang::Sema::CurContext, clang::Sema::Diag(), clang::SourceRange::getEnd(), clang::TemplateArgument::getKind(), clang::Decl::getLocation(), clang::Decl::getSourceRange(), clang::Sema::getTrivialTemplateArgumentLoc(), clang::TemplateArgumentList::OnStack, P, clang::TemplateArgument::Pack, clang::TemplateArgument::pack_elements(), clang::DeducedTemplateArgument::setDeducedFromArrayBound(), clang::Sema::SubstDecl(), clang::Sema::SubstType(), and clang::DeducedTemplateArgument::wasDeducedFromArrayBound().
|
static |
Definition at line 2405 of file SemaTemplateDeduction.cpp.
|
static |
Attempt template argument deduction from an initializer list deemed to be an argument in a function call.
Definition at line 3502 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().
|
static |
Deduce the value of the given non-type template parameter as the given deduced template argument.
All non-type template parameter deduction is funneled through here.
Definition at line 329 of file SemaTemplateDeduction.cpp.
References checkDeducedTemplateArguments(), clang::Sema::Context, DeduceTemplateArgumentsByTypeMatch(), clang::ASTContext::getAdjustedParameterType(), clang::TemplateParmPosition::getDepth(), clang::TemplateParmPosition::getIndex(), clang::Sema::getLangOpts(), clang::QualType::getNonReferenceType(), clang::ValueDecl::getType(), clang::NonTypeTemplateParmDecl::isExpandedParameterPack(), clang::TDF_SkipNonDependent, clang::Sema::TDK_Inconsistent, clang::Sema::TDK_Success, and clang::DeducedTemplateArgument::wasDeducedFromArrayBound().
Referenced by DeduceNonTypeTemplateArgument(), DeduceNullPtrTemplateArgument(), DeduceTemplateArguments(), and DeduceTemplateArgumentsByTypeMatch().
|
static |
Deduce the value of the given non-type template parameter from the given integral constant.
Definition at line 376 of file SemaTemplateDeduction.cpp.
References clang::Sema::Context, and DeduceNonTypeTemplateArgument().
|
static |
Deduce the value of the given non-type template parameter from the given type- or value-dependent expression.
Definition at line 409 of file SemaTemplateDeduction.cpp.
References DeduceNonTypeTemplateArgument(), and clang::Expr::getType().
|
static |
Deduce the value of the given non-type template parameter from the given declaration.
Definition at line 422 of file SemaTemplateDeduction.cpp.
References DeduceNonTypeTemplateArgument(), and clang::Decl::getCanonicalDecl().
|
static |
Deduce the value of the given non-type template parameter from the given null pointer template argument type.
Definition at line 390 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().
|
static |
Definition at line 1923 of file SemaTemplateDeduction.cpp.
References clang::Sema::Context, clang::TemplateArgument::Declaration, DeduceNonTypeTemplateArgument(), DeduceNullPtrTemplateArgument(), DeduceTemplateArgumentsByTypeMatch(), clang::TemplateArgument::Expression, clang::TemplateArgument::getAsDecl(), clang::TemplateArgument::getAsExpr(), clang::TemplateArgument::getAsIntegral(), clang::TemplateArgument::getAsTemplate(), clang::TemplateArgument::getAsType(), getDeducedParameterFromExpr(), clang::TemplateArgument::getIntegralType(), clang::TemplateArgument::getKind(), clang::TemplateArgument::getNullPtrType(), clang::TemplateArgument::getPackExpansionPattern(), clang::TemplateArgument::getParamTypeForDecl(), hasSameExtendedValue(), clang::ASTContext::hasSameType(), clang::TemplateArgument::Integral, clang::TemplateArgument::isPackExpansion(), isSameDeclaration(), clang::TemplateArgument::Null, clang::TemplateArgument::NullPtr, clang::TemplateArgument::Pack, clang::Sema::TDK_NonDeducedMismatch, clang::Sema::TDK_Success, clang::TemplateArgument::Template, clang::TemplateArgument::TemplateExpansion, and clang::TemplateArgument::Type.
Referenced by DeduceTemplateArguments(), clang::Sema::DeduceTemplateArguments(), DeduceTemplateArgumentsByTypeMatch(), hasSameExtendedValue(), and isAtLeastAsSpecializedAs().
|
static |
|
static |
Definition at line 434 of file SemaTemplateDeduction.cpp.
References checkDeducedTemplateArguments(), clang::Sema::Context, clang::TemplateName::getAsTemplateDecl(), clang::ASTContext::getCanonicalTemplateName(), clang::ASTContext::hasSameTemplateName(), clang::Sema::TDK_Inconsistent, clang::Sema::TDK_NonDeducedMismatch, and clang::Sema::TDK_Success.
|
static |
Deduce the template arguments by comparing the template parameter type (which is a template-id) with the template argument type.
S | the Sema |
TemplateParams | the template parameters that we are deducing |
Param | the parameter type |
Arg | the argument type |
Info | information about the template argument deduction itself |
Deduced | the deduced template arguments |
Definition at line 497 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().
|
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).
S | The semantic analysis object within which we are deducing |
TemplateParams | The template parameters that we are deducing |
Params | The list of parameter types |
NumParams | The number of types in Params |
Args | The list of argument types |
NumArgs | The number of types in Args |
Info | information about the template argument deduction itself |
Deduced | the deduced template arguments |
TDF | bitwise OR of the TemplateDeductionFlags bits that describe how template argument deduction is performed. |
PartialOrdering | If true, we are performing template argument deduction for during partial ordering for a call (C++0x [temp.deduct.partial]). |
Definition at line 890 of file SemaTemplateDeduction.cpp.
References DeduceTemplateArgumentsByTypeMatch(), clang::PackExpansionType::getPattern(), clang::Sema::TDK_MiscellaneousDeductionFailure, and clang::Sema::TDK_Success.
|
static |
Definition at line 2163 of file SemaTemplateDeduction.cpp.
References clang::TemplateArgumentList::asArray(), and DeduceTemplateArguments().
|
static |
Deduce the template arguments by comparing the parameter type and the argument type (C++ [temp.deduct.type]).
S | the semantic analysis object within which we are deducing |
TemplateParams | the template parameters that we are deducing |
ParamIn | the parameter type |
ArgIn | the argument type |
Info | information about the template argument deduction itself |
Deduced | the deduced template arguments |
TDF | bitwise OR of the TemplateDeductionFlags bits that describe how template argument deduction is performed. |
PartialOrdering | Whether we're performing template argument deduction in the context of partial ordering (C++0x [temp.deduct.partial]). |
Definition at line 1089 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().
|
static |
Perform template argument deduction per [temp.deduct.call] for a single parameter / argument pair.
Definition at line 3563 of file SemaTemplateDeduction.cpp.
References AdjustFunctionParmAndArgTypesForDeduction(), DeduceFromInitializerList(), DeduceTemplateArgumentsByTypeMatch(), clang::Expr::getType(), and clang::Sema::TDK_Success.
Referenced by AdjustFunctionParmAndArgTypesForDeduction().
|
static |
Attempt to produce an informative diagostic explaining why auto deduction failed.
true
if diagnosed, false
if not. Definition at line 4171 of file SemaTemplateDeduction.cpp.
References clang::Sema::Diag(), and clang::Sema::TDK_Inconsistent.
|
static |
Complete template argument deduction for a partial specialization.
Definition at line 2547 of file SemaTemplateDeduction.cpp.
References getAsDeclContextOrEnclosing(), and clang::Sema::Unevaluated.
Referenced by clang::Sema::DeduceTemplateArguments(), and isAtLeastAsSpecializedAs().
|
static |
Complete template argument deduction for a class or variable template, when partial ordering against a partial specialization.
Definition at line 2626 of file SemaTemplateDeduction.cpp.
References getAsDeclContextOrEnclosing(), and clang::Sema::Unevaluated.
|
static |
Definition at line 2525 of file SemaTemplateDeduction.cpp.
References clang::Decl::getDeclContext().
Referenced by FinishTemplateArgumentDeduction().
|
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().
|
static |
Retrieve the depth and index of a template parameter.
Definition at line 589 of file SemaTemplateDeduction.cpp.
References clang::TemplateParmPosition::getDepth(), and clang::TemplateParmPosition::getIndex().
Referenced by getDepthAndIndex().
|
static |
Retrieve the depth and index of an unexpanded parameter pack.
Definition at line 602 of file SemaTemplateDeduction.cpp.
References getDepthAndIndex().
|
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 1042 of file SemaTemplateDeduction.cpp.
References clang::CXXDeductionGuideDecl::getDeducedTemplate(), clang::FunctionTemplateDecl::getTemplatedDecl(), clang::TemplateDecl::getTemplateParameters(), and clang::TemplateParameterList::size().
Referenced by clang::Sema::DeduceTemplateArguments().
|
static |
Find the pack index for a particular parameter index in an instantiation of a function template with specific arguments.
Definition at line 3101 of file SemaTemplateDeduction.cpp.
References clang::Sema::getNumArgumentsInExpansion(), clang::FunctionTemplateDecl::getTemplatedDecl(), and clang::FunctionDecl::parameters().
|
static |
Gets the type of a function for template-argument-deducton purposes when it's considered as part of an overload set.
Definition at line 3269 of file SemaTemplateDeduction.cpp.
References clang::Sema::Context, clang::Sema::DeduceReturnType(), clang::OverloadExpr::FindResult::Expression, clang::Expr::getExprLoc(), clang::Sema::getLangOpts(), clang::ASTContext::getMemberPointerType(), clang::ASTContext::getPointerType(), clang::FunctionDecl::getReturnType(), clang::ValueDecl::getType(), clang::ASTContext::getTypeDeclType(), clang::OverloadExpr::FindResult::HasFormOfMemberPointer, clang::OverloadExpr::FindResult::IsAddressOfOperand, and clang::Type::isUndeducedType().
Referenced by ResolveOverloadForDeduction().
|
static |
Definition at line 5442 of file SemaTemplateDeduction.cpp.
References clang::Sema::Context, clang::TemplateParameterList::getDepth(), clang::TemplateDecl::getTemplateParameters(), clang::Type::isDependentType(), MarkUsedTemplateParameters(), and clang::TemplateParameterList::size().
Referenced by AdjustFunctionParmAndArgTypesForDeduction().
Determine whether the parameter has qualifiers that are either inconsistent with or a superset of the argument's qualifiers.
Definition at line 983 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().
|
static |
Determine whether the given set of template arguments has a pack expansion that is not the last template argument.
Definition at line 2061 of file SemaTemplateDeduction.cpp.
References clang::TemplateArgument::Pack.
Referenced by DeduceTemplateArguments(), and clang::Sema::MarkUsedTemplateParameters().
|
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().
|
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.
Args
[ArgIdx]), false otherwise. Definition at line 2044 of file SemaTemplateDeduction.cpp.
References clang::TemplateArgument::getKind(), clang::TemplateArgument::Pack, and clang::TemplateArgument::pack_elements().
Referenced by DeduceTemplateArguments().
|
static |
Determine whether the function template FT1
is at least as specialized as FT2
.
Definition at line 4476 of file SemaTemplateDeduction.cpp.
References AddImplicitObjectParameterType(), clang::Sema::Context, DeduceTemplateArguments(), DeduceTemplateArgumentsByTypeMatch(), clang::Type::getAs(), clang::FunctionType::getReturnType(), clang::FunctionTemplateDecl::getTemplatedDecl(), clang::TemplateDecl::getTemplateParameters(), clang::ValueDecl::getType(), clang::CXXMethodDecl::isStatic(), clang::FunctionProtoType::param_type_begin(), clang::FunctionProtoType::param_type_end(), clang::TemplateParameterList::size(), clang::TDF_None, clang::TPOC_Call, clang::TPOC_Conversion, and clang::TPOC_Other.
Referenced by clang::Sema::getMoreSpecializedPartialSpecialization(), clang::Sema::getMoreSpecializedTemplate(), and clang::Sema::isMoreSpecializedThanPrimary().
|
static |
Determine whether one partial specialization, P1, is at least as specialized than another, P2.
TemplateLikeDecl | The kind of P2, which must be a TemplateDecl or {Class,Var}TemplatePartialSpecializationDecl. |
T1 | The injected-class-name of P1 (faked for a variable template). |
T2 | The injected-class-name of P2 (faked for a variable template). |
Definition at line 4812 of file SemaTemplateDeduction.cpp.
References DeduceTemplateArgumentsByTypeMatch(), FinishTemplateArgumentDeduction(), clang::TemplateArgumentList::OnStack, and clang::TDF_None.
Determine whether a type denotes a forwarding reference.
Definition at line 1050 of file SemaTemplateDeduction.cpp.
References clang::Type::getAs(), and clang::TemplateTypeParmType::getIndex().
Referenced by AdjustFunctionParmAndArgTypesForDeduction(), and DeduceTemplateArgumentsByTypeMatch().
Determines whether the given type is an opaque type that might be more qualified when instantiated.
Definition at line 565 of file SemaTemplateDeduction.cpp.
References clang::Type::getTypeClass().
Referenced by DeduceTemplateArgumentsByTypeMatch().
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().
|
static |
Determine if the two templates are equivalent.
Definition at line 4694 of file SemaTemplateDeduction.cpp.
References clang::Decl::getCanonicalDecl().
|
static |
Determine whether two template arguments are the same.
Definition at line 2175 of file SemaTemplateDeduction.cpp.
Determine whether the given type T is a simple-template-id type.
Definition at line 2751 of file SemaTemplateDeduction.cpp.
References clang::Type::getAs().
Referenced by AdjustFunctionParmAndArgTypesForDeduction().
|
static |
Determine whether this a function template whose parameter-type-list ends with a function parameter pack.
Definition at line 4627 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().
|
static |
Helper function to build a TemplateParameter when we don't know its type statically.
Definition at line 612 of file SemaTemplateDeduction.cpp.
|
static |
Mark the template parameters that are used by this template argument.
Definition at line 5360 of file SemaTemplateDeduction.cpp.
References clang::TemplateArgument::Declaration, Depth, clang::TemplateArgument::Expression, clang::TemplateArgument::getAsExpr(), clang::TemplateArgument::getAsTemplateOrTemplatePattern(), clang::TemplateArgument::getAsType(), clang::TemplateArgument::getKind(), clang::TemplateArgument::getNullPtrType(), clang::TemplateArgument::Integral, clang::TemplateArgument::Null, clang::TemplateArgument::NullPtr, P, clang::TemplateArgument::Pack, clang::TemplateArgument::pack_elements(), clang::TemplateArgument::Template, clang::TemplateArgument::TemplateExpansion, clang::TemplateArgument::Type, and Used.
Referenced by hasDeducibleTemplateParameters(), and MarkUsedTemplateParameters().
|
static |
Mark the template parameters that are used by the given type.
Definition at line 5107 of file SemaTemplateDeduction.cpp.
References Depth, clang::DependentAddressSpaceType::getAddrSpaceExpr(), clang::ASTContext::getCanonicalType(), clang::MemberPointerType::getClass(), clang::DependentSizedExtVectorType::getElementType(), clang::MemberPointerType::getPointeeType(), clang::DependentAddressSpaceType::getPointeeType(), clang::FunctionType::getReturnType(), clang::DependentSizedExtVectorType::getSizeExpr(), clang::Type::getTypeClass(), clang::QualType::getTypePtr(), clang::Type::isDependentType(), clang::QualType::isNull(), MarkUsedTemplateParameters(), clang::T, and Used.
|
static |
Mark the template parameters that are used by the given expression.
Definition at line 5021 of file SemaTemplateDeduction.cpp.
|
static |
Mark the template parameters that are used by the given nested name specifier.
Definition at line 5065 of file SemaTemplateDeduction.cpp.
References Depth, clang::NestedNameSpecifier::getAsType(), clang::NestedNameSpecifier::getPrefix(), MarkUsedTemplateParameters(), and Used.
|
static |
Mark the template parameters that are used by the given template name.
Definition at line 5082 of file SemaTemplateDeduction.cpp.
|
static |
Apply the deduction rules for overload sets.
Definition at line 3295 of file SemaTemplateDeduction.cpp.
References clang::OverloadExpr::copyTemplateArgumentsInto(), clang::OverloadExpr::FindResult::Expression, clang::OverloadExpr::find(), GetTypeOfFunction(), clang::OverloadExpr::hasExplicitTemplateArgs(), clang::OverloadExpr::FindResult::IsAddressOfOperand, clang::Type::isFunctionPointerType(), clang::Type::isFunctionType(), clang::Type::isMemberFunctionPointerType(), clang::Sema::resolveAddressOfOnlyViableOverloadCandidate(), clang::Sema::ResolveSingleFunctionTemplateSpecialization(), clang::TDF_IgnoreQualifiers, and clang::TDF_ParamWithReferenceType.
Referenced by AdjustFunctionParmAndArgTypesForDeduction().