https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103828
--- Comment #4 from Francois-Xavier Coudert <fxcoudert at gcc dot gnu.org> --- Wait, there is more, lower in gfc_conv_scalar_char_value(): /* If we have a constant character expression, make it into an integer. */ if ((*expr)->expr_type == EXPR_CONSTANT) { gfc_typespec ts; gfc_clear_ts (&ts); *expr = gfc_get_int_expr (gfc_default_character_kind, NULL, (*expr)->value.character.string[0]); if ((*expr)->ts.kind != gfc_c_int_kind) { /* The expr needs to be compatible with a C int. If the conversion fails, then the 2 causes an ICE. */ ts.type = BT_INTEGER; ts.kind = gfc_c_int_kind; gfc_convert_type (*expr, &ts, 2); } } And… we're forcing it into a C int. Again. The commit that introduced this function is: +2007-08-06 Christopher D. Rickett <crick...@lanl.gov> + + PR fortran/32732 + * trans-expr.c (gfc_conv_scalar_char_value): Convert the tree and + actual arg expressions for scalar characters passed by-value to + bind(c) routines. + (gfc_conv_function_call): Call gfc_conv_scalar_char_value. + * trans.h: Add prototype for gfc_conv_scalar_char_value. + * trans-decl.c (generate_local_decl): Convert by-value character + dummy args of bind(c) procedures using + gfc_conv_scalar_char_value. It's interesting to note that, at the time, the testcase was failing on IA64 HP-UX, although the bug was still marked as fixed.