aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2019-09-26 16:17:22 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2019-09-26 10:17:22 -0600
commit26cdf7bd5e9cb47f2a8761d8d5d2babf0bf5bb15 (patch)
tree30fd49d51eebd8d14bef62c93ccaa316452bf5ee
parentc9fb0a85b68d1465ad1a88509a39190c27109c69 (diff)
downloadgcc-26cdf7bd5e9cb47f2a8761d8d5d2babf0bf5bb15.zip
gcc-26cdf7bd5e9cb47f2a8761d8d5d2babf0bf5bb15.tar.gz
gcc-26cdf7bd5e9cb47f2a8761d8d5d2babf0bf5bb15.tar.bz2
PR tree-optimization/91914 - Invalid strlen folding for offset into struct
gcc/testsuite/CHangeLog: * gcc.dg/strlenopt-79.c: New test. From-SVN: r276156
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/strlenopt-79.c46
2 files changed, 51 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2323593..8d75c29 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-09-26 Martin Sebor <msebor@redhat.com>
+
+ PR tree-optimization/91914
+ * gcc.dg/strlenopt-79.c: New test.
+
2019-09-26 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gcc.target/arm/acle/simd32.c: Update test.
diff --git a/gcc/testsuite/gcc.dg/strlenopt-79.c b/gcc/testsuite/gcc.dg/strlenopt-79.c
new file mode 100644
index 0000000..362cbfb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/strlenopt-79.c
@@ -0,0 +1,46 @@
+/* PR tree-optimization/91914 - Invalid strlen folding for offset into struct
+ { dg-do run }
+ { dg-options "-O2 -Wall" } */
+
+#define assert(expr) \
+ ((expr) \
+ ? (void)0 \
+ : (__builtin_printf ("%s:%i: assertion failed: %s\n", \
+ __FILE__, __LINE__, #expr), \
+ __builtin_abort ()))
+
+extern __SIZE_TYPE__ strlen (const char*);
+
+struct stringpool_t
+{
+ char s1[sizeof ("1")];
+ char s2[sizeof ("12")];
+ char s3[sizeof ("123")];
+ char s4[sizeof ("1234")];
+ char s5[sizeof ("12345")];
+};
+
+static const struct stringpool_t stringpool_contents =
+ {
+ "1", "12", "123", "1234", "12345"
+ };
+
+#define stringpool ((const char *) &stringpool_contents)
+
+volatile int i0 = 0, i2 = 2, i5 = 5, i9 = 9, i14 = 14;
+
+int main (void)
+{
+ /* These shouldn't trigger warnings. */
+ assert (strlen (stringpool) == 1);
+ assert (strlen (stringpool + 2) == 2);
+ assert (strlen (stringpool + 5) == 3);
+ assert (strlen (stringpool + 9) == 4);
+ assert (strlen (stringpool + 14) == 5);
+
+ assert (strlen (stringpool + i0) == 1);
+ assert (strlen (stringpool + i2) == 2);
+ assert (strlen (stringpool + i5) == 3);
+ assert (strlen (stringpool + i9) == 4);
+ assert (strlen (stringpool + i14) == 5);
+}