On Sun, Aug 11, 2024 at 5:46 AM Peter Damianov <peter0...@disroot.org> wrote: > > Currently, if a warning references a cloned function, the name of the cloned > function will be emitted in the "In function 'xyz'" part of the diagnostic, > which users aren't supposed to see. This patch follows the DECL_ORIGIN link > to get the name of the original function, so the internal compiler details > aren't exposed.
OK. Thanks, Richard. > gcc/ChangeLog: > PR diagnostics/102061 > * langhooks.cc (lhd_print_error_function): Follow DECL_ORIGIN > links. > * gcc.dg/pr102061.c: New testcase. > > Signed-off-by: Peter Damianov <peter0...@disroot.org> > --- > v4: Address formatting nits, add comment. > v4: Rework testcase. It is now shorter and covers more, including both > "inlined from" and "in function" parts of diagnostics. > > I would still appreciate a review regarding cp_print_error_function, perhaps > with more info about whether it needs adjustment or whatever circumstances it > is used in. > > gcc/langhooks.cc | 6 ++++++ > gcc/testsuite/gcc.dg/pr102061.c | 31 +++++++++++++++++++++++++++++++ > 2 files changed, 37 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/pr102061.c > > diff --git a/gcc/langhooks.cc b/gcc/langhooks.cc > index 61f2b676256..270f7aee1c1 100644 > --- a/gcc/langhooks.cc > +++ b/gcc/langhooks.cc > @@ -395,6 +395,11 @@ lhd_print_error_function (diagnostic_context *context, > const char *file, > else > fndecl = current_function_decl; > > + // Follow DECL_ORIGIN link, in case this is a cloned function. > + // Otherwise, we will emit names like "foo.constprop" or "bar.isra" > + // in the diagnostic. > + fndecl = DECL_ORIGIN (fndecl); > + > if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE) > pp_printf > (context->printer, _("In member function %qs"), > @@ -439,6 +444,7 @@ lhd_print_error_function (diagnostic_context *context, > const char *file, > } > if (fndecl) > { > + fndecl = DECL_ORIGIN (fndecl); > expanded_location s = expand_location (*locus); > pp_comma (context->printer); > pp_newline (context->printer); > diff --git a/gcc/testsuite/gcc.dg/pr102061.c b/gcc/testsuite/gcc.dg/pr102061.c > new file mode 100644 > index 00000000000..aff1062ca5a > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr102061.c > @@ -0,0 +1,31 @@ > +/* { dg-do compile } */ > +/* { dg-options "-Wall -O2" } */ > +/* { dg-message "In function 'foo'" "" { target *-*-* } 0 } */ > +/* { dg-message "inlined from 'bar'" "" { target *-*-* } 0 } */ > +/* { dg-message "isra" "" { xfail *-*-* } 0 } */ > +/* { dg-excess-errors "" } */ > + > +// The warnings generated here should not contain names of clones, like > +// 'foo.isra' and 'bar.isra' > + > +// Emit warning with "In function 'foo'" > +__attribute__((noinline)) > +static int foo(char* p) { > + __builtin_strncpy(p, p, 1); > + return 0; > +} > + > +// Emit warning with "inlined from 'bar'" > +// For some reason, this function needs to be infinite recursive > +// for the warning to show up in an isra clone. > +static int bar(char* p) { > + __builtin_strncpy(p, p, 1); > + bar(p); > + return 0; > +} > + > +void baz() { > + char c[0]; > + foo(c); > + bar(c); > +} > -- > 2.39.2 >