https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93778

--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by David Malcolm <dmalc...@gcc.gnu.org>:

https://gcc.gnu.org/g:2e6233935c77b56a68e939c629702f960b8e6fb2

commit r10-6695-g2e6233935c77b56a68e939c629702f960b8e6fb2
Author: David Malcolm <dmalc...@redhat.com>
Date:   Mon Feb 17 16:43:46 2020 -0500

    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.

Reply via email to