3vtrasym.adb, [...]: Minor reformatting
authorArnaud Charlet <charlet@gcc.gnu.org>
Wed, 29 Oct 2003 10:26:16 +0000 (11:26 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 29 Oct 2003 10:26:16 +0000 (11:26 +0100)
* 3vtrasym.adb, 5vtraent.ads, sprint.adb,
sem_ch10.adb: Minor reformatting

* exp_ch5.adb (Expand_Assign_Array): Test for bit unaligned operands
(Expand_Assign_Record): Test right hand side for bit unaligned as well

* 3vtrasym.adb:
* 5vtraent.adb:
* 5vtraent.ads:
* tb-alvms.c:
Support for TBK$SYMBOLIZE-based symbolic traceback.

* exp_disp.adb:
Revert previous change, that did not work well when pragma No_Run_Time
was used in conjunction with a run-time other than ZFP.

* make.adb:
(Gnatmake): When there are no Ada mains in attribute Main, disable the
 bind and link steps only is switch -z is not used.

* Makefile.generic: Remove duplicated setting of CC.

* Makefile.prolog: Set CC to gcc by default, to override make's
default (cc).

* einfo.h: Regenerated.

* sem_ch10.adb (Analyze_Subunit): Restore state of suppress flags for
current body, after compiling subunit.

* itypes.adb (Create_Itype): In ASIS_Mode, do not freeze the itype
when in deleted code, because gigi needs properly ordered freeze
actions to annotate types.

* freeze.adb (Is_Fully_Defined): Predicate must be recursive, to
prevent the premature freezing of record type that contains
subcomponents with a private type that does not yet have a completion.

* sem_ch12.adb:
(Analyze_Package_Instantiation): Check that instances can not be used in
limited with_clauses.

* sem_ch8.adb:
(Analyze_Package_Renaming): Check that limited withed packages cannot
be renamed. Improve text on error messages related to limited
with_clauses.

* einfo.adb, einfo.ads: Remove Non_Limited_Views attribute.

* sprint.adb: (Sprint_Node_Actual): Print limited with_clauses.
Update copyright notice.

* sem_ch10.adb: (Build_Limited_Views): Complete its documentation.
(Install_Limited_Context_Clauses): New subprogram that isolates all the
checks required for limited context_clauses and installs the limited
view.
(Install_Limited_Withed_Unit): Complete its documentation.
(Analyze_Context): Check that limited with_clauses are only allowed in
package specs.
(Install_Context): Call Install_Limited_Context_Clauses after the
parents have been installed.
(Install_Limited_Withed_Unit): Add documentation. Mark the installed
package as 'From_With_Type'; this mark indicates that the limited view
is installed. Used to check bad usages of limited with_clauses.
(Build_Limited_Views): Do not add shadow entities to the scope's list
of entities. Do not add real entities to the Non_Limited_Views chain.
Improve error notification.
(Remove_Context_Clauses): Remove context clauses in two phases:
limited views first and regular views later (to maintain the
stack model).
(Remove_Limited_With_Clause): If the package is analyzed then reinstall
its visible entities.

* sem_type.adb (Specific_Type): Type Universal_Fixed is compatible
with any type that Is_Fixed_Point_Type.

* sinfo.ads: Fix documentation for Associated_Node attribute.

* switch-c.adb (Scan_Front_End_Switches): ASIS_Mode is set now when
both '-gnatc' and '-gnatt' are specified.

* atree.adb (Initialize): Add initialization for Node_Count (set to
zero).

* decl.c (gnat_to_gnu_entity, case E_Subprogram): If no return value,
do not consider as Pure.

Part of implementation of function-at-a-time:

* trans.c (gnat_to_gnu_code): If IS_STMT, call expand_expr_stmt.
(tree_transform): Add new argument to build_component_ref.
(tree_transform, case N_Assignment_Statement): Make and return an
EXPR_STMT.
(tree_transform): If result IS_STMT, set flags and return it.
(gnat_expand_stmt, set_lineno_from_sloc): New functions.

* utils2.c (build_simple_component_ref, build_component_ref): Add new
arg, NO_FOLD_P.
(build_binary_op, case EQ_EXPR): Pass additional arg to it.
(build_allocator): Likewise.

* utils.c (convert_to_fat_pointer, convert_to_thin_pointer, convert):
Add new arg to build_component_ref.
(maybe_unconstrained_array, unchecked_convert): Likewise.

* ada-tree.def (EXPR_STMT): New code.

* ada-tree.h (IS_STMT, TREE_SLOC, EXPR_STMT_EXPR): New macros.

* decl.c (gnat_to_gnu_entity, case object): Add extra arg to
build_component_ref calls.

* misc.c (gnat_expand_expr): If IS_STMT, call gnat_expand_stmt.

* gigi.h (gnat_expand_stmt, set_lineno_from_sloc): New functions.
(build_component_ref): Add new argument, NO_FOLD_P.

From-SVN: r73032

31 files changed:
gcc/ada/3vtrasym.adb
gcc/ada/5vtraent.adb
gcc/ada/5vtraent.ads
gcc/ada/ChangeLog
gcc/ada/Makefile.generic
gcc/ada/Makefile.prolog
gcc/ada/ada-tree.def
gcc/ada/ada-tree.h
gcc/ada/atree.adb
gcc/ada/decl.c
gcc/ada/einfo.adb
gcc/ada/einfo.ads
gcc/ada/einfo.h
gcc/ada/exp_ch5.adb
gcc/ada/exp_disp.adb
gcc/ada/freeze.adb
gcc/ada/gigi.h
gcc/ada/itypes.adb
gcc/ada/make.adb
gcc/ada/misc.c
gcc/ada/sem_ch10.adb
gcc/ada/sem_ch12.adb
gcc/ada/sem_ch8.adb
gcc/ada/sem_type.adb
gcc/ada/sinfo.ads
gcc/ada/sprint.adb
gcc/ada/switch-c.adb
gcc/ada/tb-alvms.c
gcc/ada/trans.c
gcc/ada/utils.c
gcc/ada/utils2.c

index 26382c111305613a34e63b4919a04941555879e1..d11e26b730c89b90402b190a377579e461b62e8b 100644 (file)
@@ -34,7 +34,6 @@
 
 with Ada.Exceptions.Traceback; use Ada.Exceptions.Traceback;
 with Interfaces.C;
-with Interfaces.C.Strings;
 with System;
 with System.Aux_DEC;
 with System.Soft_Links;
@@ -45,133 +44,147 @@ package body GNAT.Traceback.Symbolic is
    pragma Warnings (Off);
    pragma Linker_Options ("--for-linker=sys$library:trace.exe");
 
-   use Interfaces.C.Strings;
+   use Interfaces.C;
    use System;
    use System.Aux_DEC;
    use System.Traceback_Entries;
 
-   type Dscdef1_Type is record
-      Maxstrlen : Unsigned_Word;
-      Dtype     : Unsigned_Byte;
-      Class     : Unsigned_Byte;
-      Pointer   : chars_ptr;
-   end record;
+   subtype User_Arg_Type is Unsigned_Longword;
+   subtype Cond_Value_Type is Unsigned_Longword;
 
-   for Dscdef1_Type use record
-      Maxstrlen at 0 range 0 .. 15;
-      Dtype     at 2 range 0 .. 7;
-      Class     at 3 range 0 .. 7;
-      Pointer   at 4 range 0 .. 31;
+   type ASCIC is record
+      Count : unsigned_char;
+      Data  : char_array (1 .. 255);
    end record;
-   for Dscdef1_Type'Size use 64;
+   pragma Convention (C, ASCIC);
 
-   Image_Buf  : String (1 .. 10240);
-   Image_Len  : Integer;
-   Image_Need_Hdr : Boolean := True;
-   Image_Do_Another_Line : Boolean;
-   Image_Xtra_Msg : Boolean;
-
-   procedure Traceback_Image (Out_Desc : access Dscdef1_Type);
-
-   procedure Traceback_Image (Out_Desc : access Dscdef1_Type) is
-      Image : String (1 .. Integer (Out_Desc.Maxstrlen));
-   begin
-      Image := Value (Out_Desc.Pointer,
-                      Interfaces.C.size_t (Out_Desc.Maxstrlen));
-
-      if Image_Do_Another_Line and then
-        (Image_Need_Hdr or else
-         Image (Image'First .. Image'First + 27) /=
-         "  image    module    routine")
-      then
-         declare
-            First : Integer := Image_Len + 1;
-            Last  : Integer := First + Image'Length - 1;
-         begin
-            Image_Buf (First .. Last + 1) := Image & ASCII.LF;
-            Image_Len := Last + 1;
-         end;
-
-         Image_Need_Hdr := False;
-
-         if Image (Image'First .. Image'First + 3) = "----" then
-            if Image_Xtra_Msg = False then
-               Image_Xtra_Msg := True;
-            else
-               Image_Xtra_Msg := False;
-            end if;
-         end if;
+   for ASCIC use record
+      Count at 0 range 0 .. 7;
+      Data  at 1 range 0 .. 8 * 255 - 1;
+   end record;
+   for ASCIC'Size use 8 * 256;
 
-         if Out_Desc.Maxstrlen = 79 and then not Image_Xtra_Msg then
-            Image_Len := Image_Len - 1;
-            Image_Do_Another_Line := False;
-         end if;
-      end if;
-   end Traceback_Image;
+   function Fetch_ASCIC is new Fetch_From_Address (ASCIC);
 
-   subtype User_Arg_Type is Unsigned_Longword;
-   subtype Cond_Value_Type is Unsigned_Longword;
-
-   procedure Show_Traceback
+   procedure Symbolize
      (Status         : out Cond_Value_Type;
-      Faulting_FP    : Address;
-      Faulting_SP    : Address;
-      Faulting_PC    : Address;
-      Detail_Level   : Integer           := Integer'Null_Parameter;
+      Current_PC     : in Address;
+      Adjusted_PC    : in Address;
+      Current_FP     : in Address;
+      Current_R26    : in Address;
+      Image_Name     : out Address;
+      Module_Name    : out Address;
+      Routine_Name   : out Address;
+      Line_Number    : out Integer;
+      Relative_PC    : out Address;
+      Absolute_PC    : out Address;
+      PC_Is_Valid    : out Long_Integer;
       User_Act_Proc  : Address           := Address'Null_Parameter;
-      User_Arg_Value : User_Arg_Type     := User_Arg_Type'Null_Parameter;
-      Exceptionn     : Unsigned_Longword := Unsigned_Longword'Null_Parameter);
+      User_Arg_Value : User_Arg_Type     := User_Arg_Type'Null_Parameter);
 
-   pragma Interface (External, Show_Traceback);
+   pragma Interface (External, Symbolize);
 
    pragma Import_Valued_Procedure
-     (Show_Traceback, "TBK$SHOW_TRACEBACK",
-      (Cond_Value_Type, Address, Address, Address, Integer, Address,
-       User_Arg_Type, Unsigned_Longword),
-      (Value, Value, Value, Value, Reference, Value, Value, Reference),
-       Detail_Level);
-
+     (Symbolize, "TBK$SYMBOLIZE",
+      (Cond_Value_Type, Address, Address, Address, Address,
+       Address, Address, Address, Integer,
+       Address, Address, Long_Integer,
+       Address, User_Arg_Type),
+      (Value, Value, Value, Value, Value,
+       Reference, Reference, Reference, Reference,
+       Reference, Reference, Reference,
+       Value, Value),
+       User_Act_Proc);
 
    ------------------------
    -- Symbolic_Traceback --
    ------------------------
 
    function Symbolic_Traceback (Traceback : Tracebacks_Array) return String is
-      Res : String (1 .. 256 * Traceback'Length);
-      Len : Integer;
-      Status : Cond_Value_Type;
+      Status       : Cond_Value_Type;
+      Image_Name        : ASCIC;
+      Image_Name_Addr   : Address;
+      Module_Name       : ASCIC;
+      Module_Name_Addr  : Address;
+      Routine_Name      : ASCIC;
+      Routine_Name_Addr : Address;
+      Line_Number       : Integer;
+      Relative_PC       : Address;
+      Absolute_PC       : Address;
+      PC_Is_Valid       : Long_Integer;
+      Return_Address    : Address;
+      Res               : String (1 .. 256 * Traceback'Length);
+      Len               : Integer;
 
    begin
       if Traceback'Length > 0 then
-
          Len := 0;
 
          --  Since image computation is not thread-safe we need task lockout
+
          System.Soft_Links.Lock_Task.all;
-         for I in Traceback'Range loop
-            Image_Len := 0;
-            Image_Do_Another_Line := True;
-            Image_Xtra_Msg := False;
 
-            Show_Traceback
+         for J in Traceback'Range loop
+            if J = Traceback'Last then
+               Return_Address := Address_Zero;
+            else
+               Return_Address := PC_For (Traceback (J + 1));
+            end if;
+
+            Symbolize
               (Status,
-               FP_For (Traceback (I)),
-               SP_For (Traceback (I)),
-               PC_For (Traceback (I)),
-               0,
-               Traceback_Image'Address);
+               PC_For (Traceback (J)),
+               PC_For (Traceback (J)),
+               PV_For (Traceback (J)),
+               Return_Address,
+               Image_Name_Addr,
+               Module_Name_Addr,
+               Routine_Name_Addr,
+               Line_Number,
+               Relative_PC,
+               Absolute_PC,
+               PC_Is_Valid);
+
+            Image_Name   := Fetch_ASCIC (Image_Name_Addr);
+            Module_Name  := Fetch_ASCIC (Module_Name_Addr);
+            Routine_Name := Fetch_ASCIC (Routine_Name_Addr);
 
             declare
                First : Integer := Len + 1;
-               Last  : Integer := First + Image_Len - 1;
+               Last  : Integer := First + 80 - 1;
+
             begin
-               Res (First .. Last + 1) := Image_Buf & ASCII.LF;
-               Len := Last + 1;
+               Res (First .. Last) := (others => ' ');
+
+               Res (First .. First + Integer (Image_Name.Count) - 1) :=
+                 To_Ada
+                  (Image_Name.Data (1 .. size_t (Image_Name.Count)),
+                   False);
+
+               Res (First + 10 ..
+                    First + 10 + Integer (Module_Name.Count) - 1) :=
+                 To_Ada
+                  (Module_Name.Data (1 .. size_t (Module_Name.Count)),
+                   False);
+
+               Res (First + 30 ..
+                    First + 30 + Integer (Routine_Name.Count) - 1) :=
+                 To_Ada
+                  (Routine_Name.Data (1 .. size_t (Routine_Name.Count)),
+                   False);
+
+               Res (First + 50 ..
+                    First + 50 + Integer'Image (Line_Number)'Length - 1) :=
+                 Integer'Image (Line_Number);
+
+               Res (Last) := ASCII.LF;
+               Len := Last;
             end;
          end loop;
-         System.Soft_Links.Unlock_Task.all;
 
+         System.Soft_Links.Unlock_Task.all;
          return Res (1 .. Len);
+
       else
          return "";
       end if;
index bab8daf7f0840a974a4871078082c6c3e4411f81..532acad6e32d6aa56709cbc2d8ba3ec7b2cfc93b 100644 (file)
@@ -47,22 +47,13 @@ package body System.Traceback_Entries is
    end PC_For;
 
    ------------
-   -- SP_For --
+   -- PV_For --
    ------------
 
-   function SP_For (TB_Entry : Traceback_Entry) return System.Address is
+   function PV_For (TB_Entry : Traceback_Entry) return System.Address is
    begin
-      return TB_Entry.SP;
-   end SP_For;
-
-   ------------
-   -- FP_For --
-   ------------
-
-   function FP_For (TB_Entry : Traceback_Entry) return System.Address is
-   begin
-      return TB_Entry.FP;
-   end FP_For;
+      return TB_Entry.PV;
+   end PV_For;
 
    ------------------
    -- TB_Entry_For --
@@ -70,7 +61,7 @@ package body System.Traceback_Entries is
 
    function TB_Entry_For (PC : System.Address) return Traceback_Entry is
    begin
-      return (PC => PC, SP => System.Null_Address, FP => System.Null_Address);
+      return (PC => PC, PV => System.Null_Address);
    end TB_Entry_For;
 
 end System.Traceback_Entries;
index ed71437ea62272cbc6d4809c7134d2338b07da46..0d27c197fff374b0561dcfb90d8ca8ef725d4ed4 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
---  This is the Alpha/OpenVMS version of this package.
+--  This is the Alpha/OpenVMS version of this package
 
 package System.Traceback_Entries is
 
-   type Traceback_Entry is private;
-
-   Null_TB_Entry : constant Traceback_Entry;
-
-   function PC_For (TB_Entry : Traceback_Entry) return System.Address;
-   function SP_For (TB_Entry : Traceback_Entry) return System.Address;
-   function FP_For (TB_Entry : Traceback_Entry) return System.Address;
-
-   function TB_Entry_For (PC : System.Address) return Traceback_Entry;
-
-private
-
    type Traceback_Entry is record
       PC : System.Address;
-      SP : System.Address;
-      FP : System.Address;
+      PV : System.Address;
    end record;
 
    pragma Suppress_Initialization (Traceback_Entry);
 
-   Null_TB_Entry : constant Traceback_Entry
-     := (PC => System.Null_Address,
-         SP => System.Null_Address,
-         FP => System.Null_Address);
+   Null_TB_Entry : constant Traceback_Entry :=
+                     (PC => System.Null_Address,
+                      PV => System.Null_Address);
+
+   function PC_For (TB_Entry : Traceback_Entry) return System.Address;
+   function PV_For (TB_Entry : Traceback_Entry) return System.Address;
+
+   function TB_Entry_For (PC : System.Address) return Traceback_Entry;
 
 end System.Traceback_Entries;
 
index adb14dffeda0e1ce4568c3bb214b38b104f5f261..c6de5e02630fe9f5dda9ad3ef261b2da67d85695 100644 (file)
@@ -1,3 +1,140 @@
+2003-10-29  Robert Dewar  <dewar@gnat.com>
+
+       * 3vtrasym.adb, 5vtraent.ads, sprint.adb,
+       sem_ch10.adb: Minor reformatting
+
+       * exp_ch5.adb (Expand_Assign_Array): Test for bit unaligned operands
+       (Expand_Assign_Record): Test right hand side for bit unaligned as well
+
+2003-10-29  Vasiliy Fofanov  <fofanov@act-europe.fr>
+
+       * 3vtrasym.adb: 
+       * 5vtraent.adb: 
+       * 5vtraent.ads: 
+       * tb-alvms.c: 
+       Support for TBK$SYMBOLIZE-based symbolic traceback.
+
+2003-10-29  Jose Ruiz  <ruiz@act-europe.fr>
+
+       * exp_disp.adb: 
+       Revert previous change, that did not work well when pragma No_Run_Time
+       was used in conjunction with a run-time other than ZFP.
+
+2003-10-29  Vincent Celier  <celier@gnat.com>
+
+       * make.adb: 
+       (Gnatmake): When there are no Ada mains in attribute Main, disable the
+        bind and link steps only is switch -z is not used.
+
+2003-10-29  Arnaud Charlet  <charlet@act-europe.fr>
+
+       * Makefile.generic: Remove duplicated setting of CC.
+
+       * Makefile.prolog: Set CC to gcc by default, to override make's
+       default (cc).
+
+       * einfo.h: Regenerated.
+
+2003-10-29  Ed Schonberg  <schonberg@gnat.com>
+
+       * sem_ch10.adb (Analyze_Subunit): Restore state of suppress flags for
+       current body, after compiling subunit.
+
+       * itypes.adb (Create_Itype): In ASIS_Mode, do not freeze the itype
+       when in deleted code, because gigi needs properly ordered freeze
+       actions to annotate types.
+
+       * freeze.adb (Is_Fully_Defined): Predicate must be recursive, to
+       prevent the premature freezing of record type that contains
+       subcomponents with a private type that does not yet have a completion.
+
+2003-10-29  Javier Miranda  <miranda@gnat.com>
+
+       * sem_ch12.adb: 
+       (Analyze_Package_Instantiation): Check that instances can not be used in
+       limited with_clauses.
+
+       * sem_ch8.adb: 
+       (Analyze_Package_Renaming): Check that limited withed packages cannot
+       be renamed. Improve text on error messages related to limited
+       with_clauses.
+
+       * einfo.adb, einfo.ads: Remove Non_Limited_Views attribute.
+
+       * sprint.adb: (Sprint_Node_Actual): Print limited with_clauses.
+       Update copyright notice.
+
+       * sem_ch10.adb: (Build_Limited_Views): Complete its documentation.
+       (Install_Limited_Context_Clauses): New subprogram that isolates all the
+       checks required for limited context_clauses and installs the limited
+       view.
+       (Install_Limited_Withed_Unit): Complete its documentation.
+       (Analyze_Context): Check that limited with_clauses are only allowed in
+       package specs.
+       (Install_Context): Call Install_Limited_Context_Clauses after the
+       parents have been installed.
+       (Install_Limited_Withed_Unit): Add documentation. Mark the installed
+       package as 'From_With_Type'; this mark indicates that the limited view
+       is installed. Used to check bad usages of limited with_clauses.
+       (Build_Limited_Views): Do not add shadow entities to the scope's list
+       of entities. Do not add real entities to the Non_Limited_Views chain.
+       Improve error notification.
+       (Remove_Context_Clauses): Remove context clauses in two phases:
+       limited views first and regular views later (to maintain the
+       stack model).
+       (Remove_Limited_With_Clause): If the package is analyzed then reinstall
+       its visible entities.
+
+2003-10-29  Thomas Quinot  <quinot@act-europe.fr>
+
+       * sem_type.adb (Specific_Type): Type Universal_Fixed is compatible
+       with any type that Is_Fixed_Point_Type.
+
+       * sinfo.ads: Fix documentation for Associated_Node attribute.
+
+2003-10-29  Sergey Rybin  <rybin@act-europe.fr>
+
+       * switch-c.adb (Scan_Front_End_Switches): ASIS_Mode is set now when
+       both '-gnatc' and '-gnatt' are specified.
+
+       * atree.adb (Initialize): Add initialization for Node_Count (set to
+       zero).
+
+2003-10-29  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * decl.c (gnat_to_gnu_entity, case E_Subprogram): If no return value,
+       do not consider as Pure.
+
+       Part of implementation of function-at-a-time:
+
+       * trans.c (gnat_to_gnu_code): If IS_STMT, call expand_expr_stmt.
+       (tree_transform): Add new argument to build_component_ref.
+       (tree_transform, case N_Assignment_Statement): Make and return an
+       EXPR_STMT.
+       (tree_transform): If result IS_STMT, set flags and return it.
+       (gnat_expand_stmt, set_lineno_from_sloc): New functions.
+
+       * utils2.c (build_simple_component_ref, build_component_ref): Add new
+       arg, NO_FOLD_P.
+       (build_binary_op, case EQ_EXPR): Pass additional arg to it.
+       (build_allocator): Likewise.
+
+       * utils.c (convert_to_fat_pointer, convert_to_thin_pointer, convert):
+       Add new arg to build_component_ref.
+       (maybe_unconstrained_array, unchecked_convert): Likewise.
+
+       * ada-tree.def (EXPR_STMT): New code.
+
+       * ada-tree.h (IS_STMT, TREE_SLOC, EXPR_STMT_EXPR): New macros.
+
+       * decl.c (gnat_to_gnu_entity, case object): Add extra arg to
+       build_component_ref calls.
+
+       * misc.c (gnat_expand_expr): If IS_STMT, call gnat_expand_stmt.
+
+       * gigi.h (gnat_expand_stmt, set_lineno_from_sloc): New functions.
+       (build_component_ref): Add new argument, NO_FOLD_P.
+
 2003-10-27  Arnaud Charlet  <charlet@act-europe.fr>
 
        * Makefile.generic: Add missing substitution on object_deps handling.
index 630f6c5a740f400e2f6cdee46e29a09f56dc3c65..34e0d24af01e9f450cef356c6f322ed864bb9e22 100644 (file)
@@ -67,10 +67,6 @@ ifndef MAIN
    MAIN=ada
 endif
 
-ifndef CC
-   CC=gcc
-endif
-
 ifndef ADA_SPEC
    ADA_SPEC=.ads
 endif
index 5766fa98ae14af423d3ac1cedcf393abce324bef..1aaff2946170d1c506bd02ec8d5ba5d6e038c81f 100644 (file)
@@ -39,6 +39,7 @@ C_EXT:=.c
 CXX_EXT:=.cc
 AR_EXT=.a
 OBJ_EXT=.o
+CC=gcc
 
 # Default target is to build (compile/bind/link)
 # Target build is defined in Makefile.generic
index 9b3b1cdf9bdbac998cf2691ae090010f1d082683..24cfa59fa8e4efbf32afe7144f5043ef231b36fc 100644 (file)
@@ -77,3 +77,11 @@ DEFTREECODE (GNAT_NOP_EXPR, "gnat_nop_expr", '1', 1)
    ??? This should be redone at some point.  */
 
 DEFTREECODE (GNAT_LOOP_ID, "gnat_loop_id", 'x', 0)
+
+/* Here are the tree codes for the statement types known to Ada.  These
+   must be at the end of this file to allow IS_STMT to work.
+
+   We start with an expression statement, whose only operand is an
+   expression, EXPR_STMT_EXPR, Execution of the statement means evaluation of
+   the expression (such as a MODIFY_EXPR) and discarding its result.  */
+DEFTREECODE (EXPR_STMT, "expr_stmt_expr", 's', 1)
index 9f1675a2c237b33b9336758fe8c812e2be83f83f..13487ffb0680376475d9492735142a2c1aef37e9 100644 (file)
@@ -275,3 +275,14 @@ struct lang_type GTY(())
    node.  We need to find some other place to store it!  */
 #define TREE_LOOP_ID(NODE) \
   (((union lang_tree_node *)TREE_CHECK (NODE, GNAT_LOOP_ID))->loop_id.loop_id)
+
+/* Define fields and macros for statements.
+
+   Start by defining which tree codes are used for statements.  */
+#define IS_STMT(NODE)          (TREE_CODE_CLASS (TREE_CODE (NODE)) == 's')
+
+/* We store the Sloc in statement nodes.  */
+#define TREE_SLOC(NODE)                TREE_COMPLEXITY (STMT_CHECK (NODE))
+
+/* There is just one field in an EXPR_STMT: the expression.  */
+#define EXPR_STMT_EXPR(NODE)   TREE_OPERAND_CHECK_CODE (NODE, EXPR_STMT, 0)
index e27a63fa44554a3f26e3094c12d1d3da9173a6c7..50647da5eebf8b758c301c6cf04d9c6f5e16ccf7 100644 (file)
@@ -838,6 +838,7 @@ package body Atree is
       pragma Warnings (Off, Dummy);
 
    begin
+      Node_Count := 0;
       Atree_Private_Part.Nodes.Init;
       Orig_Nodes.Init;
 
index bbad5b50e4676eca6744ad05bc4343281a317f4c..d01074e9b0a514b8c5f5cc56b9b146887c3884ae 100644 (file)
@@ -946,7 +946,7 @@ gnat_to_gnu_entity (gnat_entity, gnu_expr, definition)
                    gnu_expr
                      = build_component_ref
                        (gnu_expr, NULL_TREE,
-                        TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr))));
+                        TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr))), 0);
                  }
 
                if (TREE_CODE (TYPE_SIZE_UNIT (gnu_alloc_type)) == INTEGER_CST
@@ -990,7 +990,7 @@ gnat_to_gnu_entity (gnat_entity, gnu_expr, definition)
                (build_binary_op
                 (MODIFY_EXPR, NULL_TREE,
                  build_component_ref (gnu_new_var, NULL_TREE,
-                                      TYPE_FIELDS (gnu_new_type)),
+                                      TYPE_FIELDS (gnu_new_type), 0),
                  gnu_expr));
 
            gnu_type = build_reference_type (gnu_type);
