diff --git a/gcc/analyzer/region-model-manager.cc b/gcc/analyzer/region-model-manager.cc index 422c4a95e7b..75402649a91 100644 --- a/gcc/analyzer/region-model-manager.cc +++ b/gcc/analyzer/region-model-manager.cc @@ -781,6 +781,8 @@ region_model_manager::get_region_for_global (tree expr) const region * region_model_manager::get_field_region (const region *parent, tree field) { + gcc_assert (TREE_CODE (field) == FIELD_DECL); + field_region::key_t key (parent, field); if (field_region *reg = m_field_regions.get (key)) return reg; diff --git a/gcc/analyzer/region.cc b/gcc/analyzer/region.cc index c3dc8cdfa84..1823901a3ee 100644 --- a/gcc/analyzer/region.cc +++ b/gcc/analyzer/region.cc @@ -311,6 +311,8 @@ region::get_subregions_for_binding (region_model_manager *mgr, for (tree field = TYPE_FIELDS (get_type ()); field != NULL_TREE; field = DECL_CHAIN (field)) { + if (TREE_CODE (field) != FIELD_DECL) + continue; const region *subregion = mgr->get_field_region (this, field); subregion->get_subregions_for_binding (mgr, relative_bit_offset, diff --git a/gcc/testsuite/g++.dg/analyzer/pr96723.C b/gcc/testsuite/g++.dg/analyzer/pr96723.C new file mode 100644 index 00000000000..5d9980c9d2d --- /dev/null +++ b/gcc/testsuite/g++.dg/analyzer/pr96723.C @@ -0,0 +1,10 @@ +void +foo () +{ + union + { + int *p; + } u; + u.p = new int; + delete u.p; +}