Suppress uninitialized warnings for new created uses from __builtin_clear_padding folding [PR104550]

__builtin_clear_padding(&object) will clear all the padding bits of the object.
actually, it doesn't involve any use of an user variable. Therefore, users do
not expect any uninitialized warning from it. It's reasonable to suppress
uninitialized warnings for all new created uses from __builtin_clear_padding
folding.

	PR middle-end/104550

gcc/ChangeLog:

	* gimple-fold.cc (clear_padding_flush): Suppress warnings for new
	created uses.

gcc/testsuite/ChangeLog:

	* gcc.dg/auto-init-pr104550-1.c: New test.
	* gcc.dg/auto-init-pr104550-2.c: New test.
	* gcc.dg/auto-init-pr104550-3.c: New test.
This commit is contained in:
Qing Zhao 2022-02-28 15:58:43 +00:00
parent 1060d06b4d
commit 3f3246eb16
4 changed files with 43 additions and 1 deletions

View File

@ -4379,7 +4379,17 @@ clear_padding_flush (clear_padding_struct *buf, bool full)
else
{
src = make_ssa_name (type);
g = gimple_build_assign (src, unshare_expr (dst));
tree tmp_dst = unshare_expr (dst);
/* The folding introduces a read from the tmp_dst, we should
prevent uninitialized warning analysis from issuing warning
for such fake read. In order to suppress warning only for
this expr, we should set the location of tmp_dst to
UNKNOWN_LOCATION first, then suppress_warning will call
set_no_warning_bit to set the no_warning flag only for
tmp_dst. */
SET_EXPR_LOCATION (tmp_dst, UNKNOWN_LOCATION);
suppress_warning (tmp_dst, OPT_Wuninitialized);
g = gimple_build_assign (src, tmp_dst);
gimple_set_location (g, buf->loc);
gsi_insert_before (buf->gsi, g, GSI_SAME_STMT);
tree mask = native_interpret_expr (type,

View File

@ -0,0 +1,10 @@
/* PR 104550*/
/* { dg-do compile } */
/* { dg-options "-O -Wuninitialized -ftrivial-auto-var-init=pattern" } */
struct vx_audio_level {
int has_monitor_level : 1;
};
void vx_set_monitor_level() {
struct vx_audio_level info; /* { dg-bogus "info" "is used uninitialized" } */
}

View File

@ -0,0 +1,11 @@
/* PR 104550 */
/* { dg-do compile } */
/* { dg-options "-O -Wuninitialized -ftrivial-auto-var-init=zero" } */
struct vx_audio_level {
int has_monitor_level : 1;
};
void vx_set_monitor_level() {
struct vx_audio_level info;
__builtin_clear_padding (&info); /* { dg-bogus "info" "is used uninitialized" } */
}

View File

@ -0,0 +1,11 @@
/* PR 104550 */
/* { dg-do compile } */
/* { dg-options "-O -Wuninitialized -ftrivial-auto-var-init=pattern" } */
struct vx_audio_level {
int has_monitor_level : 1;
};
void vx_set_monitor_level() {
struct vx_audio_level info; /* { dg-bogus "info" "is used uninitialized" } */
__builtin_clear_padding (&info); /* { dg-bogus "info" "is used uninitialized" } */
}