diff options
author | David Malcolm <dmalcolm@redhat.com> | 2020-08-27 18:20:24 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2020-08-31 16:06:50 -0400 |
commit | ecdb93224c56189a129e97c556fe6b78e1b15a63 (patch) | |
tree | 6a4585b076cd707a9f943b7487fa129abe089cb2 /gcc/analyzer/svalue.cc | |
parent | d503cd98713a41aad34ade2b9b0d9973efb21e11 (diff) | |
download | gcc-ecdb93224c56189a129e97c556fe6b78e1b15a63.zip gcc-ecdb93224c56189a129e97c556fe6b78e1b15a63.tar.gz gcc-ecdb93224c56189a129e97c556fe6b78e1b15a63.tar.bz2 |
analyzer: fix ICE on casting float to pointer [PR96764]
gcc/analyzer/ChangeLog:
PR analyzer/96764
* region-model-manager.cc
(region_model_manager::maybe_fold_unaryop): Handle VIEW_CONVERT_EXPR.
(region_model_manager::get_or_create_cast): Move logic for
real->integer casting to...
(get_code_for_cast): ...this new function, and add logic for
real->non-integer casts.
(region_model_manager::maybe_fold_sub_svalue): Handle
VIEW_CONVERT_EXPR.
* region-model.cc
(region_model::add_any_constraints_from_gassign): Likewise.
* svalue.cc (svalue::maybe_undo_cast): Likewise.
(unaryop_svalue::dump_to_pp): Likewise.
gcc/testsuite/ChangeLog:
PR analyzer/96764
* gcc.dg/analyzer/pr96764.c: New test.
Diffstat (limited to 'gcc/analyzer/svalue.cc')
-rw-r--r-- | gcc/analyzer/svalue.cc | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/gcc/analyzer/svalue.cc b/gcc/analyzer/svalue.cc index a1c6241..fcab578 100644 --- a/gcc/analyzer/svalue.cc +++ b/gcc/analyzer/svalue.cc @@ -128,16 +128,19 @@ svalue::maybe_get_constant () const return NULL_TREE; } -/* If this svalue is a cast (i.e a unaryop NOP_EXPR), return the underlying - svalue. +/* If this svalue is a cast (i.e a unaryop NOP_EXPR or VIEW_CONVERT_EXPR), + return the underlying svalue. Otherwise return NULL. */ const svalue * svalue::maybe_undo_cast () const { if (const unaryop_svalue *unaryop_sval = dyn_cast_unaryop_svalue ()) - if (unaryop_sval->get_op () == NOP_EXPR) - return unaryop_sval->get_arg (); + { + enum tree_code op = unaryop_sval->get_op (); + if (op == NOP_EXPR || op == VIEW_CONVERT_EXPR) + return unaryop_sval->get_arg (); + } return NULL; } @@ -566,7 +569,7 @@ unaryop_svalue::dump_to_pp (pretty_printer *pp, bool simple) const { if (simple) { - if (m_op == NOP_EXPR) + if (m_op == VIEW_CONVERT_EXPR || m_op == NOP_EXPR) { pp_string (pp, "CAST("); dump_tree (pp, get_type ()); |