https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97855

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
             Status|UNCONFIRMED                 |ASSIGNED
     Ever confirmed|0                           |1
                 CC|                            |dmalcolm at gcc dot gnu.org
   Last reconfirmed|                            |2021-02-26

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  The issue seems to be that in diagnostic_report_diagnostic () we do

1244      pp_format (context->printer, &diagnostic->message);
1245      (*diagnostic_starter (context)) (context, diagnostic);

where the first call ends up with the %qD part of "%qD may be used
uninitialized in this function" still in the pretty-printers buffer which then
the
diagnostic_starter will use without resetting it.

For the specific message the expression is formatted via default_tree_printer
and dump_generic_node (we have sth usable in DECL_DEBUG_EXPR).

The following seems to fix it but I'm not sure what the actual mistake in
using the diagnostic provided pretty-printer is.  The dump_generic_node
doesn't cause any flushing.

diff --git a/gcc/tree-diagnostic.c b/gcc/tree-diagnostic.c
index 95b8ef30070..f124e627aad 100644
--- a/gcc/tree-diagnostic.c
+++ b/gcc/tree-diagnostic.c
@@ -300,7 +300,11 @@ default_tree_printer (pretty_printer *pp, text_info *text,
const char *spec,
       pp_string (pp, n);
     }
   else
-    dump_generic_node (pp, t, 0, TDF_SLIM, 0);
+    {
+      pretty_printer buffer;
+      dump_generic_node (&buffer, t, 0, TDF_SLIM, 0);
+      pp_string (pp, pp_formatted_text (&buffer));
+    }

   return true;
 }

This then issues

/home/rguenther/src/trunk/gcc/calls.c: In function 'expand_call':
/home/rguenther/src/trunk/gcc/dojump.c:118:28: warning: 'MEM[(struct poly_int
*)&save].D.6750.coeffs[0]' may be used uninitialized in this function
[-Wmaybe-uninitialized]
  118 |       pending_stack_adjust = save->x_pending_stack_adjust;
      |                            ^
/home/rguenther/src/trunk/gcc/calls.c:4150:34: note: 'MEM[(struct poly_int
*)&save].D.6750.coeffs[0]' was declared here
 4150 |       saved_pending_stack_adjust save;
      |                                  ^
/home/rguenther/src/trunk/gcc/dojump.c:119:27: warning: 'MEM[(struct poly_int
*)&save + 8B].D.6750.coeffs[0]' may be used uninitialized in this function
[-Wmaybe-uninitialized]
  119 |       stack_pointer_delta = save->x_stack_pointer_delta;
      |                           ^
/home/rguenther/src/trunk/gcc/calls.c:4150:34: note: 'MEM[(struct poly_int
*)&save + 8B].D.6750.coeffs[0]' was declared here
 4150 |       saved_pending_stack_adjust save;
      |                                  ^

instead of the broken

/home/rguenther/src/trunk/gcc/calls.c: In function 'expand_call':
D.6750.coeffs[0]'/home/rguenther/src/trunk/gcc/dojump.c:118:28: warning:  may
be used uninitialized in this function [-Wmaybe-uninitialized]
  118 |       pending_stack_adjust = save->x_pending_stack_adjust;
      |                            ^
D.6750.coeffs[0]'/home/rguenther/src/trunk/gcc/calls.c:4150:34: note:  was
declared here
 4150 |       saved_pending_stack_adjust save;
      |                                  ^
D.6750.coeffs[0]'/home/rguenther/src/trunk/gcc/dojump.c:119:27: warning:  may
be used uninitialized in this function [-Wmaybe-uninitialized]
  119 |       stack_pointer_delta = save->x_stack_pointer_delta;
      |                           ^
D.6750.coeffs[0]'/home/rguenther/src/trunk/gcc/calls.c:4150:34: note:  was
declared here
 4150 |       saved_pending_stack_adjust save;
      |                                  ^

for the ltrans unit I was am investigating.  I put this to more testing
but as said, I don't understand why or how it goes wrong at all ...

Reply via email to