aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gimple-pretty-print.c6
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/Wstringop-overflow-16.c21
-rw-r--r--gcc/tree-ssa-strlen.c5
5 files changed, 39 insertions, 1 deletions
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 <msebor@redhat.com>
+ 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 <msebor@redhat.com>
+ 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",