diff options
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r-- | gcc/tree-ssa-strlen.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 80309e4..f64bc9b 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -1989,15 +1989,18 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt) lenrange[0] = lenrange[1] = wi::shwi (~sidx, prec); else { - tree range[2]; - get_range_strlen (src, range); - if (range[0] != NULL_TREE - && TREE_CODE (range[0]) == INTEGER_CST - && range[1] != NULL_TREE - && TREE_CODE (range[1]) == INTEGER_CST) - { - lenrange[0] = wi::to_wide (range[0], prec); - lenrange[1] = wi::to_wide (range[1], prec); + c_strlen_data lendata = { }; + get_range_strlen (src, &lendata, /* eltsize = */1); + if (TREE_CODE (lendata.minlen) == INTEGER_CST + && TREE_CODE (lendata.maxbound) == INTEGER_CST) + { + /* When LENDATA.MAXLEN is unknown, reset LENDATA.MINLEN + which stores the length of the shortest known string. */ + if (integer_all_onesp (lendata.maxlen)) + lenrange[0] = wi::shwi (0, prec); + else + lenrange[0] = wi::to_wide (lendata.minlen, prec); + lenrange[1] = wi::to_wide (lendata.maxbound, prec); } else { |