[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Fri, 11 Jun 2004 10:47:39 +0000 (12:47 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 11 Jun 2004 10:47:39 +0000 (12:47 +0200)
2004-06-11  Vincent Celier  <celier@gnat.com>

* mlib-tgt-vms-alpha.adb (Build_Dynamic_Library): Issue switch -R to
gnatsym, when symbol policy is Restricted.

* mlib-tgt-vms-ia64.adb (Build_Dynamic_Library): Issue switch -R to
gnatsym, when symbol policy is Restricted.

* symbols-vms-alpha.adb (Initialize): When symbol policy is Restricted,
read the symbol file.
(Finalize): Fail in symbol policy Restricted if a symbol in the original
symbol file is not in the object files. Do not create a new symbol file
when symbol policy is Restricted.

* gnatbind.adb (Gnatbind): Initialize Snames, because Snames is used
in Scng.

* gnatsym.adb (Parse_Vmd_Line): Process new switch -R for symbol policy
Restricted.
(Usage): Line for new switch -R

* make.adb (Initialize): When the platform is not VMS, add the
directory where gnatmake is invoked in the front of the path, if
gnatmake is invoked with directory information.  Change the Scan_Args
while loop to a for loop.
(Recursive_Compute_Depth): Remove parameter Visited. Improve efficiency:
if Depth is equal or greater than the proposed depth, there is nothing
to do.
(Initialize): Call Recursive_Compute_Depth with initial Depth equal to 1
instead of 0.

* prj.ads: Add new symbol policy Restricted.

* prj-dect.adb (Parse_Case_Construction): Call End_Case_Construction
with the new parameters Check_All_Labels and Case_Location.

* prj-nmsc.adb (Ada_Check): Process new symbol policy Restricted
(Library_Symbol_File needs to be defined).

* prj-strt.adb (End_Case_Construction): New parameters Check_All_Labels
and Case_Location If Check_All_Labels is True, check that all values of
the string type are used, and output warning(s) if they are not.

* prj-strt.ads (End_Case_Construction): New parameters Check_All_Labels
and Case_Location.

* gnat_ugn.texi: Reorder subclauses in menus "Switches for gcc"

* gnat_ugn.texi: Update documentation about the library directory in
Library Projects.

* makegpr.adb (Display_Command): In verbose mode, also display the
value of the CPATH env var, when the compiler is gcc.
(Initialize): Change the Scan_Args while loop to a for loop
(Compile_Individual_Sources): Change directory to object directory
before compilations.

* symbols.ads: New symbol policy Restricted.

2004-06-11  Olivier Hainque  <hainque@act-europe.fr>

* a-except.adb (Raise_After_Setup family): Remove. The responsibility
is now taken care of internally in the Exception_Propagation package
and does not require clients assistance any more.

* a-exexpr.adb (Is_Setup_And_Not_Propagated,
Set_Setup_And_Not_Propagated, and Clear_Setup_And_Not_Propagated): New
functions. Helpers to maintain a predicate required in the handling of
occurrence transfer between tasks.
This is now handled internally and does not require clients assistance
for the setup/propagate separation anymore.
(Setup_Exception, Propagate_Exception): Simplify the Private_Data
allocation strategy, handle the Setup_And_Not_Propagated predicate and
document.

* s-taenca.adb (Check_Exception): Use raise_with_msg instead of
raise_after_setup, now that everything is handled internally within the
setup/propagation engine.

2004-06-11  Hristian Kirtchev  <kirtchev@gnat.com>

* exp_ch6.adb (Expand_Inlined_Call): Add function Formal_Is_Used_Once.
Add additional conditions for the case of an actual being a simple
name or literal. Improve inlining by preventing the generation
of temporaries with a short lifetime (one use).

2004-06-11  Hristian Kirtchev  <kirtchev@gnat.com>

PR ada/15587

* einfo.ads: Minor comment updates for Has_Completion and
E_Constant list of flags.

* sem_ch3.adb (Analyze_Object_Declaration): Full constant declarations
and constant redeclarations now set the Has_Completion flag of their
defining identifiers.

* sem_ch7.adb (Analyze_Package_Spec): Add procedure
Inspect_Deferred_Constant_Completion.
Used to detect private deferred constants that have not been completed
either by a constant redeclaration or pragma Import. Emits error message
"constant declaration requires initialization expression".

* sem_prag.adb (Process_Import_Or_Interface): An Import pragma now
completes a deferred constant.

2004-06-11  Geert Bosch  <bosch@gnat.com>

* eval_fat.adb (Decompose_Int): Fix rounding of negative numbers.

* s-fatgen.adb (Gradual_Scaling): Correct off-by-one error in
calculating exponent for scaling denormal numbers.
(Leading_Part): Properly raise Constraint_Error for zero or negative
Adjustment.
(Remainder): Properly raise Constraint_Error for zero divisor.

2004-06-11  Thomas Quinot  <quinot@act-europe.fr>

* sem_util.adb: Minor reformatting.

* exp_ch2.adb (Expand_Entry_Parameter): Generate an explicit
dereference when accessing the entry parameter record.
(Check_Array_Type): Always check for possible implicit dereference.
(maybe_implicit_dereference): Rename to check_no_implicit_derefence.
Abort if a pointer is still present (denoting that an implicit
dereference was left in the tree by the front-end).

* sem_attr.adb (Expand_Entry_Parameter): Generate an explicit
dereference when accessing the entry parameter record.
(Check_Array_Type): Always check for possible implicit dereference.
(maybe_implicit_dereference): Rename to check_no_implicit_derefence.
Abort if a pointer is still present (denoting that an implicit
dereference was left in the tree by the front-end).

2004-06-11  Emmanuel Briot  <briot@act-europe.fr>

* g-debpoo.adb (Deallocate, Dereference): Add prefix "error:" to error
message, like the compiler itself does. Easier to parse the output.

* g-debpoo.ads: (Allocate, Deallocate, Dereference): Add comments.

* gnat_ugn.texi (gnatxref, gnatfind): Clarify that source names should
be base names, and not includes directories.

2004-06-11  Arnaud Charlet  <charlet@act-europe.fr>

* Makefile.generic ($(EXEC)): Depend on $(OBJECTS), not $(OBJ_FILES),
so that dependencies are properly taken into account by make.

2004-06-11  Arnaud Charlet  <charlet@act-europe.fr>

PR ada/15622
* s-unstyp.ads, s-maccod.ads, sem_ch8.adb, s-auxdec.ads,
exp_intr.adb, s-auxdec-vms_64.ads: Fix typo: instrinsic -> intrinsic

2004-06-11  Jerome Guitton  <guitton@act-europe.fr>

* Makefile.in (install-gnatlib): install target-specific run-time files.

* Make-lang.in: Remove obsolete targets.

2004-06-11  Ed Schonberg  <schonberg@gnat.com>

* par-ch12.adb (P_Generic): Add scope before analyzing subprogram
specification, to catch misuses of program unit names.

* sem_res.adb (Resolve_Type_Conversion): Do not emit warnings on
superfluous conversions in an instance.

2004-06-11  Ed Schonberg  <schonberg@gnat.com>

PR ada/15403

* sem_ch12.adb (Save_References): If operator node has been folded to
enumeration literal, associated_node must be discarded.

2004-06-11  Jose Ruiz  <ruiz@act-europe.fr>

* s-stchop-vxworks.adb: Add required pragma Convention to
Task_Descriptor because it is updated by a C function.

From-SVN: r82973

43 files changed:
gcc/ada/ChangeLog
gcc/ada/Make-lang.in
gcc/ada/Makefile.generic
gcc/ada/Makefile.in
gcc/ada/a-except.adb
gcc/ada/a-exexpr.adb
gcc/ada/einfo.ads
gcc/ada/eval_fat.adb
gcc/ada/exp_ch2.adb
gcc/ada/exp_ch6.adb
gcc/ada/exp_intr.adb
gcc/ada/g-debpoo.adb
gcc/ada/g-debpoo.ads
gcc/ada/gnat_ugn.texi
gcc/ada/gnatbind.adb
gcc/ada/gnatsym.adb
gcc/ada/make.adb
gcc/ada/makegpr.adb
gcc/ada/mlib-tgt-vms-alpha.adb
gcc/ada/mlib-tgt-vms-ia64.adb
gcc/ada/par-ch12.adb
gcc/ada/prj-dect.adb
gcc/ada/prj-nmsc.adb
gcc/ada/prj-strt.adb
gcc/ada/prj-strt.ads
gcc/ada/prj.ads
gcc/ada/s-auxdec-vms_64.ads
gcc/ada/s-auxdec.ads
gcc/ada/s-fatgen.adb
gcc/ada/s-maccod.ads
gcc/ada/s-stchop-vxworks.adb
gcc/ada/s-taenca.adb
gcc/ada/s-unstyp.ads
gcc/ada/sem_attr.adb
gcc/ada/sem_ch12.adb
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch7.adb
gcc/ada/sem_ch8.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_res.adb
gcc/ada/sem_util.adb
gcc/ada/symbols-vms-alpha.adb
gcc/ada/symbols.ads

index 665ba73cd332ba72d6ee528ee346a4af68d08ec0..8e5893db74c7704df81fd0857542457f09ada431 100644 (file)
@@ -1,3 +1,184 @@
+2004-06-11  Vincent Celier  <celier@gnat.com>
+
+       * mlib-tgt-vms-alpha.adb (Build_Dynamic_Library): Issue switch -R to
+       gnatsym, when symbol policy is Restricted.
+
+       * mlib-tgt-vms-ia64.adb (Build_Dynamic_Library): Issue switch -R to
+       gnatsym, when symbol policy is Restricted.
+
+       * symbols-vms-alpha.adb (Initialize): When symbol policy is Restricted,
+       read the symbol file.
+       (Finalize): Fail in symbol policy Restricted if a symbol in the original
+       symbol file is not in the object files. Do not create a new symbol file
+       when symbol policy is Restricted.
+
+       * gnatbind.adb (Gnatbind): Initialize Snames, because Snames is used
+       in Scng.
+
+       * gnatsym.adb (Parse_Vmd_Line): Process new switch -R for symbol policy
+       Restricted.
+       (Usage): Line for new switch -R
+
+       * make.adb (Initialize): When the platform is not VMS, add the
+       directory where gnatmake is invoked in the front of the path, if
+       gnatmake is invoked with directory information.  Change the Scan_Args
+       while loop to a for loop.
+       (Recursive_Compute_Depth): Remove parameter Visited. Improve efficiency:
+       if Depth is equal or greater than the proposed depth, there is nothing
+       to do.
+       (Initialize): Call Recursive_Compute_Depth with initial Depth equal to 1
+       instead of 0.
+
+       * prj.ads: Add new symbol policy Restricted.
+
+       * prj-dect.adb (Parse_Case_Construction): Call End_Case_Construction
+       with the new parameters Check_All_Labels and Case_Location.
+
+       * prj-nmsc.adb (Ada_Check): Process new symbol policy Restricted
+       (Library_Symbol_File needs to be defined).
+
+       * prj-strt.adb (End_Case_Construction): New parameters Check_All_Labels
+       and Case_Location If Check_All_Labels is True, check that all values of
+       the string type are used, and output warning(s) if they are not.
+
+       * prj-strt.ads (End_Case_Construction): New parameters Check_All_Labels
+       and Case_Location.
+
+       * gnat_ugn.texi: Reorder subclauses in menus "Switches for gcc"
+
+       * gnat_ugn.texi: Update documentation about the library directory in
+       Library Projects.
+
+       * makegpr.adb (Display_Command): In verbose mode, also display the
+       value of the CPATH env var, when the compiler is gcc.
+       (Initialize): Change the Scan_Args while loop to a for loop
+       (Compile_Individual_Sources): Change directory to object directory
+       before compilations.
+
+       * symbols.ads: New symbol policy Restricted.
+
+2004-06-11  Olivier Hainque  <hainque@act-europe.fr>
+
+       * a-except.adb (Raise_After_Setup family): Remove. The responsibility
+       is now taken care of internally in the Exception_Propagation package
+       and does not require clients assistance any more.
+
+       * a-exexpr.adb (Is_Setup_And_Not_Propagated,
+       Set_Setup_And_Not_Propagated, and Clear_Setup_And_Not_Propagated): New
+       functions. Helpers to maintain a predicate required in the handling of
+       occurrence transfer between tasks.
+       This is now handled internally and does not require clients assistance
+       for the setup/propagate separation anymore.
+       (Setup_Exception, Propagate_Exception): Simplify the Private_Data
+       allocation strategy, handle the Setup_And_Not_Propagated predicate and
+       document.
+
+       * s-taenca.adb (Check_Exception): Use raise_with_msg instead of
+       raise_after_setup, now that everything is handled internally within the
+       setup/propagation engine.
+
+2004-06-11  Hristian Kirtchev  <kirtchev@gnat.com>
+
+       * exp_ch6.adb (Expand_Inlined_Call): Add function Formal_Is_Used_Once.
+       Add additional conditions for the case of an actual being a simple
+       name or literal. Improve inlining by preventing the generation
+       of temporaries with a short lifetime (one use).
+
+2004-06-11  Hristian Kirtchev  <kirtchev@gnat.com>
+
+       PR ada/15587
+
+       * einfo.ads: Minor comment updates for Has_Completion and
+       E_Constant list of flags.
+
+       * sem_ch3.adb (Analyze_Object_Declaration): Full constant declarations
+       and constant redeclarations now set the Has_Completion flag of their
+       defining identifiers.
+
+       * sem_ch7.adb (Analyze_Package_Spec): Add procedure
+       Inspect_Deferred_Constant_Completion.
+       Used to detect private deferred constants that have not been completed
+       either by a constant redeclaration or pragma Import. Emits error message
+       "constant declaration requires initialization expression".
+
+       * sem_prag.adb (Process_Import_Or_Interface): An Import pragma now
+       completes a deferred constant.
+
+2004-06-11  Geert Bosch  <bosch@gnat.com>
+
+       * eval_fat.adb (Decompose_Int): Fix rounding of negative numbers.
+
+       * s-fatgen.adb (Gradual_Scaling): Correct off-by-one error in
+       calculating exponent for scaling denormal numbers.
+       (Leading_Part): Properly raise Constraint_Error for zero or negative
+       Adjustment.
+       (Remainder): Properly raise Constraint_Error for zero divisor.
+
+2004-06-11  Thomas Quinot  <quinot@act-europe.fr>
+
+       * sem_util.adb: Minor reformatting.
+
+       * exp_ch2.adb (Expand_Entry_Parameter): Generate an explicit
+       dereference when accessing the entry parameter record.
+       (Check_Array_Type): Always check for possible implicit dereference.
+       (maybe_implicit_dereference): Rename to check_no_implicit_derefence.
+       Abort if a pointer is still present (denoting that an implicit
+       dereference was left in the tree by the front-end).
+
+       * sem_attr.adb (Expand_Entry_Parameter): Generate an explicit
+       dereference when accessing the entry parameter record.
+       (Check_Array_Type): Always check for possible implicit dereference.
+       (maybe_implicit_dereference): Rename to check_no_implicit_derefence.
+       Abort if a pointer is still present (denoting that an implicit
+       dereference was left in the tree by the front-end).
+
+2004-06-11  Emmanuel Briot  <briot@act-europe.fr>
+
+       * g-debpoo.adb (Deallocate, Dereference): Add prefix "error:" to error
+       message, like the compiler itself does. Easier to parse the output.
+
+       * g-debpoo.ads: (Allocate, Deallocate, Dereference): Add comments.
+
+       * gnat_ugn.texi (gnatxref, gnatfind): Clarify that source names should
+       be base names, and not includes directories.
+
+2004-06-11  Arnaud Charlet  <charlet@act-europe.fr>
+
+       * Makefile.generic ($(EXEC)): Depend on $(OBJECTS), not $(OBJ_FILES),
+       so that dependencies are properly taken into account by make.
+
+2004-06-11  Arnaud Charlet  <charlet@act-europe.fr>
+
+       PR ada/15622
+       * s-unstyp.ads, s-maccod.ads, sem_ch8.adb, s-auxdec.ads,
+       exp_intr.adb, s-auxdec-vms_64.ads: Fix typo: instrinsic -> intrinsic
+
+2004-06-11  Jerome Guitton  <guitton@act-europe.fr>
+
+       * Makefile.in (install-gnatlib): install target-specific run-time files.
+
+       * Make-lang.in: Remove obsolete targets.
+
+2004-06-11  Ed Schonberg  <schonberg@gnat.com>
+
+       * par-ch12.adb (P_Generic): Add scope before analyzing subprogram
+       specification, to catch misuses of program unit names.
+
+       * sem_res.adb (Resolve_Type_Conversion): Do not emit warnings on
+       superfluous conversions in an instance.
+
+2004-06-11  Ed Schonberg  <schonberg@gnat.com>
+
+       PR ada/15403
+
+       * sem_ch12.adb (Save_References): If operator node has been folded to
+       enumeration literal, associated_node must be discarded.
+
+2004-06-11  Jose Ruiz  <ruiz@act-europe.fr>
+
+       * s-stchop-vxworks.adb: Add required pragma Convention to
+       Task_Descriptor because it is updated by a C function.
+
 2004-06-08  Arnaud Charlet  <charlet@act-europe.fr>
 
        PR ada/15568
index 1342a542da22ee9a80dc117e4c8357dd4d7b6b4b..05ea6eaac10c803f61ed7b375c199137652fc113 100644 (file)
@@ -279,12 +279,6 @@ gnatbind$(exeext): ada/b_gnatb.o $(CONFIG_H) $(GNATBIND_OBJS)
        $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ ada/b_gnatb.o $(GNATBIND_OBJS) \
             $(LIBS) $(SYSLIBS)
 
-install-rts-zfp: force
-       $(MAKE) -C ada  $(FLAGS_TO_PASS) install-rts RTS_NAME=zfp
-
-install-rts-ravenscar: force
-       $(MAKE) -C ada  $(FLAGS_TO_PASS) install-rts RTS_NAME=ravenscar
-
 # use cross-gcc
 gnat-cross: force
        make $(GNAT1_ADA_OBJS) CC="gcc -B../stage1/" CFLAGS="-S -gnatp" \
index a678d2416509e79e56c5d3a714d0d73382f8e0c8..7ecd218461b747d77865f85956b1a5d50fe13812 100644 (file)
@@ -344,7 +344,7 @@ link:
 else
 
 link: $(EXEC_DIR)/$(EXEC) archive-objects
-$(EXEC_DIR)/$(EXEC): $(OBJ_FILES)
+$(EXEC_DIR)/$(EXEC): $(OBJECTS)
        @$(display) $(LINKER) -o $(EXEC_DIR)/$(EXEC) $(OBJ_DIR)/$(MAIN_OBJECT) $(LDFLAGS) $(FLDFLAGS)
        @$(LINKER) -o $(EXEC_DIR)/$(EXEC) $(OBJ_DIR)/$(MAIN_OBJECT) $(LDFLAGS) $(FLDFLAGS)
 endif
index 89fe096cdbc310bbb925606d0f87e2c0be132a26..97544297887a3759b5afbef475da9ac3b0556db9 100644 (file)
@@ -1622,6 +1622,9 @@ install-gnatlib: ../stamp-gnatlib
            $(INSTALL_DATA) $$file $(DESTDIR)$(ADA_RTL_OBJ_DIR); \
            $(RANLIB) $(DESTDIR)$(ADA_RTL_OBJ_DIR)/$$file; \
        done
+       -$(foreach file, $(EXTRA_ADALIB_FILES), \
+           $(INSTALL_DATA_DATE) rts/$(file) $(DESTDIR)$(ADA_RTL_OBJ_DIR) && \
+       ) true
 #     Install the shared libraries, if any, using $(INSTALL) instead
 #     of $(INSTALL_DATA). The latter may force a mode inappropriate
 #     for shared libraries on some targets, e.g. on HP-UX where the x
index c07790ab4fe132140a15a12384a993998b0a9e32..477caa87558da9d66de55d641e02478e66791985 100644 (file)
@@ -331,20 +331,6 @@ package body Ada.Exceptions is
    --  exception occurrence referenced by the Current_Excep in the TSD.
    --  Abort is deferred before the raise call.
 
-   procedure Raise_With_Msg (E : Exception_Id; Setup : Boolean);
-   pragma No_Return (Raise_With_Msg);
-   --  Similar to above, with an extra parameter to indicate wether
-   --  Setup_Exception has been called already.
-
-   procedure Raise_After_Setup (E : Exception_Id);
-   pragma No_Return (Raise_After_Setup);
-   pragma Export (C, Raise_After_Setup, "__gnat_raise_after_setup");
-   --  Wrapper to Raise_With_Msg and Setup set to True.
-   --
-   --  This is called by System.Tasking.Entry_Calls.Check_Exception when an
-   --  exception has occured during an entry call. The exception to propagate
-   --  has been setup and initialized via Transfer_Occurrence in this case.
-
    procedure Raise_With_Location_And_Msg
      (E : Exception_Id;
       F : Big_String_Ptr;
@@ -993,13 +979,11 @@ package body Ada.Exceptions is
    -- Raise_With_Msg --
    --------------------
 
-   procedure Raise_With_Msg (E : Exception_Id; Setup : Boolean) is
+   procedure Raise_With_Msg (E : Exception_Id) is
       Excep : constant EOA := Get_Current_Excep.all;
 
    begin
-      if not Setup then
-         Exception_Propagation.Setup_Exception (Excep, Excep);
-      end if;
+      Exception_Propagation.Setup_Exception (Excep, Excep);
 
       Excep.Exception_Raised := False;
       Excep.Id               := E;
@@ -1010,20 +994,6 @@ package body Ada.Exceptions is
       Raise_Current_Excep (E);
    end Raise_With_Msg;
 
-   procedure Raise_With_Msg (E : Exception_Id) is
-   begin
-      Raise_With_Msg (E, Setup => False);
-   end Raise_With_Msg;
-
-   -----------------------
-   -- Raise_After_Setup --
-   -----------------------
-
-   procedure Raise_After_Setup (E : Exception_Id) is
-   begin
-      Raise_With_Msg (E, Setup => True);
-   end Raise_After_Setup;
-
    --------------------------------------
    -- Calls to Run-Time Check Routines --
    --------------------------------------
index b42b3fc7fd77bcbc2543cc3ae90f3be7d7c45b9a..0d0eb09475942ba7dbc0115300089d538fe6693f 100644 (file)
@@ -36,6 +36,8 @@ with Interfaces;
 with Ada.Unchecked_Conversion;
 with Ada.Unchecked_Deallocation;
 
+with System.Storage_Elements;  use System.Storage_Elements;
+
 pragma Warnings (Off);
 --  Since several constructs give warnings in 3.14a1, including unreferenced
 --  variables and pragma Unreferenced itself.
@@ -170,22 +172,6 @@ package body Exception_Propagation is
    procedure Free is new Unchecked_Deallocation
      (Exception_Occurrence, EOA);
 
-   function Remove
-     (Top   : EOA;
-      Excep : GNAT_GCC_Exception_Access) return Boolean;
-   --  Remove Excep from the stack starting at Top.
-   --  Return True if Excep was found and removed, false otherwise.
-
-   --  Hooks called when entering/leaving an exception handler for a given
-   --  occurrence, aimed at handling the stack of active occurrences. The
-   --  calls are generated by gigi in tree_transform/N_Exception_Handler.
-
-   procedure Begin_Handler (GCC_Exception : GNAT_GCC_Exception_Access);
-   pragma Export (C, Begin_Handler, "__gnat_begin_handler");
-
-   procedure End_Handler (GCC_Exception : GNAT_GCC_Exception_Access);
-   pragma Export (C, End_Handler, "__gnat_end_handler");
-
    function CleanupUnwind_Handler
      (UW_Version   : Integer;
       UW_Phases    : Unwind_Action;
@@ -211,6 +197,41 @@ package body Exception_Propagation is
       UW_Argument  : System.Address);
    pragma Import (C, Unwind_ForcedUnwind, "__gnat_Unwind_ForcedUnwind");
 
+   --------------------------------------------
+   -- Occurrence stack management facilities --
+   --------------------------------------------
+
+   function Remove
+     (Top   : EOA;
+      Excep : GNAT_GCC_Exception_Access) return Boolean;
+   --  Remove Excep from the stack starting at Top.
+   --  Return True if Excep was found and removed, false otherwise.
+
+   --  Hooks called when entering/leaving an exception handler for a given
+   --  occurrence, aimed at handling the stack of active occurrences. The
+   --  calls are generated by gigi in tree_transform/N_Exception_Handler.
+
+   procedure Begin_Handler (GCC_Exception : GNAT_GCC_Exception_Access);
+   pragma Export (C, Begin_Handler, "__gnat_begin_handler");
+
+   procedure End_Handler (GCC_Exception : GNAT_GCC_Exception_Access);
+   pragma Export (C, End_Handler, "__gnat_end_handler");
+
+   --  To handle the case of a task "transferring" an exception occurrence to
+   --  another task, for instance via Exceptional_Complete_Rendezvous, we need
+   --  to be able to identify occurrences which have been Setup and not yet
+   --  Propagated. We hijack one of the common header fields for that purpose,
+   --  setting it to a special key value during the setup process, clearing it
+   --  at the very beginning of the propagation phase, and expecting it never
+   --  to be reset to the special value later on.
+
+   Setup_Key : constant := 16#DEAD_BEEF#;
+
+   function Is_Setup_And_Not_Propagated (E : EOA) return Boolean;
+
+   procedure Set_Setup_And_Not_Propagated (E : EOA);
+   procedure Clear_Setup_And_Not_Propagated (E : EOA);
+
    ------------------------------------------------------------
    -- Accessors to basic components of a GNAT exception data --
    ------------------------------------------------------------
@@ -316,11 +337,48 @@ package body Exception_Propagation is
       return URC_NO_REASON;
    end CleanupUnwind_Handler;
 
+   ---------------------------------
+   -- Is_Setup_And_Not_Propagated --
+   ---------------------------------
+
+   function Is_Setup_And_Not_Propagated (E : EOA) return Boolean is
+      GCC_E : GNAT_GCC_Exception_Access :=
+        To_GNAT_GCC_Exception (E.Private_Data);
+   begin
+      return GCC_E /= null and then GCC_E.Header.Private1 = Setup_Key;
+   end Is_Setup_And_Not_Propagated;
+
+   ------------------------------------
+   -- Clear_Setup_And_Not_Propagated --
+   ------------------------------------
+
+   procedure Clear_Setup_And_Not_Propagated (E : EOA) is
+      GCC_E : GNAT_GCC_Exception_Access :=
+        To_GNAT_GCC_Exception (E.Private_Data);
+   begin
+      pragma Assert (GCC_E /= null);
+      GCC_E.Header.Private1 := 0;
+   end Clear_Setup_And_Not_Propagated;
+
+   ----------------------------------
+   -- Set_Setup_And_Not_Propagated --
+   ----------------------------------
+
+   procedure Set_Setup_And_Not_Propagated (E : EOA) is
+      GCC_E : GNAT_GCC_Exception_Access :=
+        To_GNAT_GCC_Exception (E.Private_Data);
+   begin
+      pragma Assert (GCC_E /= null);
+      GCC_E.Header.Private1 := Setup_Key;
+   end Set_Setup_And_Not_Propagated;
+
    ---------------------
    -- Setup_Exception --
    ---------------------
 
-   --  Push the current exception occurrence on the stack before overriding it.
+   --  In this implementation of the exception propagation scheme, this
+   --  subprogram should be understood as: Setup the exception occurrence
+   --  stack headed at Current for a forthcoming raise of Excep.
 
    procedure Setup_Exception
      (Excep    : EOA;
@@ -331,38 +389,62 @@ package body Exception_Propagation is
       Next          : EOA;
       GCC_Exception : GNAT_GCC_Exception_Access;
 
-      --  Note that we make no use of the Reraised indication at this point.
-
-      --  The information is still passed around just in case of future needs,
-      --  since we've already switched between using/not-using it a number of
-      --  times.
-
    begin
-      --  If the current exception is not live, the stack is empty and there
-      --  is nothing to do. Note that the stack always appears empty for
-      --  mechanisms that do not require one. For the mechanism we implement
-      --  in this unit, the initial Private_Data allocation for an occurrence
-      --  is issued by Propagate_Exception.
 
-      if Top.Private_Data = System.Null_Address then
+      --  The exception Excep is soon to be propagated, and the storage used
+      --  for that will be the occurrence statically allocated for the current
+      --  thread. This storage might currently be used for a still active
+      --  occurrence, so we need to push it on the thread's occurrence stack
+      --  (headed at that static occurrence) before it gets clobbered.
+
+      --  What we do here is to trigger this push when need be, and allocate a
+      --  Private_Data block for the forthcoming Propagation.
+
+      --  Some tasking rendez-vous attempts lead to an occurrence transfer
+      --  from the server to the client (see Exceptional_Complete_Rendezvous).
+      --  In those cases Setup is called twice for the very same occurrence
+      --  before it gets propagated: once from the server, because this is
+      --  where the occurrence contents is elaborated and known, and then
+      --  once from the client when it detects the case and actually raises
+      --  the exception in its own context.
+
+      --  The Is_Setup_And_Not_Propagated predicate tells us when we are in
+      --  the second call to Setup for a Transferred occurrence, and there is
+      --  nothing to be done here in this situation. This predicate cannot be
+      --  True if we are dealing with a Reraise, and we may even be called
+      --  with a raw uninitialized Excep occurrence in this case so we should
+      --  not check anyway. Observe the front-end expansion for a "raise;" to
+      --  see that happening. We get a local occurrence and a direct call to
+      --  Save_Occurrence without the intermediate init-proc call.
+
+      if not Reraised and then Is_Setup_And_Not_Propagated (Excep) then
          return;
       end if;
 
-      --  Shift the contents of the Top of the stack in a freshly allocated
-      --  entry, which leaves the room in the fixed Top entry available for the
-      --  occurrence about to be propagated.
+      --  Allocate what will be the Private_Data block for the exception
+      --  to be propagated.
 
-      Next := new Exception_Occurrence;
-      Save_Occurrence_And_Private (Next.all, Top.all);
+      GCC_Exception := new GNAT_GCC_Exception;
 
-      --  Allocate Private_Data for the occurrence about to be propagated
-      --  and link everything together.
+      --  If the Top of the occurrence stack is not currently used for an
+      --  active exception (the stack is empty) we just need to setup the
+      --  Private_Data pointer.
 
-      GCC_Exception := new GNAT_GCC_Exception;
-      GCC_Exception.Next_Exception := Next;
+      --  Otherwise, we also need to shift the contents of the Top of the
+      --  stack in a freshly allocated entry and link everything together.
+
+      if Top.Private_Data /= System.Null_Address then
+         Next := new Exception_Occurrence;
+         Save_Occurrence_And_Private (Next.all, Top.all);
+
+         GCC_Exception.Next_Exception := Next;
+         Top.Private_Data := GCC_Exception.all'Address;
+      end if;
 
       Top.Private_Data := GCC_Exception.all'Address;
 
+      Set_Setup_And_Not_Propagated (Top);
+
    end Setup_Exception;
 
    -------------------
@@ -403,16 +485,16 @@ package body Exception_Propagation is
       GCC_Exception : GNAT_GCC_Exception_Access;
 
    begin
-      if Excep.Private_Data = System.Null_Address then
-         GCC_Exception := new GNAT_GCC_Exception;
-         Excep.Private_Data := GCC_Exception.all'Address;
-      else
-         GCC_Exception := To_GNAT_GCC_Exception (Excep.Private_Data);
-      end if;
+      pragma Assert (Excep.Private_Data /= System.Null_Address);
 
-      --  Fill in the useful flags for the personality routine called for each
+      --  Retrieve the Private_Data for this occurrence and set the useful
+      --  flags for the personality routine, which will be called for each
       --  frame via Unwind_RaiseException below.
 
+      GCC_Exception := To_GNAT_GCC_Exception (Excep.Private_Data);
+
+      Clear_Setup_And_Not_Propagated (Excep);
+
       GCC_Exception.Id := Excep.Id;
       GCC_Exception.N_Cleanups_To_Trigger := 0;
 
index 57f97329602b35b709b6843d9403169ade8f689f..7327be8b246401547645c638518e0864e98bbfe9 100644 (file)
@@ -1250,8 +1250,8 @@ package Einfo is
 --    Has_Completion (Flag26)
 --       Present in all entities that require a completion (functions,
 --       procedures, private types, limited private types, incomplete types,
---       and packages that require a body). Set if the completion has been
---       encountered and analyzed.
+--       constants and packages that require a body). The flag is set if the
+--       completion has been encountered and analyzed.
 
 --    Has_Completion_In_Body (Flag71)
 --       Present in  "Taft amendment types" that is to say incomplete types
@@ -4142,6 +4142,7 @@ package Einfo is
    --    Has_Alignment_Clause          (Flag46)
    --    Has_Atomic_Components         (Flag86)
    --    Has_Biased_Representation     (Flag139)
+   --    Has_Completion                (Flag26)   (constants only)
    --    Has_Size_Clause               (Flag29)
    --    Has_Volatile_Components       (Flag87)
    --    Is_Atomic                     (Flag85)
index 2d4399303012be76fd7025e589b27c97585b150d..00a131dd623d23afa9b18928024b330e3774522f 100644 (file)
@@ -382,14 +382,10 @@ package body Eval_Fat is
       Calculate_Fraction_And_Exponent : begin
          Uintp_Mark := Mark;
 
-         --  Put back sign before applying the rounding.
-
-         if UR_Is_Negative (X) then
-            Fraction := -Fraction;
-         end if;
-
          --  Determine correct rounding based on the remainder
-         --  which is in N and the divisor D.
+         --  which is in N and the divisor D. The rounding is
+         --  performed on the absolute value of X, so Ceiling
+         --  and Floor need to check for the sign of X explicitly.
 
          case Mode is
             when Round_Even =>
@@ -416,11 +412,14 @@ package body Eval_Fat is
                end if;
 
             when Ceiling =>
-               if N > Uint_0 then
+               if N > Uint_0 and then not UR_Is_Negative (X) then
                   Fraction := Fraction + 1;
                end if;
 
-            when Floor   => null;
+            when Floor   =>
+               if N > Uint_0 and then UR_Is_Negative (X) then
+                  Fraction := Fraction + 1;
+               end if;
          end case;
 
          --  The result must be normalized to [1.0/Radix, 1.0),
@@ -431,6 +430,12 @@ package body Eval_Fat is
             Exponent := Exponent + 1;
          end if;
 
+         --  Put back sign after applying the rounding.
+
+         if UR_Is_Negative (X) then
+            Fraction := -Fraction;
+         end if;
+
          Release_And_Save (Uintp_Mark, Fraction, Exponent);
       end Calculate_Fraction_And_Exponent;
    end Decompose_Int;
index 7192cb9a33350455c003e41a8b77a1df32c5c14c..966670d68c2b1df76975c54208b4c5cfbeb09c78 100644 (file)
@@ -519,8 +519,9 @@ package body Exp_Ch2 is
       P_Comp_Ref :=
         Make_Selected_Component (Loc,
           Prefix =>
-            Unchecked_Convert_To (Parm_Type,
-              New_Reference_To (Addr_Ent, Loc)),
+            Make_Explicit_Dereference (Loc,
+              Unchecked_Convert_To (Parm_Type,
+                New_Reference_To (Addr_Ent, Loc))),
           Selector_Name =>
             New_Reference_To (Entry_Component (Ent_Formal), Loc));
 
index 67d18dde16a4cb431f63e0038a18f34a335d2c19..edb31846708dc8c1a2a14031c8bcd7717597451c 100644 (file)
@@ -2278,6 +2278,9 @@ package body Exp_Ch6 is
       --  If procedure body has no local variables, inline body without
       --  creating block,  otherwise rewrite call with block.
 
+      function Formal_Is_Used_Once (Formal : Entity_Id) return Boolean;
+      --  Determine whether a formal parameter is used only once in Orig_Bod
+
       ---------------------
       -- Make_Exit_Label --
       ---------------------
@@ -2512,6 +2515,62 @@ package body Exp_Ch6 is
          end if;
       end Rewrite_Procedure_Call;
 
+      -------------------------
+      -- Formal_Is_Used_Once --
+      ------------------------
+
+      function Formal_Is_Used_Once (Formal : Entity_Id) return Boolean is
+         Use_Counter : Int := 0;
+
+         function Count_Uses (N : Node_Id) return Traverse_Result;
+         --  Traverse the tree and count the uses of the formal parameter.
+         --  In this case, for optimization purposes, we do not need to
+         --  continue the traversal once more than one use is encountered.
+
+         function Count_Uses (N : Node_Id) return Traverse_Result is
+         begin
+
+            --  The original node is an identifier
+
+            if Nkind (N) = N_Identifier
+              and then Present (Entity (N))
+
+               --  The original node's entity points to the one in the
+               --  copied body.
+
+              and then Nkind (Entity (N)) = N_Identifier
+              and then Present (Entity (Entity (N)))
+
+               --  The entity of the copied node is the formal parameter
+
+              and then Entity (Entity (N)) = Formal
+            then
+               Use_Counter := Use_Counter + 1;
+
+               if Use_Counter > 1 then
+
+                  --  Denote more than one use and abandon the traversal
+
+                  Use_Counter := 2;
+                  return Abandon;
+
+               end if;
+            end if;
+
+            return OK;
+         end Count_Uses;
+
+         procedure Count_Formal_Uses is new Traverse_Proc (Count_Uses);
+
+      --  Start of processing for Formal_Is_Used_Once
+
+      begin
+
+         Count_Formal_Uses (Orig_Bod);
+         return Use_Counter = 1;
+
+      end Formal_Is_Used_Once;
+
    --  Start of processing for Expand_Inlined_Call
 
    begin
@@ -2608,6 +2667,13 @@ package body Exp_Ch6 is
                (not Is_Scalar_Type (Etype (A))
                  or else Ekind (Entity (A)) = E_Enumeration_Literal))
 
+         --  When the actual is an identifier and the corresponding formal
+         --  is used only once in the original body, the formal can be
+         --  substituted directly with the actual parameter.
+
+           or else (Nkind (A) = N_Identifier
+             and then Formal_Is_Used_Once (F))
+
            or else Nkind (A) = N_Real_Literal
            or else Nkind (A) = N_Integer_Literal
            or else Nkind (A) = N_Character_Literal
index 9fe4052297066146c96bed6a3e38b2e67ee3e765..f7014d25f937cb6bfe1a3484faedc1f86ef9126c 100644 (file)
@@ -72,7 +72,7 @@ package body Exp_Intr is
 
    procedure Expand_Shift (N : Node_Id; E : Entity_Id; K : Node_Kind);
    --  Expand an intrinsic shift operation, N and E are from the call to
-   --  Expand_Instrinsic_Call (call node and subprogram spec entity) and
+   --  Expand_Intrinsic_Call (call node and subprogram spec entity) and
    --  K is the kind for the shift node
 
    procedure Expand_Unc_Conversion (N : Node_Id; E : Entity_Id);
index 4d93310db2fd311beb205c5d1f61fdf1f521b690..340c2f65158dfba48dc5304f0c93acb760782147 100644 (file)
@@ -1095,7 +1095,7 @@ package body GNAT.Debug_Pools is
          if Pool.Raise_Exceptions then
             raise Freeing_Not_Allocated_Storage;
          else
-            Put ("Freeing not allocated storage, at ");
+            Put ("error: Freeing not allocated storage, at ");
             Put_Line (Pool.Stack_Trace_Depth, null,
                       Deallocate_Label'Address,
                       Code_Address_For_Deallocate_End);
@@ -1106,7 +1106,7 @@ package body GNAT.Debug_Pools is
          if Pool.Raise_Exceptions then
             raise Freeing_Deallocated_Storage;
          else
-            Put ("Freeing already deallocated storage, at ");
+            Put ("error: Freeing already deallocated storage, at ");
             Put_Line (Pool.Stack_Trace_Depth, null,
                       Deallocate_Label'Address,
                       Code_Address_For_Deallocate_End);
@@ -1225,7 +1225,7 @@ package body GNAT.Debug_Pools is
          if Pool.Raise_Exceptions then
             raise Accessing_Not_Allocated_Storage;
          else
-            Put ("Accessing not allocated storage, at ");
+            Put ("error: Accessing not allocated storage, at ");
             Put_Line (Pool.Stack_Trace_Depth, null,
                       Dereference_Label'Address,
                       Code_Address_For_Dereference_End);
@@ -1238,7 +1238,7 @@ package body GNAT.Debug_Pools is
             if Pool.Raise_Exceptions then
                raise Accessing_Deallocated_Storage;
             else
-               Put ("Accessing deallocated storage, at ");
+               Put ("error: Accessing deallocated storage, at ");
                Put_Line
                  (Pool.Stack_Trace_Depth, null,
                   Dereference_Label'Address,
index 3cfe1bc270af7e2886948cdff5b865d2a7b95e39..6207f93878d9e5ff131fc491b228644bedd4f48a 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2003 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2004 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- --
@@ -249,20 +249,35 @@ private
       Storage_Address          : out Address;
       Size_In_Storage_Elements : Storage_Count;
       Alignment                : Storage_Count);
+   --  Allocate a new chunk of memory, and set it up so that the debug pool
+   --  can check accesses to its data, and report incorrect access later on.
+   --  The parameters have the same semantics as defined in the ARM95.
 
    procedure Deallocate
      (Pool                     : in out Debug_Pool;
       Storage_Address          : Address;
       Size_In_Storage_Elements : Storage_Count;
       Alignment                : Storage_Count);
+   --  Mark a block of memory as invalid. It might not be physically removed
+   --  immediately, depending on the setup of the debug pool, so that checks
+   --  are still possible.
+   --  The parameters have the same semantics as defined in the ARM95.
 
    function Storage_Size (Pool : Debug_Pool) return SSC;
+   --  Return the maximal size of data that can be allocated through Pool.
+   --  Since Pool uses the malloc() system call, all the memory is accessible
+   --  through the pool
 
    procedure Dereference
      (Pool                     : in out Debug_Pool;
       Storage_Address          : System.Address;
       Size_In_Storage_Elements : Storage_Count;
       Alignment                : Storage_Count);
+   --  Check whether a derefence statement is valid, ie whether the pointer
+   --  was allocated through Pool. As documented above, errors will be
+   --  reported either by a special error message or an exception, depending
+   --  on the setup of the storage pool.
+   --  The parameters have the same semantics as defined in the ARM95.
 
    type Byte_Count is mod System.Max_Binary_Modulus;
    --  Type used for maintaining byte counts, needs to be large enough
index 82f64a923966baf83718ad1b0f1e574a4d166189..809973c7d089a271d691604486de79b81fc71bbb 100644 (file)
@@ -280,10 +280,10 @@ Switches for gcc
 * Output and Error Message Control::
 * Warning Message Control::
 * Debugging and Assertion Control::
-* Run-Time Checks::
-* Stack Overflow Checking::
 * Validity Checking::
 * Style Checking::
+* Run-Time Checks::
+* Stack Overflow Checking::
 * Using gcc for Syntax Checking::
 * Using gcc for Semantic Checking::
 * Compiling Ada 83 Programs::
@@ -3631,10 +3631,10 @@ describe the switches in more detail in functionally grouped sections.
 * Output and Error Message Control::
 * Warning Message Control::
 * Debugging and Assertion Control::
-* Run-Time Checks::
-* Stack Overflow Checking::
 * Validity Checking::
 * Style Checking::
+* Run-Time Checks::
+* Stack Overflow Checking::
 * Using gcc for Syntax Checking::
 * Using gcc for Semantic Checking::
 * Compiling Ada 83 Programs::
@@ -12435,6 +12435,8 @@ The @code{Library_Dir} attribute has a string value that designates the path
 (absolute or relative) of the directory where the library will reside.
 It must designate an existing directory, and this directory must be
 different from the project's object directory. It also needs to be writable.
+The directory should only be used for one library; the reason is that all
+files contained in this directory may be deleted by the Project Manager.
 
 If both @code{Library_Name} and @code{Library_Dir} are specified and
 are legal, then the project file defines a library project.  The optional
@@ -13758,6 +13760,10 @@ specifying @file{source*.adb} is the same as giving every file in the current
 directory whose name starts with @file{source} and whose extension is
 @file{adb}.
 
+You shouldn't specify any directory name, just base names. @command{gnatxref}
+and @command{gnatfind} will be able to locate these files by themselves using
+the source path. If you specify directories, no result is produced.
+
 @end table
 
 @noindent
index 3dc76ef09322ef6718f0cc2eccdbbf7321be78cd..6d5595e7264569d2f72cb9eca8927ed159d135ba 100644 (file)
@@ -43,6 +43,7 @@ with Osint;    use Osint;
 with Osint.B;  use Osint.B;
 with Output;   use Output;
 with Rident;   use Rident;
+with Snames;
 with Switch;   use Switch;
 with Switch.B; use Switch.B;
 with Targparm; use Targparm;
@@ -444,6 +445,7 @@ begin
 
    Csets.Initialize;
    Namet.Initialize;
+   Snames.Initialize;
 
    --  Acquire target parameters
 
index 6b1dd4d3499854db87e59614e7e7ee8e94ffb0c9..f639f43fd14893c3e7e31f69ddd8ff2035505c27 100644 (file)
@@ -124,7 +124,7 @@ procedure Gnatsym is
    procedure Parse_Cmd_Line is
    begin
       loop
-         case GNAT.Command_Line.Getopt ("c C q r: s: v V:") is
+         case GNAT.Command_Line.Getopt ("c C q r: s: v V:") is
             when ASCII.NUL =>
                exit;
 
@@ -141,6 +141,9 @@ procedure Gnatsym is
                Reference_Symbol_File_Name :=
                  new String'(GNAT.Command_Line.Parameter);
 
+            when 'R' =>
+               Symbol_Policy := Restricted;
+
             when 's' =>
                Symbol_File_Name := new String'(GNAT.Command_Line.Parameter);
 
@@ -183,10 +186,11 @@ procedure Gnatsym is
    begin
       Write_Line ("gnatsym [options] object_file {object_file}");
       Write_Eol;
-      Write_Line ("   -c       Compliant policy");
-      Write_Line ("   -C       Controlled policy");
+      Write_Line ("   -c       Compliant symbol policy");
+      Write_Line ("   -C       Controlled symbol policy");
       Write_Line ("   -q       Quiet mode");
       Write_Line ("   -r<ref>  Reference symbol file name");
+      Write_Line ("   -R       Restricted symbol policy");
       Write_Line ("   -s<sym>  Symbol file name");
       Write_Line ("   -v       Verbose mode");
       Write_Line ("   -V<ver>  Version");
index a4b2a41ff9fdc1df6e8391f34c62486b3782ef2c..3de414cce223ec73dfe586e6efd9e14f66bd8192 100644 (file)
@@ -502,12 +502,8 @@ package body Make is
    procedure Debug_Msg (S : String; N : Name_Id);
    --  If Debug.Debug_Flag_W is set outputs string S followed by name N.
 
-   type Project_Array is array (Positive range <>) of Project_Id;
-   No_Projects : constant Project_Array := (1 .. 0 => No_Project);
-
    procedure Recursive_Compute_Depth
      (Project : Project_Id;
-      Visited : Project_Array;
       Depth   : Natural);
    --  Compute depth of Project and of the projects it depends on
 
@@ -5554,8 +5550,6 @@ package body Make is
    ----------------
 
    procedure Initialize is
-      Next_Arg : Positive;
-
    begin
       --  Override default initialization of Check_Object_Consistency
       --  since this is normally False for GNATBIND, but is True for
@@ -5585,10 +5579,37 @@ package body Make is
 
       Mains.Delete;
 
-      Next_Arg := 1;
-      Scan_Args : while Next_Arg <= Argument_Count loop
+      --  Add the directory where gnatmake is invoked in the front of the
+      --  path, if gnatmake is invoked with directory information.
+      --  Only do this if the platform is not VMS, where the notion of path
+      --  does not really exist.
+
+      if not OpenVMS then
+         declare
+            Command : constant String := Command_Name;
+         begin
+            for Index in reverse Command'Range loop
+               if Command (Index) = Directory_Separator then
+                  declare
+                     Absolute_Dir : constant String :=
+                       Normalize_Pathname (Command (Command'First .. Index));
+                     PATH : constant String :=
+                       Absolute_Dir & Path_Separator & Getenv ("PATH").all;
+
+                  begin
+                     Setenv ("PATH", PATH);
+                  end;
+
+                  exit;
+               end if;
+            end loop;
+         end;
+      end if;
+
+      --  Scan the switches and arguments
+
+      Scan_Args : for Next_Arg in 1 .. Argument_Count loop
          Scan_Make_Arg (Argument (Next_Arg), And_Save => True);
-         Next_Arg := Next_Arg + 1;
       end loop Scan_Args;
 
       if Usage_Requested then
@@ -5688,8 +5709,13 @@ package body Make is
 
          --  Compute depth of each project
 
+         for Proj in 1 .. Projects.Last loop
+            Projects.Table (Proj).Seen := False;
+            Projects.Table (Proj).Depth := 0;
+         end loop;
+
          Recursive_Compute_Depth
-           (Main_Project, Visited => No_Projects, Depth => 0);
+           (Main_Project, Depth => 1);
 
       else
 
@@ -6189,26 +6215,28 @@ package body Make is
 
    procedure Recursive_Compute_Depth
      (Project : Project_Id;
-      Visited : Project_Array;
       Depth   : Natural)
    is
       List : Project_List;
       Proj : Project_Id;
-      OK : Boolean;
-      New_Visited : constant Project_Array := Visited & Project;
 
    begin
-      --  Nothing to do if there is no project
+      --  Nothing to do if there is no project or if the project has already
+      --  been seen or if the depth is large enough.
 
-      if Project = No_Project then
+      if Project = No_Project
+        or else Projects.Table (Project).Seen
+        or else Projects.Table (Project).Depth >= Depth
+      then
          return;
       end if;
 
-      --  If current depth of project is lower than Depth, adjust it
+      Projects.Table (Project).Depth := Depth;
 
-      if Projects.Table (Project).Depth < Depth then
-         Projects.Table (Project).Depth := Depth;
-      end if;
+      --  Mark the project as Seen to avoid endless loop caused by limited
+      --  withs.
+
+      Projects.Table (Project).Seen := True;
 
       List := Projects.Table (Project).Imported_Projects;
 
@@ -6217,34 +6245,20 @@ package body Make is
       while List /= Empty_Project_List loop
          Proj := Project_Lists.Table (List).Project;
          List := Project_Lists.Table (List).Next;
-
-         OK := True;
-
-         --  To avoid endless loops due to cycles with limited widts,
-         --  do not revisit a project that is already in the chain of imports
-         --  that brought us here.
-
-         for J in Visited'Range loop
-            if Visited (J) = Proj then
-               OK := False;
-               exit;
-            end if;
-         end loop;
-
-         if OK then
-            Recursive_Compute_Depth
-              (Project => Proj,
-               Visited => New_Visited,
-               Depth => Depth + 1);
-         end if;
+         Recursive_Compute_Depth
+           (Project => Proj,
+            Depth => Depth + 1);
       end loop;
 
       --  Visit a project being extended, if any
 
       Recursive_Compute_Depth
         (Project => Projects.Table (Project).Extends,
-         Visited => New_Visited,
-         Depth => Depth + 1);
+         Depth   => Depth + 1);
+
+      --  Reset the Seen flag, as we leave this project
+
+      Projects.Table (Project).Seen := False;
    end Recursive_Compute_Depth;
 
    -----------------------
index 5204206d481ef5aef9ba52f08c24560f166e000e..691a6de930de86adc229e13a4fc364e470e5f2ae 100644 (file)
@@ -392,7 +392,10 @@ package body Makegpr is
       First_Source : Other_Source_Id);
    --  ??? needs comment
 
-   procedure Display_Command (Name : String; Path : String_Access);
+   procedure Display_Command
+     (Name  : String;
+      Path  : String_Access;
+      CPATH : String_Access := null);
    --  Display the command for a spawned process, if in Verbose_Mode or
    --  not in Quiet_Output.
 
@@ -1625,6 +1628,7 @@ package body Makegpr is
    is
       Source  : Other_Source := Other_Sources.Table (Source_Id);
       Success : Boolean;
+      CPATH   : String_Access := null;
 
    begin
       --  If the compiler is not know yet, get its path name
@@ -1808,11 +1812,18 @@ package body Makegpr is
 
       Add_Search_Directories (Data, Source.Language);
 
+      --  Set CPATH, if compiler is GCC
+
+      if Compiler_Is_Gcc (Source.Language) then
+         CPATH := Current_Include_Paths (Source.Language);
+      end if;
+
       --  And invoke the compiler
 
       Display_Command
-        (Compiler_Names (Source.Language).all,
-         Compiler_Paths (Source.Language));
+        (Name  => Compiler_Names (Source.Language).all,
+         Path  => Compiler_Paths (Source.Language),
+         CPATH => CPATH);
 
       Spawn
         (Compiler_Paths (Source.Language).all,
@@ -1881,6 +1892,10 @@ package body Makegpr is
       Get_Imported_Directories (Main_Project, Data);
       Projects.Table (Main_Project) := Data;
 
+      --  Compilation will occur in the object directory
+
+      Change_Dir (Get_Name_String (Data.Object_Directory));
+
       if not Data.Sources_Present then
          if Ada_Is_A_Language then
             Mains.Reset;
@@ -2238,7 +2253,11 @@ package body Makegpr is
    -- Display_Command --
    ---------------------
 
-   procedure Display_Command (Name : String; Path : String_Access) is
+   procedure Display_Command
+     (Name  : String;
+      Path  : String_Access;
+      CPATH : String_Access := null)
+   is
    begin
       --  Only display the command in Verbose Mode (-v) or when
       --  not in Quiet Output (no -q).
@@ -2247,6 +2266,11 @@ package body Makegpr is
          --  In Verbose Mode output the full path of the spawned process
 
          if Verbose_Mode then
+            if CPATH /= null then
+               Write_Str  ("CPATH = ");
+               Write_Line (CPATH.all);
+            end if;
+
             Write_Str (Path.all);
 
          else
@@ -2584,8 +2608,6 @@ package body Makegpr is
    ----------------
 
    procedure Initialize is
-      Next_Arg : Positive;
-
    begin
       --  Do some necessary package initializations
 
@@ -2605,13 +2627,10 @@ package body Makegpr is
       Add_Str_To_Name_Buffer ("compiler_command");
       Name_Compiler_Command := Name_Find;
 
-      Next_Arg := 1;
-
       --  Get the command line arguments
 
-      Scan_Args : while Next_Arg <= Argument_Count loop
+      Scan_Args : for Next_Arg in 1 .. Argument_Count loop
          Scan_Arg (Argument (Next_Arg));
-         Next_Arg := Next_Arg + 1;
       end loop Scan_Args;
 
       --  Fail if command line ended with "-P"
index 8637014a9c97ef4242397e236d462b6128aae55d..b3b71722fb693b633d7a8d4f3f249fb511e6e9f1 100644 (file)
@@ -438,6 +438,10 @@ package body MLib.Tgt is
          when Controlled =>
             Last_Argument := Last_Argument + 1;
             Arguments (Last_Argument) := new String'("-C");
+
+         when Restricted =>
+            Last_Argument := Last_Argument + 1;
+            Arguments (Last_Argument) := new String'("-R");
       end case;
 
       --  Add each relevant object file
index 7d868d0b3270291960d06e4d5e1f5c7b46f1905a..5ce66cce12e227d6e4168456cf6403c7ae6eddeb 100644 (file)
@@ -471,6 +471,10 @@ package body MLib.Tgt is
          when Controlled =>
             Last_Argument := Last_Argument + 1;
             Arguments (Last_Argument) := new String'("-C");
+
+         when Restricted =>
+            Last_Argument := Last_Argument + 1;
+            Arguments (Last_Argument) := new String'("-R");
       end case;
 
       --  Add each relevant object file
index 2880fe43678846b0da260db6e79598d6a12a9327..4dd2b1e01cd53c6f72b44bc36719059fa177de57 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2003 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2004 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- --
@@ -200,7 +200,15 @@ package body Ch12 is
          Set_Specification (Gen_Decl, P_Package (Pf_Spcn));
       else
          Gen_Decl := New_Node (N_Generic_Subprogram_Declaration, Gen_Sloc);
+
          Set_Specification (Gen_Decl, P_Subprogram_Specification);
+
+         if Nkind (Defining_Unit_Name (Specification (Gen_Decl)))
+           = N_Defining_Program_Unit_Name
+           and then Scope.Last > 0
+         then
+            Error_Msg_SP ("child unit allowed only at library level");
+         end if;
          TF_Semicolon;
       end if;
 
index 0db8d9150bdffbec5a6fda91ccaafcec668af1a4..35cb8c0c13594210756ac8867399862d1fee61ce 100644 (file)
@@ -26,6 +26,7 @@
 
 with Err_Vars; use Err_Vars;
 with Namet;    use Namet;
+with Opt;      use Opt;
 with Prj.Err;  use Prj.Err;
 with Prj.Strt; use Prj.Strt;
 with Prj.Tree; use Prj.Tree;
@@ -535,7 +536,10 @@ package body Prj.Dect is
 
       First_Declarative_Item : Project_Node_Id := Empty_Node;
 
-      First_Choice : Project_Node_Id := Empty_Node;
+      First_Choice           : Project_Node_Id := Empty_Node;
+
+      When_Others            : Boolean := False;
+      --  Set to True when there is a "when others =>" clause
 
    begin
       Case_Construction  :=
@@ -612,6 +616,7 @@ package body Prj.Dect is
          Scan;
 
          if Token = Tok_Others then
+            When_Others := True;
 
             --  Scan past "others"
 
@@ -661,7 +666,9 @@ package body Prj.Dect is
          end if;
       end loop When_Loop;
 
-      End_Case_Construction;
+      End_Case_Construction
+        (Check_All_Labels => not When_Others and not Quiet_Output,
+         Case_Location    => Location_Of (Case_Construction));
 
       Expect (Tok_End, "`END CASE`");
       Remove_Next_End_Node;
index c710a2bd0af8c47d4ce85bac970277df5290708a..c87b7e3f722294fa735d93e86cef60667fdafea7 100644 (file)
@@ -1209,7 +1209,44 @@ package body Prj.Nmsc is
                   end;
                end if;
 
-               if not Lib_Symbol_File.Default then
+               if not Lib_Symbol_Policy.Default then
+                  declare
+                     Value : constant String :=
+                               To_Lower
+                                 (Get_Name_String (Lib_Symbol_Policy.Value));
+
+                  begin
+                     if Value = "autonomous" or else Value = "default" then
+                        Data.Symbol_Data.Symbol_Policy := Autonomous;
+
+                     elsif Value = "compliant" then
+                        Data.Symbol_Data.Symbol_Policy := Compliant;
+
+                     elsif Value = "controlled" then
+                        Data.Symbol_Data.Symbol_Policy := Controlled;
+
+                     elsif Value = "restricted" then
+                        Data.Symbol_Data.Symbol_Policy := Restricted;
+
+                     else
+                        Error_Msg
+                          (Project,
+                           "illegal value for Library_Symbol_Policy",
+                           Lib_Symbol_Policy.Location);
+                     end if;
+                  end;
+               end if;
+
+               if Lib_Symbol_File.Default then
+                  if Data.Symbol_Data.Symbol_Policy = Restricted then
+                     Error_Msg
+                       (Project,
+                        "Library_Symbol_File needs to be defined when " &
+                        "symbol policy is Restricted",
+                        Lib_Symbol_Policy.Location);
+                  end if;
+
+               else
                   Data.Symbol_Data.Symbol_File := Lib_Symbol_File.Value;
 
                   Get_Name_String (Lib_Symbol_File.Value);
@@ -1245,33 +1282,10 @@ package body Prj.Nmsc is
                   end if;
                end if;
 
-               if not Lib_Symbol_Policy.Default then
-                  declare
-                     Value : constant String :=
-                               To_Lower
-                                 (Get_Name_String (Lib_Symbol_Policy.Value));
-
-                  begin
-                     if Value = "autonomous" or else Value = "default" then
-                        Data.Symbol_Data.Symbol_Policy := Autonomous;
-
-                     elsif Value = "compliant" then
-                        Data.Symbol_Data.Symbol_Policy := Compliant;
-
-                     elsif Value = "controlled" then
-                        Data.Symbol_Data.Symbol_Policy := Controlled;
-
-                     else
-                        Error_Msg
-                          (Project,
-                           "illegal value for Library_Symbol_Policy",
-                           Lib_Symbol_Policy.Location);
-                     end if;
-                  end;
-               end if;
-
                if Lib_Ref_Symbol_File.Default then
-                  if Data.Symbol_Data.Symbol_Policy /= Autonomous then
+                  if Data.Symbol_Data.Symbol_Policy = Compliant
+                    or else Data.Symbol_Data.Symbol_Policy = Controlled
+                  then
                      Error_Msg
                        (Project,
                         "a reference symbol file need to be defined",
index cc1bd83db80189fcdf1ef2e53715cdfc2e27600c..dabd2a1730d4c962d803a7bdc7461ea877b1810d 100644 (file)
@@ -260,8 +260,48 @@ package body Prj.Strt is
    -- End_Case_Construction --
    ---------------------------
 
-   procedure End_Case_Construction is
+   procedure End_Case_Construction
+     (Check_All_Labels   : Boolean;
+      Case_Location      : Source_Ptr)
+   is
+      Non_Used : Natural := 0;
+      First_Non_Used : Choice_Node_Id := First_Choice_Node_Id;
    begin
+      --  First, if Check_All_Labels is True, check if all values
+      --  of the string type have been used.
+
+      if Check_All_Labels then
+         for Choice in Choice_First .. Choices.Last loop
+               if not Choices.Table (Choice).Already_Used then
+                  Non_Used := Non_Used + 1;
+
+                  if Non_Used = 1 then
+                     First_Non_Used := Choice;
+                  end if;
+               end if;
+         end loop;
+
+         --  If only one is not used, report a single warning for this value
+         if Non_Used = 1 then
+            Error_Msg_Name_1 := Choices.Table (First_Non_Used).The_String;
+            Error_Msg ("?value { is not used as label", Case_Location);
+
+         --  If several are not used, report a warning for each one of them
+
+         elsif Non_Used > 1 then
+            Error_Msg
+              ("?the following values are not used as labels:",
+               Case_Location);
+
+            for Choice in First_Non_Used .. Choices.Last loop
+               if not Choices.Table (Choice).Already_Used then
+                  Error_Msg_Name_1 := Choices.Table (Choice).The_String;
+                  Error_Msg ("\?{", Case_Location);
+               end if;
+            end loop;
+         end if;
+      end if;
+
       --  If this is the only case construction, empty the tables
 
       if Choice_Lasts.Last = 1 then
index 633b022e8f5907a4f85c3288e22bbdaef6513d25..612a3984d27fdf9741c02f84ee4ad4bc8e5cf2ee 100644 (file)
@@ -53,11 +53,16 @@ private package Prj.Strt is
    --  into a table to be checked against the case labels of the
    --  case construction.
 
-   procedure End_Case_Construction;
+   procedure End_Case_Construction
+     (Check_All_Labels   : Boolean;
+      Case_Location      : Source_Ptr);
    --  This procedure is called at the end of a case construction
    --  to remove the case labels and to restore the previous state.
    --  In particular, in the case of nested case constructions,
    --  the case labels of the enclosing case construction are restored.
+   --  When When_Others is False and we are not in quiet output, a warning
+   --  is emitted for each value of the case variable string type that has
+   --  not been specified.
 
    procedure Parse_Choice_List
      (First_Choice : out Project_Node_Id);
index 9d82b5ff841a23bfad916e56ba00f064caa8e437..0edac399d6b84f9b8c6ead63bea46ed6df24eb91 100644 (file)
@@ -172,8 +172,8 @@ package Prj is
 
    type Lib_Kind is (Static, Dynamic, Relocatable);
 
-   type Policy is (Autonomous, Compliant, Controlled);
-   --  See explaination about this type in package Symbol
+   type Policy is (Autonomous, Compliant, Controlled, Restricted);
+   --  See explaination about this type in package Symbols
 
    type Symbol_Record is record
       Symbol_File   : Name_Id := No_Name;
index daf4b4682f2973691915fe23479038f81d6c35f2..111be333b94b5519c8242f4da97ef25e986e5af4 100644 (file)
@@ -463,7 +463,7 @@ private
    --  convention C so that the critical parameters are passed by reference.
    --  Without this, the parameters are passed by copy, creating load/store
    --  race conditions. We also inline them, since this seems more in the
-   --  spirit of the original (hardware instrinsic) routines.
+   --  spirit of the original (hardware intrinsic) routines.
 
    pragma Convention (C, Clear_Interlocked);
    pragma Inline_Always (Clear_Interlocked);
index 2d34ff111c977e2cc7b644a0fd11d23ebaf3ce74..c3e16f502ca502fbf9ea0ef72d37c4a28acf0f37 100644 (file)
@@ -459,7 +459,7 @@ private
    --  convention C so that the critical parameters are passed by reference.
    --  Without this, the parameters are passed by copy, creating load/store
    --  race conditions. We also inline them, since this seems more in the
-   --  spirit of the original (hardware instrinsic) routines.
+   --  spirit of the original (hardware intrinsic) routines.
 
    pragma Convention (C, Clear_Interlocked);
    pragma Inline_Always (Clear_Interlocked);
index c0f53b1565710195e0d7f30ba3a3c863be3d6ee4..50b5e63548c11820026b89a849f7086bfd3f758c 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2003 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2004 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- --
@@ -302,12 +302,12 @@ package body System.Fat_Gen is
       Ex : UI := Adjustment;
 
    begin
-      if Adjustment < T'Machine_Emin then
+      if Adjustment < T'Machine_Emin - 1 then
          Y  := 2.0 ** T'Machine_Emin;
          Y1 := Y;
          Ex := Ex - T'Machine_Emin;
 
-         while Ex <= 0 loop
+         while Ex < 0 loop
             Y := T'Machine (Y / 2.0);
 
             if Y = 0.0 then
@@ -337,6 +337,9 @@ package body System.Fat_Gen is
       if Radix_Digits >= T'Machine_Mantissa then
          return X;
 
+      elsif Radix_Digits <= 0 then
+         raise Constraint_Error;
+
       else
          L := Exponent (X) - Radix_Digits;
          Y := Truncation (Scaling (X, -L));
@@ -433,6 +436,10 @@ package body System.Fat_Gen is
       P_Even   : Boolean;
 
    begin
+      if Y = 0.0 then
+         raise Constraint_Error;
+      end if;
+
       if X > 0.0 then
          Sign_X :=  1.0;
          Arg := X;
index b08c3bb17b2591f3cfb955888c34f75cf2d29ac4..0c970d65824f880edcf2793c779f56ab1e3475a8 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2003 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2004 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- --
@@ -31,7 +31,7 @@
 --                                                                          --
 ------------------------------------------------------------------------------
 
---  This package provides machine code support, both for instrinsic machine
+--  This package provides machine code support, both for intrinsic machine
 --  operations, and also for machine code statements. See GNAT documentation
 --  for full details.
 
index 3c3c84e89809486b8260fd686a8c9a63db49eb74..a5cb67a927bd08b603a47b129e6748659d0f11ff 100644 (file)
@@ -122,6 +122,7 @@ package body System.Stack_Checking.Operations is
          Td_ErrorStatus  : Interfaces.C.int; -- most recent task error status
          Td_Delay        : Interfaces.C.int; -- delay/timeout ticks
       end record;
+      pragma Convention (C, Task_Descriptor);
 
       --  This VxWorks procedure fills in a specified task descriptor
       --  for a specified task.
index 97705c1f834f9682902e3d7b05f0700fa47e3c14..d63a9454b960b22f62b07be61e850a3468443d54 100644 (file)
@@ -154,7 +154,7 @@ package body System.Tasking.Entry_Calls is
       use type Ada.Exceptions.Exception_Id;
 
       procedure Internal_Raise (X : Ada.Exceptions.Exception_Id);
-      pragma Import (C, Internal_Raise, "__gnat_raise_after_setup");
+      pragma Import (C, Internal_Raise, "__gnat_raise_with_msg");
 
       E : constant Ada.Exceptions.Exception_Id :=
             Entry_Call.Exception_To_Raise;
index 5edeeb834125448cc560b67f581cd5b62e62fc3f..7617c9ac4663f8789c917df06bf51ca011b80b23 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2003 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2004 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- --
@@ -88,7 +88,7 @@ pragma Pure (Unsigned_Types);
    --  Types used for packed array conversions
 
    subtype Bytes_F is Packed_Bytes4 (1 .. Float'Size / 8);
-   --  Type used in implementation of Is_Negative instrinsic (see Exp_Intr)
+   --  Type used in implementation of Is_Negative intrinsic (see Exp_Intr)
 
    function Shift_Left
      (Value  : Short_Short_Unsigned;
index 25285378550421f650f11312c3c30a87a2b8dac4..18c6177724f1c7ede3a4e0e3aa3f2353b8cd0522 100644 (file)
@@ -671,12 +671,8 @@ package body Sem_Attr is
             --  object, and that the expression, if present, is static
             --  and within the range of the dimensions of the type.
 
-            if Is_Array_Type (P_Type) then
-               Index := First_Index (P_Base_Type);
-
-            else pragma Assert (Is_Access_Type (P_Type));
-               Index := First_Index (Base_Type (Designated_Type (P_Type)));
-            end if;
+            pragma Assert (Is_Array_Type (P_Type));
+            Index := First_Index (P_Base_Type);
 
             if No (E1) then
 
@@ -722,6 +718,7 @@ package body Sem_Attr is
          --  Normal case of array type or subtype
 
          Check_Either_E0_Or_E1;
+         Check_Dereference;
 
          if Is_Array_Type (P_Type) then
             if not Is_Constrained (P_Type)
@@ -740,26 +737,18 @@ package body Sem_Attr is
 
             D := Number_Dimensions (P_Type);
 
-         elsif Is_Access_Type (P_Type)
-           and then Is_Array_Type (Designated_Type (P_Type))
-         then
-            if Is_Entity_Name (P) and then Is_Type (Entity (P)) then
-               Error_Attr ("prefix of % attribute cannot be access type", P);
-            end if;
-
-            D := Number_Dimensions (Designated_Type (P_Type));
-
-            --  If there is an implicit dereference, then we must freeze
-            --  the designated type of the access type, since the type of
-            --  the referenced array is this type (see AI95-00106).
-
-            Freeze_Before (N, Designated_Type (P_Type));
-
          else
             if Is_Private_Type (P_Type) then
                Error_Attr
                  ("prefix for % attribute may not be private type", P);
 
+            elsif Is_Access_Type (P_Type)
+              and then Is_Array_Type (Designated_Type (P_Type))
+              and then Is_Entity_Name (P)
+              and then Is_Type (Entity (P))
+            then
+               Error_Attr ("prefix of % attribute cannot be access type", P);
+
             elsif Attr_Id = Attribute_First
                     or else
                   Attr_Id = Attribute_Last
@@ -874,6 +863,13 @@ package body Sem_Attr is
 
          Resolve (P);
          if Is_Access_Type (P_Type) then
+
+            --  If there is an implicit dereference, then we must freeze
+            --  the designated type of the access type, since the type of
+            --  the referenced array is this type (see AI95-00106).
+
+            Freeze_Before (N, Designated_Type (P_Type));
+
             Rewrite (P,
               Make_Explicit_Dereference (Sloc (P),
                 Prefix => Relocate_Node (P)));
@@ -1861,6 +1857,7 @@ package body Sem_Attr is
 
          --  If the prefix is a selected component whose prefix is of an
          --  access type, then introduce an explicit dereference.
+         --  ??? Could we reuse Check_Dereference here?
 
          if Nkind (Pref) = N_Selected_Component
            and then Is_Access_Type (Ptyp)
index 8a531409b716904f3805b3648dbc4287eb6a018e..6f1083acda8ac4b4aec6c356760d0057096e8add 100644 (file)
@@ -9531,7 +9531,6 @@ package body Sem_Ch12 is
                   --  inlining.
 
                   Rewrite (N, New_Copy (N2));
-                  Set_Associated_Node (N, N2);
                   Set_Analyzed (N, False);
                end if;
             end if;
index b81cac9052ddd334501554369844d01ebeb798c5..ea0991faa29ce57a9a0b730396c24bb5f0defac9 100644 (file)
@@ -1696,6 +1696,13 @@ package body Sem_Ch3 is
 
          Set_Is_True_Constant (Id, True);
 
+         --  If we are analyzing a constant declaration, set its completion
+         --  flag after analyzing the expression.
+
+         if Constant_Present (N) then
+            Set_Has_Completion (Id);
+         end if;
+
          if not Assignment_OK (N) then
             Check_Initialization (T, E);
          end if;
index e69736523604fccb62375264f51c1bac450e3fb0..d0a5b63e3779dc61bdaef5f18be01a127ed060e0 100644 (file)
@@ -691,6 +691,12 @@ package body Sem_Ch7 is
       --  Child and Unit are entities of compilation units. True if Child
       --  is a public child of Parent as defined in 10.1.1
 
+      procedure Inspect_Deferred_Constant_Completion;
+      --  Examines the deferred constants in the private part of the
+      --  package specification. Emits the error "constant declaration
+      --  requires initialization expression " if not completed by an
+      --  import pragma.
+
       ---------------------
       -- Clear_Constants --
       ---------------------
@@ -793,6 +799,42 @@ package body Sem_Ch7 is
          end if;
       end Is_Public_Child;
 
+      --------------------------------------------
+      --  Inspect_Deferred_Constant_Completion  --
+      --------------------------------------------
+
+      procedure Inspect_Deferred_Constant_Completion is
+         Decl   : Node_Id;
+      begin
+
+         Decl := First (Priv_Decls);
+         while Present (Decl) loop
+
+            --  Deferred constant signature
+
+            if Nkind (Decl) = N_Object_Declaration
+              and then Constant_Present (Decl)
+              and then No (Expression (Decl))
+
+               --  No need to check internally generated constants
+
+              and then Comes_From_Source (Decl)
+
+               --  The constant is not completed. A full object declaration
+               --  or a pragma Import complete a deferred constant.
+
+              and then not Has_Completion (Defining_Identifier (Decl))
+            then
+               Error_Msg_N
+                 ("constant declaration requires initialization expression",
+                 Defining_Identifier (Decl));
+
+            end if;
+
+            Decl := Next (Decl);
+         end loop;
+      end Inspect_Deferred_Constant_Completion;
+
    --  Start of processing for Analyze_Package_Specification
 
    begin
@@ -887,6 +929,11 @@ package body Sem_Ch7 is
 
          Analyze_Declarations (Priv_Decls);
 
+         --  Check the private declarations for incomplete deferred
+         --  constants.
+
+         Inspect_Deferred_Constant_Completion;
+
          --  The first private entity is the immediate follower of the last
          --  visible entity, if there was one.
 
index 1b0d7b17511094a0ae8e10d8fb049d6050461caa..78aceb63e20740a42f1be306f157460bcdce9719 100644 (file)
@@ -1436,7 +1436,7 @@ package body Sem_Ch8 is
                Set_Alias (New_S, Old_S);
             end if;
 
-            --  Note that we do not set Is_Instrinsic_Subprogram if we have
+            --  Note that we do not set Is_Intrinsic_Subprogram if we have
             --  a renaming as body, since the entity in this case is not an
             --  intrinsic (it calls an intrinsic, but we have a real body
             --  for this call, and it is in this body that the required
index c5ee33c867f1fa3ef1df0facccbe44f1a40d05dc..8501a71c72c49a8b979fd35284ba228072708eea 100644 (file)
@@ -2705,6 +2705,12 @@ package body Sem_Prag is
                Set_Is_Public (Def_Id);
                Process_Interface_Name (Def_Id, Arg3, Arg4);
 
+               --  pragma Import completes deferred constants
+
+               if Ekind (Def_Id) = E_Constant then
+                  Set_Has_Completion (Def_Id);
+               end if;
+
                --  It is not possible to import a constant of an unconstrained
                --  array type (e.g. string) because there is no simple way to
                --  write a meaningful subtype for it.
index 0dcea1dfa9a73abf909b70215ca92bf0879107d0..53574d6067340b0c4710adcc77120a9a583c7164 100644 (file)
@@ -6355,6 +6355,7 @@ package body Sem_Res is
       if Warn_On_Redundant_Constructs
         and then Comes_From_Source (Orig_N)
         and then Nkind (Orig_N) = N_Type_Conversion
+        and then not In_Instance
       then
          Orig_N := Original_Node (Expression (Orig_N));
          Orig_T := Target_Type;
index 22c5f885dd7fe6a87e973e9c4d27bd24fd832a28..d7e5f3b3ee84550910bc1cffeeb9bd80fbb2610d 100644 (file)
@@ -42,7 +42,7 @@ with Nmake;    use Nmake;
 with Output;   use Output;
 with Opt;      use Opt;
 with Restrict; use Restrict;
-with Rtsfind; use Rtsfind;
+with Rtsfind;  use Rtsfind;
 with Scans;    use Scans;
 with Scn;      use Scn;
 with Sem;      use Sem;
index c623e42b383a7a1dfff1a5384752791e0e007805..0f0c6240f26c43b83848a656de43b5a984122c64 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 2003 Free Software Foundation, Inc.               --
+--          Copyright (C) 2003-2004 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- --
@@ -229,25 +229,52 @@ package body Symbols is
 
       Success := True;
 
-      --  If policy is not autonomous, attempt to read the reference file
+      --  If policy is Compliant or Controlled, attempt to read the reference
+      --  file. If policy is Restricted, attempt to read the symbol file.
 
       if Sym_Policy /= Autonomous then
-         begin
-            Open (File, In_File, Reference);
+         case Sym_Policy is
+            when Autonomous =>
+               null;
 
-         exception
-            when Ada.Text_IO.Name_Error =>
-               return;
+            when Compliant | Controlled =>
+               begin
+                  Open (File, In_File, Reference);
 
-            when X : others =>
-               if not Quiet then
-                  Put_Line ("could not open """ & Reference & """");
-                  Put_Line (Exception_Message (X));
-               end if;
+               exception
+                  when Ada.Text_IO.Name_Error =>
+                     Success := False;
+                     return;
 
-               Success := False;
-               return;
-         end;
+                  when X : others =>
+                     if not Quiet then
+                        Put_Line ("could not open """ & Reference & """");
+                        Put_Line (Exception_Message (X));
+                     end if;
+
+                     Success := False;
+                     return;
+               end;
+
+            when Restricted =>
+               begin
+                  Open (File, In_File, Symbol_File);
+
+               exception
+                  when Ada.Text_IO.Name_Error =>
+                     Success := False;
+                     return;
+
+                  when X : others =>
+                     if not Quiet then
+                        Put_Line ("could not open """ & Symbol_File & """");
+                        Put_Line (Exception_Message (X));
+                     end if;
+
+                     Success := False;
+                     return;
+               end;
+         end case;
 
          --  Read line by line
 
@@ -637,7 +664,7 @@ package body Symbols is
                             """ is no longer present in the object files");
                end if;
 
-               if Sym_Policy = Controlled then
+               if Sym_Policy = Controlled or else Sym_Policy = Restricted then
                   Success := False;
                   return;
 
@@ -656,78 +683,83 @@ package body Symbols is
             end if;
          end loop;
 
-         --  Append additional symbols, if any, to the Original_Symbols table
+         if Sym_Policy /= Restricted then
 
-         for Index in 1 .. Symbol_Table.Last (Complete_Symbols) loop
-            S_Data := Complete_Symbols.Table (Index);
+            --  Append additional symbols, if any, to the Original_Symbols
+            --  table.
 
-            if S_Data.Present then
+            for Index in 1 .. Symbol_Table.Last (Complete_Symbols) loop
+               S_Data := Complete_Symbols.Table (Index);
 
-               if Sym_Policy = Controlled then
-                  Put_Line ("symbol """ & S_Data.Name.all &
-                            """ is not in the reference symbol file");
-                  Success := False;
-                  return;
+               if S_Data.Present then
 
-               elsif Soft_Minor_ID then
-                  Minor_ID := Minor_ID + 1;
-                  Soft_Minor_ID := False;
+                  if Sym_Policy = Controlled then
+                     Put_Line ("symbol """ & S_Data.Name.all &
+                               """ is not in the reference symbol file");
+                     Success := False;
+                     return;
+
+                  elsif Soft_Minor_ID then
+                     Minor_ID := Minor_ID + 1;
+                     Soft_Minor_ID := False;
+                  end if;
+
+                  Symbol_Table.Increment_Last (Original_Symbols);
+                  Original_Symbols.Table
+                    (Symbol_Table.Last (Original_Symbols)) := S_Data;
+                  Complete_Symbols.Table (Index).Present := False;
                end if;
+            end loop;
 
-               Symbol_Table.Increment_Last (Original_Symbols);
-               Original_Symbols.Table (Symbol_Table.Last (Original_Symbols)) :=
-                 S_Data;
-               Complete_Symbols.Table (Index).Present := False;
-            end if;
-         end loop;
+            --  Create the symbol file
 
-         --  Create the symbol file
+            Create (File, Ada.Text_IO.Out_File, Symbol_File_Name.all);
 
-         Create (File, Ada.Text_IO.Out_File, Symbol_File_Name.all);
+            Put (File, Case_Sensitive);
+            Put_Line (File, "yes");
 
-         Put (File, Case_Sensitive);
-         Put_Line (File, "yes");
+            --  Put a line in the symbol file for each symbol in the symbol
+            --  table.
 
-         --  Put a line in the symbol file for each symbol in the symbol table
+            for Index in 1 .. Symbol_Table.Last (Original_Symbols) loop
+               if Original_Symbols.Table (Index).Present then
+                  Put (File, Symbol_Vector);
+                  Put (File, Original_Symbols.Table (Index).Name.all);
 
-         for Index in 1 .. Symbol_Table.Last (Original_Symbols) loop
-            if Original_Symbols.Table (Index).Present then
-               Put (File, Symbol_Vector);
-               Put (File, Original_Symbols.Table (Index).Name.all);
+                  if Original_Symbols.Table (Index).Kind = Data then
+                     Put_Line (File, Equal_Data);
 
-               if Original_Symbols.Table (Index).Kind = Data then
-                  Put_Line (File, Equal_Data);
+                  else
+                     Put_Line (File, Equal_Procedure);
+                  end if;
 
-               else
-                  Put_Line (File, Equal_Procedure);
+                  Free (Original_Symbols.Table (Index).Name);
                end if;
+            end loop;
 
-               Free (Original_Symbols.Table (Index).Name);
-            end if;
-         end loop;
-
-         Put (File, Case_Sensitive);
-         Put_Line (File, "NO");
+            Put (File, Case_Sensitive);
+            Put_Line (File, "NO");
 
-         --  Put the version IDs
+            --  Put the version IDs
 
-         Put (File, Gsmatch);
-         Put (File, Image (Major_ID));
-         Put (File, ',');
-         Put_Line  (File, Image (Minor_ID));
+            Put (File, Gsmatch);
+            Put (File, Image (Major_ID));
+            Put (File, ',');
+            Put_Line  (File, Image (Minor_ID));
 
-         --  And we are done
+            --  And we are done
 
-         Close (File);
+            Close (File);
 
-         --  Reset both tables
+            --  Reset both tables
 
-         Symbol_Table.Set_Last (Original_Symbols, 0);
-         Symbol_Table.Set_Last (Complete_Symbols, 0);
+            Symbol_Table.Set_Last (Original_Symbols, 0);
+            Symbol_Table.Set_Last (Complete_Symbols, 0);
 
-         --  Clear the symbol file name
+            --  Clear the symbol file name
 
-         Free (Symbol_File_Name);
+            Free (Symbol_File_Name);
+         end if;
 
          Success := True;
       end if;
index 73fa2c8863c469e903b04c664d20317041146210..81a87d00b6a0172fa9094e34e44660d02d2d23d4 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 2003 Free Software Foundation, Inc.               --
+--          Copyright (C) 2003-2004 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- --
@@ -44,9 +44,13 @@ package Symbols is
       --  all symbols are already found in the reference file or with an
       --  incremented minor ID, if not.
 
-       Controlled);
+       Controlled,
       --  Fail if symbols are not the same as those in the reference file
 
+      Restricted);
+      --  Restrict the symbols to those in the symbol file. Fail if some
+      --  symbols in the symbol file are not exported from the object files.
+
    type Symbol_Kind is (Data, Proc);
    --  To distinguish between the different kinds of symbols