@@ -15,6 +15,7 @@ Author: Daniel Kroening, kroening@kroening.com
1515#include < util/config.h>
1616#include < util/cprover_prefix.h>
1717#include < util/expr_util.h>
18+ #include < util/find_symbols.h>
1819#include < util/floatbv_expr.h>
1920#include < util/ieee_float.h>
2021#include < util/mathematical_expr.h>
@@ -1608,17 +1609,20 @@ void c_typecheck_baset::typecheck_expr_trinary(if_exprt &expr)
16081609 exprt tmp1=simplify_expr (operands[1 ], *this );
16091610 exprt tmp2=simplify_expr (operands[2 ], *this );
16101611
1611- // is one of them void * AND null? Convert that to the other.
1612- // (at least that's how GCC behaves)
1612+ // Is one of them void * AND null? Convert that to the other.
1613+ // (At least that's how GCC, Clang, and Visual Studio behave. Presence of
1614+ // symbols blocks them from simplifying the expression to NULL.)
16131615 if (
16141616 to_pointer_type (operands[1 ].type ()).base_type ().id () == ID_empty &&
1615- tmp1.is_constant () && is_null_pointer (to_constant_expr (tmp1)))
1617+ tmp1.is_constant () && is_null_pointer (to_constant_expr (tmp1)) &&
1618+ find_symbols (operands[1 ]).empty ())
16161619 {
16171620 implicit_typecast (operands[1 ], operands[2 ].type ());
16181621 }
16191622 else if (
16201623 to_pointer_type (operands[2 ].type ()).base_type ().id () == ID_empty &&
1621- tmp2.is_constant () && is_null_pointer (to_constant_expr (tmp2)))
1624+ tmp2.is_constant () && is_null_pointer (to_constant_expr (tmp2)) &&
1625+ find_symbols (operands[2 ]).empty ())
16221626 {
16231627 implicit_typecast (operands[2 ], operands[1 ].type ());
16241628 }
0 commit comments