Hi Mark, I have a question about your patch for PR c++/26534. In particular, you added to standard_conversion in call.c the following code:
if (expr) { tree bitfield_type; bitfield_type = is_bitfield_expr_with_lowered_type (expr); if (bitfield_type) from = bitfield_type; } Now consider the following testcase derived from PR c++/27505 and my analysis on why it fails. struct s { bool field:8; }; void foo (struct s *p) { if (!p->field) ; } When build_unary_op builds TRUTH_NOT_EXPR, it calls perform_implicit_conversion to convert p->field to the boolean type. (FWIW, p->field is expressed as <component_ref <indirect_ref ...> <field_ref ...>>). The call to perform_implicit_conversion eventually gets to standard_conversion. The code fragment of standard_conversion shown above changes FROM to the boolean_type. Since TO is also the boolean type, no conversion happens, causing perform_implicit_conversion to return the original expression, which is of INTEGER_TYPE. invert_truthvalue, called from cp/typeck.c:3969, expects nothing but expressions of BOOLEAN_TYPE, so it ICEs at fold-const.c:3165. Now, is the code in standard_conversion meant to be an optimization or something that's required for language conformance? If the latter is the case, can we somehow force a conversion? Thanks, Kazu Hirata