@@ -998,7 +998,7 @@ gnat_to_gnu_entity (gnat_entity, gnu_expr, definition)
              = build_unary_op
                (ADDR_EXPR, gnu_type,
                 build_component_ref (gnu_new_var, NULL_TREE,
-                                     TYPE_FIELDS (gnu_new_type)));
+                                     TYPE_FIELDS (gnu_new_type), 0));
 
            gnu_size = 0;
            used_by_ref = 1;
@@ -3536,6 +3536,13 @@ gnat_to_gnu_entity (gnat_entity, gnu_expr, definition)
        if (! global_bindings_p ())
          pure_flag = 0;
 
+       /* A subprogram (something that doesn't return anything) shouldn't
+          be considered Pure since there would be no reason for such a
+          subprogram.  Note that procedures with Out (or In Out) parameters
+          have already been converted into a function with a return type. */
+       if (TREE_CODE (gnu_return_type) == VOID_TYPE)
+         pure_flag = 0;
+
        gnu_type
          = build_qualified_type (gnu_type,
                                  (TYPE_QUALS (gnu_type)
index 6eac0d783599e8610f4b2a752840811fbbea34ab..6b0c1a132aa6c34d2aae8aeaba843ec9c25e1fda 100644 (file)
@@ -80,7 +80,6 @@ package body Einfo is
    --    Hiding_Loop_Variable            Node8
    --    Mechanism                       Uint8 (but returns Mechanism_Type)
    --    Normalized_First_Bit            Uint8
-   --    Non_Limited_Views               Elist8
 
    --    Class_Wide_Type                 Node9
    --    Current_Value                   Node9
@@ -1798,17 +1797,10 @@ package body Einfo is
    function Non_Limited_View (Id : E) return E is
    begin
       pragma Assert (False
-        or else Ekind (Id) = E_Incomplete_Type
-        or else Ekind (Id) = E_Package);
+        or else Ekind (Id) = E_Incomplete_Type);
       return Node17 (Id);
    end Non_Limited_View;
 
-   function Non_Limited_Views (Id : E) return L is
-   begin
-      pragma Assert (Ekind (Id) = E_Package);
-      return Elist8 (Id);
-   end Non_Limited_Views;
-
    function Nonzero_Is_True (Id : E) return B is
    begin
       pragma Assert (Root_Type (Id) = Standard_Boolean);
@@ -2845,7 +2837,7 @@ package body Einfo is
    begin
       pragma Assert
         (Is_Type (Id)
-          or else Ekind (Id) = E_Package);
+         or else Ekind (Id) = E_Package);
       Set_Flag159 (Id, V);
    end Set_From_With_Type;
 
