aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQing Zhao <qing.zhao@oracle.com>2022-02-28 15:58:43 +0000
committerQing Zhao <qing.zhao@oracle.com>2022-02-28 15:58:43 +0000
commit3f3246eb16f554c70c5ce87ad2c785f83adb4625 (patch)
treea062d29bb8293c9752e89a20e059d0472321b846
parent1060d06b4df8836135ed15d020afbd3637dc625b (diff)
downloadgcc-3f3246eb16f554c70c5ce87ad2c785f83adb4625.zip
gcc-3f3246eb16f554c70c5ce87ad2c785f83adb4625.tar.gz
gcc-3f3246eb16f554c70c5ce87ad2c785f83adb4625.tar.bz2
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.
-rw-r--r--gcc/gimple-fold.cc12
-rw-r--r--gcc/testsuite/gcc.dg/auto-init-pr104550-1.c10
-rw-r--r--gcc/testsuite/gcc.dg/auto-init-pr104550-2.c11
-rw-r--r--gcc/testsuite/gcc.dg/auto-init-pr104550-3.c11
4 files changed, 43 insertions, 1 deletions
diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index 16f02c2..c9179ab 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -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,
diff --git a/gcc/testsuite/gcc.dg/auto-init-pr104550-1.c b/gcc/testsuite/gcc.dg/auto-init-pr104550-1.c
new file mode 100644
index 0000000..a08110c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/auto-init-pr104550-1.c
@@ -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" } */
+}
diff --git a/gcc/testsuite/gcc.dg/auto-init-pr104550-2.c b/gcc/testsuite/gcc.dg/auto-init-pr104550-2.c
new file mode 100644
index 0000000..2c395b3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/auto-init-pr104550-2.c
@@ -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" } */
+}
diff --git a/gcc/testsuite/gcc.dg/auto-init-pr104550-3.c b/gcc/testsuite/gcc.dg/auto-init-pr104550-3.c
new file mode 100644
index 0000000..9893e37
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/auto-init-pr104550-3.c
@@ -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" } */
+}