Hi, this fixes PR middle-end/86528.
Bootstrapped and reg-tested on x86_64-pc-linux-gnu. Is it OK for trunk? Thanks Bernd.
gcc: 2018-07-04 Bernd Edlinger <bernd.edlin...@hotmail.de> PR middle-end/86528 * builtins.c (check_access): Bail out if range[0] is no INTEGER_CST. * expr.c (string_constant): Fix the element size of ARRAY_TYPE. testsuite: 2018-07-04 Bernd Edlinger <bernd.edlin...@hotmail.de> PR middle-end/86528 * gcc.c-torture/execute/pr86528.c: New test. * gcc.dg/Wrestrict-10.c (test_arr_strcat_2): Fix typo. --- /dev/null 2018-07-02 16:09:41.095282291 +0200 +++ gcc/testsuite/gcc.c-torture/execute/pr86528.c 2018-07-16 14:32:24.555426245 +0200 @@ -0,0 +1,20 @@ +/* PR middle-end/86528 */ + +void __attribute__((noinline, noclone)) +test(char *data, __SIZE_TYPE__ len) +{ + static char const appended[] = "/./"; + char *buf = __builtin_alloca (len + sizeof appended); + __builtin_memcpy (buf, data, len); + __builtin_strcpy (buf + len, &appended[data[len - 1] == '/']); + if (__builtin_strcmp(buf, "test1234/./")) + __builtin_abort(); +} + +int +main() +{ + char *arg = "test1234/"; + test(arg, __builtin_strlen(arg)); + return 0; +} --- gcc/testsuite/gcc.dg/Wrestrict-10.c.jj 2018-05-16 04:30:38.000000000 +0200 +++ gcc/testsuite/gcc.dg/Wrestrict-10.c 2018-07-16 16:06:13.250852255 +0200 @@ -39,8 +39,7 @@ test_arr_strcat_1 (void) void __attribute__ ((noclone, noinline)) test_arr_strcat_2 (void) { - /* This probably deserves a warning. */ - strcpy (b.a, &b.a[i]); + strcat (b.a, &b.a[i]); /* { dg-warning "\\\[-Wrestrict" } */ } void __attribute__ ((noclone, noinline)) --- gcc/builtins.c.jj 2018-07-13 16:10:45.000000000 +0200 +++ gcc/builtins.c 2018-07-16 12:48:18.880896706 +0200 @@ -3192,6 +3192,10 @@ check_access (tree exp, tree, tree, tree if (dstwrite) get_size_range (dstwrite, range); + /* This can happen at -O0. */ + if (range[0] && TREE_CODE (range[0]) != INTEGER_CST) + return false; + tree func = get_callee_fndecl (exp); /* First check the number of bytes to be written against the maximum --- gcc/expr.c.jj 2018-07-09 22:33:48.000000000 +0200 +++ gcc/expr.c 2018-07-16 13:18:03.433353514 +0200 @@ -11341,7 +11341,9 @@ string_constant (tree arg, tree *ptr_off tree offset = wide_int_to_tree (sizetype, base_off); if (varidx) { - if (tree eltsize = TYPE_SIZE_UNIT (TREE_TYPE (array))) + if (TREE_CODE (TREE_TYPE (array)) != ARRAY_TYPE) + return NULL_TREE; + if (tree eltsize = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (array)))) { /* Add the scaled variable index to the constant offset. */ tree eltoff = fold_build2 (MULT_EXPR, TREE_TYPE (offset),