diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e05c969993..d443cb45ed4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2020-03-17 Jakub Jelinek + PR middle-end/94189 + * builtins.c (expand_builtin_strnlen): Do return NULL_RTX if we would + emit a warning if it was enabled and don't depend on TREE_NO_WARNING + for code-generation. + Backported from mainline 2020-03-16 Jakub Jelinek diff --git a/gcc/builtins.c b/gcc/builtins.c index ed11f79ff0b..e8e43f53ec6 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3112,27 +3112,25 @@ expand_builtin_strnlen (tree exp, rtx target, machine_mode target_mode) return NULL_RTX; } - if (lendata.decl - && !TREE_NO_WARNING (exp) - && ((tree_int_cst_lt (len, bound)) - || !exact)) + if (lendata.decl && (tree_int_cst_lt (len, bound) || !exact)) { location_t warnloc = expansion_point_location_if_in_system_header (loc); - if (warning_at (warnloc, OPT_Wstringop_overflow_, - exact - ? G_("%K%qD specified bound %E exceeds the size %E " - "of unterminated array") - : G_("%K%qD specified bound %E may exceed the size " - "of at most %E of unterminated array"), - exp, func, bound, len)) + if (!TREE_NO_WARNING (exp) + && warning_at (warnloc, OPT_Wstringop_overflow_, + exact + ? G_("%K%qD specified bound %E exceeds the size " + "%E of unterminated array") + : G_("%K%qD specified bound %E may exceed the " + "size of at most %E of unterminated array"), + exp, func, bound, len)) { inform (DECL_SOURCE_LOCATION (lendata.decl), "referenced argument declared here"); TREE_NO_WARNING (exp) = true; - return NULL_RTX; } + return NULL_RTX; } if (!len) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 522a7608203..f982ee6a9ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2020-03-17 Jakub Jelinek + PR middle-end/94189 + * gcc.dg/pr94189.c: New test. + Backported from mainline 2020-03-16 Jakub Jelinek diff --git a/gcc/testsuite/gcc.dg/pr94189.c b/gcc/testsuite/gcc.dg/pr94189.c new file mode 100644 index 00000000000..f927d55279a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr94189.c @@ -0,0 +1,11 @@ +/* PR middle-end/94189 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcompare-debug" } */ + +const char a[] = { 'a', 'b', 'c', 'd' };/* { dg-message "declared here" } */ + +int +foo (void) +{ + return __builtin_strnlen (a, 5); /* { dg-warning "specified bound 5 exceeds the size 4 of unterminated array" } */ +}