analyzer: fix ICE converting float to int [PR96699]

gcc/analyzer/ChangeLog:
	PR analyzer/96699
	* region-model-manager.cc
	(region_model_manager::get_or_create_cast): Use FIX_TRUNC_EXPR for
	casting from REAL_TYPE to INTEGER_TYPE.

gcc/testsuite/ChangeLog:
	PR analyzer/96699
	* gcc.dg/analyzer/pr96699.c: New test.
This commit is contained in:
David Malcolm 2020-08-19 05:00:52 -04:00
parent 07d456bb80
commit 366bd1ac01
2 changed files with 18 additions and 0 deletions

View file

@ -396,6 +396,11 @@ region_model_manager::get_or_create_unaryop (tree type, enum tree_code op,
const svalue *
region_model_manager::get_or_create_cast (tree type, const svalue *arg)
{
gcc_assert (type);
if (arg->get_type ())
if (TREE_CODE (type) == INTEGER_TYPE
&& TREE_CODE (arg->get_type ()) == REAL_TYPE)
return get_or_create_unaryop (type, FIX_TRUNC_EXPR, arg);
return get_or_create_unaryop (type, NOP_EXPR, arg);
}

View file

@ -0,0 +1,13 @@
struct qi {
union {
int hj;
float sl;
};
};
void
i2 (struct qi *la)
{
if (la->hj == 0)
la->sl = 0.0f;
}