@@ -3741,18 +3733,11 @@ package body Einfo is
 
    procedure Set_Non_Limited_View (Id : E; V : E) is
       pragma Assert (False
-        or else Ekind (Id) = E_Incomplete_Type
-        or else Ekind (Id) = E_Package);
+        or else Ekind (Id) = E_Incomplete_Type);
    begin
       Set_Node17 (Id, V);
    end Set_Non_Limited_View;
 
-   procedure Set_Non_Limited_Views (Id : E; V : L) is
-   begin
-      pragma Assert (Ekind (Id) = E_Package);
-      Set_Elist8 (Id, V);
-   end Set_Non_Limited_Views;
-
    procedure Set_Nonzero_Is_True (Id : E; V : B := True) is
    begin
       pragma Assert
index 3f8b227fd6de1ec872c7e7620387e01186638845..a16063d27be9191a63ca4bbcec2237fdcf18cc29 100644 (file)
@@ -2381,8 +2381,7 @@ package Einfo is
 --       Present in non-generic package entities that are not instances.
 --       The elements of this list are the shadow entities created for the
 --       types and local packages that are declared in a package that appears
---       in a limited_with clause. This list and Non_Limited_Views are built
---       at the same time, and their elements are in one-one correspondence.
+--       in a limited_with clause.
 
 --    Lit_Indexes (Node15)
 --       Present in enumeration types and subtypes. Non-empty only for the
@@ -2551,14 +2550,9 @@ package Einfo is
 --       is other than a power of 2.
 
 --    Non_Limited_View (Node17)
---       Present in incomplete types, and local packages that are the
---       shadow entities created when analyzing a limited_with_clause.
---       Points to the definining entity in the original declaration.
-
---    Non_Limited_Views (Elist8)
---       Present in non-generic packages that are not instances. The elements
---       of this list are defining identifiers for types and local packages
---       declared within a package that appears in a limited_with clause.
+--       Present in incomplete types that are the shadow entities
+--       created when analyzing a limited_with_clause. Points to the
+--       definining entity in the original declaration.
 
 --    Nonzero_Is_True (Flag162) [base type only]
 --       Present in enumeration types. True if any non-zero value is to be
@@ -4388,7 +4382,6 @@ package Einfo is
    --  E_Package
    --  E_Generic_Package
    --    Dependent_Instances           (Elist8)   (for an instance)
-   --    Non_Limited_Views             (Elist8)   (non-generic, not instance)
    --    Renaming_Map                  (Uint9)
    --    Handler_Records               (List10)   (non-generic case only)
    --    Generic_Homonym               (Node11)   (generic case only)
@@ -5152,7 +5145,6 @@ package Einfo is
    function No_Return                          (Id : E) return B;
    function Non_Binary_Modulus                 (Id : E) return B;
    function Non_Limited_View                   (Id : E) return E;
-   function Non_Limited_Views                  (Id : E) return L;
    function Nonzero_Is_True                    (Id : E) return B;
    function Normalized_First_Bit               (Id : E) return U;
    function Normalized_Position                (Id : E) return U;
@@ -5624,7 +5616,6 @@ package Einfo is
    procedure Set_No_Return                     (Id : E; V : B := True);
    procedure Set_Non_Binary_Modulus            (Id : E; V : B := True);
    procedure Set_Non_Limited_View              (Id : E; V : E);
-   procedure Set_Non_Limited_Views             (Id : E; V : L);
    procedure Set_Nonzero_Is_True               (Id : E; V : B := True);
    procedure Set_Normalized_First_Bit          (Id : E; V : U);
    procedure Set_Normalized_Position           (Id : E; V : U);
@@ -6150,7 +6141,6 @@ package Einfo is
    pragma Inline (No_Return);
    pragma Inline (Non_Binary_Modulus);
    pragma Inline (Non_Limited_View);
-   pragma Inline (Non_Limited_Views);
    pragma Inline (Nonzero_Is_True);
    pragma Inline (Normalized_First_Bit);
    pragma Inline (Normalized_Position);
@@ -6455,7 +6445,6 @@ package Einfo is
    pragma Inline (Set_No_Return);
    pragma Inline (Set_Non_Binary_Modulus);
    pragma Inline (Set_Non_Limited_View);
-   pragma Inline (Set_Non_Limited_Views);
    pragma Inline (Set_Nonzero_Is_True);
    pragma Inline (Set_Normalized_First_Bit);
    pragma Inline (Set_Normalized_Position);
index f9b0a8a41fab7a5cc48e27c4fce9b162a0f838ce..05db041ddc6b9ced55497f0d7752e14c990c5905 100644 (file)
    INLINE B No_Return                          (E Id);
    INLINE B Non_Binary_Modulus                 (E Id);
    INLINE E Non_Limited_View                   (E Id);
-   INLINE L Non_Limited_Views                  (E Id);
    INLINE B Nonzero_Is_True                    (E Id);
    INLINE U Normalized_First_Bit               (E Id);
    INLINE U Normalized_Position                (E Id);
    INLINE E Non_Limited_View (E Id)
       { return Node17 (Id); }
 
-   INLINE L Non_Limited_Views (E Id)
-      { return Elist8 (Id); }
-
    INLINE B Nonzero_Is_True (E Id)
       { return Flag162 (Base_Type (Id)); }
 
index 4287b752ce16f6ba6465e9c20ac135dd96913fc5..8105de381d2b002c57dc811b3aceaf96ed72bdaf 100644 (file)
@@ -98,15 +98,17 @@ package body Exp_Ch5 is
    function Maybe_Bit_Aligned_Large_Component (N : Node_Id) return Boolean;
    --  This function is used in processing the assignment of a record or
    --  indexed component. The back end can handle such assignments fine
