diff options
author | Martin Sebor <msebor@redhat.com> | 2020-03-25 09:39:50 -0600 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 2020-03-25 09:39:50 -0600 |
commit | 05c13c439903eb78f109bcab62fd9a74f03a3c9b (patch) | |
tree | 96a1286aa6c51248a3e3c702fbaa3bba67522500 /gcc/gimple-fold.c | |
parent | 0fca105f8ca95747fad3d3315e642ea9dc6936e0 (diff) | |
download | gcc-05c13c439903eb78f109bcab62fd9a74f03a3c9b.zip gcc-05c13c439903eb78f109bcab62fd9a74f03a3c9b.tar.gz gcc-05c13c439903eb78f109bcab62fd9a74f03a3c9b.tar.bz2 |
PR tree-optimization/94131 - ICE on printf with a VLA string and -fno-tree-ccp
gcc/testsuite/ChangeLog:
PR tree-optimization/94131
* gcc.dg/pr94131.c: New test.
gcc/ChangeLog:
PR tree-optimization/94131
* gimple-fold.c (get_range_strlen_tree): Fail for variable-length
types and decls.
* tree-ssa-strlen.c (get_range_strlen_dynamic): Avoid assuming
types have constant sizes.
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r-- | gcc/gimple-fold.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index c5939f1..55b78fa 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -1378,7 +1378,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind, /* Fail when the array bound is unknown or zero. */ val = TYPE_SIZE_UNIT (optype); - if (!val || integer_zerop (val)) + if (!val + || TREE_CODE (val) != INTEGER_CST + || integer_zerop (val)) return false; val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val, @@ -1412,7 +1414,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind, /* Fail when the array bound is unknown or zero. */ val = TYPE_SIZE_UNIT (optype); - if (!val || integer_zerop (val)) + if (!val + || TREE_CODE (val) != INTEGER_CST + || integer_zerop (val)) return false; val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val, integer_one_node); @@ -1448,7 +1452,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind, /* Fail if the offset is out of bounds. Such accesses should be diagnosed at some point. */ val = DECL_SIZE_UNIT (ref); - if (!val || integer_zerop (val)) + if (!val + || TREE_CODE (val) != INTEGER_CST + || integer_zerop (val)) return false; poly_offset_int psiz = wi::to_offset (val); |