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

--- Comment #30 from anlauf at gcc dot gnu.org ---
(In reply to David Edelsohn from comment #29)
> Maybe something about the way that GFORTRAN is passing the string by value. 
> 257.optimized shows
> 
>   val (&"B"[1]{lb: 1 sz: 1}, "B", 1, 1);
>   val (&"A"[1]{lb: 1 sz: 1}, "A", 1, 1);
>   val (&"A"[1]{lb: 1 sz: 1}, 65, 1, 1);
>   val (&"A"[1]{lb: 1 sz: 1}, 65, 1, 1);
>   val (&"A"[1]{lb: 1 sz: 1}, 65, 1, 1);
>   _37 = c[1]{lb: 1 sz: 1};
>   val (&"1"[1]{lb: 1 sz: 1}, _37, 1, 1);
>   _38 = c[1]{lb: 1 sz: 1};
>   val (&"1"[1]{lb: 1 sz: 1}, _38, 1, 1);
> 
> &"B"[1] is not shifted.  65 is not shifted.  "B" is shifted.
> 
> GFORTRAN is passing the value in different ways that trigger different parts
> of the target ABI.  It seems to be assuming that those different parts of
> the ABI and forms of parameter passing will produce the same results in
> terms of padding, but that is not guaranteed.

Is it possible that a VIEW_CONVERT_EXPR is needed for handling this, and
that this is forgotten or wrong for one of those variants?

There exists native_encode_expr, which appears to handle constant exprs,
and which might pass "B" to native_encode_string, and we need to emulate
this conversion for non-constant char expressions.  (Just guessing.)

That &"B"[1] is not shifted is not surprising: we are passing this argument
by reference, not value.

Reply via email to