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

            Bug ID: 89885
           Summary: --help=warning prints wrongly default values for
                    options set via e.g. -Wall or -Wextra
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: driver
          Assignee: unassigned at gcc dot gnu.org
          Reporter: marxin at gcc dot gnu.org
  Target Milestone: ---

One example:

$ gcc --help=warning -Wall -Wextra -Q | grep Wcatch-v
  -Wcatch-value                         
  -Wcatch-value=<0,3>                   0

So it claims the value is 0. But:

$ gcc  -Wall -Wextra -Werror 
/home/marxin/Programming/gcc/gcc/testsuite/g++.dg/warn/Wcatch-value-1.C
/home/marxin/Programming/gcc/gcc/testsuite/g++.dg/warn/Wcatch-value-1.C: In
function ‘void foo()’:
/home/marxin/Programming/gcc/gcc/testsuite/g++.dg/warn/Wcatch-value-1.C:13:10:
error: catching polymorphic type ‘struct B’ by value [-Werror=catch-value=]
   13 |   catch (B)    {}  // { dg-warning "catching polymorphic type" }
      |          ^

Issues is that option common_handle_option_auto is called from:

#0  common_handle_option_auto (opts=0x246be40 <global_options>,
opts_set=0x246aea0 <global_options_set>, decoded=0x7fffffffd5e0, lang_mask=32,
kind=0, loc=0, handlers=0x7fffffffd810, dc=0x246cf00
<global_diagnostic_context>) at options.c:16459
#1  0x00000000018466a4 in common_handle_option (opts=0x246be40
<global_options>, opts_set=0x246aea0 <global_options_set>,
decoded=0x7fffffffd5e0, lang_mask=32, kind=0, loc=0, handlers=0x7fffffffd810,
dc=0x246cf00 <global_diagnostic_context>, target_option_override_hook=
    0x124b510 <ix86_option_override()>) at
/home/marxin/Programming/gcc/gcc/opts.c:2807
#2  0x000000000184c5ef in handle_option (opts=0x246be40 <global_options>,
opts_set=0x246aea0 <global_options_set>, decoded=0x7fffffffd5e0, lang_mask=32,
kind=0, loc=0, handlers=0x7fffffffd810, generated_p=true, dc=0x246cf00
<global_diagnostic_context>)
    at /home/marxin/Programming/gcc/gcc/opts-common.c:1104
#3  0x000000000184c69f in handle_generated_option (opts=0x246be40
<global_options>, opts_set=0x246aea0 <global_options_set>, opt_index=594,
arg=0x0, value=0, lang_mask=32, kind=0, loc=0, handlers=0x7fffffffd810,
generated_p=true, dc=0x246cf00 <global_diagnostic_context>)
    at /home/marxin/Programming/gcc/gcc/opts-common.c:1130

But --help options are directly printed in:

#0  print_filtered_help (include_flags=131072, exclude_flags=0, any_flags=0,
columns=272, opts=0x21d70c0 <global_options>, lang_mask=16) at
/home/marxin/Programming/gcc/gcc/opts.c:1303
#1  0x000000000162173e in print_specific_help (include_flags=131072,
exclude_flags=0, any_flags=0, opts=0x21d70c0 <global_options>, lang_mask=16) at
/home/marxin/Programming/gcc/gcc/opts.c:1683
#2  0x0000000001622af5 in common_handle_option (opts=0x21d70c0
<global_options>, opts_set=0x21d6120 <global_options_set>, decoded=0x21ef780,
lang_mask=16, kind=0, loc=0, handlers=0x7fffffffd820, dc=0x21d8180
<global_diagnostic_context>, target_option_override_hook=
    0x1032fc0 <ix86_option_override()>) at
/home/marxin/Programming/gcc/gcc/opts.c:2244

Correct behavior would be to print --help late after all is set. Ideally in
finish_options.

Reply via email to