PR tree-optimization/86696 - ICE in handle_char_store at gcc/tree-ssa-strlen.c:3332
gcc/ChangeLog: PR tree-optimization/86696 * tree-ssa-strlen.c (get_min_string_length): Handle all integer types, including enums. (handle_char_store): Be prepared for the above function to fail. gcc/testsuite/ChangeLog: PR tree-optimization/86696 * gcc.dg/pr86696.C: New test. From-SVN: r263032
This commit is contained in:
parent
254c23d3f4
commit
e4bbeea27e
4 changed files with 53 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
|||
2018-07-27 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR tree-optimization/86696
|
||||
* tree-ssa-strlen.c (get_min_string_length): Handle all integer
|
||||
types, including enums.
|
||||
(handle_char_store): Be prepared for the above function to fail.
|
||||
|
||||
2018-07-26 Qing Zhao <qing.zhao@oracle.com>
|
||||
|
||||
* builtins.c (inline_expand_builtin_string_cmp): Disable inlining
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2018-07-27 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR tree-optimization/86696
|
||||
* g++.dg/pr86696.C: New test.
|
||||
|
||||
2018-07-27 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
PR tree-optimization/86636
|
||||
|
|
30
gcc/testsuite/g++.dg/pr86696.C
Normal file
30
gcc/testsuite/g++.dg/pr86696.C
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* PR tree-optimization/86696 - ICE in handle_char_store at
|
||||
gcc/tree-ssa-strlen.c
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O2 -Wall -std=c++11" } */
|
||||
|
||||
typedef char a;
|
||||
template <typename b> struct c {
|
||||
int d;
|
||||
b e;
|
||||
};
|
||||
struct f;
|
||||
class g {
|
||||
public:
|
||||
void h(c<f>);
|
||||
};
|
||||
enum i {};
|
||||
enum j : a { k, l };
|
||||
struct f {
|
||||
i m;
|
||||
a n;
|
||||
a o;
|
||||
a p;
|
||||
j family;
|
||||
};
|
||||
void fn1() {
|
||||
i format{};
|
||||
f info{format, a(), 0, 4, l};
|
||||
g dest;
|
||||
dest.h({format, info});
|
||||
}
|
|
@ -3150,7 +3150,7 @@ handle_pointer_plus (gimple_stmt_iterator *gsi)
|
|||
static HOST_WIDE_INT
|
||||
get_min_string_length (tree rhs, bool *full_string_p)
|
||||
{
|
||||
if (TREE_CODE (TREE_TYPE (rhs)) == INTEGER_TYPE)
|
||||
if (INTEGRAL_TYPE_P (TREE_TYPE (rhs)))
|
||||
{
|
||||
if (tree_expr_nonzero_p (rhs))
|
||||
{
|
||||
|
@ -3315,9 +3315,16 @@ handle_char_store (gimple_stmt_iterator *gsi)
|
|||
Otherwise, we're storing an unknown value at offset OFFSET,
|
||||
so need to clip the nonzero_chars to OFFSET. */
|
||||
bool full_string_p = storing_all_zeros_p;
|
||||
HOST_WIDE_INT len = (storing_nonzero_p
|
||||
? get_min_string_length (rhs, &full_string_p)
|
||||
: 1);
|
||||
HOST_WIDE_INT len = 1;
|
||||
if (storing_nonzero_p)
|
||||
{
|
||||
/* Try to get the minimum length of the string (or
|
||||
individual character) being stored. If it fails,
|
||||
STORING_NONZERO_P guarantees it's at least 1. */
|
||||
len = get_min_string_length (rhs, &full_string_p);
|
||||
if (len < 0)
|
||||
len = 1;
|
||||
}
|
||||
|
||||
location_t loc = gimple_location (stmt);
|
||||
tree oldlen = si->nonzero_chars;
|
||||
|
|
Loading…
Add table
Reference in a new issue