From 648af1684557e24e54a67b95b57fae2646cc2b56 Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Fri, 30 Aug 2019 17:49:17 +0000 Subject: [PATCH] PR middle-end/91599 - GCC does not say where warning is happening gcc/ChangeLog: PR middle-end/91599 * tree-ssa-strlen.c (handle_store): Use a fallback location if the statement doesn't have one. * gimple-pretty-print.c (percent_G_format): Same. gcc/testsuite/ChangeLog: PR middle-end/91599 * gcc.dg/Wstringop-overflow-16.c: New test. From-SVN: r275211 --- gcc/ChangeLog | 5 +++++ gcc/gimple-pretty-print.c | 6 +++++- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/Wstringop-overflow-16.c | 21 +++++++++++++++++++++ gcc/tree-ssa-strlen.c | 5 +++++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/Wstringop-overflow-16.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 45dd3a2..1a8026c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2019-08-30 Martin Sebor + PR middle-end/91599 + * tree-ssa-strlen.c (handle_store): Use a fallback location if + the statement doesn't have one. + * gimple-pretty-print.c (percent_G_format): Same. + PR middle-end/91584 * tree-vrp.c (vrp_prop::check_mem_ref): Normalize type domain bounds before using them to validate MEM_REF offset. diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c index ce339ee..2d5ece0 100644 --- a/gcc/gimple-pretty-print.c +++ b/gcc/gimple-pretty-print.c @@ -3034,8 +3034,12 @@ percent_G_format (text_info *text) { gimple *stmt = va_arg (*text->args_ptr, gimple*); + /* Fall back on the rich location if the statement doesn't have one. */ + location_t loc = gimple_location (stmt); + if (loc == UNKNOWN_LOCATION) + loc = text->m_richloc->get_loc (); tree block = gimple_block (stmt); - percent_K_format (text, gimple_location (stmt), block); + percent_K_format (text, loc, block); } #if __GNUC__ >= 10 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 420ddd4..83d17a3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2019-08-30 Martin Sebor + PR middle-end/91599 + * gcc.dg/Wstringop-overflow-16.c: New test. + PR middle-end/91584 * gfortran.dg/char_array_constructor_4.f90: New test. diff --git a/gcc/testsuite/gcc.dg/Wstringop-overflow-16.c b/gcc/testsuite/gcc.dg/Wstringop-overflow-16.c new file mode 100644 index 0000000..74548a4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wstringop-overflow-16.c @@ -0,0 +1,21 @@ +/* PR middle-end/91599 - GCC does not say where warning is happening + { dg-do compile } + { dg-options "-O2 -Wall" } */ + +struct charseq { + unsigned char bytes[0]; // { dg-message "object declared here" } +}; + +struct locale_ctype_t { + struct charseq *mboutdigits[10]; +}; + +void ctype_finish (struct locale_ctype_t *ctype) +{ + long unsigned int cnt; + for (cnt = 0; cnt < 20; ++cnt) { + static struct charseq replace[2]; + replace[0].bytes[1] = '\0'; // { dg-warning "\\\[-Wstringop-overflow" } + ctype->mboutdigits[cnt] = &replace[0]; + } +} diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 7bb5f52..b979320 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -4036,7 +4036,12 @@ handle_store (gimple_stmt_iterator *gsi) if (tree dstsize = compute_objsize (lhs, 1, &decl)) if (compare_tree_int (dstsize, lenrange[2]) < 0) { + /* Fall back on the LHS location if the statement + doesn't have one. */ location_t loc = gimple_nonartificial_location (stmt); + if (loc == UNKNOWN_LOCATION) + loc = tree_nonartificial_location (lhs); + loc = expansion_point_location_if_in_system_header (loc); if (warning_n (loc, OPT_Wstringop_overflow_, lenrange[2], "%Gwriting %u byte into a region of size %E", -- 2.7.4