From 2f967bc4b32e3348e889fc4e59c48a66c3b3b575 Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Mon, 4 Nov 2019 18:15:43 +0000 Subject: [PATCH] PR tree-optimization/92349 - ICE in -Warray-bounds of a VLA member gcc/testsuite/ChangeLog: PR tree-optimization/92349 * gcc.dg/Warray-bounds-50.c: New test. gcc/ChangeLog: PR tree-optimization/92349 * tree-vrp.c (vrp_prop::check_array_ref): Avoid assuming struct memebers have constant sizes. From-SVN: r277786 --- gcc/ChangeLog | 6 ++ gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.dg/Warray-bounds-50.c | 114 ++++++++++++++++++++++++ gcc/tree-vrp.c | 3 +- 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/Warray-bounds-50.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b94a3236728..b8b120d96ff 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-11-04 Martin Sebor + + PR tree-optimization/92349 + * tree-vrp.c (vrp_prop::check_array_ref): Avoid assuming struct + memebers have constant sizes. + 2019-11-04 Andre Vieira * tree-vect-loop.c (vect_analyze_loop): Remove orig_loop_vinfo diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2059b594e16..5fa63c3cb8b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-11-04 Martin Sebor + + PR tree-optimization/92349 + * gcc.dg/Warray-bounds-50.c: New test. + 2019-11-04 Joel Hutton * gcc.dg/vect/bb-slp-40.c: New test. diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-50.c b/gcc/testsuite/gcc.dg/Warray-bounds-50.c new file mode 100644 index 00000000000..d6edfac6ad7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Warray-bounds-50.c @@ -0,0 +1,114 @@ +/* PR middle-end/92349 - ICE in -Warray-bounds on a VLA member + { dg-do compile } + { dg-options "-O2 -Wall" } */ + +typedef __SIZE_TYPE__ size_t; + +void sink (void*, ...); + +void mem_vla_cst_store_idx (void) +{ + int n = 3; + + struct { + char a[n], b; + } s; + + char *p = s.a; + + s.a[0] = 0; + s.b = 0; + + *++p = 1; + *++p = 2; + + sink (&s, p); +} + +void mem_vla_range_store_idx (int n) +{ + if (n < 3 || 4 < n) + n = 3; + + struct { + char a[n], b; + } s; + + char *p = s.a; + + s.a[0] = 0; + s.b = 0; + + *++p = 1; + *++p = 2; + + sink (&s, p); +} + +void mem_vla_var_store_idx (size_t n) +{ + struct { + char a[n], b; + } s; + + char *p = s.a; + + s.a[0] = 0; + s.b = 0; + + *++p = 1; + *++p = 2; + + sink (&s, p); +} + + +void mem_vla_cst_store_ptr (void) +{ + int n = 3; + + struct { + char a[n], b; + } s; + + char *p = s.a; + + *p++ = __LINE__; + *p++ = __LINE__; + *p++ = __LINE__; + + sink (&s, p); +} + +void mem_vla_range_store_ptr (int n) +{ + if (n < 3 || 4 < n) + n = 3; + + struct { + char a[n], b; + } s; + + char *p = s.a; + + *p++ = __LINE__; + *p++ = __LINE__; + *p++ = __LINE__; + + sink (&s, p); +} + +void mem_vla_var_store_ptr (size_t n) +{ + struct { + char a[n], b; + } s; + + char *p = s.a; + + *p++ = __LINE__; + *p++ = __LINE__; + *p++ = __LINE__; + + sink (&s, p); +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 31258615247..da6b6151b4a 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -4164,7 +4164,8 @@ vrp_prop::check_array_ref (location_t location, tree ref, /* Try to determine the size of the trailing array from its initializer (if it has one). */ if (tree refsize = component_ref_size (arg, &interior_zero_len)) - maxbound = refsize; + if (TREE_CODE (refsize) == INTEGER_CST) + maxbound = refsize; } if (maxbound == ptrdiff_max -- 2.30.2