-   --  if the object involved is small (64-bits) or if it is aligned on
+   --  if the objects involved are small (64-bits) or are both aligned on
    --  a byte boundary (starts on a byte, and ends on a byte). However,
    --  problems arise for large components that are not byte aligned,
-   --  since the assignment may clobber other components that share
-   --  bit positions in the starting or ending bytes. This function is
-   --  used to detect such situations, so that the assignment can be
-   --  handled component-wise. A value of False means that either the
-   --  object is known to be greater than 64 bits, or that it is known
-   --  to be byte aligned. True is returned if the object is known to
+   --  since the assignment may clobber other components that share bit
+   --  positions in the starting or ending bytes, and in the case of
+   --  components not starting on a byte boundary, the back end cannot
+   --  even manage to extract the value. This function is used to detect
+   --  such situations, so that the assignment can be handled component-wise.
+   --  A value of False means that either the object is known to be greater
+   --  than 64 bits, or that it is known to be byte aligned (and occupy an
+   --  integral number of bytes. True is returned if the object is known to
    --  be greater than 64 bits, and is known to be unaligned. As implied
    --  by the name, the result is conservative, in that if the compiler
    --  cannot determine these conditions at compile time, True is returned.
@@ -368,6 +370,14 @@ package body Exp_Ch5 is
          R_Type  := Get_Actual_Subtype (Act_Rhs);
          Loop_Required := True;
 
+      --  We require a loop if the left side is possibly bit unaligned
+
+      elsif Maybe_Bit_Aligned_Large_Component (Lhs)
+              or else
+            Maybe_Bit_Aligned_Large_Component (Rhs)
+      then
+         Loop_Required := True;
+
       --  Arrays with controlled components are expanded into a loop
       --  to force calls to adjust at the component level.
 
@@ -1016,7 +1026,10 @@ package body Exp_Ch5 is
       --  clobbering of other components sharing bits in the first or
       --  last byte of the component to be assigned.
 
-      elsif Maybe_Bit_Aligned_Large_Component (Lhs) then
+      elsif Maybe_Bit_Aligned_Large_Component (Lhs)
+              or
+            Maybe_Bit_Aligned_Large_Component (Rhs)
+      then
          null;
 
       --  If neither condition met, then nothing special to do, the back end
index c9ba3be354f90497c9dd27fe1e15e79cf57f6bdd..0d203b6d289336f3ef37f544603e7ee4ea6c5294 100644 (file)
@@ -922,10 +922,11 @@ package body Exp_Disp is
 
       --        Register_Tag (Dt_Ptr);
 
-      --  Skip this if routine not available
+      --  Skip this if routine not available, or in No_Run_Time mode
 
          if RTE_Available (RE_Register_Tag)
            and then Is_RTE (Generalized_Tag, RE_Tag)
+           and then not No_Run_Time_Mode
          then
             Append_To (Elab_Code,
               Make_Procedure_Call_Statement (Loc,
index 18f77f04283940bc2c0643cd140cfb624747e68b..0ac32c3dd9e4d51a88ae3c955bf5b4379126d26a 100644 (file)
@@ -124,7 +124,12 @@ package body Freeze is
    --  a subprogram type (i.e. an access to a subprogram).
 
    function Is_Fully_Defined (T : Entity_Id) return Boolean;
-   --  true if T is not private, or has a full view.
+   --  true if T is not private and has no private components, or has a full
+   --  view. Used to determine whether the designated type of an access type
+   --  should be frozen when the access type is frozen. This is done when an
+   --  allocator is frozen, or an expression that may involve attributes of
+   --  the designated type. Otherwise freezing the access type does not freeze
+   --  the designated type.
 
    procedure Process_Default_Expressions
      (E     : Entity_Id;
@@ -4246,15 +4251,38 @@ package body Freeze is
    --  Is_Fully_Defined --
    -----------------------
 
-   --  Should this be in Sem_Util ???
-
    function Is_Fully_Defined (T : Entity_Id) return Boolean is
    begin
       if Ekind (T) = E_Class_Wide_Type then
          return Is_Fully_Defined (Etype (T));
-      else
-         return not Is_Private_Type (T)
-           or else Present (Full_View (Base_Type (T)));
+
+      elsif Is_Array_Type (T) then
+         return Is_Fully_Defined (Component_Type (T));
+
+      elsif Is_Record_Type (T)
+        and not Is_Private_Type (T)
+      then
+
+         --  Verify that the record type has no components with
+         --  private types without completion.
+
+         declare
+            Comp : Entity_Id;
+         begin
+            Comp := First_Component (T);
+
+            while Present (Comp) loop
+               if not Is_Fully_Defined (Etype (Comp)) then
+                  return False;
+               end if;
+
+               Next_Component (Comp);
+            end loop;
+            return True;
+         end;
+
+      else return not Is_Private_Type (T)
+        or else Present (Full_View (Base_Type (T)));
       end if;
    end Is_Fully_Defined;
 
index 573d934b4ab5df68eed964d743c76403908d6d1c..f820e3a0a415479a243f8850310528a989c66700 100644 (file)
@@ -190,6 +190,9 @@ extern void gnat_to_code    PARAMS ((Node_Id));
    code.  */
 extern tree gnat_to_gnu                PARAMS ((Node_Id));
 
+/* GNU_STMT is a statement.  We generate code for that statement.  */
+extern void gnat_expand_stmt   PARAMS ((tree));
+
 /* Do the processing for the declaration of a GNAT_ENTITY, a type.  If
    a separate Freeze node exists, delay the bulk of the processing.  Otherwise
    make a GCC type for GNAT_ENTITY and set up the correspondance.  */
@@ -201,6 +204,9 @@ extern void process_type    PARAMS ((Entity_Id));
    input_line.  If WRITE_NOTE_P is true, emit a line number note. */
 extern void set_lineno         PARAMS ((Node_Id, int));
 
+/* Likewise, but passed a Sloc.  */
+extern void set_lineno_from_sloc PARAMS ((Source_Ptr, int));
+
 /* Post an error message.  MSG is the error message, properly annotated.
    NODE is the node at which to post the error and the node to use for the
    "&" substitution.  */
@@ -699,8 +705,8 @@ extern tree gnat_build_constructor PARAMS((tree, tree));
 
 /* Return a COMPONENT_REF to access a field that is given by COMPONENT,
    an IDENTIFIER_NODE giving the name of the field, FIELD, a FIELD_DECL,
-   for the field, or both.  */
-extern tree build_component_ref        PARAMS((tree, tree, tree));
+   for the field, or both.  Don't fold the result if NO_FOLD_P.  */
+extern tree build_component_ref        PARAMS((tree, tree, tree, int));
 
 /* Build a GCC tree to call an allocation or deallocation function.
    If GNU_OBJ is nonzero, it is an object to deallocate.  Otherwise,
index 12864b84be248384249205d591f6e8be1dda9f4a..dd5f98a5132aac515bd0edf80c29400f44aa60f6 100644 (file)
@@ -26,6 +26,7 @@
 
 with Atree;    use Atree;
 with Einfo;    use Einfo;
+with Opt;      use Opt;
 with Sem;      use Sem;
 with Sem_Util; use Sem_Util;
 with Sinfo;    use Sinfo;
@@ -64,7 +65,9 @@ package body Itypes is
       Set_Is_Itype (Typ);
       Set_Associated_Node_For_Itype (Typ, Related_Nod);
 
-      if In_Deleted_Code then
+      if In_Deleted_Code
+        and then not ASIS_Mode
+      then
          Set_Is_Frozen (Typ);
       end if;
 
index a82c99aff7fc4a6bcd432877fdef6cd41f1cd015..e0f5998f21f22b3a0c37ddc6aa2a13aad183b60c 100644 (file)
@@ -3623,10 +3623,12 @@ package body Make is
                      if not At_Least_One_Main then
 
                         --  First make sure that the binder and the linker
-                        --  will not be invoked.
+                        --  will not be invoked if -z is not used.
 
-                        Do_Bind_Step := False;
-                        Do_Link_Step := False;
+                        if not No_Main_Subprogram then
+                           Do_Bind_Step := False;
+                           Do_Link_Step := False;
+                        end if;
 
                         --  Put all the sources in the queue
 
index 83907b949030e53778bc4e69cf1f4382b64ce031..8d541e4d0b97a7f5853d851b29c4b4a941fd2a66 100644 (file)
@@ -544,6 +544,13 @@ gnat_expand_expr (tree exp, rtx target, enum machine_mode tmode, int modifier)
   tree new;
   rtx result;
 
+  /* If this is a statement, call the expansion routine for statements.  */
+  if (IS_STMT (exp))
+    {
+      gnat_expand_stmt (exp);
+      return const0_rtx;
+    }
+
   /* Update EXP to be the new expression to expand.  */
   switch (TREE_CODE (exp))
     {
index 743e943ff7acaba6c093bb334cf60324457a15fc..c7803048681174ebadee64218d2b8cd2552d9559 100644 (file)
@@ -73,8 +73,10 @@ package body Sem_Ch10 is
    --  Analyzes items in the context clause of compilation unit
 
    procedure Build_Limited_Views (N : Node_Id);
-   --  Build list of shadow entities for a package mentioned in a
-   --  limited_with clause.
+   --  Build and decorate the list of shadow entities for a package mentioned
+   --  in a limited_with clause. If the package was not previously analyzed
+   --  then it also performs a basic decoration of the real entities; this
+   --  is required to do not pass non-decorated entities to the back-end.
 
    procedure Check_Body_Needed_For_SAL (Unit_Name : Entity_Id);
    --  Check whether the source for the body of a compilation unit must
@@ -123,10 +125,13 @@ package body Sem_Ch10 is
    --  Subsidiary to previous one. Process only with_ and use_clauses for
    --  current unit and its library unit if any.
 
+   procedure Install_Limited_Context_Clauses (N : Node_Id);
+   --  Subsidiary to Install_Context. Process only limited with_clauses
+   --  for current unit.
+
    procedure Install_Limited_Withed_Unit (N : Node_Id);
    --  Place shadow entities for a limited_with package in the visibility
-   --  structures for the current compilation. Verify that there is no
-   --  regular with_clause in the context.
+   --  structures for the current compilation.
 
    procedure Install_Withed_Unit (With_Clause : Node_Id);
    --  If the unit is not a child unit, make unit immediately visible.
@@ -782,7 +787,7 @@ package body Sem_Ch10 is
    begin
       --  Loop through context items. This is done is three passes:
       --  a) The first pass analyze non-limited with-clauses.
-      --  b) The second pass add implicit limited_with clauses for the
+      --  b) The second pass add implicit limited_with clauses for
       --     the parents of child units.
       --  c) The third pass analyzes limited_with clauses.
 
@@ -792,7 +797,9 @@ package body Sem_Ch10 is
          --  For with clause, analyze the with clause, and then update
          --  the version, since we are dependent on a unit that we with.
 
-         if Nkind (Item) = N_With_Clause then
+         if Nkind (Item) = N_With_Clause
+           and then not Limited_Present (Item)
+         then
 
             --  Skip analyzing with clause if no unit, nothing to do (this
             --  happens for a with that references a non-existant unit)
@@ -845,6 +852,11 @@ package body Sem_Ch10 is
            and then Limited_Present (Item)
          then
 
+            if Nkind (Unit (N)) /= N_Package_Declaration then
+               Error_Msg_N ("limited with_clause only allowed in"
+                            & " package specification", Item);
+            end if;
+
             --  Skip analyzing with clause if no unit, see above.
 
             if Present (Library_Unit (Item)) then
@@ -1239,6 +1251,7 @@ package body Sem_Ch10 is
       Num_Scopes      : Int := 0;
       Use_Clauses     : array (1 .. Scope_Stack.Last) of Node_Id;
       Enclosing_Child : Entity_Id := Empty;
+      Svg             : constant Suppress_Array := Scope_Suppress;
 
       procedure Analyze_Subunit_Context;
       --  Capture names in use clauses of the subunit. This must be done
@@ -1482,6 +1495,10 @@ package body Sem_Ch10 is
          Re_Install_Use_Clauses;
          Install_Context (N);
 
+         --  Restore state of suppress flags for current body.
+
+         Scope_Suppress := Svg;
+
          --  If the subunit is within a child unit, then siblings of any
          --  parent unit that appear in the context clause of the subunit
          --  must also be made immediately visible.
@@ -2534,6 +2551,8 @@ package body Sem_Ch10 is
          Install_Parents (Lib_Unit, Private_Present (Parent (Lib_Unit)));
       end if;
 
+      Install_Limited_Context_Clauses (N);
+
       Check_With_Type_Clauses (N);
    end Install_Context;
 
@@ -2548,7 +2567,6 @@ package body Sem_Ch10 is
       Check_Private : Boolean := False;
       Decl_Node     : Node_Id;
       Lib_Parent    : Entity_Id;
-      Lim_Present   : Boolean := False;
 
    begin
       --  Loop through context clauses to find the with/use clauses.
@@ -2565,9 +2583,8 @@ package body Sem_Ch10 is
          then
             if Limited_Present (Item) then
 
-               --  Second pass will be necessary
+               --  Limited withed units will be installed later.
 
-               Lim_Present := True;
                goto Continue;
 
             --  If Name (Item) is not an entity name, something is wrong, and
@@ -2703,7 +2720,7 @@ package body Sem_Ch10 is
 
       if Is_Child_Spec (Lib_Unit) then
 
-         --  The unit also has implicit withs on its own parents.
+         --  The unit also has implicit withs on its own parents
 
          if No (Context_Items (N)) then
             Set_Context_Items (N, New_List);
@@ -2778,23 +2795,224 @@ package body Sem_Ch10 is
       if Check_Private then
          Check_Private_Child_Unit (N);
       end if;
+   end Install_Context_Clauses;
 
-      --  Second pass: install limited_with clauses
+   -------------------------------------
+   -- Install_Limited_Context_Clauses --
+   -------------------------------------
 
-      if Lim_Present then
-         Item := First (Context_Items (N));
+   procedure Install_Limited_Context_Clauses (N : Node_Id) is
+      Item : Node_Id;
+
+      procedure Check_Parent (P : Node_Id; W : Node_Id);
+      --  Check that the unlimited view of a given compilation_unit is not
+      --  already visible in the parents (neither immediately through the
+      --  context clauses, nor indirectly through "use + renamings").
+
+      procedure Check_Private_Limited_Withed_Unit (N : Node_Id);
+      --  Check that if a limited_with clause of a given compilation_unit
+      --  mentions a private child of some library unit, then the given
+      --  compilation_unit shall be the declaration of a private descendant
+      --  of that library unit.
+
+      procedure Check_Withed_Unit (W : Node_Id);
+      --  Check that a limited with_clause does not appear in the same
+      --  context_clause as a nonlimited with_clause that mentions
+      --  the same library.
+
+      --------------------
+      --  Check_Parent  --
+      --------------------
+
+      procedure Check_Parent (P : Node_Id; W : Node_Id) is
+         Item   : Node_Id;
+         Spec   : Node_Id;
+         WEnt   : Entity_Id;
+         Nam    : Node_Id;
+         E      : Entity_Id;
+         E2     : Entity_Id;
 
+      begin
+         pragma Assert (Nkind (W) = N_With_Clause);
+
+         --  Step 1: Check if the unlimited view is installed in the parent
+
+         Item := First (Context_Items (P));
          while Present (Item) loop
             if Nkind (Item) = N_With_Clause
-              and then Limited_Present (Item)
+              and then not Limited_Present (Item)
+              and then not Implicit_With (Item)
+              and then Library_Unit (Item) = Library_Unit (W)
             then
-               Install_Limited_Withed_Unit (Item);
+               Error_Msg_N ("unlimited view visible in ancestor", W);
+               return;
             end if;
 
             Next (Item);
          end loop;
-      end if;
-   end Install_Context_Clauses;
+
+         --  Step 2: Check "use + renamings"
+
+         WEnt := Defining_Unit_Name (Specification (Unit (Library_Unit (W))));
+         Spec := Specification (Unit (P));
+
+         --  We tried to traverse the list of entities corresponding to the
+         --  defining entity of the package spec. However, first_entity was
+         --  found to be 'empty'. Don't know why???
+
+         --          Def  := Defining_Unit_Name (Spec);
+         --          Ent  := First_Entity (Def);
+
+         --  As a workaround we traverse the list of visible declarations ???
+
+         Item := First (Visible_Declarations (Spec));
+         while Present (Item) loop
+
+            if Nkind (Item) = N_Use_Package_Clause then
+
+               --  Traverse the list of packages
+
+               Nam := First (Names (Item));
+
+               while Present (Nam) loop
+                  E := Entity (Nam);
+
+                  pragma Assert (Present (Parent (E)));
+
+                  if Nkind (Parent (E))
+                    = N_Package_Renaming_Declaration
+                    and then Renamed_Entity (E) = WEnt
+                  then
+                     Error_Msg_N ("unlimited view visible through "
+                                  & "use_clause + renamings", W);
+                     return;
+
+                  elsif Nkind (Parent (E)) = N_Package_Specification then
+
+                     --  The use clause may refer to a local package.
+                     --  Check all the enclosing scopes.
+
+                     E2 := E;
+                     while E2 /= Standard_Standard
+                       and then E2 /= WEnt loop
+                        E2 := Scope (E2);
+                     end loop;
+
+                     if E2 = WEnt then
+                        Error_Msg_N ("unlimited view visible through "
+                                     & "use_clause ", W);
+                        return;
+                     end if;
+
+                  end if;
+                  Next (Nam);
+               end loop;
+
+            end if;
+
+            Next (Item);
+         end loop;
+
+         --  Recursive call to check all the ancestors
+
+         if Is_Child_Spec (Unit (P)) then
+            Check_Parent (P => Parent_Spec (Unit (P)), W => W);
+         end if;
+      end Check_Parent;
+
+      ---------------------------------------
+      -- Check_Private_Limited_Withed_Unit --
+      ---------------------------------------
+
+      procedure Check_Private_Limited_Withed_Unit (N : Node_Id) is
+         C     : Node_Id;
+         P     : Node_Id;
+         Found : Boolean := False;
+
+      begin
+         --  If the current compilation unit is not private we don't
+         --  need to check anything else.
+
+         if not Private_Present (Parent (N)) then
+            Found := False;
+
+         else
+            --  Compilation unit of the parent of the withed library unit
+
+            P := Parent_Spec (Unit (Library_Unit (N)));
+
+            --  Traverse all the ancestors of the current compilation
+            --  unit to check if it is a descendant of named library unit.
+
+            C := Parent (N);
+            while Present (Parent_Spec (Unit (C))) loop
+               C := Parent_Spec (Unit (C));
+
+               if C = P then
+                  Found := True;
+                  exit;
+               end if;
+            end loop;
+         end if;
+
+         if not Found then
+            Error_Msg_N ("current unit is not a private descendant"
+                         & " of the withed unit ('R'M 10.1.2(8)", N);
+         end if;
+      end Check_Private_Limited_Withed_Unit;
+
+      -----------------------
+      -- Check_Withed_Unit --
+      -----------------------
+
+      procedure Check_Withed_Unit (W : Node_Id) is
+         Item : Node_Id;
+
+      begin
+         --  A limited with_clause can not appear in the same context_clause
+         --  as a nonlimited with_clause which mentions the same library.
+
+         Item := First (Context_Items (N));
+         while Present (Item) loop
+            if Nkind (Item) = N_With_Clause
+              and then not Limited_Present (Item)
+              and then not Implicit_With (Item)
+              and then Library_Unit (Item) = Library_Unit (W)
+            then
+               Error_Msg_N ("limited and unlimited view "
+                            & "not allowed in the same context clauses", W);
+               return;
+            end if;
+
+            Next (Item);
+         end loop;
+      end Check_Withed_Unit;
+
+   --  Start of processing for Install_Limited_Context_Clauses
+
+   begin
+      Item := First (Context_Items (N));
+      while Present (Item) loop
+         if Nkind (Item) = N_With_Clause
+           and then Limited_Present (Item)
+         then
+
+            Check_Withed_Unit (Item);
+
+            if Private_Present (Library_Unit (Item)) then
+               Check_Private_Limited_Withed_Unit (Item);
+            end if;
+
+            if Is_Child_Spec (Unit (N)) then
+               Check_Parent (Parent_Spec (Unit (N)), Item);
+            end if;
+
+            Install_Limited_Withed_Unit (Item);
+         end if;
+
+         Next (Item);
+      end loop;
+   end Install_Limited_Context_Clauses;
 
    ---------------------
    -- Install_Parents --
@@ -2917,6 +3135,10 @@ package body Sem_Ch10 is
       --  the current unit.
       --  Shouldn't this be somewhere more general ???
 
+      -----------------
+      -- Is_Ancestor --
+      -----------------
+
       function Is_Ancestor (E : Entity_Id) return Boolean is
          Par : Entity_Id;
 
@@ -3047,16 +3269,37 @@ package body Sem_Ch10 is
          P := Defining_Identifier (P);
       end if;
 
+      --  A common usage of the limited-with is to have a limited-with
+      --  in the package spec, and a normal with in its package body.
+      --  For example:
+
+      --       limited with X;  -- [1]
+      --       package A is ...
+
+      --       with X;          -- [2]
+      --       package body A is ...
+
+      --  The compilation of A's body installs the entities of its
+      --  withed packages (the context clauses found at [2]) and
+      --  then the context clauses of its specification (found at [1]).
+
+      --  As a consequence, at point [1] the specification of X has been
+      --  analyzed and it is immediately visible. According to the semantics
+      --  of the limited-with context clauses we don't install the limited
+      --  view because the full view of X supersedes its limited view.
+
       if Analyzed (Cunit (Unum))
         and then Is_Immediately_Visible (P)
       then
-         --  disallow naming in a limited with clause a unit (or renaming
-         --  thereof) that is mentioned in an enclosing normal with clause.
-         Error_Msg_N ("limited_with not allowed on unit already withed", N);
-
          return;
       end if;
 
+      if Debug_Flag_I then
+         Write_Str ("install limited view of ");
+         Write_Name (Chars (P));
+         Write_Eol;
+      end if;
+
       if not Analyzed (Cunit (Unum)) then
          Set_Ekind (P, E_Package);
          Set_Etype (P, Standard_Void_Type);
@@ -3067,6 +3310,13 @@ package body Sem_Ch10 is
          if Current_Entity (P) /= P then
             Set_Homonym (P, Current_Entity (P));
             Set_Current_Entity (P);
+
+            if Debug_Flag_I then
+               Write_Str ("   (homonym) chain ");
+               Write_Name (Chars (P));
+               Write_Eol;
+            end if;
+
          end if;
 
          if Is_Child_Package then
@@ -3084,7 +3334,9 @@ package body Sem_Ch10 is
                Set_Scope (P, Parent_Id);
             end;
          end if;
+
       else
+
          --  If the unit appears in a previous regular with_clause, the
          --  regular entities must be unchained before the shadow ones
          --  are made accessible.
@@ -3099,6 +3351,7 @@ package body Sem_Ch10 is
                Next_Entity (Ent);
             end loop;
          end;
+
       end if;
 
       --  The package must be visible while the with_type clause is active,
@@ -3116,6 +3369,13 @@ package body Sem_Ch10 is
          if not In_Chain (Lim_Typ) then
             Set_Homonym (Lim_Typ, Current_Entity (Lim_Typ));
             Set_Current_Entity (Lim_Typ);
+
+            if Debug_Flag_I then
+               Write_Str ("   (homonym) chain ");
+               Write_Name (Chars (Lim_Typ));
+               Write_Eol;
+            end if;
+
          end if;
 
          Next_Elmt (Lim_Elmt);
@@ -3125,6 +3385,7 @@ package body Sem_Ch10 is
       --  accordingly, to uninstall it when the context is removed.
 
       Set_Limited_View_Installed (N);
+      Set_From_With_Type (P);
    end Install_Limited_Withed_Unit;
 
    -------------------------
@@ -3136,6 +3397,13 @@ package body Sem_Ch10 is
       P     : constant Entity_Id := Scope (Uname);
 
    begin
+
+      if Debug_Flag_I then
+         Write_Str ("install withed unit ");
+         Write_Name (Chars (Uname));
+         Write_Eol;
+      end if;
+
       --  We do not apply the restrictions to an internal unit unless
       --  we are compiling the internal unit as a main unit. This check
       --  is also skipped for dummy units (for missing packages).
@@ -3308,6 +3576,13 @@ package body Sem_Ch10 is
       --  Construct list of shadow entities and attach it to entity of
       --  package that is mentioned in a limited_with clause.
 
+      function New_Internal_Shadow_Entity
+        (Kind       : Entity_Kind;
+         Sloc_Value : Source_Ptr;
+         Id_Char    : Character) return Entity_Id;
+      --  This function is similar to New_Internal_Entity, except that the
+      --  entity is not added to the scope's list of entities.
+
       ------------------------------
       -- Decorate_Incomplete_Type --
       ------------------------------
@@ -3324,7 +3599,6 @@ package body Sem_Ch10 is
          Set_Stored_Constraint         (E, No_Elist);
          Set_Full_View                 (E, Empty);
          Init_Size_Align               (E);
-         Set_Has_Unknown_Discriminants (E);
       end Decorate_Incomplete_Type;
 
       --------------------------
@@ -3374,22 +3648,54 @@ package body Sem_Ch10 is
          Set_Etype (P, Standard_Void_Type);
       end Decorate_Package_Specification;
 
+      -------------------------
+      -- New_Internal_Entity --
+      -------------------------
+
+      function New_Internal_Shadow_Entity
+        (Kind       : Entity_Kind;
+         Sloc_Value : Source_Ptr;
+         Id_Char    : Character) return Entity_Id
+      is
+         N : constant Entity_Id :=
+               Make_Defining_Identifier (Sloc_Value,
+                 Chars => New_Internal_Name (Id_Char));
+
+      begin
+         Set_Ekind          (N, Kind);
+         Set_Is_Internal    (N, True);
+
+         if Kind in Type_Kind then
+            Init_Size_Align (N);
+         end if;
+
+         return N;
+      end New_Internal_Shadow_Entity;
+
       -----------------
       -- Build_Chain --
       -----------------
 
+      --  Could use more comments below ???
+
       procedure Build_Chain (Spec : Node_Id; Scope : Entity_Id) is
-         Decl : Node_Id;
+         Decl          : Node_Id;
+         Analyzed_Unit : Boolean := Analyzed (Cunit (Unum));
+         Is_Tagged     : Boolean;
 
       begin
          Decl := First (Visible_Declarations (Spec));
 
          while Present (Decl) loop
             if Nkind (Decl) = N_Full_Type_Declaration then
+               Is_Tagged :=
+                  Nkind (Type_Definition (Decl)) = N_Record_Definition
+                  and then Tagged_Present (Type_Definition (Decl));
+
                Comp_Typ := Defining_Identifier (Decl);
 
-               if not Analyzed (Cunit (Unum)) then
-                  if Tagged_Present (Type_Definition (Decl)) then
+               if not Analyzed_Unit then
+                  if Is_Tagged then
                      Decorate_Tagged_Type (Sloc (Decl), Comp_Typ, Scope);
                   else
                      Decorate_Incomplete_Type (Comp_Typ, Scope);
@@ -3398,9 +3704,8 @@ package body Sem_Ch10 is
 
                --  Create shadow entity for type
 
-               Lim_Typ  := New_Internal_Entity
+               Lim_Typ  := New_Internal_Shadow_Entity
                  (Kind       => Ekind (Comp_Typ),
-                  Scope_Id   => Scope,
                   Sloc_Value => Sloc (Comp_Typ),
                   Id_Char    => 'Z');
 
@@ -3408,17 +3713,13 @@ package body Sem_Ch10 is
                Set_Parent (Lim_Typ, Parent (Comp_Typ));
                Set_From_With_Type (Lim_Typ);
 
-               if Tagged_Present (Type_Definition (Decl)) then
+               if Is_Tagged then
                   Decorate_Tagged_Type (Sloc (Decl), Lim_Typ, Scope);
                else
                   Decorate_Incomplete_Type (Lim_Typ, Scope);
                end if;
 
                Set_Non_Limited_View (Lim_Typ, Comp_Typ);
-
-               --  Add each entity to the proper list
-
-               Append_Elmt (Comp_Typ, To => Non_Limited_Views (P));
                Append_Elmt (Lim_Typ,  To => Limited_Views (P));
 
             elsif Nkind (Decl) = N_Private_Type_Declaration
@@ -3426,13 +3727,12 @@ package body Sem_Ch10 is
             then
                Comp_Typ := Defining_Identifier (Decl);
 
-               if not Analyzed (Cunit (Unum)) then
+               if not Analyzed_Unit then
                   Decorate_Tagged_Type (Sloc (Decl), Comp_Typ, Scope);
                end if;
 
-               Lim_Typ  := New_Internal_Entity
+               Lim_Typ  := New_Internal_Shadow_Entity
                  (Kind       => Ekind (Comp_Typ),
-                  Scope_Id   => Scope,
                   Sloc_Value => Sloc (Comp_Typ),
                   Id_Char    => 'Z');
 
@@ -3443,10 +3743,6 @@ package body Sem_Ch10 is
                Decorate_Tagged_Type (Sloc (Decl), Lim_Typ, Scope);
 
                Set_Non_Limited_View (Lim_Typ, Comp_Typ);
-
-               --  Add the entities to the proper list
-
-               Append_Elmt (Comp_Typ, To => Non_Limited_Views (P));
                Append_Elmt (Lim_Typ,  To => Limited_Views (P));
 
             elsif Nkind (Decl) = N_Package_Declaration then
@@ -3464,9 +3760,8 @@ package body Sem_Ch10 is
                      Set_Scope (Comp_Typ, Scope);
                   end if;
 
-                  Lim_Typ  := New_Internal_Entity
+                  Lim_Typ  := New_Internal_Shadow_Entity
                     (Kind       => Ekind (Comp_Typ),
-                     Scope_Id   => Scope,
                      Sloc_Value => Sloc (Comp_Typ),
                      Id_Char    => 'Z');
 
@@ -3480,8 +3775,6 @@ package body Sem_Ch10 is
                   --  Note: The non_limited_view attribute is not used
                   --  for local packages.
 
-                  --  Add the entities to the proper list.
-                  Append_Elmt (Comp_Typ, To => Non_Limited_Views (P));
                   Append_Elmt (Lim_Typ,  To => Limited_Views (P));
 
                   Build_Chain (Spec, Scope => Lim_Typ);
@@ -3497,14 +3790,41 @@ package body Sem_Ch10 is
    begin
       pragma Assert (Limited_Present (N));
 
-      --  Limited withed subprograms are not allowed. Therefore, we
-      --  don't need to build the limited-view auxiliary chain.
+      --  A library_item mentioned in a limited_with_clause shall be
+      --  a package_declaration, not a subprogram_declaration,
+      --  generic_declaration, generic_instantiation, or
+      --  package_renaming_declaration
 
-      if Nkind (Parent (P)) = N_Function_Specification
-        or else Nkind (Parent (P)) = N_Procedure_Specification
-      then
-         return;
-      end if;
+      case Nkind (Unit (Library_Unit (N))) is
+
+         when N_Package_Declaration =>
+            null;
+
+         when N_Subprogram_Declaration =>
+            Error_Msg_N ("subprograms not allowed in "
+                         & "limited with_clauses", N);
+
+         when N_Generic_Package_Declaration |
+              N_Generic_Subprogram_Declaration =>
+            Error_Msg_N ("generics not allowed in "
+                         & "limited with_clauses", N);
+
+         when N_Package_Instantiation |
+              N_Function_Instantiation |
+              N_Procedure_Instantiation =>
+            Error_Msg_N ("generic instantiations not allowed in "
+                         & "limited with_clauses", N);
+
+         when N_Generic_Package_Renaming_Declaration |
+              N_Generic_Procedure_Renaming_Declaration |
+              N_Generic_Function_Renaming_Declaration =>
+            Error_Msg_N ("generic renamings not allowed in "
+                         & "limited with_clauses", N);
+
+         when others =>
+            pragma Assert (False);
+            null;
+      end case;
 
       --  Check if the chain is already built
 
@@ -3516,7 +3836,6 @@ package body Sem_Ch10 is
 
       Set_Ekind (P, E_Package);
       Set_Limited_Views     (P, New_Elmt_List);
-      Set_Non_Limited_Views (P, New_Elmt_List);
       --  Set_Entity (Name (N), P);
 
       --  Create the auxiliary chain
@@ -3650,11 +3969,32 @@ package body Sem_Ch10 is
       Unit_Name : Entity_Id;
 
    begin
+      --  We remove the context clauses in two phases: limited-views first
+      --  and regular-views later (to maintain the stack model).
 
-      --  Loop through context items and undo with_clauses and use_clauses.
+      --  First Phase: Remove limited_with context clauses
 
       Item := First (Context_Items (N));
+      while Present (Item) loop
+
+         --  We are interested only in with clauses which got installed
+         --  on entry.
 
+         if Nkind (Item) = N_With_Clause
+           and then Limited_Present (Item)
+           and then Limited_View_Installed (Item)
+         then
+            Remove_Limited_With_Clause (Item);
+
+         end if;
+
+         Next (Item);
+      end loop;
+
+      --  Second Phase: Loop through context items and undo regular
+      --  with_clauses and use_clauses.
+
+      Item := First (Context_Items (N));
       while Present (Item) loop
 
          --  We are interested only in with clauses which got installed
@@ -3664,7 +4004,7 @@ package body Sem_Ch10 is
            and then Limited_Present (Item)
            and then Limited_View_Installed (Item)
          then
-            Remove_Limited_With_Clause (Item);
+            null;
 
          elsif Nkind (Item) = N_With_Clause
             and then Context_Installed (Item)
@@ -3687,7 +4027,6 @@ package body Sem_Ch10 is
 
          Next (Item);
       end loop;
-
    end Remove_Context_Clauses;
 
    --------------------------------
@@ -3697,7 +4036,6 @@ package body Sem_Ch10 is
    procedure Remove_Limited_With_Clause (N : Node_Id) is
       P_Unit    : Entity_Id := Unit (Library_Unit (N));
       P         : Entity_Id := Defining_Unit_Name (Specification (P_Unit));
-
       Lim_Elmt  : Elmt_Id;
       Lim_Typ   : Entity_Id;
 
@@ -3709,6 +4047,13 @@ package body Sem_Ch10 is
          P := Defining_Identifier (P);
       end if;
 
+      if Debug_Flag_I then
+         Write_Str ("remove limited view of ");
+         Write_Name (Chars (P));
+         Write_Str (" from visibility");
+         Write_Eol;
+      end if;
+
       --  Remove all shadow entities from visibility
 
       Lim_Elmt  := First_Elmt (Limited_Views (P));
@@ -3720,6 +4065,11 @@ package body Sem_Ch10 is
          Next_Elmt (Lim_Elmt);
       end loop;
 
+      --  Indicate that the limited view of the package is not installed
+
+      Set_From_With_Type (P, False);
+      Set_Limited_View_Installed (N, False);
+
       --  If the exporting package has previously been analyzed, it
       --  has appeared in the closure already and should be left alone.
       --  Otherwise, remove package itself from visibility.
@@ -3731,9 +4081,40 @@ package body Sem_Ch10 is
          Set_Ekind (P, E_Void);
          Set_Scope (P, Empty);
          Set_Is_Immediately_Visible (P, False);
-      end if;
 
-      Set_Limited_View_Installed (N, False);
+      else
+
+         --  Reinstall visible entities (entities removed from visibility in
+         --  Install_Limited_Withed to install the shadow entities).
+
+         declare
+            Ent : Entity_Id;
+
+         begin
+            Ent := First_Entity (P);
+            while Present (Ent) and then Ent /= First_Private_Entity (P) loop
+
+               --  Shadow entities have not been added to the list of
+               --  entities associated to the package spec. Therefore we
+               --  just have to re-chain all its visible entities.
+
+               if not Is_Class_Wide_Type (Ent) then
+
+                  Set_Homonym (Ent, Current_Entity (Ent));
+                  Set_Current_Entity (Ent);
+
+                  if Debug_Flag_I then
+                     Write_Str ("   (homonym) chain ");
+                     Write_Name (Chars (Ent));
+                     Write_Eol;
+                  end if;
+
+               end if;
+
+               Next_Entity (Ent);
+            end loop;
+         end;
+      end if;
    end Remove_Limited_With_Clause;
 
    --------------------
@@ -3819,6 +4200,8 @@ package body Sem_Ch10 is
          end if;
       end Unchain;
 
+      --  Start of Remove_With_Type_Clause
+
    begin
       if Nkind (Name) = N_Selected_Component then
          Typ := Entity (Selector_Name (Name));
@@ -3882,8 +4265,9 @@ package body Sem_Ch10 is
    begin
 
       if Debug_Flag_I then
-         Write_Str ("remove withed unit ");
+         Write_Str ("remove unit ");
          Write_Name (Chars (Unit_Name));
+         Write_Str (" from visibility");
          Write_Eol;
       end if;
 
@@ -3923,5 +4307,12 @@ package body Sem_Ch10 is
             Set_Homonym (Prev, Homonym (E));
          end if;
       end if;
+
+      if Debug_Flag_I then
+         Write_Str ("   (homonym) unchain ");
+         Write_Name (Chars (E));
+         Write_Eol;
+      end if;
+
    end Unchain;
 end Sem_Ch10;
index f8ca61ea52ea370201006bdaad015a6870881898..09e9717f18bb1e4b615b7c3f10a4bc6ff399c57d 100644 (file)
@@ -2332,8 +2332,15 @@ package body Sem_Ch12 is
          return;
 
       elsif Ekind (Gen_Unit) /= E_Generic_Package then
-         Error_Msg_N
-           ("expect name of generic package in instantiation", Gen_Id);
+
+         if From_With_Type (Gen_Unit) then
+            Error_Msg_N
+              ("cannot instantiate a limited withed package", Gen_Id);
+         else
+            Error_Msg_N
+              ("expect name of generic package in instantiation", Gen_Id);
+         end if;
+
          Restore_Env;
          return;
       end if;
index c4ad473fe84c5594949fecdbd5842ae0e4ada7c0..3f249c5428f3d80d6b6e1567de87b6c88655d194 100644 (file)
@@ -789,8 +789,14 @@ package body Sem_Ch8 is
       end if;
 
       if Etype (Old_P) = Any_Type then
-            Error_Msg_N
-             ("expect package name in renaming", Name (N));
+         Error_Msg_N
+           ("expect package name in renaming", Name (N));
+
+      elsif Ekind (Old_P) = E_Package
+        and then From_With_Type (Old_P)
+      then
+         Error_Msg_N
+           ("limited withed package cannot be renamed", Name (N));
 
       elsif Ekind (Old_P) /= E_Package
         and then not (Ekind (Old_P) = E_Generic_Package
@@ -811,11 +817,6 @@ package body Sem_Ch8 is
          Set_Ekind (New_P, E_Package);
          Set_Etype (New_P, Standard_Void_Type);
 
-      elsif Ekind (Old_P) = E_Package
-        and then From_With_Type (Old_P)
-      then
-         Error_Msg_N ("imported package cannot be renamed", Name (N));
-
       else
          --  Entities in the old package are accessible through the
          --  renaming entity. The simplest implementation is to have
@@ -3397,7 +3398,8 @@ package body Sem_Ch8 is
             null;
          else
             Error_Msg_N
-              ("imported package can only be used to access imported type",
+              ("limited withed package can only be used to access "
+               & " incomplete types",
                 N);
          end if;
       end if;
@@ -5285,7 +5287,7 @@ package body Sem_Ch8 is
       Set_In_Use (P);
 
       if From_With_Type (P) then
-         Error_Msg_N ("imported package cannot appear in use clause", N);
+         Error_Msg_N ("limited withed package cannot appear in use clause", N);
       end if;
 
       --  Find enclosing instance, if any.
index 105dc53bc55e8aeefba77295ed7fd9b5dd2a87de..dda7d1d785e2b83d4bf0e05d6baab7392c3f2e66 100644 (file)
@@ -2134,15 +2134,19 @@ package body Sem_Type is
       if B1 = B2 then
          return B1;
 
-      elsif (T1 = Universal_Integer  and then Is_Integer_Type (T2))
-        or else (T1 = Universal_Real and then Is_Real_Type (T2))
-        or else (T1 = Any_Fixed      and then Is_Fixed_Point_Type (T2))
+      elsif False
+        or else (T1 = Universal_Integer and then Is_Integer_Type (T2))
+        or else (T1 = Universal_Real    and then Is_Real_Type (T2))
+        or else (T1 = Universal_Fixed   and then Is_Fixed_Point_Type (T2))
+        or else (T1 = Any_Fixed         and then Is_Fixed_Point_Type (T2))
       then
          return B2;
 
-      elsif (T2 = Universal_Integer  and then Is_Integer_Type (T1))
-        or else (T2 = Universal_Real and then Is_Real_Type (T1))
-        or else (T2 = Any_Fixed      and then Is_Fixed_Point_Type (T1))
+      elsif False
+        or else (T2 = Universal_Integer and then Is_Integer_Type (T1))
+        or else (T2 = Universal_Real    and then Is_Real_Type (T1))
+        or else (T2 = Universal_Fixed   and then Is_Fixed_Point_Type (T1))
+        or else (T2 = Any_Fixed         and then Is_Fixed_Point_Type (T1))
       then
          return B1;
 
index 014228b5a9ccc98f4ac5a814da1d879da2e19e52..fe94742e6e3f90e95b7112e7699725dee32068c0 100644 (file)
@@ -573,7 +573,7 @@ package Sinfo is
    --    and N_Extension_Aggregate nodes. This field is used during generic
    --    processing to relate nodes in the original template to nodes in the
    --    generic copy. It overlaps the Entity field, and is used to capture
-   --    global references in the analyzed copy and place them in the template.
+   --    global references in the analyzed copy and place them in the instance.
    --    See description in Sem_Ch12 for further details on this usage.
 
    --  At_End_Proc (Node1)
index 0cb991802e460757c8561885ae673bc87644b990..6ae6542c9b2861ca1d3ee18d236ee329bb1eca74 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2002, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2003, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -2490,7 +2490,12 @@ package body Sprint is
 
             else
                if First_Name (Node) or else not Dump_Original_Only then
-                  Write_Indent_Str ("with ");
+                  if Limited_Present (Node) then
+                     Write_Indent_Str ("limited with ");
+                  else
+                     Write_Indent_Str ("with ");
+                  end if;
+
                else
                   Write_Str (", ");
                end if;
index c76c4a1af550f9dadeaf9439ced578dffccfad70..e5e953683920f9a96bb4673ab9bdf82fbcfa5b95 100644 (file)
@@ -216,6 +216,10 @@ package body Switch.C is
                Ptr := Ptr + 1;
                Operating_Mode := Check_Semantics;
 
+               if Tree_Output then
+                  ASIS_Mode := True;
+               end if;
+
             --  Processing for d switch
 
             when 'd' =>
@@ -638,7 +642,11 @@ package body Switch.C is
             when 't' =>
                Ptr := Ptr + 1;
                Tree_Output := True;
-               ASIS_Mode := True;
+
+               if Operating_Mode = Check_Semantics then
+                  ASIS_Mode := True;
+               end if;
+
                Back_Annotate_Rep_Info := True;
 
             --  Processing for T switch
index fecedd396f05fdf9e8a5501406716bb304049dd3..ff222603a8f3d587cb97be4c39b5616e4ce942fd 100644 (file)
@@ -89,6 +89,10 @@ typedef struct
 #define RA_UNKNOWN ((REG)~0)
 #define RA_STOP    ((REG)0)
 
+/* Compute Procedure Value from a live Frame Pointer value.  */
+#define PV_FOR(FP) \
+  ((REG_AT (FP) & 0x7) == 0) ? *(PDSCDEF **)(FP) : (PDSCDEF *)(FP);
+
 /**********
  * unwind *
  **********/
@@ -127,10 +131,7 @@ unwind (frame_state_t * fs)
   if (fs->fp == 0)
     return;
 
-  if ((REG_AT (fs->fp) & 0x7) == 0)
-    pv = *(PDSCDEF **)fs->fp;
-  else
-    pv = (PDSCDEF *) fs->fp;
+  pv = PV_FOR (fs->fp);
 
   if (pv == 0
       || pv->pdsc$w_flags & PDSC$M_BASE_FRAME)
@@ -190,18 +191,15 @@ unwind (frame_state_t * fs)
 }
 
 /* Structure representing a traceback entry in the tracebacks array to be
-   filled by __gnat_backtrace below. This should match the declaration of
-   Traceback_Entry in System.Traceback_Entries.
+   filled by __gnat_backtrace below.
 
    The use of a structure is motivated by the potential necessity of having
    several fields to fill for each entry, for instance if later calls to VMS
    system functions need more than just a mere PC to compute info on a frame
    (e.g. for non-symbolic->symbolic translation purposes).  */
-
 typedef struct {
-  void * pc;  /* Address of the call instruction in the chain.  */
-  void * sp;  /* Stack Pointer value at the point of this call.  */
-  void * fp;  /* Frame Pointer value at the point of this call.  */
+  void * pc;
+  void * pv;
 } tb_entry_t;
 
 /********************
@@ -249,8 +247,7 @@ __gnat_backtrace (array, size, exclude_min, exclude_max, skip_frames)
          || frame_state.pc > exclude_max)
        {
          tbe->pc = frame_state.pc;
-         tbe->sp = frame_state.sp;
-         tbe->fp = frame_state.fp;
+         tbe->pv = PV_FOR (frame_state.fp);
        
          cnt ++;
          tbe ++;
index d28ded8f305f8dc5e2dd718e4874d9067cc2e381..0d4539f97465b143fcea71284bfa3743914bc2b8 100644 (file)
@@ -243,9 +243,13 @@ gnat_to_code (gnat_node)
 
   gnu_root = tree_transform (gnat_node);
 
+  /* If we return a statement, generate code for it.  */
+  if (IS_STMT (gnu_root))
+    expand_expr_stmt (gnu_root);
+
   /* This should just generate code, not return a value.  If it returns
      a value, something is wrong.  */
-  if (gnu_root != error_mark_node)
+  else if (gnu_root != error_mark_node)
     gigi_abort (302);
 }
 
@@ -997,7 +1001,9 @@ tree_transform (gnat_node)
              gnu_prefix = gnat_stabilize_reference (gnu_prefix, 0);
 
            gnu_result
-             = build_component_ref (gnu_prefix, NULL_TREE, gnu_field);
+             = build_component_ref (gnu_prefix, NULL_TREE, gnu_field,
+                                    (Nkind (Parent (gnat_node))
+                                     == N_Attribute_Reference));
          }
 
        if (gnu_result == 0)
