================ @@ -10905,6 +10983,93 @@ bool OverloadCandidate::NotValidBecauseConstraintExprHasError() const { ->Satisfaction.ContainsErrors; } +void OverloadCandidateSet::AddNonDeducedTemplateCandidate( + FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, + ArrayRef<Expr *> Args, bool SuppressUserConversions, + bool PartialOverloading, bool AllowExplicit, + CallExpr::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, + bool AggregateCandidateDeduction) { + NonDeducedFunctionTemplateOverloadCandidate C{FunctionTemplate, + FoundDecl, + Args, + IsADLCandidate, + PO, + SuppressUserConversions, + PartialOverloading, + AllowExplicit, + AggregateCandidateDeduction}; + NonDeducedCandidates.emplace_back(std::move(C)); +} + +void OverloadCandidateSet::AddNonDeducedMethodTemplateCandidate( + FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, + CXXRecordDecl *ActingContext, QualType ObjectType, + Expr::Classification ObjectClassification, ArrayRef<Expr *> Args, + bool SuppressUserConversions, bool PartialOverloading, + OverloadCandidateParamOrder PO) { + NonDeducedMethodTemplateOverloadCandidate C{ + MethodTmpl, FoundDecl, Args, ActingContext, + ObjectClassification, ObjectType, PO, SuppressUserConversions, + PartialOverloading}; + NonDeducedCandidates.emplace_back(std::move(C)); +} + +void OverloadCandidateSet::AddNonDeducedConversionTemplateCandidate( + FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, + CXXRecordDecl *ActingContext, Expr *From, QualType ToType, + bool AllowObjCConversionOnExplicit, bool AllowExplicit, + bool AllowResultConversion) { + + NonDeducedConversionTemplateOverloadCandidate C{ + FunctionTemplate, FoundDecl, + ActingContext, From, + ToType, AllowObjCConversionOnExplicit, + AllowExplicit, AllowResultConversion}; + + NonDeducedCandidates.emplace_back(std::move(C)); +} + +static void +AddTemplateOverloadCandidate(Sema &S, OverloadCandidateSet &CandidateSet, + NonDeducedMethodTemplateOverloadCandidate &&C) { + + S.AddMethodTemplateCandidateImmediately( + CandidateSet, C.FunctionTemplate, C.FoundDecl, C.ActingContext, + /*ExplicitTemplateArgs=*/nullptr, C.ObjectType, C.ObjectClassification, + C.Args, C.SuppressUserConversions, C.PartialOverloading, C.PO); +} + +static void +AddTemplateOverloadCandidate(Sema &S, OverloadCandidateSet &CandidateSet, + NonDeducedFunctionTemplateOverloadCandidate &&C) { + S.AddTemplateOverloadCandidateImmediately( + CandidateSet, C.FunctionTemplate, C.FoundDecl, + /*ExplicitTemplateArgs=*/nullptr, C.Args, C.SuppressUserConversions, + C.PartialOverloading, C.AllowExplicit, C.IsADLCandidate, C.PO, + C.AggregateCandidateDeduction); +} + +static void AddTemplateOverloadCandidate( + Sema &S, OverloadCandidateSet &CandidateSet, + NonDeducedConversionTemplateOverloadCandidate &&C) { + return S.AddTemplateConversionCandidateImmediately( ---------------- zyn0217 wrote:
Can we reuse `InjectNonDeducedTemplateCandidates` for `*Immediately` functions or vice versa? https://github.com/llvm/llvm-project/pull/133426 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits