Don't emit switch-unreachable warnings for -ftrivial-auto-var-init (PR102276)
authorQing Zhao <qing.zhao@oracle.com>
Wed, 2 Mar 2022 16:48:37 +0000 (16:48 +0000)
committerQing Zhao <qing.zhao@oracle.com>
Wed, 2 Mar 2022 16:53:00 +0000 (16:53 +0000)
commitdbaabd06aaf4a1b0f2a20671c39148a0bd6ccf0e
treeda157c6ccb1c857e58b7e4521fde2bd561351390
parent8fede2876a751d53a28442dcca32466daa929daa
Don't emit switch-unreachable warnings for -ftrivial-auto-var-init (PR102276)

At the same time, adding -Wtrivial-auto-var-init and update documentation.
 -Wtrivial-auto-var-init and update documentation.

for the following testing case:
1 int g(int *);
2 int f1()
3 {
4     switch (0) {
5         int x;
6         default:
7         return g(&x);
8     }
9 }
compiling with -O -ftrivial-auto-var-init causes spurious warning:
warning: statement will never be executed [-Wswitch-unreachable]
5 |         int x;
  |             ^
This is due to the compiler-generated initialization at the point of
the declaration.

We could avoid the warning  to exclude the following cases:

when
flag_auto_var_init > AUTO_INIT_UNINITIALIZED
And
1) call to .DEFERRED_INIT
2) call to __builtin_clear_padding if the 2nd argument is present and non-zero
3) a gimple assign store right after the .DEFERRED_INIT call that has the LHS
   as RHS

However, we still need to warn users about the incapability of the option
-ftrivial-auto-var-init by adding a new warning option -Wtrivial-auto-var-init
to report cases when it cannot initialize the auto variable. At the same
time, update documentation for -ftrivial-auto-var-init to connect it with
the new warning option -Wtrivial-auto-var-init,  and add documentation
for -Wtrivial-auto-var-init.

gcc/ChangeLog:

PR middle-end/102276
* common.opt (-Wtrivial-auto-var-init): New option.
* doc/invoke.texi (-Wtrivial-auto-var-init): Document new option.
(-ftrivial-auto-var-init): Update option;
* gimplify.cc (emit_warn_switch_unreachable): New function.
(warn_switch_unreachable_r): Rename to ...
(warn_switch_unreachable_and_auto_init_r): This.
(maybe_warn_switch_unreachable): Rename to ...
(maybe_warn_switch_unreachable_and_auto_init): This.
(gimplify_switch_expr): Update calls to renamed function.

gcc/testsuite/ChangeLog:

PR middle-end/102276
* gcc.dg/auto-init-pr102276-1.c: New test.
* gcc.dg/auto-init-pr102276-2.c: New test.
* gcc.dg/auto-init-pr102276-3.c: New test.
* gcc.dg/auto-init-pr102276-4.c: New test.
gcc/common.opt
gcc/doc/invoke.texi
gcc/gimplify.cc
gcc/testsuite/gcc.dg/auto-init-pr102276-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-pr102276-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-pr102276-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-pr102276-4.c [new file with mode: 0644]