@@ -2058,8 +2064,6 @@ tree_transform (gnat_node)
       gnu_rhs
        = maybe_unconstrained_array (gnat_to_gnu (Expression (gnat_node)));
 
-      set_lineno (gnat_node, 1);
-
       /* If range check is needed, emit code to generate it */
       if (Do_Range_Check (Expression (gnat_node)))
        gnu_rhs = emit_range_check (gnu_rhs, Etype (Name (gnat_node)));
@@ -2071,10 +2075,12 @@ tree_transform (gnat_node)
           && TREE_OVERFLOW (TYPE_SIZE (TREE_TYPE (gnu_lhs))))
          || (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_rhs))) == INTEGER_CST
              && TREE_OVERFLOW (TYPE_SIZE (TREE_TYPE (gnu_rhs)))))
-       expand_expr_stmt (build_call_raise (SE_Object_Too_Large));
+       gnu_result = build_call_raise (SE_Object_Too_Large);
       else
-       expand_expr_stmt (build_binary_op (MODIFY_EXPR, NULL_TREE,
-                                          gnu_lhs, gnu_rhs));
+       gnu_result
+         = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_lhs, gnu_rhs);
+
+      gnu_result = build_nt (EXPR_STMT, gnu_result);
       break;
 
     case N_If_Statement:
