[Ada] Spurious error on pragma Independent_Components
authorHristian Kirtchev <kirtchev@adacore.com>
Thu, 24 May 2018 13:05:03 +0000 (13:05 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 24 May 2018 13:05:03 +0000 (13:05 +0000)
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

gcc/ada/ChangeLog
gcc/ada/sem_prag.adb

index cad2b78..efe7559 100644 (file)
@@ -1,5 +1,10 @@
 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.
index d75f20e..c85d26f 100644 (file)
@@ -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.