https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117643

--- Comment #17 from kargls at comcast dot net ---
On 12/24/24 10:03, jvdelisle at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117643
> 
> --- Comment #15 from Jerry DeLisle <jvdelisle at gcc dot gnu.org> ---
>  From Harald's post. "There is another case I found while playing which is
> rejected:
> 
>     print *, f_c_string(c_char_"abc", asis)    "
> 
> I bet the parsing does not handle c_char_ with the two underscores. I have not
> actually tried that case yet. (I wanted to capture it here.)
> 

Looks like a more general problem than just my patch.  In gdb, I see

(gdb) p *string
$11 = {expr_type = EXPR_CONSTANT, ts = {type = BT_CHARACTER, kind = 1,
        u = {derived = 0x80426fba0, cl = 0x80426fba0, pad = 69663648},
        interface = 0x0, is_c_interop = 0, is_iso_c = 0,
        f90_type = BT_UNKNOWN, deferred = false, interop_kind = 0x0},
        ...}

It seems parsing of a c_char_'string_constant' is setting neither
is_c_interop nor is_iso_c.  I would assume is_c_interop should be
set.

I suppose the error in check.cc(gfc_check_f_c_string) that starts
with

    if (string->ts.type != BT_CHARACTER
       || (string->ts.type == BT_CHARACTER
          && (string->ts.kind != 1 || string->ts.is_c_interop != 1)))

can be suppressed for (string.expr_type == EXPR_CONSTANT &&
string->ts.type == BT_CHARACTER && string->ts.kind == 1)

Reply via email to