Author: rsmith Date: Wed Jan 4 16:03:59 2017 New Revision: 291014 URL: http://llvm.org/viewvc/llvm-project?rev=291014&view=rev Log: Fix failure to treat overloaded function in braced-init-list as a non-deduced context.
Previously, if an overloaded function in a braced-init-list was encountered in template argument deduction, and the overload set couldn't be resolved to a particular function, we'd immediately produce a deduction failure. That's not correct; this situation is supposed to result in that particular P/A pair being treated as a non-deduced context, and deduction can still succeed if the type can be deduced from elsewhere. Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/include/clang/Sema/TemplateDeduction.h cfe/trunk/lib/Sema/SemaOverload.cpp cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=291014&r1=291013&r2=291014&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Jan 4 16:03:59 2017 @@ -3375,9 +3375,6 @@ def err_addrof_function_disabled_by_enab "non-tautological enable_if conditions">; def note_addrof_ovl_candidate_disabled_by_enable_if_attr : Note< "candidate function made ineligible by enable_if">; -def note_ovl_candidate_failed_overload_resolution : Note< - "candidate template ignored: couldn't resolve reference to overloaded " - "function %0">; def note_ovl_candidate_deduced_mismatch : Note< "candidate template ignored: deduced type " "%diff{$ of %ordinal0 parameter does not match adjusted type $ of argument" Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=291014&r1=291013&r2=291014&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Wed Jan 4 16:03:59 2017 @@ -6576,9 +6576,6 @@ public: /// \brief The explicitly-specified template arguments were not valid /// template arguments for the given template. TDK_InvalidExplicitArguments, - /// \brief The arguments included an overloaded function name that could - /// not be resolved to a suitable function. - TDK_FailedOverloadResolution, /// \brief Deduction failed; that's all we know. TDK_MiscellaneousDeductionFailure, /// \brief CUDA Target attributes do not match. Modified: cfe/trunk/include/clang/Sema/TemplateDeduction.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/TemplateDeduction.h?rev=291014&r1=291013&r2=291014&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/TemplateDeduction.h (original) +++ cfe/trunk/include/clang/Sema/TemplateDeduction.h Wed Jan 4 16:03:59 2017 @@ -53,7 +53,7 @@ class TemplateDeductionInfo { public: TemplateDeductionInfo(SourceLocation Loc, unsigned DeducedDepth = 0) : Deduced(nullptr), Loc(Loc), HasSFINAEDiagnostic(false), - DeducedDepth(DeducedDepth), Expression(nullptr) {} + DeducedDepth(DeducedDepth), CallArgIndex(0) {} /// \brief Returns the location at which template argument is /// occurring. @@ -175,21 +175,12 @@ public: /// FIXME: Finish documenting this. TemplateArgument SecondArg; - union { - /// \brief The expression which caused a deduction failure. - /// - /// TDK_FailedOverloadResolution: this argument is the reference to - /// an overloaded function which could not be resolved to a specific - /// function. - Expr *Expression; - - /// \brief The index of the function argument that caused a deduction - /// failure. - /// - /// TDK_DeducedMismatch: this is the index of the argument that had a - /// different argument type from its substituted parameter type. - unsigned CallArgIndex; - }; + /// \brief The index of the function argument that caused a deduction + /// failure. + /// + /// TDK_DeducedMismatch: this is the index of the argument that had a + /// different argument type from its substituted parameter type. + unsigned CallArgIndex; /// \brief Information on packs that we're currently expanding. /// @@ -235,10 +226,6 @@ struct DeductionFailureInfo { /// refers to, if any. const TemplateArgument *getSecondArg(); - /// \brief Return the expression this deduction failure refers to, - /// if any. - Expr *getExpr(); - /// \brief Return the index of the call argument that this deduction /// failure refers to, if any. llvm::Optional<unsigned> getCallArgIndex(); Modified: cfe/trunk/lib/Sema/SemaOverload.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=291014&r1=291013&r2=291014&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOverload.cpp (original) +++ cfe/trunk/lib/Sema/SemaOverload.cpp Wed Jan 4 16:03:59 2017 @@ -644,10 +644,6 @@ clang::MakeDeductionFailureInfo(ASTConte Result.HasDiagnostic = true; } break; - - case Sema::TDK_FailedOverloadResolution: - Result.Data = Info.Expression; - break; } return Result; @@ -662,7 +658,6 @@ void DeductionFailureInfo::Destroy() { case Sema::TDK_TooManyArguments: case Sema::TDK_TooFewArguments: case Sema::TDK_InvalidExplicitArguments: - case Sema::TDK_FailedOverloadResolution: case Sema::TDK_CUDATargetMismatch: break; @@ -705,7 +700,6 @@ TemplateParameter DeductionFailureInfo:: case Sema::TDK_SubstitutionFailure: case Sema::TDK_DeducedMismatch: case Sema::TDK_NonDeducedMismatch: - case Sema::TDK_FailedOverloadResolution: case Sema::TDK_CUDATargetMismatch: return TemplateParameter(); @@ -737,7 +731,6 @@ TemplateArgumentList *DeductionFailureIn case Sema::TDK_Inconsistent: case Sema::TDK_Underqualified: case Sema::TDK_NonDeducedMismatch: - case Sema::TDK_FailedOverloadResolution: case Sema::TDK_CUDATargetMismatch: return nullptr; @@ -765,7 +758,6 @@ const TemplateArgument *DeductionFailure case Sema::TDK_TooFewArguments: case Sema::TDK_InvalidExplicitArguments: case Sema::TDK_SubstitutionFailure: - case Sema::TDK_FailedOverloadResolution: case Sema::TDK_CUDATargetMismatch: return nullptr; @@ -793,7 +785,6 @@ const TemplateArgument *DeductionFailure case Sema::TDK_TooFewArguments: case Sema::TDK_InvalidExplicitArguments: case Sema::TDK_SubstitutionFailure: - case Sema::TDK_FailedOverloadResolution: case Sema::TDK_CUDATargetMismatch: return nullptr; @@ -811,14 +802,6 @@ const TemplateArgument *DeductionFailure return nullptr; } -Expr *DeductionFailureInfo::getExpr() { - if (static_cast<Sema::TemplateDeductionResult>(Result) == - Sema::TDK_FailedOverloadResolution) - return static_cast<Expr*>(Data); - - return nullptr; -} - llvm::Optional<unsigned> DeductionFailureInfo::getCallArgIndex() { if (static_cast<Sema::TemplateDeductionResult>(Result) == Sema::TDK_DeducedMismatch) @@ -9699,14 +9682,6 @@ static void DiagnoseBadDeduction(Sema &S return; } - case Sema::TDK_FailedOverloadResolution: { - OverloadExpr::FindResult R = OverloadExpr::find(DeductionFailure.getExpr()); - S.Diag(Templated->getLocation(), - diag::note_ovl_candidate_failed_overload_resolution) - << R.Expression->getName(); - return; - } - case Sema::TDK_DeducedMismatch: { // Format the template argument list into the argument string. SmallString<128> TemplateArgString; @@ -10043,7 +10018,6 @@ static unsigned RankDeductionFailure(con return 3; case Sema::TDK_InstantiationDepth: - case Sema::TDK_FailedOverloadResolution: return 4; case Sema::TDK_InvalidExplicitArguments: Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=291014&r1=291013&r2=291014&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp Wed Jan 4 16:03:59 2017 @@ -3279,10 +3279,9 @@ DeduceTemplateArgumentByListElement(Sema // For all other cases, just match by type. QualType ArgType = Arg->getType(); if (AdjustFunctionParmAndArgTypesForDeduction(S, TemplateParams, ParamType, - ArgType, Arg, TDF)) { - Info.Expression = Arg; - return Sema::TDK_FailedOverloadResolution; - } + ArgType, Arg, TDF)) + return Sema::TDK_Success; + return DeduceTemplateArgumentsByTypeMatch(S, TemplateParams, ParamType, ArgType, Info, Deduced, TDF); } Modified: cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp?rev=291014&r1=291013&r2=291014&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp (original) +++ cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp Wed Jan 4 16:03:59 2017 @@ -220,10 +220,14 @@ namespace initlist_of_array { namespace init_list_deduction_failure { void f(); void f(int); + // FIXME: It'd be nice to track that 'T' became a non-deduced context due to + // overload resolution failure for 'f'. template<typename T> void g(std::initializer_list<T>); - // expected-note@-1 {{candidate template ignored: couldn't resolve reference to overloaded function 'f'}} - void h() { g({f}); } - // expected-error@-1 {{no matching function for call to 'g'}} + // expected-note@-1 {{candidate template ignored: couldn't infer template argument 'T'}} + void h() { + g({f}); // expected-error {{no matching function for call to 'g'}} + g({f, h}); // ok + } } namespace deleted_copy { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits