On Thu, Feb 28, 2019 at 02:33:37PM -0500, Jason Merrill wrote: > On 2/28/19 2:00 PM, Marek Polacek wrote: > > Here we issued the "invalid use of non-static member function" error with > > UNKNOWN_LOCATION, which merely shows "cc1plus" and no file/line. We can > > greatly improve this situation with the below. > > > > The patch is IMHO trivial (though it's user-provided) to go in even at > > this point. > > > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > > > 2019-02-28 Marek Polacek <pola...@redhat.com> > > > > PR c++/89537 - missing location for error with non-static member fn. > > * call.c (resolve_args): Use EXPR_LOCATION. > > * typeck.c (build_class_member_access_expr): Use input_location. > > > > * g++.dg/diagnostic/member-fn-1.C: New test. > > > > diff --git gcc/cp/call.c gcc/cp/call.c > > index fb67d905acd..d9073d7c23d 100644 > > --- gcc/cp/call.c > > +++ gcc/cp/call.c > > @@ -4246,7 +4246,7 @@ resolve_args (vec<tree, va_gc> *args, tsubst_flags_t > > complain) > > error ("invalid use of void expression"); > > return NULL; > > } > > - else if (invalid_nonstatic_memfn_p (arg->exp.locus, arg, complain)) > > + else if (invalid_nonstatic_memfn_p (EXPR_LOCATION (arg), arg, > > complain)) > > Maybe cp_expr_loc_or_loc (arg, input_location)?
That gives a suboptimal location: values(p1->values) {} ^ whereas with my fix: values(p1->values) {} ~~~~^~~~~~ > > return NULL; > > } > > return args; > > diff --git gcc/cp/typeck.c gcc/cp/typeck.c > > index 1db9333b5ff..1bf9ad88141 100644 > > --- gcc/cp/typeck.c > > +++ gcc/cp/typeck.c > > @@ -2562,7 +2562,8 @@ build_class_member_access_expr (cp_expr object, tree > > member, > > type = unknown_type_node; > > /* Note that we do not convert OBJECT to the BASELINK_BINFO > > base. That will happen when the function is called. */ > > - result = build3 (COMPONENT_REF, type, object, member, NULL_TREE); > > + result = build3_loc (input_location, COMPONENT_REF, type, object, > > member, > > + NULL_TREE); > > Then I think this change shouldn't be needed. The build3 call above this block also uses input_location. Marek