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

Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ebotcazou at gcc dot gnu.org

--- Comment #13 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
This is problematic for Ada (and I don't understand why it has been backported
onto the 14 branch since it touches quite a sensitive code and the issue is not
a regression AFAICS).  The LTO compiler relies on this machinery to recompute
TYPE_CANONICAL and disregarding the size of the array field leads to
nonsensical results.

Ada testcase:

with Ada.Strings.Bounded;

package Q is

  package M is new Ada.Strings.Bounded.Generic_Bounded_Length (10);

  type T is new M.Bounded_String;

  Null_T : constant T;

private
  Null_T : constant T := To_Bounded_String ("");
end;

with Q;

procedure P is
begin
  null;
end;

compiled with gnatmake p -O -flto yields:

during RTL pass: expand
In function 'q__m__to_bounded_string',
    inlined from 'q___elabs' at q.ads:12:26,
    inlined from 'ada_main__adainit' at
/home/eric/build/gcc-14/native/tmp/b~p.adb:169:8,
    inlined from 'main' at /home/eric/build/gcc-14/native/tmp/b~p.adb:200:7:
/home/eric/install/gcc-14/lib64/gcc/x86_64-suse-linux/14.2.1/adainclude/a-strbou.adb:101:10:
internal compiler error: in expand_expr_real_2, at expr.cc:9683
  101 |          return To_Super_String (Source, Max_Length, Drop);
      |          ^
0x6eab12 expand_expr_real_2(separate_ops*, rtx_def*, machine_mode,
expand_modifier)
        /home/eric/cvs/gcc-14/gcc/expr.cc:9683

because the LTO compiler wrongly removes a VIEW_CONVERT_EXPR between a dynamic
record type and a static version of it, as they now incorrectly have the same
TYPE_CANONICAL.

Reply via email to