From: Martin Sebor Date: Mon, 15 Jan 2018 06:15:09 +0000 (+0000) Subject: re PR other/83508 ([arm] c-c++-common/Wrestrict.c fails since r255836) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e0676e2e718a28b2eeb1ef483653edd3b026a470;p=gcc.git re PR other/83508 ([arm] c-c++-common/Wrestrict.c fails since r255836) PR other/83508 * builtins.c (check_access): Avoid warning when the no-warning bit is set. PR other/83508 * gcc.dg/Wstringop-overflow-2.c: New test. From-SVN: r256683 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0d908279e9c..ffcf36af539 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-01-14 Martin Sebor + + PR other/83508 + * builtins.c (check_access): Avoid warning when the no-warning bit + is set. + 2018-01-14 Cory Fields * tree-ssa-loop-im.c (sort_bbs_in_loop_postorder_cmp): Stabilize sort. diff --git a/gcc/builtins.c b/gcc/builtins.c index a0d0a10d38f..d9f1e476cb0 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3154,6 +3154,9 @@ check_access (tree exp, tree, tree, tree dstwrite, || (tree_fits_uhwi_p (dstwrite) && tree_int_cst_lt (dstwrite, range[0])))) { + if (TREE_NO_WARNING (exp)) + return false; + location_t loc = tree_nonartificial_location (exp); loc = expansion_point_location_if_in_system_header (loc); @@ -3213,6 +3216,9 @@ check_access (tree exp, tree, tree, tree dstwrite, if (tree_int_cst_lt (maxobjsize, range[0])) { + if (TREE_NO_WARNING (exp)) + return false; + /* Warn about crazy big sizes first since that's more likely to be meaningful than saying that the bound is greater than the object size if both are big. */ @@ -3234,6 +3240,9 @@ check_access (tree exp, tree, tree, tree dstwrite, if (dstsize != maxobjsize && tree_int_cst_lt (dstsize, range[0])) { + if (TREE_NO_WARNING (exp)) + return false; + if (tree_int_cst_equal (range[0], range[1])) warning_at (loc, opt, "%K%qD specified bound %E " @@ -3257,6 +3266,9 @@ check_access (tree exp, tree, tree, tree dstwrite, && dstwrite && range[0] && tree_int_cst_lt (slen, range[0])) { + if (TREE_NO_WARNING (exp)) + return false; + location_t loc = tree_nonartificial_location (exp); if (tree_int_cst_equal (range[0], range[1])) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a7b0364526f..37f54de8146 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-01-10 Martin Sebor + + PR other/83508 + * gcc.dg/Wstringop-overflow-2.c: New test. + 2018-01-14 Jerry DeLisle PR libgfortran/83811 diff --git a/gcc/testsuite/gcc.dg/Wstringop-overflow-2.c b/gcc/testsuite/gcc.dg/Wstringop-overflow-2.c new file mode 100644 index 00000000000..6e3e2ca0825 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wstringop-overflow-2.c @@ -0,0 +1,30 @@ +/* PR tree-optimization/83508 - c-c++-common/Wrestrict.c fails since r255836 + Test to verify that only one of -Wrestrict and -Wstringop-overflow is + issued for a problem where either would be appropriate. + { dg-do compile } + { dg-options "-O2 -Wrestrict -Wstringop-overflow" } */ + +#define DIFF_MAX __PTRDIFF_MAX__ + +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __SIZE_TYPE__ size_t; + +void sink (void*); + +void f (ptrdiff_t i, size_t n) +{ + if (i < DIFF_MAX - 2 || DIFF_MAX - 1 > i) + i = DIFF_MAX - 2; + + if (n < 4 || 5 < n) + n = 4; + + char a[8] = "012"; + + /* The following could very well be diagnosed by -Wstringop-overflow + instead but there's no way to verify that only one of the two + warnings is issued and the choice of -Wrestrict simply reflects + the fact that -Wrestrict runs before -Wstringop-overflow. */ + __builtin_strncpy (a + i, a, n); /* { dg-warning "\\\[-Wrestrict]" } */ + sink (a); +}