From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7879) id 68A613858417; Wed, 15 Feb 2023 10:18:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 68A613858417 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1676456294; bh=EB9d83E6Wc/2dOgLV5zoS0lZL/uDu74GJfRBnW0zvwU=; h=From:To:Subject:Date:From; b=sq+nS0l5M+yJv6YSMFLrhhm0E9DkpwN7E9/M4sfm2pTpxW1hrcbtQ5Hp/qKsCCSvq XbNf4wl/o23MznWRgAHZNiE7HxvNMtsfndkmJJplwWoezFmHBpRrU0WF/clkLpb808 323PYXUHq/kiqfOyEPL/EO3D+9e3cj72G81BuzXI= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Filip Kastl To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/pheeck/heads/sccp)] analyzer: fix ICE on 'bind' that returns a struct [PR107788] X-Act-Checkin: gcc X-Git-Author: David Malcolm X-Git-Refname: refs/users/pheeck/heads/sccp X-Git-Oldrev: f0900a441a5aa54d07269303b2be2bfa4301378c X-Git-Newrev: 0306d532ad2f572ed6c4533a286afa67b51a89e9 Message-Id: <20230215101814.68A613858417@sourceware.org> Date: Wed, 15 Feb 2023 10:18:14 +0000 (GMT) List-Id: https://gcc.gnu.org/g:0306d532ad2f572ed6c4533a286afa67b51a89e9 commit 0306d532ad2f572ed6c4533a286afa67b51a89e9 Author: David Malcolm Date: Mon Nov 21 19:08:18 2022 -0500 analyzer: fix ICE on 'bind' that returns a struct [PR107788] gcc/analyzer/ChangeLog: PR analyzer/107788 * region-model.cc (region_model::update_for_int_cst_return): Require that the return type be an integer type. (region_model::update_for_nonzero_return): Likewise. gcc/testsuite/ChangeLog: PR analyzer/107788 * g++.dg/analyzer/fd-bind-pr107783.C: New test. Signed-off-by: David Malcolm Diff: --- gcc/analyzer/region-model.cc | 4 ++++ gcc/testsuite/g++.dg/analyzer/fd-bind-pr107783.C | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc index 1d5b09a6805..e71fd41f62d 100644 --- a/gcc/analyzer/region-model.cc +++ b/gcc/analyzer/region-model.cc @@ -1930,6 +1930,8 @@ region_model::update_for_int_cst_return (const call_details &cd, { if (!cd.get_lhs_type ()) return; + if (TREE_CODE (cd.get_lhs_type ()) != INTEGER_TYPE) + return; const svalue *result = m_mgr->get_or_create_int_cst (cd.get_lhs_type (), retval); if (unmergeable) @@ -1955,6 +1957,8 @@ region_model::update_for_nonzero_return (const call_details &cd) { if (!cd.get_lhs_type ()) return; + if (TREE_CODE (cd.get_lhs_type ()) != INTEGER_TYPE) + return; const svalue *zero = m_mgr->get_or_create_int_cst (cd.get_lhs_type (), 0); const svalue *result diff --git a/gcc/testsuite/g++.dg/analyzer/fd-bind-pr107783.C b/gcc/testsuite/g++.dg/analyzer/fd-bind-pr107783.C new file mode 100644 index 00000000000..eb5e23c82cf --- /dev/null +++ b/gcc/testsuite/g++.dg/analyzer/fd-bind-pr107783.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +struct minus { +} _1; +int _2; +struct _Bind { + _Bind(_Bind &); +}; +template +_Bind bind(_Func, _BoundArgs &&...); +void test01() { bind(minus(), _2, _1); }