@@ -3168,7 +3174,7 @@ tree_transform (gnat_node)
                    = length == 1 ? gnu_subprog_call
                      : build_component_ref
                        (gnu_subprog_call, NULL_TREE,
-                        TREE_PURPOSE (scalar_return_list));
+                        TREE_PURPOSE (scalar_return_list), 0);
                  int unchecked_conversion
                    = Nkind (gnat_actual) == N_Unchecked_Type_Conversion;
                  /* If the actual is a conversion, get the inner expression,
@@ -3614,7 +3620,8 @@ tree_transform (gnat_node)
                        (build_unary_op
                         (INDIRECT_REF, NULL_TREE,
                          TREE_VALUE (gnu_except_ptr_stack)),
-                        get_identifier ("not_handled_by_others"), NULL_TREE)),
+                        get_identifier ("not_handled_by_others"), NULL_TREE,
+                        0)),
                         integer_zero_node);
                }
 
@@ -3643,7 +3650,7 @@ tree_transform (gnat_node)
                         (build_unary_op
                          (INDIRECT_REF, NULL_TREE,
                           TREE_VALUE (gnu_except_ptr_stack)),
-                         get_identifier ("import_code"), NULL_TREE),
+                         get_identifier ("import_code"), NULL_TREE, 0),
                         gnu_expr);
                  else
                    this_choice
@@ -3664,7 +3671,7 @@ tree_transform (gnat_node)
                          (build_unary_op
                           (INDIRECT_REF, NULL_TREE,
                            TREE_VALUE (gnu_except_ptr_stack)),
-                          get_identifier ("lang"), NULL_TREE);
+                          get_identifier ("lang"), NULL_TREE, 0);
 
                      this_choice
                        = build_binary_op
@@ -4024,8 +4031,17 @@ tree_transform (gnat_node)
        gigi_abort (321);
     }
 
+  /* If the result is a statement, set needed flags and return it.  */
+  if (IS_STMT (gnu_result))
+    {
+      TREE_TYPE (gnu_result) = void_type_node;
+      TREE_THIS_VOLATILE (gnu_result) = TREE_SIDE_EFFECTS (gnu_result) = 1;
+      TREE_SLOC (gnu_result) = Sloc (gnat_node);
+      return gnu_result;
+    }
+
   /* If the result is a constant that overflows, raise constraint error.  */
