summaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2014-07-18 09:05:04 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2014-07-18 09:05:04 +0000
commitaddd4a7e253c7ba64ed5f85d6fff29bdea1e10cc (patch)
tree0cf2f23c15136334abbb91e7669863ba1839f2cc /gcc/ada
parent5c3b4f09104a503edeb09d3027697049dbc4b185 (diff)
downloadgcc-addd4a7e253c7ba64ed5f85d6fff29bdea1e10cc.tar.gz
2014-07-18 Robert Dewar <dewar@adacore.com>
* bcheck.adb (Check_Consistent_Restrictions): Remove obsolete code checking for violation of No_Standard_Allocators_After_Elaboration (main program) * bindgen.adb (Gen_Adainit): Handle No_Standard_Allocators_After_Elaboration (Gen_Output_File_Ada): ditto. * exp_ch4.adb (Expand_N_Allocator): Handle No_Standard_Allocators_After_Elaboration. * Makefile.rtl: Add entry for s-elaall * rtsfind.ads: Add entry for Check_Standard_Allocator. * s-elaall.ads, s-elaall.adb: New files. * sem_ch4.adb (Analyze_Allocator): Handle No_Standard_Allocators_After_Elaboration. 2014-07-18 Robert Dewar <dewar@adacore.com> * lib.adb, lib.ads, lib-writ.adb, lib-writ.ads, ali.adb, ali.ads, lib-load.adb: Remove Lib.Has_Allocator and all uses. Remove AB parameter from ali files and all uses. Remove Allocator_In_Body and all uses. 2014-07-18 Robert Dewar <dewar@adacore.com> * g-expect-vms.adb: Add comment. 2014-07-18 Thomas Quinot <quinot@adacore.com> * par_sco.adb (Is_Logical_Operation): return True for N_If_Expression. 2014-07-18 Ed Schonberg <schonberg@adacore.com> * sem_attr.adb (Resolve_Attribute, case 'Update): Do full analysis and resolution of each choice in the associations within the argument of Update, because they may be variable names. 2014-07-18 Hristian Kirtchev <kirtchev@adacore.com> * exp_attr.adb (Expand_Loop_Entry_Attribute): Insert any condition actions before the generated if statement. 2014-07-18 Hristian Kirtchev <kirtchev@adacore.com> * gnat_ugn.texi Enhance the documentation of switches -gnateA and -gnateV. 2014-07-18 Ed Schonberg <schonberg@adacore.com> * sem_util.adb (Build_Default_Subtype): Add missing condition so that code matches description: use the full view of the base only if the base is private and the subtype is not. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212779 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog54
-rw-r--r--gcc/ada/Makefile.rtl1
-rw-r--r--gcc/ada/ali.adb11
-rw-r--r--gcc/ada/ali.ads4
-rw-r--r--gcc/ada/bcheck.adb29
-rw-r--r--gcc/ada/bindgen.adb38
-rw-r--r--gcc/ada/exp_attr.adb15
-rw-r--r--gcc/ada/exp_ch4.adb14
-rw-r--r--gcc/ada/g-expect-vms.adb5
-rw-r--r--gcc/ada/gnat_ugn.texi35
-rw-r--r--gcc/ada/lib-load.adb3
-rw-r--r--gcc/ada/lib-writ.adb6
-rw-r--r--gcc/ada/lib-writ.ads12
-rw-r--r--gcc/ada/lib.adb10
-rw-r--r--gcc/ada/lib.ads16
-rw-r--r--gcc/ada/par_sco.adb4
-rw-r--r--gcc/ada/rtsfind.ads5
-rw-r--r--gcc/ada/s-elaall.adb72
-rw-r--r--gcc/ada/s-elaall.ads57
-rw-r--r--gcc/ada/sem_attr.adb10
-rw-r--r--gcc/ada/sem_ch4.adb32
-rw-r--r--gcc/ada/sem_util.adb8
22 files changed, 344 insertions, 97 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 9b591d88ad3..632da87f745 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,57 @@
+2014-07-18 Robert Dewar <dewar@adacore.com>
+
+ * bcheck.adb (Check_Consistent_Restrictions):
+ Remove obsolete code checking for violation of
+ No_Standard_Allocators_After_Elaboration (main program)
+ * bindgen.adb (Gen_Adainit): Handle
+ No_Standard_Allocators_After_Elaboration
+ (Gen_Output_File_Ada): ditto.
+ * exp_ch4.adb (Expand_N_Allocator): Handle
+ No_Standard_Allocators_After_Elaboration.
+ * Makefile.rtl: Add entry for s-elaall
+ * rtsfind.ads: Add entry for Check_Standard_Allocator.
+ * s-elaall.ads, s-elaall.adb: New files.
+ * sem_ch4.adb (Analyze_Allocator): Handle
+ No_Standard_Allocators_After_Elaboration.
+
+2014-07-18 Robert Dewar <dewar@adacore.com>
+
+ * lib.adb, lib.ads, lib-writ.adb, lib-writ.ads, ali.adb,
+ ali.ads, lib-load.adb: Remove Lib.Has_Allocator and all uses.
+ Remove AB parameter from ali files and all uses.
+ Remove Allocator_In_Body and all uses.
+
+2014-07-18 Robert Dewar <dewar@adacore.com>
+
+ * g-expect-vms.adb: Add comment.
+
+2014-07-18 Thomas Quinot <quinot@adacore.com>
+
+ * par_sco.adb (Is_Logical_Operation): return True for
+ N_If_Expression.
+
+2014-07-18 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_attr.adb (Resolve_Attribute, case 'Update): Do full
+ analysis and resolution of each choice in the associations within
+ the argument of Update, because they may be variable names.
+
+2014-07-18 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * exp_attr.adb (Expand_Loop_Entry_Attribute): Insert any condition
+ actions before the generated if statement.
+
+2014-07-18 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * gnat_ugn.texi Enhance the documentation of
+ switches -gnateA and -gnateV.
+
+2014-07-18 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_util.adb (Build_Default_Subtype): Add missing condition
+ so that code matches description: use the full view of the base
+ only if the base is private and the subtype is not.
+
2014-07-17 Gary Dismukes <dismukes@adacore.com>
* exp_disp.adb: Minor reformatting.
diff --git a/gcc/ada/Makefile.rtl b/gcc/ada/Makefile.rtl
index 25a30e04e2d..a40dff5eeea 100644
--- a/gcc/ada/Makefile.rtl
+++ b/gcc/ada/Makefile.rtl
@@ -518,6 +518,7 @@ GNATRTL_NONTASKING_OBJS= \
s-direio$(objext) \
s-dmotpr$(objext) \
s-dsaser$(objext) \
+ s-elaall$(objext) \
s-excdeb$(objext) \
s-except$(objext) \
s-exctab$(objext) \
diff --git a/gcc/ada/ali.adb b/gcc/ada/ali.adb
index 3bf12f32584..b90c5c04da7 100644
--- a/gcc/ada/ali.adb
+++ b/gcc/ada/ali.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2014, 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- --
@@ -894,7 +894,6 @@ package body ALI is
Sfile => No_File,
Task_Dispatching_Policy => ' ',
Time_Slice_Value => -1,
- Allocator_In_Body => False,
WC_Encoding => 'b',
Unit_Exception_Table => False,
Ver => (others => ' '),
@@ -977,14 +976,6 @@ package body ALI is
Skip_Space;
- if Nextc = 'A' then
- P := P + 1;
- Checkc ('B');
- ALIs.Table (Id).Allocator_In_Body := True;
- end if;
-
- Skip_Space;
-
if Nextc = 'C' then
P := P + 1;
Checkc ('=');
diff --git a/gcc/ada/ali.ads b/gcc/ada/ali.ads
index d95d01d2e34..1d7e159ef22 100644
--- a/gcc/ada/ali.ads
+++ b/gcc/ada/ali.ads
@@ -142,10 +142,6 @@ package ALI is
-- line. A value of -1 indicates that no T=xxx parameter was found, or
-- no M line was present. Not set if 'M' appears in Ignore_Lines.
- Allocator_In_Body : Boolean;
- -- Set True if an AB switch appears on the main program line. False
- -- if no M line, or AB not present, or 'M appears in Ignore_Lines.
-
WC_Encoding : Character;
-- Wide character encoding if main procedure. Otherwise not relevant.
-- Not set if 'M' appears in Ignore_Lines.
diff --git a/gcc/ada/bcheck.adb b/gcc/ada/bcheck.adb
index fec69598cc7..0e81ee650e9 100644
--- a/gcc/ada/bcheck.adb
+++ b/gcc/ada/bcheck.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2014, 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- --
@@ -923,21 +923,18 @@ package body Bcheck is
-- Start of processing for Check_Consistent_Restrictions
begin
- -- A special test, if we have a main program, then if it has an
- -- allocator in the body, this is considered to be a violation of
- -- the restriction No_Allocators_After_Elaboration. We just mark
- -- this restriction and then the normal circuit will flag it.
-
- if Bind_Main_Program
- and then ALIs.Table (ALIs.First).Main_Program /= None
- and then not No_Main_Subprogram
- and then ALIs.Table (ALIs.First).Allocator_In_Body
- then
- Cumulative_Restrictions.Violated
- (No_Standard_Allocators_After_Elaboration) := True;
- ALIs.Table (ALIs.First).Restrictions.Violated
- (No_Standard_Allocators_After_Elaboration) := True;
- end if;
+ -- We used to have a special test here:
+
+ -- A special test, if we have a main program, then if it has an
+ -- allocator in the body, this is considered to be a violation of
+ -- the restriction No_Allocators_After_Elaboration. We just mark
+ -- this restriction and then the normal circuit will flag it.
+
+ -- But we don't do that any more, because in the final version of Ada
+ -- 2012, it is statically illegal to have an allocator in a library-
+ -- level subprogram, so we don't need this bind time test any more.
+ -- If we have a main program with parameters (which GNAT allows), then
+ -- allocators in that will be caught by the run-time check.
-- Loop through all restriction violations
diff --git a/gcc/ada/bindgen.adb b/gcc/ada/bindgen.adb
index a192953fbbc..f045b8e0235 100644
--- a/gcc/ada/bindgen.adb
+++ b/gcc/ada/bindgen.adb
@@ -739,8 +739,8 @@ package body Bindgen is
if Dispatching_Domains_Used then
WBI (" procedure Freeze_Dispatching_Domains;");
WBI (" pragma Import");
- WBI (" (Ada, Freeze_Dispatching_Domains, " &
- """__gnat_freeze_dispatching_domains"");");
+ WBI (" (Ada, Freeze_Dispatching_Domains, "
+ & """__gnat_freeze_dispatching_domains"");");
end if;
WBI (" begin");
@@ -749,6 +749,18 @@ package body Bindgen is
WBI (" end if;");
WBI (" Is_Elaborated := True;");
+ -- Call System.Elaboration_Allocators.Mark_Start_Of_Elaboration if
+ -- restriction No_Standard_Allocators_After_Elaboration is active.
+
+ if Cumulative_Restrictions.Set
+ (No_Standard_Allocators_After_Elaboration)
+ then
+ WBI (" System.Elaboration_Allocators."
+ & "Mark_Start_Of_Elaboration;");
+ end if;
+
+ -- Generate assignments to initialize globals
+
Set_String (" Main_Priority := ");
Set_Int (Main_Priority);
Set_Char (';');
@@ -996,6 +1008,15 @@ package body Bindgen is
Gen_Elab_Calls;
+ -- Call System.Elaboration_Allocators.Mark_Start_Of_Elaboration if
+ -- restriction No_Standard_Allocators_After_Elaboration is active.
+
+ if Cumulative_Restrictions.Set
+ (No_Standard_Allocators_After_Elaboration)
+ then
+ WBI (" System.Elaboration_Allocators.Mark_End_Of_Elaboration;");
+ end if;
+
-- From this point, no new dispatching domain can be created.
if Dispatching_Domains_Used then
@@ -2482,10 +2503,23 @@ package body Bindgen is
WBI ("with System.Restrictions;");
end if;
+ -- Generate with of Ada.Exceptions if needs library finalization
+
if Needs_Library_Finalization then
WBI ("with Ada.Exceptions;");
end if;
+ -- Generate with of System.Elaboration_Allocators if the restriction
+ -- No_Standard_Allocators_After_Elaboration was present.
+
+ if Cumulative_Restrictions.Set
+ (No_Standard_Allocators_After_Elaboration)
+ then
+ WBI ("with System.Elaboration_Allocators;");
+ end if;
+
+ -- Generate start of package body
+
WBI ("");
WBI ("package body " & Ada_Main & " is");
WBI (" pragma Warnings (Off);");
diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index 4e191642f3a..1585b7d4a09 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -801,7 +801,7 @@ package body Exp_Attr is
pragma Assert
(Nkind (Parent (Loop_Stmt)) = N_Handled_Sequence_Of_Statements
and then Nkind (Parent (Parent (Loop_Stmt))) =
- N_Block_Statement);
+ N_Block_Statement);
Decls := Declarations (Parent (Parent (Loop_Stmt)));
end if;
@@ -1022,6 +1022,19 @@ package body Exp_Attr is
if Present (Result) then
Rewrite (Loop_Stmt, Result);
+
+ -- The insertion of condition actions associated with an iteration
+ -- scheme is usually done by the expansion of loop statements. The
+ -- expansion of Loop_Entry however reuses the iteration scheme to
+ -- build an if statement. As a result any condition actions must be
+ -- inserted before the if statement to avoid references before
+ -- declaration.
+
+ if Present (Scheme) and then Present (Condition_Actions (Scheme)) then
+ Insert_Actions (Loop_Stmt, Condition_Actions (Scheme));
+ Set_Condition_Actions (Scheme, No_List);
+ end if;
+
Analyze (Loop_Stmt);
-- The conditional block was analyzed when a previous 'Loop_Entry was
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index 3aec3b15e0e..917f98a0e73 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -4490,6 +4490,20 @@ package body Exp_Ch4 is
end if;
end if;
+ -- If no storage pool has been specified and we have the restriction
+ -- No_Standard_Allocators_After_Elaboration is present, then generate
+ -- a call to Elaboration_Allocators.Check_Standard_Allocator.
+
+ if Nkind (N) = N_Allocator
+ and then No (Storage_Pool (N))
+ and then Restriction_Active (No_Standard_Allocators_After_Elaboration)
+ then
+ Insert_Action (N,
+ Make_Procedure_Call_Statement (Loc,
+ Name =>
+ New_Occurrence_Of (RTE (RE_Check_Standard_Allocator), Loc)));
+ end if;
+
-- Handle case of qualified expression (other than optimization above)
-- First apply constraint checks, because the bounds or discriminants
-- in the aggregate might not match the subtype mark in the allocator.
diff --git a/gcc/ada/g-expect-vms.adb b/gcc/ada/g-expect-vms.adb
index 4899682ba6b..cbffb574136 100644
--- a/gcc/ada/g-expect-vms.adb
+++ b/gcc/ada/g-expect-vms.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2002-2010, AdaCore --
+-- Copyright (C) 2002-2014, AdaCore --
-- --
-- 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,6 +31,9 @@
-- This is the VMS version
+-- Note: there is far too much code duplication wrt g-expect.adb (the
+-- standard version). This should be factored out ???
+
with System; use System;
with Ada.Calendar; use Ada.Calendar;
diff --git a/gcc/ada/gnat_ugn.texi b/gcc/ada/gnat_ugn.texi
index 2132a8bd32d..629fac81633 100644
--- a/gcc/ada/gnat_ugn.texi
+++ b/gcc/ada/gnat_ugn.texi
@@ -3769,7 +3769,37 @@ also suppress generation of cross-reference information
@item ^-gnateA^/ALIASING_CHECK^
@cindex @option{-gnateA} (@command{gcc})
-Check that there is no aliasing between two parameters of the same subprogram.
+Check that the actual parameters of a subprogram call are not aliases of one
+another. To qualify as aliasing, the actuals must denote objects of a composite
+type, their memory locations must be identical or overlapping, and at least one
+of the corresponding formal parameters must be of mode OUT or IN OUT.
+
+@smallexample
+type Rec_Typ is record
+ Data : Integer := 0;
+end record;
+
+function Self (Val : Rec_Typ) return Rec_Typ is
+begin
+ return Val;
+end Self;
+
+procedure Detect_Aliasing (Val_1 : in out Rec_Typ; Val_2 : Rec_Typ) is
+begin
+ null;
+end Detect_Aliasing;
+
+Obj : Rec_Typ;
+
+Detect_Aliasing (Obj, Obj);
+Detect_Aliasing (Obj, Self (Obj));
+@end smallexample
+
+In the example above, the first call to @code{Detect_Aliasing} fails with a
+@code{Program_Error} at runtime because the actuals for @code{Val_1} and
+@code{Val_2} denote the same object. The second call executes without raising
+an exception because @code{Self(Obj)} produces an anonymous object which does
+not share the memory location of @code{Obj}.
@item -gnatec=@var{path}
@cindex @option{-gnatec} (@command{gcc})
@@ -3991,7 +4021,8 @@ support this switch.
@item ^-gnateV^/PARAMETER_VALIDITY_CHECK^
@cindex @option{-gnateV} (@command{gcc})
-Check validity of subprogram parameters.
+Check that all actual parameters of a subprogram call are valid according to
+the rules of validity checking (@pxref{Validity Checking}).
@item ^-gnateY^/IGNORE_SUPPRESS_SYLE_CHECK_PRAGMAS^
@cindex @option{-gnateY} (@command{gcc})
diff --git a/gcc/ada/lib-load.adb b/gcc/ada/lib-load.adb
index eecf2a72498..262cefe00a7 100644
--- a/gcc/ada/lib-load.adb
+++ b/gcc/ada/lib-load.adb
@@ -214,7 +214,6 @@ package body Lib.Load is
Expected_Unit => Spec_Name,
Fatal_Error => True,
Generate_Code => False,
- Has_Allocator => False,
Has_RACW => False,
Filler => False,
Ident_String => Empty,
@@ -321,7 +320,6 @@ package body Lib.Load is
Expected_Unit => No_Unit_Name,
Fatal_Error => False,
Generate_Code => False,
- Has_Allocator => False,
Has_RACW => False,
Filler => False,
Ident_String => Empty,
@@ -685,7 +683,6 @@ package body Lib.Load is
Expected_Unit => Uname_Actual,
Fatal_Error => False,
Generate_Code => False,
- Has_Allocator => False,
Has_RACW => False,
Filler => False,
Ident_String => Empty,
diff --git a/gcc/ada/lib-writ.adb b/gcc/ada/lib-writ.adb
index 44dc4150c62..df57c65ba7c 100644
--- a/gcc/ada/lib-writ.adb
+++ b/gcc/ada/lib-writ.adb
@@ -82,7 +82,6 @@ package body Lib.Writ is
Dynamic_Elab => False,
Fatal_Error => False,
Generate_Code => False,
- Has_Allocator => False,
Has_RACW => False,
Filler => False,
Ident_String => Empty,
@@ -140,7 +139,6 @@ package body Lib.Writ is
Dynamic_Elab => False,
Fatal_Error => False,
Generate_Code => False,
- Has_Allocator => False,
Has_RACW => False,
Filler => False,
Ident_String => Empty,
@@ -1020,10 +1018,6 @@ package body Lib.Writ is
Write_Info_Nat (Opt.Time_Slice_Value);
end if;
- if Has_Allocator (Main_Unit) then
- Write_Info_Str (" AB");
- end if;
-
if Main_CPU (Main_Unit) /= Default_Main_CPU then
Write_Info_Str (" C=");
Write_Info_Nat (Main_CPU (Main_Unit));
diff --git a/gcc/ada/lib-writ.ads b/gcc/ada/lib-writ.ads
index c68f3c68a85..dd62a6903cc 100644
--- a/gcc/ada/lib-writ.ads
+++ b/gcc/ada/lib-writ.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2014, 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- --
@@ -116,7 +116,7 @@ package Lib.Writ is
-- -- M Main Program --
-- ---------------------
- -- M type [priority] [T=time-slice] [AB] [C=cpu] W=?
+ -- M type [priority] [T=time-slice] [C=cpu] W=?
-- This line appears only if the main unit for this file is suitable
-- for use as a main program. The parameters are:
@@ -141,14 +141,6 @@ package Lib.Writ is
-- milliseconds. The actual significance of this parameter is
-- target dependent.
- -- AB
-
- -- Present if there is an allocator in the body of the procedure
- -- after the BEGIN. This will be a violation of the restriction
- -- No_Allocators_After_Elaboration if it is present, and this
- -- unit is used as a main program (only the binder can find the
- -- violation, since only the binder knows the main program).
-
-- C=cpu
-- Present only if there was a valid pragma CPU in the
diff --git a/gcc/ada/lib.adb b/gcc/ada/lib.adb
index 826fcc99683..296a6b9a1d1 100644
--- a/gcc/ada/lib.adb
+++ b/gcc/ada/lib.adb
@@ -116,11 +116,6 @@ package body Lib is
return Units.Table (U).Generate_Code;
end Generate_Code;
- function Has_Allocator (U : Unit_Number_Type) return Boolean is
- begin
- return Units.Table (U).Has_Allocator;
- end Has_Allocator;
-
function Has_RACW (U : Unit_Number_Type) return Boolean is
begin
return Units.Table (U).Has_RACW;
@@ -206,11 +201,6 @@ package body Lib is
Units.Table (U).Generate_Code := B;
end Set_Generate_Code;
- procedure Set_Has_Allocator (U : Unit_Number_Type; B : Boolean := True) is
- begin
- Units.Table (U).Has_Allocator := B;
- end Set_Has_Allocator;
-
procedure Set_Has_RACW (U : Unit_Number_Type; B : Boolean := True) is
begin
Units.Table (U).Has_RACW := B;
diff --git a/gcc/ada/lib.ads b/gcc/ada/lib.ads
index b5499df96f3..fea2f14a1d7 100644
--- a/gcc/ada/lib.ads
+++ b/gcc/ada/lib.ads
@@ -316,10 +316,6 @@ package Lib is
-- code is to be generated. This includes the unit explicitly compiled,
-- together with its specification, and any subunits.
- -- Has_Allocator
- -- This flag is set if a subprogram unit has an allocator after the
- -- BEGIN (it is used to set the AB flag in the M ALI line).
-
-- Has_RACW
-- A Boolean flag, initially set to False when a unit entry is created,
-- and set to True if the unit defines a remote access to class wide
@@ -409,7 +405,6 @@ package Lib is
function Fatal_Error (U : Unit_Number_Type) return Boolean;
function Generate_Code (U : Unit_Number_Type) return Boolean;
function Ident_String (U : Unit_Number_Type) return Node_Id;
- function Has_Allocator (U : Unit_Number_Type) return Boolean;
function Has_RACW (U : Unit_Number_Type) return Boolean;
function Loading (U : Unit_Number_Type) return Boolean;
function Main_CPU (U : Unit_Number_Type) return Int;
@@ -428,7 +423,6 @@ package Lib is
procedure Set_Fatal_Error (U : Unit_Number_Type; B : Boolean := True);
procedure Set_Generate_Code (U : Unit_Number_Type; B : Boolean := True);
procedure Set_Has_RACW (U : Unit_Number_Type; B : Boolean := True);
- procedure Set_Has_Allocator (U : Unit_Number_Type; B : Boolean := True);
procedure Set_Ident_String (U : Unit_Number_Type; N : Node_Id);
procedure Set_Loading (U : Unit_Number_Type; B : Boolean := True);
procedure Set_Main_CPU (U : Unit_Number_Type; P : Int);
@@ -726,7 +720,6 @@ private
pragma Inline (Dependency_Num);
pragma Inline (Fatal_Error);
pragma Inline (Generate_Code);
- pragma Inline (Has_Allocator);
pragma Inline (Has_RACW);
pragma Inline (Increment_Serial_Number);
pragma Inline (Loading);
@@ -738,7 +731,6 @@ private
pragma Inline (Set_Cunit_Entity);
pragma Inline (Set_Fatal_Error);
pragma Inline (Set_Generate_Code);
- pragma Inline (Set_Has_Allocator);
pragma Inline (Set_Has_RACW);
pragma Inline (Set_Loading);
pragma Inline (Set_Main_CPU);
@@ -770,7 +762,6 @@ private
Dynamic_Elab : Boolean;
Filler : Boolean;
Loading : Boolean;
- Has_Allocator : Boolean;
OA_Setting : Character;
SPARK_Mode_Pragma : Node_Id;
end record;
@@ -798,10 +789,9 @@ private
Generate_Code at 57 range 0 .. 7;
Has_RACW at 58 range 0 .. 7;
Dynamic_Elab at 59 range 0 .. 7;
- Filler at 60 range 0 .. 7;
- OA_Setting at 61 range 0 .. 7;
- Loading at 62 range 0 .. 7;
- Has_Allocator at 63 range 0 .. 7;
+ Filler at 60 range 0 .. 15;
+ OA_Setting at 62 range 0 .. 7;
+ Loading at 63 range 0 .. 7;
SPARK_Mode_Pragma at 64 range 0 .. 31;
end record;
diff --git a/gcc/ada/par_sco.adb b/gcc/ada/par_sco.adb
index 97b6f93e4c5..8712ba627a4 100644
--- a/gcc/ada/par_sco.adb
+++ b/gcc/ada/par_sco.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2009-2013, Free Software Foundation, Inc. --
+-- Copyright (C) 2009-2014, 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- --
@@ -357,7 +357,7 @@ package body Par_SCO is
function Is_Logical_Operator (N : Node_Id) return Boolean is
begin
- return Nkind_In (N, N_Op_Not, N_And_Then, N_Or_Else);
+ return Nkind_In (N, N_Op_Not, N_And_Then, N_Or_Else, N_If_Expression);
end Is_Logical_Operator;
-----------------------
diff --git a/gcc/ada/rtsfind.ads b/gcc/ada/rtsfind.ads
index db4dd0b239c..72bbd025db8 100644
--- a/gcc/ada/rtsfind.ads
+++ b/gcc/ada/rtsfind.ads
@@ -241,6 +241,7 @@ package Rtsfind is
System_Dim,
System_DSA_Services,
System_DSA_Types,
+ System_Elaboration_Allocators,
System_Exception_Table,
System_Exceptions_Debug,
System_Exn_Int,
@@ -856,6 +857,8 @@ package Rtsfind is
RE_Any_Container_Ptr, -- System.DSA_Types
+ RE_Check_Standard_Allocator, -- System.Elaboration_Allocators
+
RE_Register_Exception, -- System.Exception_Table
RE_Local_Raise, -- System.Exceptions_Debug
@@ -2141,6 +2144,8 @@ package Rtsfind is
RE_Any_Container_Ptr => System_DSA_Types,
+ RE_Check_Standard_Allocator => System_Elaboration_Allocators,
+
RE_Register_Exception => System_Exception_Table,
RE_Local_Raise => System_Exceptions_Debug,
diff --git a/gcc/ada/s-elaall.adb b/gcc/ada/s-elaall.adb
new file mode 100644
index 00000000000..8160cf3594c
--- /dev/null
+++ b/gcc/ada/s-elaall.adb
@@ -0,0 +1,72 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT RUN-TIME COMPONENTS --
+-- --
+-- S Y S T E M . E L A B O R A T I O N _ A L L O C A T O R S --
+-- --
+-- B o d y --
+-- --
+-- Copyright (C) 2014, 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- --
+-- ware Foundation; either version 3, or (at your option) any later ver- --
+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE. --
+-- --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception, --
+-- version 3.1, as published by the Free Software Foundation. --
+-- --
+-- You should have received a copy of the GNU General Public License and --
+-- a copy of the GCC Runtime Library Exception along with this program; --
+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
+-- <http://www.gnu.org/licenses/>. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- --
+------------------------------------------------------------------------------
+
+package body System.Elaboration_Allocators is
+
+ Elaboration_In_Progress : Boolean;
+ pragma Atomic (Elaboration_In_Progress);
+ -- Flag to show if elaboration is active. We don't attempt to initialize
+ -- this because we want to be sure it gets reset if we are in a multiple
+ -- elaboration situation of some kind. Make it atomic to prevent race
+ -- conditions of any kind (not clearly necessary, but harmless!)
+
+ ------------------------------
+ -- Check_Standard_Allocator --
+ ------------------------------
+
+ procedure Check_Standard_Allocator is
+ begin
+ if not Elaboration_In_Progress then
+ raise Program_Error with
+ "standard allocator after elaboration is complete is not allowed "
+ & "(No_Standard_Allocators_After_Elaboration restriction active)";
+ end if;
+ end Check_Standard_Allocator;
+
+ -----------------------------
+ -- Mark_End_Of_Elaboration --
+ -----------------------------
+
+ procedure Mark_End_Of_Elaboration is
+ begin
+ Elaboration_In_Progress := False;
+ end Mark_End_Of_Elaboration;
+
+ -------------------------------
+ -- Mark_Start_Of_Elaboration --
+ -------------------------------
+
+ procedure Mark_Start_Of_Elaboration is
+ begin
+ Elaboration_In_Progress := True;
+ end Mark_Start_Of_Elaboration;
+
+end System.Elaboration_Allocators;
diff --git a/gcc/ada/s-elaall.ads b/gcc/ada/s-elaall.ads
new file mode 100644
index 00000000000..f1cf62002da
--- /dev/null
+++ b/gcc/ada/s-elaall.ads
@@ -0,0 +1,57 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT RUN-TIME COMPONENTS --
+-- --
+-- S Y S T E M . E L A B O R A T I O N _ A L L O C A T O R S --
+-- --
+-- S p e c --
+-- --
+-- Copyright (C) 2014, 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- --
+-- ware Foundation; either version 3, or (at your option) any later ver- --
+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE. --
+-- --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception, --
+-- version 3.1, as published by the Free Software Foundation. --
+-- --
+-- You should have received a copy of the GNU General Public License and --
+-- a copy of the GCC Runtime Library Exception along with this program; --
+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
+-- <http://www.gnu.org/licenses/>. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- --
+------------------------------------------------------------------------------
+
+-- This package provides the interfaces for proper handling of restriction
+-- No_Standard_Allocators_After_Elaboration. It is used only by programs
+-- which use this restriction.
+
+package System.Elaboration_Allocators is
+ pragma Preelaborate;
+
+ procedure Mark_Start_Of_Elaboration;
+ -- Called right at the start of main elaboration if the program activates
+ -- restriction No_Standard_Allocators_After_Elaboration. We don't want to
+ -- rely on the normal elaboration mechanism for marking this event, since
+ -- that would require us to be sure to elaborate this first, which would
+ -- be awkward, and it is convenient to have this package be Preelaborate.
+
+ procedure Mark_End_Of_Elaboration;
+ -- Called when main elaboration is complete if the program has activated
+ -- restriction No_Standard_Allocators_After_Elaboration. This is the point
+ -- beyond which any standard allocator use will violate the restriction.
+
+ procedure Check_Standard_Allocator;
+ -- Called as part of every allocator in a program for which the restriction
+ -- No_Standard_Allocators_After_Elaboration is active. This will raise an
+ -- exception (Program_Error with an appropriate message) if it is called
+ -- after the call to Mark_End_Of_Elaboration.
+
+end System.Elaboration_Allocators;
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index 48d442bb20c..8bd19df4ed5 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -10828,7 +10828,8 @@ package body Sem_Attr is
-- may be a subtype (e.g. given by a slice).
-- Choices may also be identifiers with no staticness
- -- requirements, in which case rules are unclear???
+ -- requirements, in which case they must resolve to the
+ -- index type.
declare
C : Node_Id;
@@ -10841,14 +10842,17 @@ package body Sem_Attr is
Indx := First_Index (Etype (Prefix (N)));
if Nkind (C) /= N_Aggregate then
- Set_Etype (C, Etype (Indx));
+ Analyze_And_Resolve (C, Etype (Indx));
+ Apply_Constraint_Check (C, Etype (Indx));
Check_Non_Static_Context (C);
else
C_E := First (Expressions (C));
while Present (C_E) loop
- Set_Etype (C_E, Etype (Indx));
+ Analyze_And_Resolve (C_E, Etype (Indx));
+ Apply_Constraint_Check (C_E, Etype (Indx));
Check_Non_Static_Context (C_E);
+
Next (C_E);
Next_Index (Indx);
end loop;
diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb
index 21077f662d7..e45d2196975 100644
--- a/gcc/ada/sem_ch4.adb
+++ b/gcc/ada/sem_ch4.adb
@@ -400,6 +400,7 @@ package body Sem_Ch4 is
Type_Id : Entity_Id;
P : Node_Id;
C : Node_Id;
+ Onode : Node_Id;
begin
Check_SPARK_Restriction ("allocator is not allowed", N);
@@ -420,33 +421,40 @@ package body Sem_Ch4 is
P := Parent (C);
while Present (P) loop
- -- In both cases we need a handled sequence of statements, where
- -- the occurrence of the allocator is within the statements.
+ -- For the task case we need a handled sequence of statements,
+ -- where the occurrence of the allocator is within the statements
+ -- and the parent is a task body
if Nkind (P) = N_Handled_Sequence_Of_Statements
and then Is_List_Member (C)
and then List_Containing (C) = Statements (P)
then
+ Onode := Original_Node (Parent (P));
+
-- Check for allocator within task body, this is a definite
-- violation of No_Allocators_After_Elaboration we can detect
-- at compile time.
- if Nkind (Original_Node (Parent (P))) = N_Task_Body then
+ if Nkind (Onode) = N_Task_Body then
Check_Restriction
(No_Standard_Allocators_After_Elaboration, N);
exit;
end if;
+ end if;
- -- The other case is appearance in a subprogram body. This may
- -- be a violation if this is a library level subprogram, and it
- -- turns out to be used as the main program, but only the
- -- binder knows that, so just record the occurrence.
+ -- The other case is appearance in a subprogram body. This is
+ -- a violation if this is a library level subprogram with no
+ -- parameters. Note that this is now a static error even if the
+ -- subprogram is not the main program (this is a change, in an
+ -- earlier version only the main program was affected, and the
+ -- check had to be done in the binder.
- if Nkind (Original_Node (Parent (P))) = N_Subprogram_Body
- and then Nkind (Parent (Parent (P))) = N_Compilation_Unit
- then
- Set_Has_Allocator (Current_Sem_Unit);
- end if;
+ if Nkind (P) = N_Subprogram_Body
+ and then Nkind (Parent (P)) = N_Compilation_Unit
+ and then No (Parameter_Specifications (Specification (P)))
+ then
+ Check_Restriction
+ (No_Standard_Allocators_After_Elaboration, N);
end if;
C := P;
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index b2544d6f79f..faf43338807 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -1087,9 +1087,13 @@ package body Sem_Util is
-- If T is non-private but its base type is private, this is the
-- completion of a subtype declaration whose parent type is private
-- (see Complete_Private_Subtype in Sem_Ch3). The proper discriminants
- -- are to be found in the full view of the base.
+ -- are to be found in the full view of the base. Check that the private
+ -- status of T and its base differ.
- if Is_Private_Type (Bas) and then Present (Full_View (Bas)) then
+ if Is_Private_Type (Bas)
+ and then not Is_Private_Type (T)
+ and then Present (Full_View (Bas))
+ then
Bas := Full_View (Bas);
end if;