decl.c (gnat_to_gnu_entity): Move code dealing with volatileness to after code dealing with renaming.

* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Move code
	dealing with volatileness to after code dealing with renaming.

From-SVN: r140924
This commit is contained in:
Eric Botcazou 2008-10-07 08:10:27 +00:00 committed by Eric Botcazou
parent 4c6f977010
commit 9cf18af8ee
5 changed files with 64 additions and 32 deletions

View file

@ -1,3 +1,8 @@
2008-10-07 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Move code
dealing with volatileness to after code dealing with renaming.
2008-10-06 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Minor tweaks.

View file

@ -828,22 +828,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
"PAD", false, definition,
gnu_size ? true : false);
/* Make a volatile version of this object's type if we are to make
the object volatile. We also interpret 13.3(19) conservatively
and disallow any optimizations for an object covered by it. */
if ((Treat_As_Volatile (gnat_entity)
|| (Is_Exported (gnat_entity)
/* Exclude exported constants created by the compiler,
which should boil down to static dispatch tables and
make it possible to put them in read-only memory. */
&& (Comes_From_Source (gnat_entity) || !const_flag))
|| Is_Imported (gnat_entity)
|| Present (Address_Clause (gnat_entity)))
&& !TYPE_VOLATILE (gnu_type))
gnu_type = build_qualified_type (gnu_type,
(TYPE_QUALS (gnu_type)
| TYPE_QUAL_VOLATILE));
/* If this is a renaming, avoid as much as possible to create a new
object. However, in several cases, creating it is required.
This processing needs to be applied to the raw expression so
@ -991,22 +975,38 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
}
}
/* If this is an aliased object whose nominal subtype is unconstrained,
the object is a record that contains both the template and
the object. If there is an initializer, it will have already
been converted to the right type, but we need to create the
template if there is no initializer. */
else if (definition
&& TREE_CODE (gnu_type) == RECORD_TYPE
&& (TYPE_CONTAINS_TEMPLATE_P (gnu_type)
/* Beware that padding might have been introduced
via maybe_pad_type above. */
|| (TYPE_IS_PADDING_P (gnu_type)
&& TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type)))
== RECORD_TYPE
&& TYPE_CONTAINS_TEMPLATE_P
(TREE_TYPE (TYPE_FIELDS (gnu_type)))))
&& !gnu_expr)
/* Make a volatile version of this object's type if we are to make
the object volatile. We also interpret 13.3(19) conservatively
and disallow any optimizations for an object covered by it. */
if ((Treat_As_Volatile (gnat_entity)
|| (Is_Exported (gnat_entity)
/* Exclude exported constants created by the compiler,
which should boil down to static dispatch tables and
make it possible to put them in read-only memory. */
&& (Comes_From_Source (gnat_entity) || !const_flag))
|| Is_Imported (gnat_entity)
|| Present (Address_Clause (gnat_entity)))
&& !TYPE_VOLATILE (gnu_type))
gnu_type = build_qualified_type (gnu_type,
(TYPE_QUALS (gnu_type)
| TYPE_QUAL_VOLATILE));
/* If we are defining an aliased object whose nominal subtype is
unconstrained, the object is a record that contains both the
template and the object. If there is an initializer, it will
have already been converted to the right type, but we need to
create the template if there is no initializer. */
if (definition
&& !gnu_expr
&& TREE_CODE (gnu_type) == RECORD_TYPE
&& (TYPE_CONTAINS_TEMPLATE_P (gnu_type)
/* Beware that padding might have been introduced
via maybe_pad_type above. */
|| (TYPE_IS_PADDING_P (gnu_type)
&& TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type)))
== RECORD_TYPE
&& TYPE_CONTAINS_TEMPLATE_P
(TREE_TYPE (TYPE_FIELDS (gnu_type))))))
{
tree template_field
= TYPE_IS_PADDING_P (gnu_type)

View file

@ -1,3 +1,8 @@
2008-10-07 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/addr4.adb: New test.
* gnat.dg/addr5.adb: Likewise.
2008-10-06 Adam Nemet <anemet@caviumnetworks.com>
* gcc.target/mips/mips.exp (dg-mips-options): Set mips_new_gp to

View file

@ -0,0 +1,12 @@
-- { dg-do compile }
-- { dg-options "-g" }
procedure Addr4 is
function F return String is begin return ""; end F;
S1 : String renames F;
subtype ST is String (1 .. S1'Length);
S2 : ST;
for S2'Address use S1'Address;
begin
null;
end;

View file

@ -0,0 +1,10 @@
-- { dg-do compile }
-- { dg-options "-g" }
procedure Addr5 (Len : Integer) is
S : aliased String (1 .. Len) := (others => ' ');
C : Character;
for C'Address use S'Address;
begin
null;
end;