Commit 5828c09a by Bernd Edlinger Committed by Bernd Edlinger

re PR middle-end/86528 (strlen of constant string malfunction -- had to back out…

re PR middle-end/86528 (strlen of constant string malfunction -- had to back out fix for PR middle-end/77357)

gcc:
2018-07-16  Bernd Edlinger  <bernd.edlinger@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-16  Bernd Edlinger  <bernd.edlinger@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.

From-SVN: r262742
parent b8c9cad3
2018-07-16 Bernd Edlinger <bernd.edlinger@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.
2018-07-16 Kelvin Nilsen <kelvin@gcc.gnu.org>
* doc/extend.texi (PowerPC AltiVec Built-in Functions):
......
......@@ -3192,6 +3192,10 @@ check_access (tree exp, tree, tree, tree dstwrite,
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
......
......@@ -11341,7 +11341,9 @@ string_constant (tree arg, tree *ptr_offset)
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),
......
2018-07-16 Bernd Edlinger <bernd.edlinger@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.
2018-07-16 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/template/spec40.C: New.
......
/* 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;
}
......@@ -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))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment