[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Mon, 21 Nov 2011 13:23:52 +0000 (14:23 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 21 Nov 2011 13:23:52 +0000 (14:23 +0100)
2011-11-21  Tristan Gingold  <gingold@adacore.com>

* env.c: Remove unused declaration.

2011-11-21  Pascal Obry  <obry@adacore.com>

* s-os_lib.ads: Minor style fix.

2011-11-21  Pascal Obry  <obry@adacore.com>

* adaint.c (__gnat_dup2): When fd are stdout, stdin or stderr and
identical, do nothing on Windows XP.

2011-11-21  Yannick Moy  <moy@adacore.com>

* sem_ch3.adb (Constrain_Index, Process_Range_Expr_In_Decl):
Use Full_Expander_Active instead of Expander_Active to control
the forced evaluation of expressions for the sake of generating
checks.

2011-11-21  Thomas Quinot  <quinot@adacore.com>

* init.c: On FreeBSD, stack checking failures may raise SIGBUS.

2011-11-21  Tristan Gingold  <gingold@adacore.com>

* sysdep.c (mode_read_text, mode_write_text, mode_append_text,
mode_read_binary, mode_write_binary, mode_append_binary,
mode_read_text_plus, mode_write_text_plus, mode_append_text_plus,
mode_read_binary_plus, mode_write_binary_plus,
mode_append_binary_plus): Remove unused declarations.

2011-11-21  Yannick Moy  <moy@adacore.com>

* gnat_rm.texi: Minor rewording.

2011-11-21  Hristian Kirtchev  <kirtchev@adacore.com>

* exp_imgv.adb (Expand_Width_Attribute): Emit
an error message rather than a warning when pragma Discard_Names
prevents the computation of 'Width. Do not emit an error through
the use of RE_Null.

2011-11-21  Javier Miranda  <miranda@adacore.com>

* exp_ch6.adb (Make_Build_In_Place_Call_In_Allocator): Add
implicit type conversion when the type of the allocator is an
interface. Done to force generation of displacement of the "this"
pointer when required.

2011-11-21  Ed Schonberg  <schonberg@adacore.com>

* sinfo.ads, sinfo.adb: Corresponding_Spec applies to expression
functions, and is set when the expression is a completion of a
previous declaration.
* sem_ch6.adb (Analyze_Expression_Function): To determine properly
whether an expression function completes a previous declaration,
use Find_Corresponding_Spec, as when analyzing a subprogram body.

2011-11-21  Steve Baird  <baird@adacore.com>

* sem_util.adb (Deepest_Type_Access_Level): Improve comment.
(Type_Access_Level): Improve comment.

From-SVN: r181575

14 files changed:
gcc/ada/ChangeLog
gcc/ada/adaint.c
gcc/ada/env.c
gcc/ada/exp_ch6.adb
gcc/ada/exp_imgv.adb
gcc/ada/gnat_rm.texi
gcc/ada/init.c
gcc/ada/s-os_lib.ads
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_util.adb
gcc/ada/sinfo.adb
gcc/ada/sinfo.ads
gcc/ada/sysdep.c

index c8d6cce99d558541f4e73a22a811caf83bed1810..8549dd1d2643b7486840b26cbc4b83cd5f0ad665 100644 (file)
@@ -1,3 +1,67 @@
+2011-11-21  Tristan Gingold  <gingold@adacore.com>
+
+       * env.c: Remove unused declaration.
+
+2011-11-21  Pascal Obry  <obry@adacore.com>
+
+       * s-os_lib.ads: Minor style fix.
+
+2011-11-21  Pascal Obry  <obry@adacore.com>
+
+       * adaint.c (__gnat_dup2): When fd are stdout, stdin or stderr and
+       identical, do nothing on Windows XP.
+
+2011-11-21  Yannick Moy  <moy@adacore.com>
+
+       * sem_ch3.adb (Constrain_Index, Process_Range_Expr_In_Decl):
+       Use Full_Expander_Active instead of Expander_Active to control
+       the forced evaluation of expressions for the sake of generating
+       checks.
+
+2011-11-21  Thomas Quinot  <quinot@adacore.com>
+
+       * init.c: On FreeBSD, stack checking failures may raise SIGBUS.
+
+2011-11-21  Tristan Gingold  <gingold@adacore.com>
+
+       * sysdep.c (mode_read_text, mode_write_text, mode_append_text,
+       mode_read_binary, mode_write_binary, mode_append_binary,
+       mode_read_text_plus, mode_write_text_plus, mode_append_text_plus,
+       mode_read_binary_plus, mode_write_binary_plus,
+       mode_append_binary_plus): Remove unused declarations.
+
+2011-11-21  Yannick Moy  <moy@adacore.com>
+
+       * gnat_rm.texi: Minor rewording.
+
+2011-11-21  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * exp_imgv.adb (Expand_Width_Attribute): Emit
+       an error message rather than a warning when pragma Discard_Names
+       prevents the computation of 'Width. Do not emit an error through
+       the use of RE_Null.
+
+2011-11-21  Javier Miranda  <miranda@adacore.com>
+
+       * exp_ch6.adb (Make_Build_In_Place_Call_In_Allocator): Add
+       implicit type conversion when the type of the allocator is an
+       interface. Done to force generation of displacement of the "this"
+       pointer when required.
+
+2011-11-21  Ed Schonberg  <schonberg@adacore.com>
+
+       * sinfo.ads, sinfo.adb: Corresponding_Spec applies to expression
+       functions, and is set when the expression is a completion of a
+       previous declaration.
+       * sem_ch6.adb (Analyze_Expression_Function): To determine properly
+       whether an expression function completes a previous declaration,
+       use Find_Corresponding_Spec, as when analyzing a subprogram body.
+
+2011-11-21  Steve Baird  <baird@adacore.com>
+
+       * sem_util.adb (Deepest_Type_Access_Level): Improve comment.
+       (Type_Access_Level): Improve comment.
+
 2011-11-21  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/Makefile.in (INCLUDES_FOR_SUBDIR): Add $(fsrcdir) by
index 7e701f53c14ed08499e54f1417163e87c4da976e..dde334295754b63c9f311694c787175df698d388 100644 (file)
@@ -2449,6 +2449,14 @@ __gnat_dup2 (int oldfd, int newfd)
   /* Not supported on VxWorks 5.x, but supported on VxWorks 6.0 when using
      RTPs.  */
   return -1;
+#elif defined (_WIN32)
+  /* Special case when oldfd and newfd are identical and are the standard
+     input, output or error as this makes Windows XP hangs. Note that we
+     do that only for standard file descriptors that are known to be valid. */
+  if (oldfd == newfd && newfd >= 0 && newfd <= 2)
+    return newfd;
+  else
+    return dup2 (oldfd, newfd);
 #else
   return dup2 (oldfd, newfd);
 #endif
index 1719684034a05b6a002a865177b2df3647bb9cb5..31c878e77954c0004f54e8fb19c5d1d933dd4f41 100644 (file)
@@ -110,8 +110,6 @@ __gnat_getenv (char *name, int *len, char **value)
 
 #ifdef VMS
 
-static char *to_host_path_spec (char *);
-
 typedef struct _ile3
 {
   unsigned short len, code;
index 6673328acaf560c814444f8081e5a4ebf87dc92a..93396525ddec14ff3c8e52ee6e2c57b18e8d195c 100644 (file)
@@ -7805,6 +7805,15 @@ package body Exp_Ch6 is
       --  to the object created by the allocator).
 
       Rewrite (Allocator, Make_Reference (Loc, Relocate_Node (Function_Call)));
+
+      --  Ada 2005 (AI-251): If the type of the allocator is an interface then
+      --  generate an implicit conversion to force displacement of the "this"
+      --  pointer.
+
+      if Is_Interface (Designated_Type (Acc_Type)) then
+         Rewrite (Allocator, Convert_To (Acc_Type, Relocate_Node (Allocator)));
+      end if;
+
       Analyze_And_Resolve (Allocator, Acc_Type);
    end Make_Build_In_Place_Call_In_Allocator;
 
index d66824bc35f7af5b75f2c374d4155d5fa91a8cab..1c46950a952e7fd9d6a53de5b8896099716e6fd7 100644 (file)
@@ -1156,31 +1156,27 @@ package body Exp_Imgv is
       else
          pragma Assert (Is_Enumeration_Type (Rtyp));
 
-         if Discard_Names (Rtyp) then
+         --  Whenever pragma Discard_Names is in effect, it suppresses the
+         --  generation of string literals for enumeration types. Since the
+         --  literals are required to evaluate the 'Width of an enumeration
+         --  type, emit an error.
+
+         --  ??? This is fine for configurable runtimes, but dubious in the
+         --  general case. For now keep both error messages until this issue
+         --  has been verified with the ARG.
 
-            --  Emit a detailed warning in configurable run-time mode because
-            --  loading RE_Null does not give a precise indication of the real
-            --  issue.
+         if Discard_Names (Rtyp) then
+            Error_Msg_Name_1 := Attribute_Name (N);
 
-            if Configurable_Run_Time_Mode
-              and then not Has_Warnings_Off (Rtyp)
-            then
-               Error_Msg_Name_1 := Attribute_Name (N);
-               Error_Msg_N ("?attribute % not supported in configurable " &
+            if Configurable_Run_Time_Mode then
+               Error_Msg_N ("attribute % not supported in configurable " &
                             "run-time mode", N);
+            else
+               Error_Msg_N ("attribute % not supported when pragma " &
+                            "Discard_Names is in effect", N);
             end if;
 
-            --  This is a configurable run-time, or else a restriction is in
-            --  effect. In either case the attribute cannot be supported. Force
-            --  a load error from Rtsfind to generate an appropriate message,
-            --  as is done with other ZFP violations.
-
-            declare
-               Discard : constant Entity_Id := RTE (RE_Null);
-               pragma Unreferenced (Discard);
-            begin
-               return;
-            end;
+            return;
          end if;
 
          Ttyp := Component_Type (Etype (Lit_Indexes (Rtyp)));
index 00e0543e3d8de9e447abdc1e16a0b6158da51c1c..ffe4358fb4076466e6286d226de02d6dd3a068d7 100644 (file)
@@ -6372,12 +6372,11 @@ refer to the value of the prefix on entry. So for
 example if you have an argument of a record type X called Arg1,
 you can refer to Arg1.Field'Old which yields the value of
 Arg1.Field on entry. The implementation simply involves generating
-an object declaration which captures the value on entry. Any
-prefix is allowed except one of a limited type (since limited
-types cannot be copied to capture their values) or an expression
-which references a local variable
-(since local variables do not exist at subprogram entry time).
-
+an object declaration which captures the value on entry.
+The prefix must denote an object of a nonlimited type (since limited types
+cannot be copied to capture their values) and it must not reference a local
+variable (since local variables do not exist at subprogram entry time). Note
+that the variable introduced by a quantified expression is a local variable.
 The following example shows the use of 'Old to implement
 a test of a postcondition:
 
index b6d6e6a57e1831dbc3d3e23511dcbeb30a076786..cc6c1d2c50bf8932297a0de1ab1321c99dbf81ad 100644 (file)
@@ -1808,8 +1808,8 @@ __gnat_error_handler (int sig,
       break;
 
     case SIGBUS:
-      exception = &constraint_error;
-      msg = "SIGBUS";
+      exception = &storage_error;
+      msg = "SIGBUS: possible stack overflow";
       break;
 
     default:
index 1c63e386ea923b495e90874a180b9aea575a7e65..3599261498c06cce5974243fe407e1d238616576 100755 (executable)
@@ -174,7 +174,7 @@ package System.OS_Lib is
    --  File descriptors for standard input output files
 
    Invalid_FD : constant File_Descriptor := -1;
-   --  File descriptor returned when error in opening/creating file;
+   --  File descriptor returned when error in opening/creating file
 
    type Mode is (Binary, Text);
    for Mode'Size use Integer'Size;
index 92e1b9da994f6625e137780c1d441a32a1208bde..16147713712c8af275b4960f6f300e9ae088e8c6 100644 (file)
@@ -11786,7 +11786,7 @@ package body Sem_Ch3 is
          --  needed, since checks may cause duplication of the expressions
          --  which must not be reevaluated.
 
-         if Expander_Active then
+         if Full_Expander_Active then
             Force_Evaluation (Low_Bound (R));
             Force_Evaluation (High_Bound (R));
          end if;
@@ -18326,7 +18326,7 @@ package body Sem_Ch3 is
             --  if needed, before applying checks, since checks may cause
             --  duplication of the expression without forcing evaluation.
 
-            if Expander_Active then
+            if Full_Expander_Active then
                Force_Evaluation (Lo);
                Force_Evaluation (Hi);
             end if;
@@ -18436,7 +18436,7 @@ package body Sem_Ch3 is
 
       --  Case of other than an explicit N_Range node
 
-      elsif Expander_Active then
+      elsif Full_Expander_Active then
          Get_Index_Bounds (R, Lo, Hi);
          Force_Evaluation (Lo);
          Force_Evaluation (Hi);
index 56c107484030bfca84744c7061697882a521c1c2..25ee63ec29f6310110a671d6c8fb1b1d9af0f48d 100644 (file)
@@ -268,16 +268,22 @@ package body Sem_Ch6 is
    procedure Analyze_Expression_Function (N : Node_Id) is
       Loc      : constant Source_Ptr := Sloc (N);
       LocX     : constant Source_Ptr := Sloc (Expression (N));
-      Def_Id   : constant Entity_Id  := Defining_Entity (Specification (N));
       Expr     : constant Node_Id    := Expression (N);
-      New_Body : Node_Id;
-      New_Decl : Node_Id;
+      Spec     : constant Node_Id    := Specification (N);
+
+      Def_Id   :  Entity_Id;
+      pragma Unreferenced (Def_Id);
 
-      Prev : constant Entity_Id := Current_Entity_In_Scope (Def_Id);
+      Prev     :  Entity_Id;
       --  If the expression is a completion, Prev is the entity whose
-      --  declaration is completed.
+      --  declaration is completed. Def_Id is needed to analyze the spec.
+
+      New_Body : Node_Id;
+      New_Decl : Node_Id;
+      New_Spec : Node_Id;
 
    begin
+
       --  This is one of the occasions on which we transform the tree during
       --  semantic analysis. If this is a completion, transform the expression
       --  function into an equivalent subprogram body, and analyze it.
@@ -286,10 +292,22 @@ package body Sem_Ch6 is
       --  determine whether this is possible.
 
       Inline_Processing_Required := True;
+      New_Spec := Copy_Separate_Tree (Spec);
+      Prev     := Current_Entity_In_Scope (Defining_Entity (Spec));
+
+      --  If there are previous overloadable entities with the same name,
+      --  check whether any of them is completed by the expression function.
+
+      if Present (Prev)
+        and then Is_Overloadable (Prev)
+      then
+         Def_Id   := Analyze_Subprogram_Specification (Spec);
+         Prev     := Find_Corresponding_Spec (N);
+      end if;
 
       New_Body :=
         Make_Subprogram_Body (Loc,
-          Specification              => Copy_Separate_Tree (Specification (N)),
+          Specification              => New_Spec,
           Declarations               => Empty_List,
           Handled_Statement_Sequence =>
             Make_Handled_Sequence_Of_Statements (LocX,
@@ -307,6 +325,7 @@ package body Sem_Ch6 is
 
          Insert_After (N, New_Body);
          Rewrite (N, Make_Null_Statement (Loc));
+         Set_Has_Completion (Prev, False);
          Analyze (N);
          Analyze (New_Body);
          Set_Is_Inlined (Prev);
@@ -314,6 +333,7 @@ package body Sem_Ch6 is
       elsif Present (Prev)
         and then Comes_From_Source (Prev)
       then
+         Set_Has_Completion (Prev, False);
          Rewrite (N, New_Body);
          Analyze (N);
 
@@ -333,8 +353,7 @@ package body Sem_Ch6 is
 
       else
          New_Decl :=
-           Make_Subprogram_Declaration (Loc,
-             Specification => Specification (N));
+           Make_Subprogram_Declaration (Loc, Specification => Spec);
 
          Rewrite (N, New_Decl);
          Analyze (N);
index 8e6a2a2fa36ccd5c4eaf36d68b4e435d56f8457f..edf1fecbfe6243cef06c962fb6b7b8b263531cb6 100644 (file)
@@ -2437,7 +2437,8 @@ package body Sem_Util is
                          (Defining_Identifier
                            (Associated_Node_For_Itype (Typ))));
 
-      --  For generic formal type, return Int'Last (infinite) (why ???)
+      --  For generic formal type, return Int'Last (infinite).
+      --  See comment preceding Is_Generic_Type call in Type_Access_Level.
 
       elsif Is_Generic_Type (Root_Type (Typ)) then
          return UI_From_Int (Int'Last);
@@ -12719,7 +12720,20 @@ package body Sem_Util is
          end if;
       end if;
 
-      --  Return library level for a generic formal type (why???)
+      --  Return library level for a generic formal type. This is done because
+      --  RM(10.3.2) says that "The statically deeper relationship does not
+      --  apply to ... a descendant of a generic formal type". Rather than
+      --  checking at each point where a static accessibility check is
+      --  performed to see if we are dealing with a formal type, this rule is
+      --  implemented by having Type_Access_Level and Deepest_Type_Access_Level
+      --  return extreme values for a formal type; Deepest_Type_Access_Level
+      --  returns Int'Last. By calling the appropriate function from among the
+      --  two, we ensure that the static accessibility check will pass if we
+      --  happen to run into a formal type. More specifically, we should call
+      --  Deepest_Type_Access_Level instead of Type_Access_Level whenever the
+      --  call occurs as part of a static accessibility check and the error
+      --  case is the case where the type's level is too shallow (as opposed
+      --  to too deep).
 
       if Is_Generic_Type (Root_Type (Btyp)) then
          return Scope_Depth (Standard_Standard);
index b36b930b8c4f9b6e2f41b5828fd6e278dcef01c5..22b44e56f27378802000ccb55fbc6763899ff10e 100644 (file)
@@ -657,6 +657,7 @@ package body Sinfo is
       (N : Node_Id) return Node_Id is
    begin
       pragma Assert (False
+        or else NT (N).Nkind = N_Expression_Function
         or else NT (N).Nkind = N_Package_Body
         or else NT (N).Nkind = N_Protected_Body
         or else NT (N).Nkind = N_Subprogram_Body
@@ -3729,6 +3730,7 @@ package body Sinfo is
       (N : Node_Id; Val : Node_Id) is
    begin
       pragma Assert (False
+        or else NT (N).Nkind = N_Expression_Function
         or else NT (N).Nkind = N_Package_Body
         or else NT (N).Nkind = N_Protected_Body
         or else NT (N).Nkind = N_Subprogram_Body
index 3379faef0385096c46457f875d393917d28dd11f..cfa8a11b5927b2ff580f96b7688e88e9e55a66ed 100644 (file)
@@ -760,6 +760,8 @@ package Sinfo is
    --    renaming declaration when it is a Renaming_As_Body. The field is Empty
    --    if there is no corresponding spec, as in the case of a subprogram body
    --    that serves as its own spec.
+   --    In Ada2012, Corresponding_Spec is set on expression functions that
+   --    complete a subprogram declaration.
 
    --  Corresponding_Stub (Node3-Sem)
    --    This field is present in an N_Subunit node. It holds the node in
@@ -4607,6 +4609,7 @@ package Sinfo is
       --  Sloc points to FUNCTION
       --  Specification (Node1)
       --  Expression (Node3)
+      --  Corresponding_Spec (Node5-Sem)
 
       -----------------------------------
       -- 6.4  Procedure Call Statement --
index 4d383fd0608de53f063efc89bf5d9443e198ba43..a4456f56a2490a47b6f7143a66ca137f3e37aea7 100644 (file)
@@ -80,54 +80,6 @@ extern struct tm *localtime_r(const time_t *, struct tm *);
 #endif
 
 /*
-   mode_read_text
-   open text file for reading
-   rt for DOS and Windows NT, r for Unix
-
-   mode_write_text
-   truncate to zero length or create text file for writing
-   wt for DOS and Windows NT, w for Unix
-
-   mode_append_text
-   append; open or create text file for writing at end-of-file
-   at for DOS and Windows NT, a for Unix
-
-   mode_read_binary
-   open binary file for reading
-   rb for DOS and Windows NT, r for Unix
-
-   mode_write_binary
-   truncate to zero length or create binary file for writing
-   wb for DOS and Windows NT, w for Unix
-
-   mode_append_binary
-   append; open or create binary file for writing at end-of-file
-   ab for DOS and Windows NT, a for Unix
-
-   mode_read_text_plus
-   open text file for update (reading and writing)
-   r+t for DOS and Windows NT, r+ for Unix
-
-   mode_write_text_plus
-   truncate to zero length or create text file for update
-   w+t for DOS and Windows NT, w+ for Unix
-
-   mode_append_text_plus
-   append; open or create text file for update, writing at end-of-file
-   a+t for DOS and Windows NT, a+ for Unix
-
-   mode_read_binary_plus
-   open binary file for update (reading and writing)
-   r+b for DOS and Windows NT, r+ for Unix
-
-   mode_write_binary_plus
-   truncate to zero length or create binary file for update
-   w+b for DOS and Windows NT, w+ for Unix
-
-   mode_append_binary_plus
-   append; open or create binary file for update, writing at end-of-file
-   a+b for DOS and Windows NT, a+ for Unix
-
    Notes:
 
    (1) Opening a file with read mode fails if the file does not exist or
@@ -169,18 +121,7 @@ extern struct tm *localtime_r(const time_t *, struct tm *);
 */
 
 #if defined(WINNT)
-static const char *mode_read_text = "rt";
-static const char *mode_write_text = "wt";
-static const char *mode_append_text = "at";
-static const char *mode_read_binary = "rb";
-static const char *mode_write_binary = "wb";
-static const char *mode_append_binary = "ab";
-static const char *mode_read_text_plus = "r+t";
-static const char *mode_write_text_plus = "w+t";
-static const char *mode_append_text_plus = "a+t";
-static const char *mode_read_binary_plus = "r+b";
-static const char *mode_write_binary_plus = "w+b";
-static const char *mode_append_binary_plus = "a+b";
+
 const char __gnat_text_translation_required = 1;
 
 void
@@ -261,18 +202,6 @@ __gnat_get_stack_bounds (void **base, void **limit)
 
 #else
 
-static const char *mode_read_text = "r";
-static const char *mode_write_text = "w";
-static const char *mode_append_text = "a";
-static const char *mode_read_binary = "r";
-static const char *mode_write_binary = "w";
-static const char *mode_append_binary = "a";
-static const char *mode_read_text_plus = "r+";
-static const char *mode_write_text_plus = "w+";
-static const char *mode_append_text_plus = "a+";
-static const char *mode_read_binary_plus = "r+";
-static const char *mode_write_binary_plus = "w+";
-static const char *mode_append_binary_plus = "a+";
 const char __gnat_text_translation_required = 0;
 
 /* These functions do nothing in non-DOS systems. */