[clang] initial template arg fix push (PR #122754)
https://github.com/AidanGoldfarb updated https://github.com/llvm/llvm-project/pull/122754 >From b6c576fb90362640b2fd4e41bd7f13dfee95d04d Mon Sep 17 00:00:00 2001 From: Aidan Date: Mon, 13 Jan 2025 11:53:39 -0500 Subject: [PATCH 1/2] initial template arg fix push --- .../clang/Basic/DiagnosticSemaKinds.td| 4 +- clang/include/clang/Sema/TemplateDeduction.h | 5 ++ clang/lib/Sema/SemaOverload.cpp | 56 +++ clang/lib/Sema/SemaTemplateDeduction.cpp | 8 +++ 4 files changed, 61 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 8be4f946dce1cc..1456f34538bcc0 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -4871,8 +4871,8 @@ def note_ovl_candidate_inconsistent_deduction_types : Note< "of conflicting types for parameter %0 (%1 of type $ vs. %3 of type $)|" "%1 and %3 of conflicting types for parameter %0}2,4">; def note_ovl_candidate_explicit_arg_mismatch_named : Note< -"candidate template ignored: invalid explicitly-specified argument " -"for template parameter %0">; +"template argument deduction/substitution failed:" +"error: could not convert '%0' from %1 to %2">; def note_ovl_candidate_unsatisfied_constraints : Note< "candidate template ignored: constraints not satisfied%0">; def note_ovl_candidate_explicit_arg_mismatch_unnamed : Note< diff --git a/clang/include/clang/Sema/TemplateDeduction.h b/clang/include/clang/Sema/TemplateDeduction.h index 28b014fd84e4b3..9edd3724cf53cd 100644 --- a/clang/include/clang/Sema/TemplateDeduction.h +++ b/clang/include/clang/Sema/TemplateDeduction.h @@ -250,6 +250,9 @@ class TemplateDeductionInfo { /// \brief The constraint satisfaction details resulting from the associated /// constraints satisfaction tests. ConstraintSatisfaction AssociatedConstraintsSatisfaction; + + /// \brief Type supplied by user for deduction + TemplateArgument SuppliedType; }; } // namespace sema @@ -300,6 +303,8 @@ struct DeductionFailureInfo { TemplateDeductionResult getResult() const { return static_cast(Result); } + + const TemplateArgument *getSuppliedType(); }; /// TemplateSpecCandidate - This is a generalization of OverloadCandidate diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 34c287926b1d7d..6c437a52be21db 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -715,12 +715,18 @@ namespace { struct DFIParamWithArguments : DFIArguments { TemplateParameter Param; }; + // Structure used by DeductionFailureInfo to store template argument // information and the index of the problematic call argument. struct DFIDeducedMismatchArgs : DFIArguments { TemplateArgumentList *TemplateArgs; unsigned CallArgIndex; }; + + struct DFIParamWithArgumentsAndSuppliedType : DFIArguments { +TemplateParameter Param; +TemplateArgument SuppliedType; + }; // Structure used by DeductionFailureInfo to store information about // unsatisfied constraints. struct CNSInfo { @@ -736,8 +742,10 @@ clang::MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, TemplateDeductionInfo &Info) { DeductionFailureInfo Result; + Result.Result = static_cast(TDK); Result.HasDiagnostic = false; + switch (TDK) { case TemplateDeductionResult::Invalid: case TemplateDeductionResult::InstantiationDepth: @@ -749,10 +757,9 @@ clang::MakeDeductionFailureInfo(ASTContext &Context, break; case TemplateDeductionResult::Incomplete: - case TemplateDeductionResult::InvalidExplicitArguments: +// case TemplateDeductionResult::InvalidExplicitArguments: Result.Data = Info.Param.getOpaqueValue(); break; - case TemplateDeductionResult::DeducedMismatch: case TemplateDeductionResult::DeducedMismatchNested: { // FIXME: Should allocate from normal heap so that we can free this later. @@ -777,6 +784,7 @@ clang::MakeDeductionFailureInfo(ASTContext &Context, case TemplateDeductionResult::IncompletePack: // FIXME: It's slightly wasteful to allocate two TemplateArguments for this. case TemplateDeductionResult::Inconsistent: + case TemplateDeductionResult::Underqualified: { // FIXME: Should allocate from normal heap so that we can free this later. DFIParamWithArguments *Saved = new (Context) DFIParamWithArguments; @@ -786,6 +794,16 @@ clang::MakeDeductionFailureInfo(ASTContext &Context, Result.Data = Saved; break; } + case TemplateDeductionResult::InvalidExplicitArguments: { +DFIParamWithArgumentsAndSuppliedType *Saved = +new (Context) DFIParamWithArgumentsAndSuppliedType; +Saved->Param = Info.Param; +Saved->FirstArg = Info.FirstArg; +Saved->SecondArg = Info.SecondArg
[clang] initial template arg fix push (PR #122754)
https://github.com/AidanGoldfarb created https://github.com/llvm/llvm-project/pull/122754 This update resolves #121235 >From b6c576fb90362640b2fd4e41bd7f13dfee95d04d Mon Sep 17 00:00:00 2001 From: Aidan Date: Mon, 13 Jan 2025 11:53:39 -0500 Subject: [PATCH] initial template arg fix push --- .../clang/Basic/DiagnosticSemaKinds.td| 4 +- clang/include/clang/Sema/TemplateDeduction.h | 5 ++ clang/lib/Sema/SemaOverload.cpp | 56 +++ clang/lib/Sema/SemaTemplateDeduction.cpp | 8 +++ 4 files changed, 61 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 8be4f946dce1cc..1456f34538bcc0 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -4871,8 +4871,8 @@ def note_ovl_candidate_inconsistent_deduction_types : Note< "of conflicting types for parameter %0 (%1 of type $ vs. %3 of type $)|" "%1 and %3 of conflicting types for parameter %0}2,4">; def note_ovl_candidate_explicit_arg_mismatch_named : Note< -"candidate template ignored: invalid explicitly-specified argument " -"for template parameter %0">; +"template argument deduction/substitution failed:" +"error: could not convert '%0' from %1 to %2">; def note_ovl_candidate_unsatisfied_constraints : Note< "candidate template ignored: constraints not satisfied%0">; def note_ovl_candidate_explicit_arg_mismatch_unnamed : Note< diff --git a/clang/include/clang/Sema/TemplateDeduction.h b/clang/include/clang/Sema/TemplateDeduction.h index 28b014fd84e4b3..9edd3724cf53cd 100644 --- a/clang/include/clang/Sema/TemplateDeduction.h +++ b/clang/include/clang/Sema/TemplateDeduction.h @@ -250,6 +250,9 @@ class TemplateDeductionInfo { /// \brief The constraint satisfaction details resulting from the associated /// constraints satisfaction tests. ConstraintSatisfaction AssociatedConstraintsSatisfaction; + + /// \brief Type supplied by user for deduction + TemplateArgument SuppliedType; }; } // namespace sema @@ -300,6 +303,8 @@ struct DeductionFailureInfo { TemplateDeductionResult getResult() const { return static_cast(Result); } + + const TemplateArgument *getSuppliedType(); }; /// TemplateSpecCandidate - This is a generalization of OverloadCandidate diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 34c287926b1d7d..6c437a52be21db 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -715,12 +715,18 @@ namespace { struct DFIParamWithArguments : DFIArguments { TemplateParameter Param; }; + // Structure used by DeductionFailureInfo to store template argument // information and the index of the problematic call argument. struct DFIDeducedMismatchArgs : DFIArguments { TemplateArgumentList *TemplateArgs; unsigned CallArgIndex; }; + + struct DFIParamWithArgumentsAndSuppliedType : DFIArguments { +TemplateParameter Param; +TemplateArgument SuppliedType; + }; // Structure used by DeductionFailureInfo to store information about // unsatisfied constraints. struct CNSInfo { @@ -736,8 +742,10 @@ clang::MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, TemplateDeductionInfo &Info) { DeductionFailureInfo Result; + Result.Result = static_cast(TDK); Result.HasDiagnostic = false; + switch (TDK) { case TemplateDeductionResult::Invalid: case TemplateDeductionResult::InstantiationDepth: @@ -749,10 +757,9 @@ clang::MakeDeductionFailureInfo(ASTContext &Context, break; case TemplateDeductionResult::Incomplete: - case TemplateDeductionResult::InvalidExplicitArguments: +// case TemplateDeductionResult::InvalidExplicitArguments: Result.Data = Info.Param.getOpaqueValue(); break; - case TemplateDeductionResult::DeducedMismatch: case TemplateDeductionResult::DeducedMismatchNested: { // FIXME: Should allocate from normal heap so that we can free this later. @@ -777,6 +784,7 @@ clang::MakeDeductionFailureInfo(ASTContext &Context, case TemplateDeductionResult::IncompletePack: // FIXME: It's slightly wasteful to allocate two TemplateArguments for this. case TemplateDeductionResult::Inconsistent: + case TemplateDeductionResult::Underqualified: { // FIXME: Should allocate from normal heap so that we can free this later. DFIParamWithArguments *Saved = new (Context) DFIParamWithArguments; @@ -786,6 +794,16 @@ clang::MakeDeductionFailureInfo(ASTContext &Context, Result.Data = Saved; break; } + case TemplateDeductionResult::InvalidExplicitArguments: { +DFIParamWithArgumentsAndSuppliedType *Saved = +new (Context) DFIParamWithArgumentsAndSuppliedType; +Saved->Param = Info.Param; +Saved->FirstArg = Info.FirstArg; +Saved