diff options
author | David Malcolm <dmalcolm@redhat.com> | 2020-02-17 16:43:46 -0500 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2020-02-18 08:15:01 -0500 |
commit | 2e6233935c77b56a68e939c629702f960b8e6fb2 (patch) | |
tree | 3e29d3b277c5626585f6b3018c740a2de76df5d7 /gcc/analyzer/ChangeLog | |
parent | a674c7b8b8028c5d7e52dd38783e8e2b02034b63 (diff) | |
download | gcc-2e6233935c77b56a68e939c629702f960b8e6fb2.zip gcc-2e6233935c77b56a68e939c629702f960b8e6fb2.tar.gz gcc-2e6233935c77b56a68e939c629702f960b8e6fb2.tar.bz2 |
analyzer: fix ICE on COMPONENT_REF of ARRAY_TYPE [PR 93778]
PR analyzer/93778 reports an ICE with -fanalyzer on a gfortran test case
at this gimple stmt:
_gfortran_st_set_nml_var (&dt_parm.0, &ro.xi.jq, &"ro%xi%jq"[1]{lb: 1 sz: 1}, 4, 0, D.3913);
where ro.xi.jq is a COMPONENT_REF, but ro.xi is of type "struct bl[3]".
The analyzer's handling of COMPONENT_REF assumes that the type of the
1st argument is a RECORD_TYPE or UNION_TYPE, whereas in this case it's
an ARRAY_TYPE, leading to a failed as_a inside
region_model::get_field_region.
This patch fixes the ICE by generalizing the "give up on this tree code"
logic from r10-6667-gf76a88ebf089871dcce215aa0cb1956ccc060895 for
PR analyzer/93388, so that the analyzer gives up when it needs to get an
lvalue for a COMPONENT_REF on something other than a RECORD_TYPE or
UNION_TYPE.
gcc/analyzer/ChangeLog:
PR analyzer/93778
* engine.cc (impl_region_model_context::on_unknown_tree_code):
Rename to...
(impl_region_model_context::on_unexpected_tree_code): ...this and
convert first argument from path_var to tree.
(exploded_node::on_stmt): Pass ctxt to purge_for_unknown_fncall.
* exploded-graph.h (region_model_context::on_unknown_tree_code):
Rename to...
(region_model_context::on_unexpected_tree_code): ...this and
convert first argument from path_var to tree.
* program-state.cc (sm_state_map::purge_for_unknown_fncall): Add
ctxt param and pass on to calls to get_rvalue.
* program-state.h (sm_state_map::purge_for_unknown_fncall): Add
ctxt param.
* region-model.cc (region_model::handle_unrecognized_call): Pass
ctxt on to call to get_rvalue.
(region_model::get_lvalue_1): Move body of default case to
region_model::make_region_for_unexpected_tree_code and call it.
Within COMPONENT_REF case, reject attempts to handle types other
than RECORD_TYPE and UNION_TYPE.
(region_model::make_region_for_unexpected_tree_code): New
function, based on default case of region_model::get_lvalue_1.
* region-model.h
(region_model::make_region_for_unexpected_tree_code): New decl.
(region_model::on_unknown_tree_code): Rename to...
(region_model::on_unexpected_tree_code): ...this and convert first
argument from path_var to tree.
(class test_region_model_context): Update vfunc implementation for
above change.
gcc/testsuite/ChangeLog:
PR analyzer/93778
* gfortran.dg/analyzer/pr93778.f90: New test.
Diffstat (limited to 'gcc/analyzer/ChangeLog')
-rw-r--r-- | gcc/analyzer/ChangeLog | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/analyzer/ChangeLog b/gcc/analyzer/ChangeLog index 9e57209..05fb614 100644 --- a/gcc/analyzer/ChangeLog +++ b/gcc/analyzer/ChangeLog @@ -1,5 +1,37 @@ 2020-02-18 David Malcolm <dmalcolm@redhat.com> + PR analyzer/93778 + * engine.cc (impl_region_model_context::on_unknown_tree_code): + Rename to... + (impl_region_model_context::on_unexpected_tree_code): ...this and + convert first argument from path_var to tree. + (exploded_node::on_stmt): Pass ctxt to purge_for_unknown_fncall. + * exploded-graph.h (region_model_context::on_unknown_tree_code): + Rename to... + (region_model_context::on_unexpected_tree_code): ...this and + convert first argument from path_var to tree. + * program-state.cc (sm_state_map::purge_for_unknown_fncall): Add + ctxt param and pass on to calls to get_rvalue. + * program-state.h (sm_state_map::purge_for_unknown_fncall): Add + ctxt param. + * region-model.cc (region_model::handle_unrecognized_call): Pass + ctxt on to call to get_rvalue. + (region_model::get_lvalue_1): Move body of default case to + region_model::make_region_for_unexpected_tree_code and call it. + Within COMPONENT_REF case, reject attempts to handle types other + than RECORD_TYPE and UNION_TYPE. + (region_model::make_region_for_unexpected_tree_code): New + function, based on default case of region_model::get_lvalue_1. + * region-model.h + (region_model::make_region_for_unexpected_tree_code): New decl. + (region_model::on_unknown_tree_code): Rename to... + (region_model::on_unexpected_tree_code): ...this and convert first + argument from path_var to tree. + (class test_region_model_context): Update vfunc implementation for + above change. + +2020-02-18 David Malcolm <dmalcolm@redhat.com> + PR analyzer/93774 * region-model.cc (region_model::convert_byte_offset_to_array_index): Use |