===================================================================
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
+-- Copyright (C) 1992-2010, 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- --
@@ -595,7 +595,17 @@ begin
if Ada_Version_Default = Ada_05 then
Write_Line ("Ada 2005 mode (default)");
else
- Write_Line ("Allow Ada 2005 extensions");
+ Write_Line ("Enforce Ada 2005 restrictions");
+ end if;
+
+ -- Line for -gnat12 switch
+
+ Write_Switch_Char ("12");
+
+ if Ada_Version_Default = Ada_12 then
+ Write_Line ("Ada 2012 mode (default)");
+ else
+ Write_Line ("Allow Ada 2012 extensions");
end if;
-- Line for -gnat-p switch
===================================================================
@@ -99,6 +99,8 @@ Implementation Defined Pragmas
* Pragma Ada_95::
* Pragma Ada_05::
* Pragma Ada_2005::
+* Pragma Ada_12::
+* Pragma Ada_2012::
* Pragma Annotate::
* Pragma Assert::
* Pragma Assume_No_Invalid_Values::
@@ -132,6 +134,7 @@ Implementation Defined Pragmas
* Pragma Export_Value::
* Pragma Export_Valued_Procedure::
* Pragma Extend_System::
+* Pragma Extensions_Allowed::
* Pragma External::
* Pragma External_Name_Casing::
* Pragma Fast_Math::
@@ -712,6 +715,8 @@ consideration, the use of these pragmas
* Pragma Ada_95::
* Pragma Ada_05::
* Pragma Ada_2005::
+* Pragma Ada_12::
+* Pragma Ada_2012::
* Pragma Annotate::
* Pragma Assert::
* Pragma Assume_No_Invalid_Values::
@@ -745,6 +750,7 @@ consideration, the use of these pragmas
* Pragma Export_Value::
* Pragma Export_Valued_Procedure::
* Pragma Extend_System::
+* Pragma Extensions_Allowed::
* Pragma External::
* Pragma External_Name_Casing::
* Pragma Fast_Math::
@@ -903,9 +909,7 @@ pragma Ada_05;
@noindent
A configuration pragma that establishes Ada 2005 mode for the unit to which
it applies, regardless of the mode set by the command line switches.
-This mode is set automatically for the @code{Ada} and @code{System}
-packages and their children, so you need not specify it in these
-contexts. This pragma is useful when writing a reusable component that
+This pragma is useful when writing a reusable component that
itself uses Ada 2005 features, but which is intended to be usable from
either Ada 83 or Ada 95 programs.
@@ -922,6 +926,37 @@ pragma Ada_2005;
This configuration pragma is a synonym for pragma Ada_05 and has the
same syntax and effect.
+@node Pragma Ada_12
+@unnumberedsec Pragma Ada_12
+@findex Ada_12
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Ada_12;
+@end smallexample
+
+@noindent
+A configuration pragma that establishes Ada 2012 mode for the unit to which
+it applies, regardless of the mode set by the command line switches.
+This mode is set automatically for the @code{Ada} and @code{System}
+packages and their children, so you need not specify it in these
+contexts. This pragma is useful when writing a reusable component that
+itself uses Ada 2012 features, but which is intended to be usable from
+Ada 83, Ada 95, or Ada 2005 programs.
+
+@node Pragma Ada_2012
+@unnumberedsec Pragma Ada_2012
+@findex Ada_2005
+@noindent
+Syntax:
+@smallexample @c ada
+pragma Ada_2012;
+@end smallexample
+
+@noindent
+This configuration pragma is a synonym for pragma Ada_12 and has the
+same syntax and effect.
+
@node Pragma Annotate
@unnumberedsec Pragma Annotate
@findex Annotate
@@ -2174,6 +2209,35 @@ it you will have to use the appropriate
system units. @xref{Top, @value{EDITION} User's Guide, About This
Guide,, gnat_ugn, @value{EDITION} User's Guide}, for details.
+@node Pragma Extensions_Allowed
+@unnumberedsec Pragma Extensions_Allowed
+@cindex Ada Extensions
+@cindex GNAT Extensions
+@findex Extensions_Allowed
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Extensions_Allowed (On | Off);
+@end smallexample
+
+@noindent
+This configuration pragma enables or disables the implementation
+extension mode (the use of Off as a parameter cancels the effect
+of the @option{-gnatX} command switch).
+
+In extension mode, the latest version of the Ada language is
+implemented (currently Ada 2012), and in addition a small number
+of GNAT specific extensions are recognized as follows:
+
+@table @asis
+@item Constrained attribute for generic objects
+The @code{Constrained} attribute is permitted for objects of
+generic types. The result indicates if the corresponding actual
+is constrained.
+
+@end table
+
@node Pragma External
@unnumberedsec Pragma External
@findex External
@@ -8879,8 +8943,8 @@ The algorithm is the Mersenne Twister, a
state. See A.5.2(38).
@end cartouche
@noindent
-The value returned by the Image function is the concatenation of
-the fixed-width decimal representations of the 624 32-bit integers
+The value returned by the Image function is the concatenation of
+the fixed-width decimal representations of the 624 32-bit integers
of the state vector.
@sp 1
===================================================================
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
+-- Copyright (C) 2001-2010, 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- --
@@ -532,11 +532,11 @@ package body Switch.C is
System_Extend_Unit := Empty;
Warning_Mode := Treat_As_Error;
- -- Set Ada 2005 mode explicitly. We don't want to rely on the
+ -- Set Ada 2012 mode explicitly. We don't want to rely on the
-- implicit setting here, since for example, we want
-- Preelaborate_05 treated as Preelaborate
- Ada_Version := Ada_05;
+ Ada_Version := Ada_12;
Ada_Version_Explicit := Ada_Version;
-- Set default warnings and style checks for -gnatg
@@ -903,6 +903,8 @@ package body Switch.C is
when 'X' =>
Ptr := Ptr + 1;
Extensions_Allowed := True;
+ Ada_Version := Ada_Version_Type'Last;
+ Ada_Version_Explicit := Ada_Version_Type'Last;
-- Processing for y switch
@@ -1048,6 +1050,42 @@ package body Switch.C is
Ada_Version_Explicit := Ada_Version;
end if;
+ -- Processing for 12 switch
+
+ when '1' =>
+ if Ptr = Max then
+ Bad_Switch ("-gnat1");
+ end if;
+
+ Ptr := Ptr + 1;
+
+ if Switch_Chars (Ptr) /= '2' then
+ Bad_Switch ("-gnat1" & Switch_Chars (Ptr .. Max));
+ else
+ Ptr := Ptr + 1;
+ Ada_Version := Ada_12;
+ Ada_Version_Explicit := Ada_Version;
+ end if;
+
+ -- Processing for 2005 and 2012 switches
+
+ when '2' =>
+ if Ptr > Max - 3 then
+ Bad_Switch ("-gnat" & Switch_Chars (Ptr .. Max));
+
+ elsif Switch_Chars (Ptr .. Ptr + 3) = "2005" then
+ Ada_Version := Ada_05;
+
+ elsif Switch_Chars (Ptr .. Ptr + 3) = "2012" then
+ Ada_Version := Ada_12;
+
+ else
+ Bad_Switch ("-gnat" & Switch_Chars (Ptr .. Ptr + 3));
+ end if;
+
+ Ada_Version_Explicit := Ada_Version;
+ Ptr := Ptr + 4;
+
-- Switch cancellation, currently only -gnat-p is allowed.
-- All we do here is the error checking, since the actual
-- processing for switch cancellation is done by calls to
===================================================================
@@ -5257,8 +5257,9 @@ package body Sem_Prag is
-- said this was a configuration pragma, but we did not check and
-- are hesitant to add the check now.
- -- However, we really cannot tolerate mixing Ada 2005 with Ada 83
- -- or Ada 95, so we must check if we are in Ada 2005 mode.
+ -- However, we really cannot tolerate mixing Ada 2005 or Ada 2012
+ -- with Ada 83 or Ada 95, so we must check if we are in Ada 2005
+ -- or Ada 2012 mode.
if Ada_Version >= Ada_05 then
Check_Valid_Configuration_Pragma;
@@ -5347,6 +5348,33 @@ package body Sem_Prag is
end if;
end;
+ ---------------------
+ -- Ada_12/Ada_2012 --
+ ---------------------
+
+ -- pragma Ada_12;
+ -- pragma Ada_2012;
+
+ -- Note: these pragma also have some specific processing in Par.Prag
+ -- because we want to set the Ada 2012 version mode during parsing.
+
+ when Pragma_Ada_12 | Pragma_Ada_2012 =>
+ GNAT_Pragma;
+ Check_Arg_Count (0);
+
+ -- For Ada_2012 we unconditionally enforce the documented
+ -- configuration pragma placement, since we do not want to
+ -- tolerate mixed modes in a unit involving Ada 2012. That would
+ -- cause real difficulties for those cases where there are
+ -- incompatibilities between Ada 95 and Ada 2005/Ada 2012.
+
+ Check_Valid_Configuration_Pragma;
+
+ -- Now set Ada 2012 mode
+
+ Ada_Version := Ada_12;
+ Ada_Version_Explicit := Ada_12;
+
----------------------
-- All_Calls_Remote --
----------------------
@@ -7451,8 +7479,11 @@ package body Sem_Prag is
if Chars (Expression (Arg1)) = Name_On then
Extensions_Allowed := True;
+ Ada_Version := Ada_Version_Type'Last;
+
else
Extensions_Allowed := False;
+ Ada_Version := Ada_Version_Explicit;
end if;
--------------
@@ -10080,7 +10111,7 @@ package body Sem_Prag is
-- This is one of the few cases where we need to test the value of
-- Ada_Version_Explicit rather than Ada_Version (which is always
- -- set to Ada_05 in a predefined unit), we need to know the
+ -- set to Ada_12 in a predefined unit), we need to know the
-- explicit version set to know if this pragma is active.
if Ada_Version_Explicit >= Ada_05 then
@@ -10580,7 +10611,7 @@ package body Sem_Prag is
-- This is one of the few cases where we need to test the value of
-- Ada_Version_Explicit rather than Ada_Version (which is always
- -- set to Ada_05 in a predefined unit), we need to know the
+ -- set to Ada_12 in a predefined unit), we need to know the
-- explicit version set to know if this pragma is active.
if Ada_Version_Explicit >= Ada_05 then
@@ -12647,6 +12678,8 @@ package body Sem_Prag is
Pragma_Ada_95 => -1,
Pragma_Ada_05 => -1,
Pragma_Ada_2005 => -1,
+ Pragma_Ada_12 => -1,
+ Pragma_Ada_2012 => -1,
Pragma_All_Calls_Remote => -1,
Pragma_Annotate => -1,
Pragma_Assert => -1,
===================================================================
@@ -2352,7 +2352,7 @@ package body Ch4 is
-- If this looks like a conditional expression, then treat it
-- that way with an error message.
- elsif Extensions_Allowed then
+ elsif Ada_Version >= Ada_12 then
Error_Msg_SC
("conditional expression must be parenthesized");
return P_Conditional_Expression;
@@ -2378,7 +2378,7 @@ package body Ch4 is
-- If this looks like a case expression, then treat it that way
-- with an error message.
- elsif Extensions_Allowed then
+ elsif Ada_Version >= Ada_12 then
Error_Msg_SC ("case expression must be parenthesized");
return P_Case_Expression;
@@ -2668,9 +2668,9 @@ package body Ch4 is
Save_State : Saved_Scan_State;
begin
- if not Extensions_Allowed then
- Error_Msg_SC ("|case expression is an Ada extension");
- Error_Msg_SC ("\|use -gnatX switch to compile this unit");
+ if Ada_Version < Ada_12 then
+ Error_Msg_SC ("|case expression is an Ada 2012 feature");
+ Error_Msg_SC ("\|use -gnat12 switch to compile this unit");
end if;
Scan; -- past CASE
@@ -2759,9 +2759,9 @@ package body Ch4 is
begin
Inside_Conditional_Expression := Inside_Conditional_Expression + 1;
- if Token = Tok_If and then not Extensions_Allowed then
- Error_Msg_SC ("|conditional expression is an Ada extension");
- Error_Msg_SC ("\|use -gnatX switch to compile this unit");
+ if Token = Tok_If and then Ada_Version < Ada_12 then
+ Error_Msg_SC ("|conditional expression is an Ada 2012 feature");
+ Error_Msg_SC ("\|use -gnat12 switch to compile this unit");
end if;
Scan; -- past IF or ELSIF
@@ -2836,15 +2836,15 @@ package body Ch4 is
procedure P_Membership_Test (N : Node_Id) is
Alt : constant Node_Id :=
P_Range_Or_Subtype_Mark
- (Allow_Simple_Expression => Extensions_Allowed);
+ (Allow_Simple_Expression => (Ada_Version >= Ada_12));
begin
-- Set case
if Token = Tok_Vertical_Bar then
- if not Extensions_Allowed then
- Error_Msg_SC ("set notation is a language extension");
- Error_Msg_SC ("\|use -gnatX switch to compile this unit");
+ if Ada_Version < Ada_12 then
+ Error_Msg_SC ("set notation is an Ada 2012 feature");
+ Error_Msg_SC ("\|use -gnat12 switch to compile this unit");
end if;
Set_Alternatives (N, New_List (Alt));
===================================================================
@@ -376,6 +376,9 @@ package Errout is
Gname5 : aliased constant String := "gnat05";
Vname5 : aliased constant String := "05";
+ Gname6 : aliased constant String := "gnat12";
+ Vname6 : aliased constant String := "12";
+
type Cstring_Ptr is access constant String;
Gnames : array (Nat range <>) of Cstring_Ptr :=
@@ -383,14 +386,16 @@ package Errout is
Gname2'Access,
Gname3'Access,
Gname4'Access,
- Gname5'Access);
+ Gname5'Access,
+ Gname6'Access);
Vnames : array (Nat range <>) of Cstring_Ptr :=
(Vname1'Access,
Vname2'Access,
Vname3'Access,
Vname4'Access,
- Vname5'Access);
+ Vname5'Access,
+ Vname6'Access);
-----------------------------------------------------
-- Global Values Used for Error Message Insertions --
===================================================================
@@ -2344,7 +2344,7 @@ package body Sem_Ch4 is
Analyze_Expression (L);
if No (R)
- and then Extensions_Allowed
+ and then Ada_Version >= Ada_12
then
Analyze_Set_Membership;
return;
===================================================================
@@ -306,7 +306,7 @@ begin
-- Ada_05/Ada_2005 --
---------------------
- -- This pragma must be processed at parse time, since we want to set
+ -- These pragmas must be processed at parse time, since we want to set
-- the Ada version properly at parse time to recognize the appropriate
-- Ada version syntax. However, it is only the zero argument form that
-- must be processed at parse time.
@@ -317,6 +317,18 @@ begin
Ada_Version_Explicit := Ada_05;
end if;
+ ---------------------
+ -- Ada_12/Ada_2012 --
+ ---------------------
+
+ -- These pragmas must be processed at parse time, since we want to set
+ -- the Ada version properly at parse time to recognize the appropriate
+ -- Ada version syntax.
+
+ when Pragma_Ada_12 | Pragma_Ada_2012 =>
+ Ada_Version := Ada_12;
+ Ada_Version_Explicit := Ada_12;
+
-----------
-- Debug --
-----------
@@ -374,8 +386,10 @@ begin
if Chars (Expression (Arg1)) = Name_On then
Extensions_Allowed := True;
+ Ada_Version := Ada_12;
else
Extensions_Allowed := False;
+ Ada_Version := Ada_Version_Explicit;
end if;
----------------
===================================================================
@@ -1227,7 +1227,13 @@ package VMS_Data is
"-gnat05";
-- /05 (D)
--
- -- Allows GNAT to recognize all implemented proposed Ada 2005
+ -- Allows GNAT to recognize the full range of Ada 2005 constructs.
+
+ S_GCC_Ada_12 : aliased constant S := "/12 " &
+ "-gnat12";
+ -- /05 (D)
+ --
+ -- Allows GNAT to recognize all implemented proposed Ada 2012
-- extensions. See features file for list of implemented features.
S_GCC_Add : aliased constant S := "/ADD_PROJECT_SEARCH_DIR=*" &
===================================================================
@@ -64,17 +64,15 @@ package Opt is
-- GNATBIND, GNATLINK
-- Set True if binder file to be generated in Ada rather than C
- type Ada_Version_Type is (Ada_83, Ada_95, Ada_05);
- pragma Warnings (Off, Ada_Version_Type);
+ type Ada_Version_Type is (Ada_83, Ada_95, Ada_05, Ada_12);
-- Versions of Ada for Ada_Version below. Note that these are ordered,
-- so that tests like Ada_Version >= Ada_95 are legitimate and useful.
- -- The Warnings_Off pragma stops warnings for Ada_Version >= Ada_05,
- -- which we want to allow, so that things work OK when Ada_15 is added!
- -- This warning is now removed, so this pragma can be removed some time???
Ada_Version_Default : constant Ada_Version_Type := Ada_05;
+ pragma Warnings (Off, Ada_Version_Default);
-- GNAT
- -- Default Ada version if no switch given
+ -- Default Ada version if no switch given. The Warnings off is to kill
+ -- constant condition warnings.
Ada_Version : Ada_Version_Type := Ada_Version_Default;
-- GNAT
@@ -91,7 +89,7 @@ package Opt is
-- the rare cases (notably for pragmas Preelaborate_05 and Pure_05)
-- where in the run-time we want the explicit version set.
- Ada_Version_Runtime : Ada_Version_Type := Ada_05;
+ Ada_Version_Runtime : Ada_Version_Type := Ada_12;
-- GNAT
-- Ada version used to compile the runtime. Used to set Ada_Version (but
-- not Ada_Version_Explicit) when compiling predefined or internal units.
===================================================================
@@ -315,7 +315,7 @@ package body Sem_Ch13 is
-- In AI-133. This involves gathering all components which start at
-- the same byte offset and processing them together
- when Ada_05 =>
+ when Ada_05 .. Ada_Version_Type'Last =>
declare
Max_Machine_Scalar_Size : constant Uint :=
UI_From_Int
===================================================================
@@ -124,9 +124,8 @@ package body Ch3 is
elsif Nkind_In (N, N_In, N_Not_In)
and then Paren_Count (N) = 0
then
- Error_Msg_N ("|this expression must be parenthesized!", N);
Error_Msg_N
- ("\|since extensions (and set notation) are allowed", N);
+ ("|this expression must be parenthesized in Ada 2012 mode!", N);
end if;
end Check_Restricted_Expression;
@@ -3663,10 +3662,10 @@ package body Ch3 is
-- Expression
else
- -- If extensions are permitted then the expression must be a
- -- simple expression. The resaon for this restriction (i.e.
- -- going back to the Ada 83 rule) is to avoid ambiguities
- -- when set membership operations are allowed, consider the
+ -- In Ada 2012 mode, the expression must be a simple
+ -- expression. The resaon for this restriction (i.e. going
+ -- back to the Ada 83 rule) is to avoid ambiguities when set
+ -- membership operations are allowed, consider the
-- following:
-- when A in 1 .. 10 | 12 =>
@@ -3679,12 +3678,12 @@ package body Ch3 is
-- when (A in 1 .. 10 | 12) =>
-- when (A in 1 .. 10) | 12 =>
- -- To solve this, if extensins are enabled, we disallow
+ -- To solve this, in Ada 2012 mode, we disallow
-- the use of membership operations in expressions in
-- choices. Technically in the grammar, the expression
-- must match the grammar for restricted expression.
- if Extensions_Allowed then
+ if Ada_Version >= Ada_12 then
Check_Restricted_Expression (Expr_Node);
-- In Ada 83 mode, the syntax required a simple expression
===================================================================
@@ -34,7 +34,7 @@ with Namet; use Namet;
package Snames is
-- This package contains definitions of standard names (i.e. entries in the
+-- Names table) that are used throughout the GNAT compiler. It also contains
-- the definitions of some enumeration types whose definitions are tied to
-- the order of these preset names.
@@ -334,6 +334,8 @@ package Snames is
Name_Ada_95 : constant Name_Id := N + $; -- GNAT
Name_Ada_05 : constant Name_Id := N + $; -- GNAT
Name_Ada_2005 : constant Name_Id := N + $; -- GNAT
+ Name_Ada_12 : constant Name_Id := N + $; -- GNAT
+ Name_Ada_2012 : constant Name_Id := N + $; -- GNAT
Name_Assertion_Policy : constant Name_Id := N + $; -- Ada 05
Name_Assume_No_Invalid_Values : constant Name_Id := N + $; -- GNAT
Name_C_Pass_By_Copy : constant Name_Id := N + $; -- GNAT
@@ -1416,6 +1418,8 @@ package Snames is
Pragma_Ada_95,
Pragma_Ada_05,
Pragma_Ada_2005,
+ Pragma_Ada_12,
+ Pragma_Ada_2012,
Pragma_Assertion_Policy,
Pragma_Assume_No_Invalid_Values,
Pragma_C_Pass_By_Copy,