aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-08-26 12:56:30 +0200
committerRichard Biener <rguenther@suse.de>2022-08-26 12:59:05 +0200
commitfc1b5707faf0b607da06e9ec3437245aba69a255 (patch)
tree97bcd43807fb9fc80bdbe7a235a48e909b9e94a3 /gcc
parentd6621a2f3176dd6a593d4f5fa7f85db0234b40d2 (diff)
downloadgcc-fc1b5707faf0b607da06e9ec3437245aba69a255.zip
gcc-fc1b5707faf0b607da06e9ec3437245aba69a255.tar.gz
gcc-fc1b5707faf0b607da06e9ec3437245aba69a255.tar.bz2
New testcase for uninit
The following adds a testcase that illustrates a defect in compute_control_dep_chain and its attempt to identify loop exits as special to continue walking post-dominators but failing to do so for following post-dominators. On trunk there is now simple_control_dep_chain saving the day, avoiding the false positive but with GCC 12 we get a bogus diagnostic. * gcc.dg/uninit-pred-11.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/uninit-pred-11.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/uninit-pred-11.c b/gcc/testsuite/gcc.dg/uninit-pred-11.c
new file mode 100644
index 0000000..734df37
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/uninit-pred-11.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O -Wmaybe-uninitialized" } */
+
+extern unsigned bar (void);
+extern void quux (void);
+int z;
+unsigned foo (unsigned v, int y)
+{
+ unsigned u;
+ if (v != 1)
+ u = bar ();
+
+ // Prevent the "dom" pass from changing the CFG layout based on the inference
+ // 'if (v != 1) is false then (v != 2) is true'. (Now it would have to
+ // duplicate the loop in order to do so, which is deemed expensive.)
+ for (int i = 0; i < 10; i++)
+ quux ();
+
+ // This variation from uninit-25.c causes compute_control_dep_chain
+ // to run into a defect but simple_control_dep_chain saves us here
+ if (y)
+ z = 1;
+ if (v != 1)
+ return u; /* { dg-bogus "may be used uninitialized" } */
+
+ return 0;
+}