-  if (TREE_CODE (gnu_result) == INTEGER_CST
+  else if (TREE_CODE (gnu_result) == INTEGER_CST
       && TREE_CONSTANT_OVERFLOW (gnu_result))
     {
       post_error ("Constraint_Error will be raised at run-time?", gnat_node);
@@ -4137,6 +4153,25 @@ tree_transform (gnat_node)
   return gnu_result;
 }
 \f
+/* GNU_STMT is a statement.  We generate code for that statement.  */
+
+void
+gnat_expand_stmt (gnu_stmt)
+     tree gnu_stmt;
+{
+  set_lineno_from_sloc (TREE_SLOC (gnu_stmt), 1);
+
+  switch (TREE_CODE (gnu_stmt))
+    {
+    case EXPR_STMT:
+      expand_expr_stmt (EXPR_STMT_EXPR (gnu_stmt));
+      break;
+
+    default:
+      abort ();
+    }
+}
+\f
 /* Force references to each of the entities in packages GNAT_NODE with's
    so that the debugging information for all of them are identical
    in all clients.  Operate recursively on anything it with's, but check
@@ -5407,6 +5442,16 @@ set_lineno (gnat_node, write_note_p)
 {
   Source_Ptr source_location = Sloc (gnat_node);
 
+  set_lineno_from_sloc (source_location, write_note_p);
+}
+
+/* Likewise, but passed a Sloc.  */
+
+void
+set_lineno_from_sloc (source_location, write_note_p)
+     Source_Ptr source_location;
+     int write_note_p;
+{
   /* If node not from source code, ignore.  */
   if (source_location < 0)
     return;
index c1c5ccf4ce46fefe1912c8b1a147a213d96d1663..a474870922f4a8e70b1c61edf887d3c536a28125 100644 (file)
@@ -2825,10 +2825,10 @@ convert_to_fat_pointer (type, expr)
       else
        expr = build1 (INDIRECT_REF, TREE_TYPE (etype), expr);
 
-      template = build_component_ref (expr, NULL_TREE, fields);
+      template = build_component_ref (expr, NULL_TREE, fields, 0);
       expr = build_unary_op (ADDR_EXPR, NULL_TREE,
                             build_component_ref (expr, NULL_TREE,
-                                                 TREE_CHAIN (fields)));
+                                                 TREE_CHAIN (fields), 0));
     }
   else
     /* Otherwise, build the constructor for the template.  */
