r333485 - [Sema] Use %sub to cleanup overload diagnostics

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Tue May 29 19:13:19 PDT 2018


Sorry for the breakage. Fix incoming as soon as my test suite run completes.

On Tue, May 29, 2018 at 7:00 PM, Eric Fiselier via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: ericwf
> Date: Tue May 29 18:00:41 2018
> New Revision: 333485
>
> URL: http://llvm.org/viewvc/llvm-project?rev=333485&view=rev
> Log:
> [Sema] Use %sub to cleanup overload diagnostics
>
> Summary:
> This patch adds the newly added `%sub` diagnostic modifier to cleanup
> repetition in the overload candidate diagnostics.
>
> I think this should be good to go.
>
> @rsmith: Some of the notes now emit `function template` where they only
> said `function` previously. It seems OK to me, but I would like your sign
> off on it.
>
>
> Reviewers: rsmith, EricWF
>
> Reviewed By: EricWF
>
> Subscribers: cfe-commits, rsmith
>
> Differential Revision: https://reviews.llvm.org/D47101
>
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/lib/Sema/SemaOverload.cpp
>     cfe/trunk/test/CXX/drs/dr4xx.cpp
>     cfe/trunk/test/CXX/special/class.inhctor/p1.cpp
>     cfe/trunk/test/SemaCXX/attr-noreturn.cpp
>     cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp
>     cfe/trunk/test/SemaCXX/overload-call.cpp
>     cfe/trunk/test/SemaCXX/overload-member-call.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/
> DiagnosticSemaKinds.td?rev=333485&r1=333484&r2=333485&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue May 29
> 18:00:41 2018
> @@ -3525,27 +3525,29 @@ def err_ovl_deleted_member_call : Error<
>  def note_ovl_too_many_candidates : Note<
>      "remaining %0 candidate%s0 omitted; "
>      "pass -fshow-overloads=all to show them">;
> -def note_ovl_candidate : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "is the implicit default constructor|"
> -    "is the implicit copy constructor|"
> -    "is the implicit move constructor|"
> -    "is the implicit copy assignment operator|"
> -    "is the implicit move assignment operator|"
> -    "inherited constructor|"
> -    "inherited constructor }0%2"
> -    "%select{| has different class%diff{ (expected $ but has $)|}4,5"
> -    "| has different number of parameters (expected %4 but has %5)"
> -    "| has type mismatch at %ordinal4 parameter"
> -    "%diff{ (expected $ but has $)|}5,6"
> -    "| has different return type%diff{ ($ expected but has $)|}4,5"
> +
> +def select_ovl_candidate_kind : TextSubstitution<
> +  "%select{function|function|constructor|"
> +    "constructor (the implicit default constructor)|"
> +    "constructor (the implicit copy constructor)|"
> +    "constructor (the implicit move constructor)|"
> +    "function (the implicit copy assignment operator)|"
> +    "function (the implicit move assignment operator)|"
> +    "inherited constructor}0%select{| template| %2}1">;
> +
> +def note_ovl_candidate : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,3"
> +    "%select{| has different class%diff{ (expected $ but has $)|}5,6"
> +    "| has different number of parameters (expected %5 but has %6)"
> +    "| has type mismatch at %ordinal5 parameter"
> +    "%diff{ (expected $ but has $)|}6,7"
> +    "| has different return type%diff{ ($ expected but has $)|}5,6"
>      "| has different qualifiers (expected "
>      "%select{none|const|restrict|const and restrict|volatile|const and
> volatile"
> -    "|volatile and restrict|const, volatile, and restrict}4 but found "
> +    "|volatile and restrict|const, volatile, and restrict}5 but found "
>      "%select{none|const|restrict|const and restrict|volatile|const and
> volatile"
> -    "|volatile and restrict|const, volatile, and restrict}5)"
> -    "| has different exception specification}3">;
> +    "|volatile and restrict|const, volatile, and restrict}6)"
> +    "| has different exception specification}4">;
>
>  def note_ovl_candidate_inherited_constructor : Note<
>      "constructor from base class %0 inherited here">;
> @@ -3615,225 +3617,97 @@ def note_ovl_candidate_non_deduced_misma
>
>  // Note that we don't treat templates differently for this diagnostic.
>  def note_ovl_candidate_arity : Note<"candidate "
> -    "%select{function|function|constructor|function|function|
> constructor|"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor}0 %select{|template }1"
> -    "not viable: requires%select{ at least| at most|}2 %3 argument%s3,
> but %4 "
> -    "%plural{1:was|:were}4 provided">;
> +    "%sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "requires%select{ at least| at most|}3 %4 argument%s4, but %5 "
> +    "%plural{1:was|:were}5 provided">;
>
>  def note_ovl_candidate_arity_one : Note<"candidate "
> -    "%select{function|function|constructor|function|function|
> constructor|"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor}0 %select{|template }1not viable: "
> -    "%select{requires at least|allows at most single|requires single}2 "
> -    "argument %3, but %plural{0:no|:%4}4 arguments were provided">;
> +    "%sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "%select{requires at least|allows at most single|requires single}3 "
> +    "argument %4, but %plural{0:no|:%5}5 arguments were provided">;
>
>  def note_ovl_candidate_deleted : Note<
> -    "candidate %select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 has been "
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 has been "
>      "%select{explicitly made unavailable|explicitly deleted|"
> -    "implicitly deleted}2">;
> +    "implicitly deleted}3">;
>
>  // Giving the index of the bad argument really clutters this message, and
>  // it's relatively unimportant because 1) it's generally obvious which
>  // argument(s) are of the given object type and 2) the fix is usually
>  // to complete the type, which doesn't involve changes to the call line
>  // anyway.  If people complain, we can change it.
> -def note_ovl_candidate_bad_conv_incomplete : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 "
> -    "not viable: cannot convert argument of incomplete type "
> -    "%diff{$ to $|to parameter type}2,3 for "
> -    "%select{%ordinal5 argument|object argument}4"
> +def note_ovl_candidate_bad_conv_incomplete : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "cannot convert argument of incomplete type "
> +    "%diff{$ to $|to parameter type}3,4 for "
> +    "%select{%ordinal6 argument|object argument}5"
>      "%select{|; dereference the argument with *|"
>      "; take the address of the argument with &|"
>      "; remove *|"
> -    "; remove &}6">;
> -def note_ovl_candidate_bad_list_argument : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 "
> -    "not viable: cannot convert initializer list argument to %3">;
> -def note_ovl_candidate_bad_overload : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1"
> -    " not viable: no overload of %3 matching %2 for %ordinal4 argument">;
> -def note_ovl_candidate_bad_conv : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1"
> -    " not viable: no known conversion "
> -    "%diff{from $ to $|from argument type to parameter type}2,3 for "
> -    "%select{%ordinal5 argument|object argument}4"
> +    "; remove &}7">;
> +def note_ovl_candidate_bad_list_argument : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "cannot convert initializer list argument to %4">;
> +def note_ovl_candidate_bad_overload : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "no overload of %4 matching %3 for %ordinal5 argument">;
> +def note_ovl_candidate_bad_conv : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "no known conversion "
> +    "%diff{from $ to $|from argument type to parameter type}3,4 for "
> +    "%select{%ordinal6 argument|object argument}5"
>      "%select{|; dereference the argument with *|"
>      "; take the address of the argument with &|"
>      "; remove *|"
> -    "; remove &}6">;
> -def note_ovl_candidate_bad_arc_conv : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1"
> -    " not viable: cannot implicitly convert argument "
> -    "%diff{of type $ to $|type to parameter type}2,3 for "
> -    "%select{%ordinal5 argument|object argument}4 under ARC">;
> -def note_ovl_candidate_bad_lvalue : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1"
> -    " not viable: expects an l-value for "
> -    "%select{%ordinal3 argument|object argument}2">;
> -def note_ovl_candidate_bad_addrspace : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 not viable: "
> -    "%select{%ordinal6|'this'}5 argument (%2) is in "
> -    "address space %3, but parameter must be in address space %4">;
> -def note_ovl_candidate_bad_gc : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 not viable: "
> -    "%select{%ordinal6|'this'}5 argument (%2) has
> %select{no|__weak|__strong}3 "
> -    "ownership, but parameter has %select{no|__weak|__strong}4
> ownership">;
> -def note_ovl_candidate_bad_ownership : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 not viable: "
> -    "%select{%ordinal6|'this'}5 argument (%2) has "
> -    "%select{no|__unsafe_unretained|__strong|__weak|__autoreleasing}3
> ownership,"
> +    "; remove &}7">;
> +def note_ovl_candidate_bad_arc_conv : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "cannot implicitly convert argument "
> +    "%diff{of type $ to $|type to parameter type}3,4 for "
> +    "%select{%ordinal6 argument|object argument}5 under ARC">;
> +def note_ovl_candidate_bad_lvalue : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "expects an l-value for "
> +    "%select{%ordinal4 argument|object argument}3">;
> +def note_ovl_candidate_bad_addrspace : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "%select{%ordinal7|'this'}6 argument (%3) is in "
> +    "address space %4, but parameter must be in address space %5">;
> +def note_ovl_candidate_bad_gc : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "%select{%ordinal7|'this'}6 argument (%3) has
> %select{no|__weak|__strong}4 "
> +    "ownership, but parameter has %select{no|__weak|__strong}5
> ownership">;
> +def note_ovl_candidate_bad_ownership : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "%select{%ordinal7|'this'}6 argument (%3) has "
> +    "%select{no|__unsafe_unretained|__strong|__weak|__autoreleasing}4
> ownership,"
>      " but parameter has %select{no|__unsafe_unretained|__strong|__weak|"
> -    "__autoreleasing}4 ownership">;
> -def note_ovl_candidate_bad_cvr_this : Note<"candidate "
> -    "%select{|function|||function|||||"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)||}0 not viable: "
> -    "'this' argument has type %2, but method is not marked "
> +    "__autoreleasing}5 ownership">;
> +def note_ovl_candidate_bad_cvr_this : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "'this' argument has type %3, but method is not marked "
>      "%select{const|restrict|const or restrict|volatile|const or volatile|"
> -    "volatile or restrict|const, volatile, or restrict}3">;
> -def note_ovl_candidate_bad_cvr : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 not viable: "
> -    "%ordinal4 argument (%2) would lose "
> +    "volatile or restrict|const, volatile, or restrict}4">;
> +def note_ovl_candidate_bad_cvr : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "%ordinal5 argument (%3) would lose "
>      "%select{const|restrict|const and restrict|volatile|const and
> volatile|"
> -    "volatile and restrict|const, volatile, and restrict}3 qualifier"
> -    "%select{||s||s|s|s}3">;
> -def note_ovl_candidate_bad_unaligned : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 not viable: "
> -    "%ordinal4 argument (%2) would lose __unaligned qualifier">;
> -def note_ovl_candidate_bad_base_to_derived_conv : Note<"candidate "
> -    "%select{function|function|constructor|"
> -    "function |function |constructor |"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor }0%1 not viable: "
> -    "cannot %select{convert from|convert from|bind}2 "
> -    "%select{base class pointer|superclass|base class object of type}2 %3
> to "
> -    "%select{derived class pointer|subclass|derived class reference}2 %4
> for "
> -    "%ordinal5 argument">;
> +    "volatile and restrict|const, volatile, and restrict}4 qualifier"
> +    "%select{||s||s|s|s}4">;
> +def note_ovl_candidate_bad_unaligned : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "%ordinal5 argument (%3) would lose __unaligned qualifier">;
> +def note_ovl_candidate_bad_base_to_derived_conv : Note<
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
> +    "cannot %select{convert from|convert from|bind}3 "
> +    "%select{base class pointer|superclass|base class object of type}3 %4
> to "
> +    "%select{derived class pointer|subclass|derived class reference}3 %5
> for "
> +    "%ordinal6 argument">;
>  def note_ovl_candidate_bad_target : Note<
> -    "candidate %select{function|function|constructor|"
> -    "function|function|constructor|"
> -    "constructor (the implicit default constructor)|"
> -    "constructor (the implicit copy constructor)|"
> -    "constructor (the implicit move constructor)|"
> -    "function (the implicit copy assignment operator)|"
> -    "function (the implicit move assignment operator)|"
> -    "inherited constructor|"
> -    "inherited constructor}0 not viable: "
> +    "candidate %sub{select_ovl_candidate_kind}0,1,2 not viable: "
>      "call to "
> -    "%select{__device__|__global__|__host__|__host__
> __device__|invalid}1 function from"
> -    " %select{__device__|__global__|__host__|__host__
> __device__|invalid}2 function">;
> +    "%select{__device__|__global__|__host__|__host__
> __device__|invalid}3 function from"
> +    " %select{__device__|__global__|__host__|__host__
> __device__|invalid}4 function">;
>  def note_implicit_member_target_infer_collision : Note<
>      "implicit %sub{select_special_member_kind}0 inferred target
> collision: call to both "
>      "%select{__device__|__global__|__host__|__host__ __device__}1 and "
>
> Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaOverload.cpp?rev=333485&r1=333484&r2=333485&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaOverload.cpp Tue May 29 18:00:41 2018
> @@ -9327,66 +9327,77 @@ enum OverloadCandidateKind {
>    oc_function,
>    oc_method,
>    oc_constructor,
> -  oc_function_template,
> -  oc_method_template,
> -  oc_constructor_template,
>    oc_implicit_default_constructor,
>    oc_implicit_copy_constructor,
>    oc_implicit_move_constructor,
>    oc_implicit_copy_assignment,
>    oc_implicit_move_assignment,
> -  oc_inherited_constructor,
> -  oc_inherited_constructor_template
> +  oc_inherited_constructor
>  };
>
> -static OverloadCandidateKind
> +enum OverloadCandidateSelect {
> +  ocs_non_template,
> +  ocs_template,
> +  ocs_described_template,
> +};
> +
> +static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
>  ClassifyOverloadCandidate(Sema &S, NamedDecl *Found, FunctionDecl *Fn,
>                            std::string &Description) {
> -  bool isTemplate = false;
>
> +  bool isTemplate = Fn->isTemplateDecl() || Found->isTemplateDecl();
>    if (FunctionTemplateDecl *FunTmpl = Fn->getPrimaryTemplate()) {
>      isTemplate = true;
>      Description = S.getTemplateArgumentBindingsText(
> -      FunTmpl->getTemplateParameters(), *Fn->
> getTemplateSpecializationArgs());
> +        FunTmpl->getTemplateParameters(), *Fn->
> getTemplateSpecializationArgs());
>    }
>
> -  if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
> -    if (!Ctor->isImplicit()) {
> -      if (isa<ConstructorUsingShadowDecl>(Found))
> -        return isTemplate ? oc_inherited_constructor_template
> -                          : oc_inherited_constructor;
> -      else
> -        return isTemplate ? oc_constructor_template : oc_constructor;
> -    }
> +  OverloadCandidateSelect Select = [&]() {
> +    if (!Description.empty())
> +      return ocs_described_template;
> +    return isTemplate ? ocs_template : ocs_non_template;
> +  }();
> +
> +  OverloadCandidateKind Kind = [&]() {
> +    if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
> +      if (!Ctor->isImplicit()) {
> +        if (isa<ConstructorUsingShadowDecl>(Found))
> +          return oc_inherited_constructor;
> +        else
> +          return oc_constructor;
> +      }
>
> -    if (Ctor->isDefaultConstructor())
> -      return oc_implicit_default_constructor;
> +      if (Ctor->isDefaultConstructor())
> +        return oc_implicit_default_constructor;
>
> -    if (Ctor->isMoveConstructor())
> -      return oc_implicit_move_constructor;
> +      if (Ctor->isMoveConstructor())
> +        return oc_implicit_move_constructor;
>
> -    assert(Ctor->isCopyConstructor() &&
> -           "unexpected sort of implicit constructor");
> -    return oc_implicit_copy_constructor;
> -  }
> +      assert(Ctor->isCopyConstructor() &&
> +             "unexpected sort of implicit constructor");
> +      return oc_implicit_copy_constructor;
> +    }
>
> -  if (CXXMethodDecl *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
> -    // This actually gets spelled 'candidate function' for now, but
> -    // it doesn't hurt to split it out.
> -    if (!Meth->isImplicit())
> -      return isTemplate ? oc_method_template : oc_method;
> +    if (CXXMethodDecl *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
> +      // This actually gets spelled 'candidate function' for now, but
> +      // it doesn't hurt to split it out.
> +      if (!Meth->isImplicit())
> +        return oc_method;
>
> -    if (Meth->isMoveAssignmentOperator())
> -      return oc_implicit_move_assignment;
> +      if (Meth->isMoveAssignmentOperator())
> +        return oc_implicit_move_assignment;
>
> -    if (Meth->isCopyAssignmentOperator())
> -      return oc_implicit_copy_assignment;
> +      if (Meth->isCopyAssignmentOperator())
> +        return oc_implicit_copy_assignment;
>
> -    assert(isa<CXXConversionDecl>(Meth) && "expected conversion");
> -    return oc_method;
> -  }
> +      assert(isa<CXXConversionDecl>(Meth) && "expected conversion");
> +      return oc_method;
> +    }
> +
> +    return oc_function;
> +  }();
>
> -  return isTemplate ? oc_function_template : oc_function;
> +  return std::make_pair(Kind, Select);
>  }
>
>  void MaybeEmitInheritedConstructorNote(Sema &S, Decl *FoundDecl) {
> @@ -9478,9 +9489,11 @@ void Sema::NoteOverloadCandidate(NamedDe
>      return;
>
>    std::string FnDesc;
> -  OverloadCandidateKind K = ClassifyOverloadCandidate(*this, Found, Fn,
> FnDesc);
> +  std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
> +      ClassifyOverloadCandidate(*this, Found, Fn, FnDesc);
>    PartialDiagnostic PD = PDiag(diag::note_ovl_candidate)
> -                             << (unsigned) K << Fn << FnDesc;
> +                         << (unsigned)KSPair.first <<
> (unsigned)KSPair.second
> +                         << Fn << FnDesc;
>
>    HandleFunctionTypeMismatch(PD, Fn->getType(), DestType);
>    Diag(Fn->getLocation(), PD);
> @@ -9554,7 +9567,7 @@ static void DiagnoseBadConversion(Sema &
>    }
>
>    std::string FnDesc;
> -  OverloadCandidateKind FnKind =
> +  std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
>        ClassifyOverloadCandidate(S, Cand->FoundDecl, Fn, FnDesc);
>
>    Expr *FromExpr = Conv.Bad.FromExpr;
> @@ -9569,9 +9582,9 @@ static void DiagnoseBadConversion(Sema &
>      DeclarationName Name = cast<OverloadExpr>(E)->getName();
>
>      S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
> -      << (unsigned) FnKind << FnDesc
> -      << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -      << ToTy << Name << I+1;
> +        << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +        << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) << ToTy
> +        << Name << I + 1;
>      MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>      return;
>    }
> @@ -9598,43 +9611,40 @@ static void DiagnoseBadConversion(Sema &
>
>      if (FromQs.getAddressSpace() != ToQs.getAddressSpace()) {
>        S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
> -        << (unsigned) FnKind << FnDesc
> -        << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -        << FromTy
> -        << FromQs.getAddressSpaceAttributePrintValue()
> -        << ToQs.getAddressSpaceAttributePrintValue()
> -        << (unsigned) isObjectArgument << I+1;
> +          << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +          << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +          << FromQs.getAddressSpaceAttributePrintValue()
> +          << ToQs.getAddressSpaceAttributePrintValue()
> +          << (unsigned)isObjectArgument << I + 1;
>        MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>        return;
>      }
>
>      if (FromQs.getObjCLifetime() != ToQs.getObjCLifetime()) {
>        S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
> -        << (unsigned) FnKind << FnDesc
> -        << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -        << FromTy
> -        << FromQs.getObjCLifetime() << ToQs.getObjCLifetime()
> -        << (unsigned) isObjectArgument << I+1;
> +          << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +          << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +          << FromQs.getObjCLifetime() << ToQs.getObjCLifetime()
> +          << (unsigned)isObjectArgument << I + 1;
>        MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>        return;
>      }
>
>      if (FromQs.getObjCGCAttr() != ToQs.getObjCGCAttr()) {
>        S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
> -      << (unsigned) FnKind << FnDesc
> -      << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -      << FromTy
> -      << FromQs.getObjCGCAttr() << ToQs.getObjCGCAttr()
> -      << (unsigned) isObjectArgument << I+1;
> +          << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +          << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +          << FromQs.getObjCGCAttr() << ToQs.getObjCGCAttr()
> +          << (unsigned)isObjectArgument << I + 1;
>        MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>        return;
>      }
>
>      if (FromQs.hasUnaligned() != ToQs.hasUnaligned()) {
>        S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_unaligned)
> -        << (unsigned) FnKind << FnDesc
> -        << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -        << FromTy << FromQs.hasUnaligned() << I+1;
> +          << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +          << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +          << FromQs.hasUnaligned() << I + 1;
>        MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>        return;
>      }
> @@ -9644,14 +9654,14 @@ static void DiagnoseBadConversion(Sema &
>
>      if (isObjectArgument) {
>        S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
> -        << (unsigned) FnKind << FnDesc
> -        << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -        << FromTy << (CVR - 1);
> +          << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +          << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +          << (CVR - 1);
>      } else {
>        S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
> -        << (unsigned) FnKind << FnDesc
> -        << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -        << FromTy << (CVR - 1) << I+1;
> +          << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +          << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +          << (CVR - 1) << I + 1;
>      }
>      MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>      return;
> @@ -9661,9 +9671,9 @@ static void DiagnoseBadConversion(Sema &
>    // telling the user that it has type void is not useful.
>    if (FromExpr && isa<InitListExpr>(FromExpr)) {
>      S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
> -      << (unsigned) FnKind << FnDesc
> -      << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -      << FromTy << ToTy << (unsigned) isObjectArgument << I+1;
> +        << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +        << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +        << ToTy << (unsigned)isObjectArgument << I + 1;
>      MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>      return;
>    }
> @@ -9677,10 +9687,10 @@ static void DiagnoseBadConversion(Sema &
>    if (TempFromTy->isIncompleteType()) {
>      // Emit the generic diagnostic and, optionally, add the hints to it.
>      S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_
> conv_incomplete)
> -      << (unsigned) FnKind << FnDesc
> -      << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -      << FromTy << ToTy << (unsigned) isObjectArgument << I+1
> -      << (unsigned) (Cand->Fix.Kind);
> +        << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +        << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +        << ToTy << (unsigned)isObjectArgument << I + 1
> +        << (unsigned)(Cand->Fix.Kind);
>
>      MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>      return;
> @@ -9718,21 +9728,19 @@ static void DiagnoseBadConversion(Sema &
>                 ToTy.getNonReferenceType().getCanonicalType() ==
>                 FromTy.getNonReferenceType().getCanonicalType()) {
>        S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_lvalue)
> -        << (unsigned) FnKind << FnDesc
> -        << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -        << (unsigned) isObjectArgument << I + 1;
> +          << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +          << (unsigned)isObjectArgument << I + 1
> +          << (FromExpr ? FromExpr->getSourceRange() : SourceRange());
>        MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>        return;
>      }
>    }
>
>    if (BaseToDerivedConversion) {
> -    S.Diag(Fn->getLocation(),
> -           diag::note_ovl_candidate_bad_base_to_derived_conv)
> -      << (unsigned) FnKind << FnDesc
> -      << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -      << (BaseToDerivedConversion - 1)
> -      << FromTy << ToTy << I+1;
> +    S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_
> base_to_derived_conv)
> +        << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +        << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> +        << (BaseToDerivedConversion - 1) << FromTy << ToTy << I + 1;
>      MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>      return;
>    }
> @@ -9743,9 +9751,9 @@ static void DiagnoseBadConversion(Sema &
>        Qualifiers ToQs = CToTy.getQualifiers();
>        if (FromQs.getObjCLifetime() != ToQs.getObjCLifetime()) {
>          S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
> -        << (unsigned) FnKind << FnDesc
> -        << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -        << FromTy << ToTy << (unsigned) isObjectArgument << I+1;
> +            << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second
> +            << FnDesc << (FromExpr ? FromExpr->getSourceRange() :
> SourceRange())
> +            << FromTy << ToTy << (unsigned)isObjectArgument << I + 1;
>          MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>          return;
>        }
> @@ -9757,10 +9765,10 @@ static void DiagnoseBadConversion(Sema &
>
>    // Emit the generic diagnostic and, optionally, add the hints to it.
>    PartialDiagnostic FDiag = S.PDiag(diag::note_ovl_candidate_bad_conv);
> -  FDiag << (unsigned) FnKind << FnDesc
> -    << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
> -    << FromTy << ToTy << (unsigned) isObjectArgument << I + 1
> -    << (unsigned) (Cand->Fix.Kind);
> +  FDiag << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +        << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) <<
> FromTy
> +        << ToTy << (unsigned)isObjectArgument << I + 1
> +        << (unsigned)(Cand->Fix.Kind);
>
>    // If we can fix the conversion, suggest the FixIts.
>    for (std::vector<FixItHint>::iterator HI = Cand->Fix.Hints.begin(),
> @@ -9833,17 +9841,18 @@ static void DiagnoseArityMismatch(Sema &
>    }
>
>    std::string Description;
> -  OverloadCandidateKind FnKind =
> +  std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
>        ClassifyOverloadCandidate(S, Found, Fn, Description);
>
>    if (modeCount == 1 && Fn->getParamDecl(0)->getDeclName())
>      S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
> -      << (unsigned) FnKind << (Fn->getDescribedFunctionTemplate() !=
> nullptr)
> -      << mode << Fn->getParamDecl(0) << NumFormalArgs;
> +        << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second
> +        << Description << mode << Fn->getParamDecl(0) << NumFormalArgs;
>    else
>      S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
> -      << (unsigned) FnKind << (Fn->getDescribedFunctionTemplate() !=
> nullptr)
> -      << mode << modeCount << NumFormalArgs;
> +        << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second
> +        << Description << mode << modeCount << NumFormalArgs;
> +
>    MaybeEmitInheritedConstructorNote(S, Found);
>  }
>
> @@ -10118,11 +10127,13 @@ static void DiagnoseBadTarget(Sema &S, O
>                             CalleeTarget = S.IdentifyCUDATarget(Callee);
>
>    std::string FnDesc;
> -  OverloadCandidateKind FnKind =
> +  std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
>        ClassifyOverloadCandidate(S, Cand->FoundDecl, Callee, FnDesc);
>
>    S.Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
> -      << (unsigned)FnKind << CalleeTarget << CallerTarget;
> +      << (unsigned)FnKindPair.first << (unsigned)ocs_non_template
> +      << FnDesc /* Ignored */
> +      << CalleeTarget << CallerTarget;
>
>    // This could be an implicit constructor for which we could not infer
> the
>    // target due to a collsion. Diagnose that case.
> @@ -10131,7 +10142,7 @@ static void DiagnoseBadTarget(Sema &S, O
>      CXXRecordDecl *ParentClass = Meth->getParent();
>      Sema::CXXSpecialMember CSM;
>
> -    switch (FnKind) {
> +    switch (FnKindPair.first) {
>      default:
>        return;
>      case oc_implicit_default_constructor:
> @@ -10203,12 +10214,12 @@ static void NoteFunctionCandidate(Sema &
>    if (Cand->Viable) {
>      if (Fn->isDeleted() || S.isFunctionConsideredUnavailable(Fn)) {
>        std::string FnDesc;
> -      OverloadCandidateKind FnKind =
> -        ClassifyOverloadCandidate(S, Cand->FoundDecl, Fn, FnDesc);
> +      std::pair<OverloadCandidateKind, OverloadCandidateSelect>
> FnKindPair =
> +          ClassifyOverloadCandidate(S, Cand->FoundDecl, Fn, FnDesc);
>
>        S.Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
> -        << FnKind << FnDesc
> -        << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0);
> +          << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second <<
> FnDesc
> +          << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0);
>        MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
>        return;
>      }
> @@ -11102,9 +11113,9 @@ private:
>          MatchesCopy.begin(), MatchesCopy.end(), FailedCandidates,
>          SourceExpr->getLocStart(), S.PDiag(),
>          S.PDiag(diag::err_addr_ovl_ambiguous)
> -          << Matches[0].second->getDeclName(),
> +            << Matches[0].second->getDeclName(),
>          S.PDiag(diag::note_ovl_candidate)
> -          << (unsigned)oc_function_template,
> +            << (unsigned)oc_function << (unsigned)ocs_described_template,
>          Complain, TargetFunctionType);
>
>      if (Result != MatchesCopy.end()) {
>
> Modified: cfe/trunk/test/CXX/drs/dr4xx.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/
> drs/dr4xx.cpp?rev=333485&r1=333484&r2=333485&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CXX/drs/dr4xx.cpp (original)
> +++ cfe/trunk/test/CXX/drs/dr4xx.cpp Tue May 29 18:00:41 2018
> @@ -533,10 +533,10 @@ namespace dr437 { // dr437: sup 1308
>
>  namespace dr444 { // dr444: yes
>    struct D;
> -  struct B { // expected-note {{candidate is the implicit copy}}
> expected-note 0-1 {{implicit move}}
> +  struct B {                    // expected-note {{candidate function
> (the implicit copy}} expected-note 0-1 {{implicit move}}
>      D &operator=(D &) = delete; // expected-error 0-1{{extension}}
> expected-note {{deleted}}
>    };
> -  struct D : B { // expected-note {{candidate is the implicit}}
> expected-note 0-1 {{implicit move}}
> +  struct D : B { // expected-note {{candidate function (the implicit
> copy}} expected-note 0-1 {{implicit move}}
>      using B::operator=;
>    } extern d;
>    void f() {
>
> Modified: cfe/trunk/test/CXX/special/class.inhctor/p1.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/
> special/class.inhctor/p1.cpp?rev=333485&r1=333484&r2=333485&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CXX/special/class.inhctor/p1.cpp (original)
> +++ cfe/trunk/test/CXX/special/class.inhctor/p1.cpp Tue May 29 18:00:41
> 2018
> @@ -3,7 +3,7 @@
>  // Note: [class.inhctor] was removed by P0136R1. This tests the new
> behavior
>  // for the wording that used to be there.
>
> -struct A { // expected-note 4{{candidate is the implicit}}
> +struct A { // expected-note 4{{candidate constructor (the implicit}}
>    A(...); // expected-note 4{{candidate constructor}} expected-note
> 4{{candidate inherited constructor}}
>    A(int = 0, int = 0, int = 0, int = 0, ...); // expected-note
> 3{{candidate constructor}} expected-note 3{{candidate inherited
> constructor}}
>    A(int = 0, int = 0, ...); // expected-note 3{{candidate constructor}}
> expected-note 3{{candidate inherited constructor}}
> @@ -14,7 +14,7 @@ struct A { // expected-note 4{{candidate
>    template<typename T, int N> A(const T (&)[N], int = 0); //
> expected-note {{candidate constructor}} expected-note {{candidate inherited
> constructor}}
>  };
>
> -struct B : A { // expected-note 4{{candidate is the implicit}}
> +struct B : A { // expected-note 4{{candidate constructor (the implicit}}
>    using A::A; // expected-note 15{{inherited here}}
>    B(void*);
>  };
>
> Modified: cfe/trunk/test/SemaCXX/attr-noreturn.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/attr-noreturn.cpp?rev=333485&r1=333484&r2=333485&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/attr-noreturn.cpp (original)
> +++ cfe/trunk/test/SemaCXX/attr-noreturn.cpp Tue May 29 18:00:41 2018
> @@ -244,11 +244,11 @@ namespace PR15291 {
>    template <typename T>
>    void qux(T) {}
>
> -  // expected-note at +5 {{candidate function not viable: no overload of
> 'baz' matching 'void (*)(int) __attribute__((noreturn))' for 1st argument}}
> -  // expected-note at +4 {{candidate function not viable: no overload of
> 'qux' matching 'void (*)(int) __attribute__((noreturn))' for 1st argument}}
> -  // expected-note at +3 {{candidate function not viable: no overload of
> 'bar' matching 'void (*)(int) __attribute__((noreturn))' for 1st argument}}
> -  // expected-note at +2 {{candidate function not viable: no overload of
> 'bar' matching 'void (*)(int)' for 1st argument}}
> -  // expected-note at +1 {{candidate function not viable: no overload of
> 'bar' matching 'void (*)(int)' for 1st argument}}
> +  // expected-note at +5 {{candidate function template not viable: no
> overload of 'baz' matching 'void (*)(int) __attribute__((noreturn))' for
> 1st argument}}
> +  // expected-note at +4 {{candidate function template not viable: no
> overload of 'qux' matching 'void (*)(int) __attribute__((noreturn))' for
> 1st argument}}
> +  // expected-note at +3 {{candidate function template not viable: no
> overload of 'bar' matching 'void (*)(int) __attribute__((noreturn))' for
> 1st argument}}
> +  // expected-note at +2 {{candidate function template not viable: no
> overload of 'bar' matching 'void (*)(int)' for 1st argument}}
> +  // expected-note at +1 {{candidate function template not viable: no
> overload of 'bar' matching 'void (*)(int)' for 1st argument}}
>    template <typename T> void accept_T(T) {}
>
>    // expected-note at +1 {{candidate function not viable: no overload of
> 'bar' matching 'void (*)(int)' for 1st argument}}
>
> Modified: cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/cxx1y-generic-lambdas.cpp?rev=333485&r1=333484&r2=333485&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp (original)
> +++ cfe/trunk/test/SemaCXX/cxx1y-generic-lambdas.cpp Tue May 29 18:00:41
> 2018
> @@ -181,7 +181,7 @@ int test() {
>      int (*fp2)(int) = [](auto b) -> int {  return b; };
>      int (*fp3)(char) = [](auto c) -> int { return c; };
>      char (*fp4)(int) = [](auto d) { return d; }; //expected-error{{no
> viable conversion}}\
> -
>  //expected-note{{candidate function[with $0 = int]}}
> +
>  //expected-note{{candidate function [with $0 = int]}}
>      char (*fp5)(char) = [](auto e) -> int { return e; };
> //expected-error{{no viable conversion}}\
>
> //expected-note{{candidate template ignored}}
>
>
> Modified: cfe/trunk/test/SemaCXX/overload-call.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/overload-call.cpp?rev=333485&r1=333484&r2=333485&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/overload-call.cpp (original)
> +++ cfe/trunk/test/SemaCXX/overload-call.cpp Tue May 29 18:00:41 2018
> @@ -338,22 +338,23 @@ namespace PR5756 {
>
>  // Tests the exact text used to note the candidates
>  namespace test1 {
> -  template <class T> void foo(T t, unsigned N); // expected-note
> {{candidate function not viable: no known conversion from 'const char [6]'
> to 'unsigned int' for 2nd argument}}
> -  void foo(int n, char N); // expected-note {{candidate function not
> viable: no known conversion from 'const char [6]' to 'char' for 2nd
> argument}}
> -  void foo(int n, const char *s, int t); // expected-note {{candidate
> function not viable: requires 3 arguments, but 2 were provided}}
> -  void foo(int n, const char *s, int t, ...); // expected-note
> {{candidate function not viable: requires at least 3 arguments, but 2 were
> provided}}
> -  void foo(int n, const char *s, int t, int u = 0); // expected-note
> {{candidate function not viable: requires at least 3 arguments, but 2 were
> provided}}
> +template <class T>
> +void foo(T t, unsigned N);                        // expected-note
> {{candidate function template not viable: no known conversion from 'const
> char [6]' to 'unsigned int' for 2nd argument}}
> +void foo(int n, char N);                          // expected-note
> {{candidate function not viable: no known conversion from 'const char [6]'
> to 'char' for 2nd argument}}
> +void foo(int n, const char *s, int t);            // expected-note
> {{candidate function not viable: requires 3 arguments, but 2 were provided}}
> +void foo(int n, const char *s, int t, ...);       // expected-note
> {{candidate function not viable: requires at least 3 arguments, but 2 were
> provided}}
> +void foo(int n, const char *s, int t, int u = 0); // expected-note
> {{candidate function not viable: requires at least 3 arguments, but 2 were
> provided}}
>
> -  // PR 11857
> -  void foo(int n); // expected-note {{candidate function not viable:
> requires single argument 'n', but 2 arguments were provided}}
> -  void foo(unsigned n = 10); // expected-note {{candidate function not
> viable: allows at most single argument 'n', but 2 arguments were provided}}
> -  void bar(int n, int u = 0); // expected-note {{candidate function not
> viable: requires at least argument 'n', but no arguments were provided}}
> -  void baz(int n = 0, int u = 0); // expected-note {{candidate function
> not viable: requires at most 2 arguments, but 3 were provided}}
> +// PR 11857
> +void foo(int n);                // expected-note {{candidate function not
> viable: requires single argument 'n', but 2 arguments were provided}}
> +void foo(unsigned n = 10);      // expected-note {{candidate function not
> viable: allows at most single argument 'n', but 2 arguments were provided}}
> +void bar(int n, int u = 0);     // expected-note {{candidate function not
> viable: requires at least argument 'n', but no arguments were provided}}
> +void baz(int n = 0, int u = 0); // expected-note {{candidate function not
> viable: requires at most 2 arguments, but 3 were provided}}
>
> -  void test() {
> -    foo(4, "hello"); //expected-error {{no matching function for call to
> 'foo'}}
> -    bar(); //expected-error {{no matching function for call to 'bar'}}
> -    baz(3, 4, 5); // expected-error {{no matching function for call to
> 'baz'}}
> +void test() {
> +  foo(4, "hello"); //expected-error {{no matching function for call to
> 'foo'}}
> +  bar();           //expected-error {{no matching function for call to
> 'bar'}}
> +  baz(3, 4, 5);    // expected-error {{no matching function for call to
> 'baz'}}
>    }
>  }
>
>
> Modified: cfe/trunk/test/SemaCXX/overload-member-call.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/overload-member-call.cpp?rev=333485&r1=333484&r2=333485&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/overload-member-call.cpp (original)
> +++ cfe/trunk/test/SemaCXX/overload-member-call.cpp Tue May 29 18:00:41
> 2018
> @@ -70,7 +70,8 @@ void test_X2(X2 *x2p, const X2 *cx2p) {
>  // Tests the exact text used to note the candidates
>  namespace test1 {
>    class A {
> -    template <class T> void foo(T t, unsigned N); // expected-note
> {{candidate function not viable: no known conversion from 'const char [6]'
> to 'unsigned int' for 2nd argument}}
> +    template <class T>
> +    void foo(T t, unsigned N); // expected-note {{candidate function
> template not viable: no known conversion from 'const char [6]' to 'unsigned
> int' for 2nd argument}}
>      void foo(int n, char N); // expected-note {{candidate function not
> viable: no known conversion from 'const char [6]' to 'char' for 2nd
> argument}}
>      void foo(int n, const char *s, int t); // expected-note {{candidate
> function not viable: requires 3 arguments, but 2 were provided}}
>      void foo(int n, const char *s, int t, ...); // expected-note
> {{candidate function not viable: requires at least 3 arguments, but 2 were
> provided}}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180529/8a931906/attachment-0001.html>


More information about the cfe-commits mailing list