From 51c7954daf0d223599ad0aeea64b63816ee1e354 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 26 Mar 2011 10:18:54 +0000 Subject: [PATCH] decl.c (gnat_to_gnu_entity): Create TYPE_DECL for the padded type built to support a specified size or alignment. * gcc-interface/decl.c (gnat_to_gnu_entity) : Create TYPE_DECL for the padded type built to support a specified size or alignment. From-SVN: r171554 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/decl.c | 17 ++++++++++++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/discr27.adb | 31 +++++++++++++++++++++++++++++++ gcc/testsuite/gnat.dg/discr27.ads | 7 +++++++ 5 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/discr27.adb create mode 100644 gcc/testsuite/gnat.dg/discr27.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index a4d45a5..91725e4 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,10 @@ 2011-03-26 Eric Botcazou + * gcc-interface/decl.c (gnat_to_gnu_entity) : Create TYPE_DECL + for the padded type built to support a specified size or alignment. + +2011-03-26 Eric Botcazou + * gcc-interface/gigi.h (finalize_from_with_types): Adjust comment. * gcc-interface/decl.c (gnat_to_gnu_entity) : Defer unconditionally to the end of the unit when the designated type is diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index d3d2b96..cea8d3d 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -911,9 +911,20 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) size of the object. */ gnu_object_size = gnu_size ? gnu_size : TYPE_SIZE (gnu_type); if (gnu_size || align > 0) - gnu_type = maybe_pad_type (gnu_type, gnu_size, align, gnat_entity, - false, false, definition, - gnu_size ? true : false); + { + tree orig_type = gnu_type; + + gnu_type = maybe_pad_type (gnu_type, gnu_size, align, gnat_entity, + false, false, definition, + gnu_size ? true : false); + + /* If a padding record was made, declare it now since it will + never be declared otherwise. This is necessary to ensure + that its subtrees are properly marked. */ + if (gnu_type != orig_type && !DECL_P (TYPE_NAME (gnu_type))) + create_type_decl (TYPE_NAME (gnu_type), gnu_type, NULL, true, + debug_info_p, gnat_entity); + } /* If this is a renaming, avoid as much as possible to create a new object. However, in several cases, creating it is required. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4f1fa8a..28ab5b9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2011-03-26 Eric Botcazou + * gnat.dg/discr27.ad[sb]: New test. + +2011-03-26 Eric Botcazou + * gnat.dg/limited_with2.ad[sb]: New test. * gnat.dg/limited_with2_pkg1.ads: New helper. * gnat.dg/imited_with2_pkg2.ads: Likewise. diff --git a/gcc/testsuite/gnat.dg/discr27.adb b/gcc/testsuite/gnat.dg/discr27.adb new file mode 100644 index 0000000..cfaba34 --- /dev/null +++ b/gcc/testsuite/gnat.dg/discr27.adb @@ -0,0 +1,31 @@ +package body Discr27 is + + subtype Index is Positive range 1..4096; + + function F return String is + S : String(1..1) := (others =>'w'); + begin + return S; + end; + + type Enum is (One, Two); + + type Rec (D : Enum := One; Len : Index := 1) is record + case D is + when One => I : Integer; + when Two => A : String(1..Len); + end case; + end record; + + procedure Nothing is + M : constant String := F; + C : constant Rec := (Two, M'Length, M); + begin + null; + end; + + procedure Proc is begin + null; + end; + +end Discr27; diff --git a/gcc/testsuite/gnat.dg/discr27.ads b/gcc/testsuite/gnat.dg/discr27.ads new file mode 100644 index 0000000..db1914a --- /dev/null +++ b/gcc/testsuite/gnat.dg/discr27.ads @@ -0,0 +1,7 @@ +-- { dg-do compile } + +package Discr27 is + + procedure Proc; + +end Discr27; -- 2.7.4