Commit d2bb0bbf by Hristian Kirtchev Committed by Pierre-Marie de Rodat

[Ada] Spurious error on pragma Independent_Components

This patch modifies the analysis of pragma Independent_Components to account
for a side effect from handling of self-referential records which render the
pragma illegal.

------------
-- Source --
------------

--  pack.ads

package Pack is
   type OK is record
      Comp_1 : Integer;
      Comp_2 : access OK;
   end record;
   pragma Independent_Components (OK);

   type Error;
   pragma Independent_Components (Error);
   type Error is record
      Comp : Integer;
   end record;
end Pack;

----------------------------
-- Compilation and output --
----------------------------

$ gcc -c pack.ads
pack.ads:9:04: representation item must be after full type declaration

2018-05-24  Hristian Kirtchev  <kirtchev@adacore.com>

gcc/ada/

	* sem_prag.adb (Analyze_Pragma): Use the full view of an internally
	generated incomplete type.

From-SVN: r260649
parent 9057bd6a
2018-05-24 Hristian Kirtchev <kirtchev@adacore.com>
* sem_prag.adb (Analyze_Pragma): Use the full view of an internally
generated incomplete type.
2018-05-24 Hristian Kirtchev <kirtchev@adacore.com>
* expander.adb (Expand): Update the save and restore of the Ghost
region.
* exp_ch3.adb (Freeze_Type): Likewise.
......
......@@ -16999,6 +16999,38 @@ package body Sem_Prag is
E := Entity (E_Id);
-- A record type with a self-referential component of anonymous
-- access type is given an incomplete view in order to handle the
-- self reference:
--
-- type Rec is record
-- Self : access Rec;
-- end record;
--
-- becomes
--
-- type Rec;
-- type Ptr is access Rec;
-- type Rec is record
-- Self : Ptr;
-- end record;
--
-- Since the incomplete view is now the initial view of the type,
-- the argument of the pragma will reference the incomplete view,
-- but this view is illegal according to the semantics of the
-- pragma.
--
-- Obtain the full view of an internally-generated incomplete type
-- only. This way an attempt to associate the pragma with a source
-- incomplete type is still caught.
if Ekind (E) = E_Incomplete_Type
and then not Comes_From_Source (E)
and then Present (Full_View (E))
then
E := Full_View (E);
end if;
-- A pragma that applies to a Ghost entity becomes Ghost for the
-- purposes of legality checks and removal of ignored Ghost code.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment