On x86 and x86_64 at least, always amazing that ACATS didn't catch it. As noted in the source, removing a "constant" keyword get rid of the ICE, so this may have to do with constant-ness.
$ gcc -c p.adb +===========================GNAT BUG DETECTED==============================+ | 4.0.0 20050213 (experimental) (x86_64-unknown-linux-gnu) GCC error: | | in copy_tree_r, at tree-inline.c:2320 | | Error detected at p.adb:17:5 | $ cat p.adb procedure P is type R (D : Boolean := False) is record case D is when False => null; when True => A : Natural; end case; end record; X1 : R; X2 : constant R := X1; -- without constant it works begin null; end P; -- Summary: ICE copy_tree_r, at tree-inline.c:2320 on simple Ada code Product: gcc Version: 4.0.0 Status: UNCONFIRMED Keywords: ice-on-valid-code Severity: normal Priority: P2 Component: ada AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: laurent at guerby dot net CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19956