@@ -2872,7 +2872,8 @@ convert_to_thin_pointer (type, expr)
 
   /* We get the pointer to the data and use a NOP_EXPR to make it the
      proper GCC type.  */
-  expr = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (TREE_TYPE (expr)));
+  expr
+    = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (TREE_TYPE (expr)), 0);
   expr = build1 (NOP_EXPR, type, expr);
 
   return expr;
@@ -2927,7 +2928,7 @@ convert (type, expr)
        return TREE_VALUE (CONSTRUCTOR_ELTS (expr));
       else
        return convert (type, build_component_ref (expr, NULL_TREE,
-                                                  TYPE_FIELDS (etype)));
+                                                  TYPE_FIELDS (etype), 0));
     }
   else if (code == RECORD_TYPE && TYPE_IS_PADDING_P (type))
     {
@@ -2977,7 +2978,7 @@ convert (type, expr)
   if (ecode == RECORD_TYPE && TYPE_LEFT_JUSTIFIED_MODULAR_P (etype)
       && code != UNCONSTRAINED_ARRAY_TYPE)
     return convert (type, build_component_ref (expr, NULL_TREE,
-                                              TYPE_FIELDS (etype)));
+                                              TYPE_FIELDS (etype), 0));
 
   /* If converting to a type that contains a template, convert to the data
      type and then build the template. */
@@ -3051,7 +3052,7 @@ convert (type, expr)
       expr = build_unary_op (INDIRECT_REF, NULL_TREE,
                             build_component_ref (TREE_OPERAND (expr, 0),
                                                  get_identifier ("P_ARRAY"),
-                                                 NULL_TREE));
+                                                 NULL_TREE, 0));
       etype = TREE_TYPE (expr);
       ecode = TREE_CODE (etype);
       break;
@@ -3146,7 +3147,7 @@ convert (type, expr)
         array and then convert it.  */
       else if (TYPE_FAT_POINTER_P (etype))
        expr = build_component_ref (expr, get_identifier ("P_ARRAY"),
-                                   NULL_TREE);
+                                   NULL_TREE, 0);
 
       return fold (convert_to_pointer (type, expr));
 
@@ -3278,7 +3279,7 @@ maybe_unconstrained_array (exp)
            = build_unary_op (INDIRECT_REF, NULL_TREE,
                              build_component_ref (TREE_OPERAND (exp, 0),
                                                   get_identifier ("P_ARRAY"),
-                                                  NULL_TREE));
+                                                  NULL_TREE, 0));
          TREE_READONLY (new) = TREE_STATIC (new) = TREE_READONLY (exp);
          return new;
        }
@@ -3306,12 +3307,13 @@ maybe_unconstrained_array (exp)
              && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (new)))
            return
              build_component_ref (new, NULL_TREE,
-                                  TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new))));
+                                  TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new))),
+                                  0);
        }
       else if (TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (exp)))
        return
          build_component_ref (exp, NULL_TREE,
-                              TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (exp))));
+                              TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (exp))), 0);
       break;
 
     default:
@@ -3399,7 +3401,7 @@ unchecked_convert (type, expr, notrunc_p)
       layout_type (rec_type);
 
       expr = unchecked_convert (rec_type, expr, notrunc_p);
-      expr = build_component_ref (expr, NULL_TREE, field);
+      expr = build_component_ref (expr, NULL_TREE, field, 0);
     }
 
   /* Similarly for integral input type whose precision is not equal to its
index c2ffdfbc1532fc2c885216c18dc0eab65897f5a7..3e90487d7111811602218775d91e855f65636d4f 100644 (file)
@@ -50,7 +50,7 @@ static tree contains_null_expr                PARAMS ((tree));
 static tree compare_arrays             PARAMS ((tree, tree, tree));
 static tree nonbinary_modular_operation        PARAMS ((enum tree_code, tree,
                                                tree, tree));
-static tree build_simple_component_ref PARAMS ((tree, tree, tree));
+static tree build_simple_component_ref PARAMS ((tree, tree, tree, int));
 \f
 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR or other logical
    operation.
@@ -955,7 +955,8 @@ build_binary_op (op_code, result_type, left_operand, right_operand)
               && integer_zerop (TREE_VALUE (CONSTRUCTOR_ELTS (right_operand))))
        {
          right_operand = build_component_ref (left_operand, NULL_TREE,
-                                              TYPE_FIELDS (left_base_type));
+                                              TYPE_FIELDS (left_base_type),
+                                              0);
          left_operand = convert (TREE_TYPE (right_operand),
                                  integer_zero_node);
        }
@@ -1609,16 +1610,17 @@ gnat_build_constructor (type, list)
 \f
 /* Return a COMPONENT_REF to access a field that is given by COMPONENT,
    an IDENTIFIER_NODE giving the name of the field, or FIELD, a FIELD_DECL,
-   for the field.
+   for the field.  Don't fold the result if NO_FOLD_P is nonzero.
 
    We also handle the fact that we might have been passed a pointer to the
    actual record and know how to look for fields in variant parts.  */
 
 static tree
-build_simple_component_ref (record_variable, component, field)
+build_simple_component_ref (record_variable, component, field, no_fold_p)
      tree record_variable;
      tree component;
      tree field;
+     int no_fold_p;
 {
   tree record_type = TYPE_MAIN_VARIANT (TREE_TYPE (record_variable));
   tree ref;
@@ -1674,8 +1676,9 @@ build_simple_component_ref (record_variable, component, field)
            {
              tree field_ref
                = build_simple_component_ref (record_variable, 
-                                             NULL_TREE, new_field);
-             ref = build_simple_component_ref (field_ref, NULL_TREE, field);
+                                             NULL_TREE, new_field, no_fold_p);
+             ref = build_simple_component_ref (field_ref, NULL_TREE, field,
+                                               no_fold_p);
 
              if (ref != 0)
                return ref;
@@ -1697,19 +1700,21 @@ build_simple_component_ref (record_variable, component, field)
       || TYPE_VOLATILE (record_type))
     TREE_THIS_VOLATILE (ref) = 1;
 
-  return fold (ref);
+  return no_fold_p ? ref : fold (ref);
 }
 \f
 /* Like build_simple_component_ref, except that we give an error if the
    reference could not be found.  */
 
 tree
-build_component_ref (record_variable, component, field)
+build_component_ref (record_variable, component, field, no_fold_p)
      tree record_variable;
      tree component;
      tree field;
+     int no_fold_p;
 {
-  tree ref = build_simple_component_ref (record_variable, component, field);
+  tree ref = build_simple_component_ref (record_variable, component, field,
+                                        no_fold_p);
 
   if (ref != 0)
     return ref;
@@ -1945,7 +1950,7 @@ build_allocator (type, init, result_type, gnat_proc, gnat_pool, gnat_node)
            build_component_ref
            (build_unary_op (INDIRECT_REF, NULL_TREE,
                             convert (storage_ptr_type, storage)),
-            NULL_TREE, TYPE_FIELDS (storage_type)),
+            NULL_TREE, TYPE_FIELDS (storage_type), 0),
            build_template (template_type, type, NULL_TREE)),
           convert (result_type, convert (storage_ptr_type, storage)));
     }
@@ -1990,7 +1995,7 @@ build_allocator (type, init, result_type, gnat_proc, gnat_pool, gnat_node)
       result = convert (build_pointer_type (new_type), result);
       result = build_unary_op (INDIRECT_REF, NULL_TREE, result);
       result = build_component_ref (result, NULL_TREE,
-                                   TYPE_FIELDS (new_type));
+                                   TYPE_FIELDS (new_type), 0);
       result = convert (result_type,
                        build_unary_op (ADDR_EXPR, NULL_TREE, result));
     }