summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/opt.ads18
-rw-r--r--gcc/ada/repinfo.adb237
-rw-r--r--gcc/ada/sem_ch13.adb326
-rw-r--r--gcc/ada/sem_ch13.ads9
-rw-r--r--gcc/ada/style.ads10
-rw-r--r--gcc/ada/styleg-c.adb25
-rw-r--r--gcc/ada/styleg-c.ads11
-rw-r--r--gcc/ada/stylesw.adb99
-rw-r--r--gcc/ada/stylesw.ads6
-rw-r--r--gcc/ada/usage.adb13
10 files changed, 537 insertions, 217 deletions
diff --git a/gcc/ada/opt.ads b/gcc/ada/opt.ads
index 6eff9952c17..fb1fa0ed217 100644
--- a/gcc/ada/opt.ads
+++ b/gcc/ada/opt.ads
@@ -430,7 +430,8 @@ package Opt is
Extensions_Allowed : Boolean := False;
-- GNAT
-- Set to True by switch -gnatX if GNAT specific language extensions
- -- are allowed. For example, "limited with" is a GNAT extension.
+ -- are allowed. For example, the use of 'Constrained with objects of
+ -- generic types is a GNAT extension.
type External_Casing_Type is (
As_Is, -- External names cased as they appear in the Ada source
@@ -1163,12 +1164,19 @@ package Opt is
-- variable that is at least partially uninitialized. Set to false to
-- suppress such warnings. The default is that such warnings are enabled.
+ Warn_On_Non_Local_Exception : Boolean := True;
+ -- GNAT
+ -- Set to True to generate warnings for non-local exception raises and also
+ -- handlers that can never handle a local raise. This warning is only ever
+ -- generated if pragma Restrictions (No_Exception_Propagation) is set. The
+ -- default is to generate the warnings if the restriction is set.
+
Warn_On_Obsolescent_Feature : Boolean := False;
-- GNAT
-- Set to True to generate warnings on use of any feature in Annex or if a
-- subprogram is called for which a pragma Obsolescent applies.
- Warn_On_Questionable_Missing_Parens : Boolean := False;
+ Warn_On_Questionable_Missing_Parens : Boolean := True;
-- GNAT
-- Set to True to generate warnings for cases where parenthese are missing
-- and the usage is questionable, because the intent is unclear.
@@ -1178,6 +1186,12 @@ package Opt is
-- Set to True to generate warnings for redundant constructs (e.g. useless
-- assignments/conversions). The default is that this warning is disabled.
+ Warn_On_Reverse_Bit_Order : Boolean := True;
+ -- GNAT
+ -- Set to True to generate warning (informational) messages for component
+ -- clauses that are affected by non-standard bit-order. The default is
+ -- that this warning is enabled.
+
Warn_On_Unchecked_Conversion : Boolean := True;
-- GNAT
-- Set to True to generate warnings for unchecked conversions that may have
diff --git a/gcc/ada/repinfo.adb b/gcc/ada/repinfo.adb
index 974dff4cc19..f32344291ac 100644
--- a/gcc/ada/repinfo.adb
+++ b/gcc/ada/repinfo.adb
@@ -784,172 +784,165 @@ package body Repinfo is
Max_Name_Length := 0;
Max_Suni_Length := 0;
- Comp := First_Entity (Ent);
+ Comp := First_Component_Or_Discriminant (Ent);
while Present (Comp) loop
- if Ekind (Comp) = E_Component
- or else Ekind (Comp) = E_Discriminant
- then
- Get_Decoded_Name_String (Chars (Comp));
- Max_Name_Length := Natural'Max (Max_Name_Length, Name_Len);
-
- Cfbit := Component_Bit_Offset (Comp);
+ Get_Decoded_Name_String (Chars (Comp));
+ Max_Name_Length := Natural'Max (Max_Name_Length, Name_Len);
- if Rep_Not_Constant (Cfbit) then
- UI_Image_Length := 2;
+ Cfbit := Component_Bit_Offset (Comp);
- else
- -- Complete annotation in case not done
+ if Rep_Not_Constant (Cfbit) then
+ UI_Image_Length := 2;
- Set_Normalized_Position (Comp, Cfbit / SSU);
- Set_Normalized_First_Bit (Comp, Cfbit mod SSU);
+ else
+ -- Complete annotation in case not done
- Sunit := Cfbit / SSU;
- UI_Image (Sunit);
- end if;
+ Set_Normalized_Position (Comp, Cfbit / SSU);
+ Set_Normalized_First_Bit (Comp, Cfbit mod SSU);
- -- If the record is not packed, then we know that all fields whose
- -- position is not specified have a starting normalized bit
- -- position of zero
+ Sunit := Cfbit / SSU;
+ UI_Image (Sunit);
+ end if;
- if Unknown_Normalized_First_Bit (Comp)
- and then not Is_Packed (Ent)
- then
- Set_Normalized_First_Bit (Comp, Uint_0);
- end if;
+ -- If the record is not packed, then we know that all fields whose
+ -- position is not specified have a starting normalized bit position
+ -- of zero.
- Max_Suni_Length :=
- Natural'Max (Max_Suni_Length, UI_Image_Length);
+ if Unknown_Normalized_First_Bit (Comp)
+ and then not Is_Packed (Ent)
+ then
+ Set_Normalized_First_Bit (Comp, Uint_0);
end if;
- Comp := Next_Entity (Comp);
+ Max_Suni_Length :=
+ Natural'Max (Max_Suni_Length, UI_Image_Length);
+
+ Next_Component_Or_Discriminant (Comp);
end loop;
-- Second loop does actual output based on those values
- Comp := First_Entity (Ent);
+ Comp := First_Component_Or_Discriminant (Ent);
while Present (Comp) loop
- if Ekind (Comp) = E_Component
- or else Ekind (Comp) = E_Discriminant
- then
- declare
- Esiz : constant Uint := Esize (Comp);
- Bofs : constant Uint := Component_Bit_Offset (Comp);
- Npos : constant Uint := Normalized_Position (Comp);
- Fbit : constant Uint := Normalized_First_Bit (Comp);
- Lbit : Uint;
+ declare
+ Esiz : constant Uint := Esize (Comp);
+ Bofs : constant Uint := Component_Bit_Offset (Comp);
+ Npos : constant Uint := Normalized_Position (Comp);
+ Fbit : constant Uint := Normalized_First_Bit (Comp);
+ Lbit : Uint;
+
+ begin
+ Write_Str (" ");
+ Get_Decoded_Name_String (Chars (Comp));
+ Set_Casing (Unit_Casing);
+ Write_Str (Name_Buffer (1 .. Name_Len));
- begin
- Write_Str (" ");
- Get_Decoded_Name_String (Chars (Comp));
- Set_Casing (Unit_Casing);
- Write_Str (Name_Buffer (1 .. Name_Len));
+ for J in 1 .. Max_Name_Length - Name_Len loop
+ Write_Char (' ');
+ end loop;
- for J in 1 .. Max_Name_Length - Name_Len loop
- Write_Char (' ');
- end loop;
+ Write_Str (" at ");
- Write_Str (" at ");
+ if Known_Static_Normalized_Position (Comp) then
+ UI_Image (Npos);
+ Spaces (Max_Suni_Length - UI_Image_Length);
+ Write_Str (UI_Image_Buffer (1 .. UI_Image_Length));
- if Known_Static_Normalized_Position (Comp) then
- UI_Image (Npos);
- Spaces (Max_Suni_Length - UI_Image_Length);
- Write_Str (UI_Image_Buffer (1 .. UI_Image_Length));
+ elsif Known_Component_Bit_Offset (Comp)
+ and then List_Representation_Info = 3
+ then
+ Spaces (Max_Suni_Length - 2);
+ Write_Str ("bit offset");
+ Write_Val (Bofs, Paren => True);
+ Write_Str (" size in bits = ");
+ Write_Val (Esiz, Paren => True);
+ Write_Eol;
+ goto Continue;
+
+ elsif Known_Normalized_Position (Comp)
+ and then List_Representation_Info = 3
+ then
+ Spaces (Max_Suni_Length - 2);
+ Write_Val (Npos);
- elsif Known_Component_Bit_Offset (Comp)
- and then List_Representation_Info = 3
- then
- Spaces (Max_Suni_Length - 2);
- Write_Str ("bit offset");
- Write_Val (Bofs, Paren => True);
- Write_Str (" size in bits = ");
- Write_Val (Esiz, Paren => True);
- Write_Eol;
+ else
+ -- For the packed case, we don't know the bit positions if we
+ -- don't know the starting position!
+
+ if Is_Packed (Ent) then
+ Write_Line ("?? range ? .. ??;");
goto Continue;
- elsif Known_Normalized_Position (Comp)
- and then List_Representation_Info = 3
- then
- Spaces (Max_Suni_Length - 2);
- Write_Val (Npos);
+ -- Otherwise we can continue
else
- -- For the packed case, we don't know the bit positions
- -- if we don't know the starting position!
-
- if Is_Packed (Ent) then
- Write_Line ("?? range ? .. ??;");
- goto Continue;
-
- -- Otherwise we can continue
-
- else
- Write_Str ("??");
- end if;
+ Write_Str ("??");
end if;
+ end if;
- Write_Str (" range ");
- UI_Write (Fbit);
- Write_Str (" .. ");
+ Write_Str (" range ");
+ UI_Write (Fbit);
+ Write_Str (" .. ");
- -- Allowing Uint_0 here is a kludge, really this should be a
- -- fine Esize value but currently it means unknown, except that
- -- we know after gigi has back annotated that a size of zero is
- -- real, since otherwise gigi back annotates using No_Uint as
- -- the value to indicate unknown).
+ -- Allowing Uint_0 here is a kludge, really this should be a
+ -- fine Esize value but currently it means unknown, except that
+ -- we know after gigi has back annotated that a size of zero is
+ -- real, since otherwise gigi back annotates using No_Uint as
+ -- the value to indicate unknown).
- if (Esize (Comp) = Uint_0 or else Known_Static_Esize (Comp))
- and then Known_Static_Normalized_First_Bit (Comp)
- then
- Lbit := Fbit + Esiz - 1;
+ if (Esize (Comp) = Uint_0 or else Known_Static_Esize (Comp))
+ and then Known_Static_Normalized_First_Bit (Comp)
+ then
+ Lbit := Fbit + Esiz - 1;
- if Lbit < 10 then
- Write_Char (' ');
- end if;
+ if Lbit < 10 then
+ Write_Char (' ');
+ end if;
- UI_Write (Lbit);
+ UI_Write (Lbit);
- -- The test for Esize (Comp) not being Uint_0 here is a kludge.
- -- Officially a value of zero for Esize means unknown, but here
- -- we use the fact that we know that gigi annotates Esize with
- -- No_Uint, not Uint_0. Really everyone should use No_Uint???
+ -- The test for Esize (Comp) not being Uint_0 here is a kludge.
+ -- Officially a value of zero for Esize means unknown, but here
+ -- we use the fact that we know that gigi annotates Esize with
+ -- No_Uint, not Uint_0. Really everyone should use No_Uint???
- elsif List_Representation_Info < 3
- or else (Esize (Comp) /= Uint_0 and then Unknown_Esize (Comp))
- then
- Write_Str ("??");
+ elsif List_Representation_Info < 3
+ or else (Esize (Comp) /= Uint_0 and then Unknown_Esize (Comp))
+ then
+ Write_Str ("??");
- else -- List_Representation >= 3 and Known_Esize (Comp)
+ -- List_Representation >= 3 and Known_Esize (Comp)
- Write_Val (Esiz, Paren => True);
+ else
+ Write_Val (Esiz, Paren => True);
- -- If in front end layout mode, then dynamic size is stored
- -- in storage units, so renormalize for output
+ -- If in front end layout mode, then dynamic size is stored
+ -- in storage units, so renormalize for output
- if not Back_End_Layout then
- Write_Str (" * ");
- Write_Int (SSU);
- end if;
+ if not Back_End_Layout then
+ Write_Str (" * ");
+ Write_Int (SSU);
+ end if;
- -- Add appropriate first bit offset
+ -- Add appropriate first bit offset
- if Fbit = 0 then
- Write_Str (" - 1");
+ if Fbit = 0 then
+ Write_Str (" - 1");
- elsif Fbit = 1 then
- null;
+ elsif Fbit = 1 then
+ null;
- else
- Write_Str (" + ");
- Write_Int (UI_To_Int (Fbit) - 1);
- end if;
+ else
+ Write_Str (" + ");
+ Write_Int (UI_To_Int (Fbit) - 1);
end if;
+ end if;
- Write_Line (";");
- end;
- end if;
+ Write_Line (";");
+ end;
<<Continue>>
- Comp := Next_Entity (Comp);
+ Next_Component_Or_Discriminant (Comp);
end loop;
Write_Line ("end record;");
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 6a49bd565ca..e6925f37866 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -166,6 +166,265 @@ package body Sem_Ch13 is
return Empty;
end Address_Aliased_Entity;
+ -----------------------------------------
+ -- Adjust_Record_For_Reverse_Bit_Order --
+ -----------------------------------------
+
+ procedure Adjust_Record_For_Reverse_Bit_Order (R : Entity_Id) is
+ Max_Machine_Scalar_Size : constant Uint :=
+ UI_From_Int
+ (Standard_Long_Long_Integer_Size);
+ -- We use this as the maximum machine scalar size in the sense of AI-133
+
+ Num_CC : Natural;
+ Comp : Entity_Id;
+ SSU : constant Uint := UI_From_Int (System_Storage_Unit);
+
+ begin
+ -- This first loop through components does two things. First it deals
+ -- with the case of components with component clauses whose length is
+ -- greater than the maximum machine scalar size (either accepting them
+ -- or rejecting as needed). Second, it counts the number of components
+ -- with component clauses whose length does not exceed this maximum for
+ -- later processing.
+
+ Num_CC := 0;
+ Comp := First_Component_Or_Discriminant (R);
+ while Present (Comp) loop
+ declare
+ CC : constant Node_Id := Component_Clause (Comp);
+ Fbit : constant Uint := Static_Integer (First_Bit (CC));
+
+ begin
+ if Present (CC) then
+
+ -- Case of component with size > max machine scalar
+
+ if Esize (Comp) > Max_Machine_Scalar_Size then
+
+ -- Must begin on byte boundary
+
+ if Fbit mod SSU /= 0 then
+ Error_Msg_N
+ ("illegal first bit value for reverse bit order",
+ First_Bit (CC));
+ Error_Msg_Uint_1 := SSU;
+ Error_Msg_Uint_2 := Max_Machine_Scalar_Size;
+
+ Error_Msg_N
+ ("\must be a multiple of ^ if size greater than ^",
+ First_Bit (CC));
+
+ -- Must end on byte boundary
+
+ elsif Esize (Comp) mod SSU /= 0 then
+ Error_Msg_N
+ ("illegal last bit value for reverse bit order",
+ Last_Bit (CC));
+ Error_Msg_Uint_1 := SSU;
+ Error_Msg_Uint_2 := Max_Machine_Scalar_Size;
+
+ Error_Msg_N
+ ("\must be a multiple of ^ if size greater than ^",
+ Last_Bit (CC));
+
+ -- OK, give warning if enabled
+
+ elsif Warn_On_Reverse_Bit_Order then
+ Error_Msg_N
+ ("multi-byte field specified with non-standard"
+ & " Bit_Order?", CC);
+
+ if Bytes_Big_Endian then
+ Error_Msg_N
+ ("\bytes are not reversed "
+ & "(component is big-endian)?", CC);
+ else
+ Error_Msg_N
+ ("\bytes are not reversed "
+ & "(component is little-endian)?", CC);
+ end if;
+ end if;
+
+ -- Case where size is not greater than max machine scalar.
+ -- For now, we just count these.
+
+ else
+ Num_CC := Num_CC + 1;
+ end if;
+ end if;
+ end;
+
+ Next_Component_Or_Discriminant (Comp);
+ end loop;
+
+ -- We need to sort the component clauses on the basis of the Position
+ -- values in the clause, so we can group clauses with the same Position
+ -- together to determine the relevant machine scalar size.
+
+ declare
+ Comps : array (0 .. Num_CC) of Entity_Id;
+ -- Array to collect component and discrimninant entities. The data
+ -- starts at index 1, the 0'th entry is for GNAT.Heap_Sort_A.
+
+ function CP_Lt (Op1, Op2 : Natural) return Boolean;
+ -- Compare routine for Sort (See GNAT.Heap_Sort_A)
+
+ procedure CP_Move (From : Natural; To : Natural);
+ -- Move routine for Sort (see GNAT.Heap_Sort_A)
+
+ Start : Natural;
+ Stop : Natural;
+ -- Start and stop positions in component list of set of components
+ -- with the same starting position (that constitute components in
+ -- a single machine scalar).
+
+ MaxL : Uint;
+ -- Maximum last bit value of any component in this set
+
+ MSS : Uint;
+ -- Corresponding machine scalar size
+
+ -----------
+ -- CP_Lt --
+ -----------
+
+ function CP_Lt (Op1, Op2 : Natural) return Boolean is
+ begin
+ return Position (Component_Clause (Comps (Op1))) <
+ Position (Component_Clause (Comps (Op2)));
+ end CP_Lt;
+
+ -------------
+ -- CP_Move --
+ -------------
+
+ procedure CP_Move (From : Natural; To : Natural) is
+ begin
+ Comps (To) := Comps (From);
+ end CP_Move;
+
+ begin
+ -- Collect the component clauses
+
+ Num_CC := 0;
+ Comp := First_Component_Or_Discriminant (R);
+ while Present (Comp) loop
+ if Present (Component_Clause (Comp))
+ and then Esize (Comp) <= Max_Machine_Scalar_Size
+ then
+ Num_CC := Num_CC + 1;
+ Comps (Num_CC) := Comp;
+ end if;
+
+ Next_Component_Or_Discriminant (Comp);
+ end loop;
+
+ -- Sort by ascending position number
+
+ Sort (Num_CC, CP_Move'Unrestricted_Access, CP_Lt'Unrestricted_Access);
+
+ -- We now have all the components whose size does not exceed the max
+ -- machine scalar value, sorted by starting position. In this loop
+ -- we gather groups of clauses starting at the same position, to
+ -- process them in accordance with Ada 2005 AI-133.
+
+ Stop := 0;
+ while Stop < Num_CC loop
+ Start := Stop + 1;
+ Stop := Start;
+ MaxL :=
+ Static_Integer (Last_Bit (Component_Clause (Comps (Start))));
+ while Stop < Num_CC loop
+ if Static_Integer
+ (Position (Component_Clause (Comps (Stop + 1)))) =
+ Static_Integer
+ (Position (Component_Clause (Comps (Stop))))
+ then
+ Stop := Stop + 1;
+ MaxL :=
+ UI_Max
+ (MaxL,
+ Static_Integer
+ (Last_Bit (Component_Clause (Comps (Stop)))));
+ else
+ exit;
+ end if;
+ end loop;
+
+ -- Now we have a group of component clauses from Start to Stop
+ -- whose positions are identical, and MaxL is the maximum last bit
+ -- value of any of these components.
+
+ -- We need to determine the corresponding machine scalar size.
+ -- This loop assumes that machine scalar sizes are even, and that
+ -- each possible machine scalar has twice as many bits as the
+ -- next smaller one.
+
+ MSS := Max_Machine_Scalar_Size;
+ while MSS mod 2 = 0
+ and then (MSS / 2) >= SSU
+ and then (MSS / 2) > MaxL
+ loop
+ MSS := MSS / 2;
+ end loop;
+
+ -- Here is where we fix up the Component_Bit_Offset value to
+ -- account for the reverse bit order. Some examples of what needs
+ -- to be done for the case of a machine scalar size of 8 are:
+
+ -- First_Bit .. Last_Bit Component_Bit_Offset
+ -- old new old new
+
+ -- 0 .. 0 7 .. 7 0 7
+ -- 0 .. 1 6 .. 7 0 6
+ -- 0 .. 2 5 .. 7 0 5
+ -- 0 .. 7 0 .. 7 0 4
+
+ -- 1 .. 1 6 .. 6 1 6
+ -- 1 .. 4 3 .. 6 1 3
+ -- 4 .. 7 0 .. 3 4 0
+
+ -- The general rule is that the first bit is is obtained by
+ -- subtracting the old ending bit from machine scalar size - 1.
+
+ for C in Start .. Stop loop
+ declare
+ Comp : constant Entity_Id := Comps (C);
+ CC : constant Node_Id := Component_Clause (Comp);
+ LB : constant Uint := Static_Integer (Last_Bit (CC));
+ NFB : constant Uint := MSS - Uint_1 - LB;
+ NLB : constant Uint := NFB + Esize (Comp) - 1;
+ Pos : constant Uint := Static_Integer (Position (CC));
+
+ begin
+ if Warn_On_Reverse_Bit_Order then
+ Error_Msg_Uint_1 := MSS;
+ Error_Msg_N
+ ("?reverse bit order in machine " &
+ "scalar of length^", First_Bit (CC));
+ Error_Msg_Uint_1 := NFB;
+ Error_Msg_Uint_2 := NLB;
+
+ if Bytes_Big_Endian then
+ Error_Msg_NE
+ ("?\big-endian range for component & is ^ .. ^",
+ First_Bit (CC), Comp);
+ else
+ Error_Msg_NE
+ ("?\little-endian range for component & is ^ .. ^",
+ First_Bit (CC), Comp);
+ end if;
+ end if;
+
+ Set_Component_Bit_Offset (Comp, Pos * SSU + NFB);
+ Set_Normalized_First_Bit (Comp, NFB mod SSU);
+ end;
+ end loop;
+ end loop;
+ end;
+ end Adjust_Record_For_Reverse_Bit_Order;
+
--------------------------------------
-- Alignment_Check_For_Esize_Change --
--------------------------------------
@@ -355,7 +614,7 @@ package body Sem_Ch13 is
end if;
if Present (Subp) then
- if Is_Abstract (Subp) then
+ if Is_Abstract_Subprogram (Subp) then
Error_Msg_N ("stream subprogram must not be abstract", Expr);
return;
end if;
@@ -926,12 +1185,12 @@ package body Sem_Ch13 is
Etyp := Etype (U_Ent);
end if;
- -- Check size, note that Gigi is in charge of checking
- -- that the size of an array or record type is OK. Also
- -- we do not check the size in the ordinary fixed-point
- -- case, since it is too early to do so (there may be a
- -- subsequent small clause that affects the size). We can
- -- check the size if a small clause has already been given.
+ -- Check size, note that Gigi is in charge of checking that the
+ -- size of an array or record type is OK. Also we do not check
+ -- the size in the ordinary fixed-point case, since it is too
+ -- early to do so (there may be subsequent small clause that
+ -- affects the size). We can check the size if a small clause
+ -- has already been given.
if not Is_Ordinary_Fixed_Point_Type (U_Ent)
or else Has_Small_Clause (U_Ent)
@@ -945,9 +1204,9 @@ package body Sem_Ch13 is
if Is_Type (U_Ent) then
Set_RM_Size (U_Ent, Size);
- -- For scalar types, increase Object_Size to power of 2,
- -- but not less than a storage unit in any case (i.e.,
- -- normally this means it will be byte addressable).
+ -- For scalar types, increase Object_Size to power of 2, but
+ -- not less than a storage unit in any case (i.e., normally
+ -- this means it will be byte addressable).
if Is_Scalar_Type (U_Ent) then
if Size <= System_Storage_Unit then
@@ -1294,6 +1553,12 @@ package body Sem_Ch13 is
then
Error_Msg_N ("Value_Size already given for &", Nam);
+ elsif Is_Array_Type (U_Ent)
+ and then not Is_Constrained (U_Ent)
+ then
+ Error_Msg_N
+ ("Value_Size cannot be given for unconstrained array", Nam);
+
else
if Is_Elementary_Type (U_Ent) then
Check_Size (Expr, U_Ent, Size, Biased);
@@ -1837,17 +2102,10 @@ package body Sem_Ch13 is
-- Clear any existing component clauses for the type (this happens
-- with derived types, where we are now overriding the original)
- Fent := First_Entity (Rectype);
-
- Comp := Fent;
+ Comp := First_Component_Or_Discriminant (Rectype);
while Present (Comp) loop
- if Ekind (Comp) = E_Component
- or else Ekind (Comp) = E_Discriminant
- then
- Set_Component_Clause (Comp, Empty);
- end if;
-
- Next_Entity (Comp);
+ Set_Component_Clause (Comp, Empty);
+ Next_Component_Or_Discriminant (Comp);
end loop;
-- All done if no component clauses
@@ -1862,6 +2120,8 @@ package body Sem_Ch13 is
-- it at the start of the record (otherwise gigi may place it after
-- other fields that have rep clauses).
+ Fent := First_Entity (Rectype);
+
if Nkind (Fent) = N_Defining_Identifier
and then Chars (Fent) = Name_uTag
then
@@ -2284,15 +2544,10 @@ package body Sem_Ch13 is
then
-- Nothing to do if at least one component with no component clause
- Comp := First_Entity (Rectype);
+ Comp := First_Component_Or_Discriminant (Rectype);
while Present (Comp) loop
- if Ekind (Comp) = E_Component
- or else Ekind (Comp) = E_Discriminant
- then
- exit when No (Component_Clause (Comp));
- end if;
-
- Next_Entity (Comp);
+ exit when No (Component_Clause (Comp));
+ Next_Component_Or_Discriminant (Comp);
end loop;
-- If we fall out of loop, all components have component clauses
@@ -2306,19 +2561,14 @@ package body Sem_Ch13 is
-- Check missing components if Complete_Representation pragma appeared
if Present (CR_Pragma) then
- Comp := First_Entity (Rectype);
+ Comp := First_Component_Or_Discriminant (Rectype);
while Present (Comp) loop
- if Ekind (Comp) = E_Component
- or else
- Ekind (Comp) = E_Discriminant
- then
- if No (Component_Clause (Comp)) then
- Error_Msg_NE
- ("missing component clause for &", CR_Pragma, Comp);
- end if;
+ if No (Component_Clause (Comp)) then
+ Error_Msg_NE
+ ("missing component clause for &", CR_Pragma, Comp);
end if;
- Next_Entity (Comp);
+ Next_Component_Or_Discriminant (Comp);
end loop;
end if;
end Analyze_Record_Representation_Clause;
diff --git a/gcc/ada/sem_ch13.ads b/gcc/ada/sem_ch13.ads
index 288e3007a1f..1da73e2f1c0 100644
--- a/gcc/ada/sem_ch13.ads
+++ b/gcc/ada/sem_ch13.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2005, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2006, 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- --
@@ -35,6 +35,13 @@ package Sem_Ch13 is
procedure Analyze_Record_Representation_Clause (N : Node_Id);
procedure Analyze_Code_Statement (N : Node_Id);
+ procedure Adjust_Record_For_Reverse_Bit_Order (R : Entity_Id);
+ -- Called from Freeze where R is a record entity for which reverse bit
+ -- order is specified and there is at least one component clause. Adjusts
+ -- component positions according to Ada 2005 AI-133. Note that this is only
+ -- called in Ada 2005 mode. The Ada 95 handling for bit order is entirely
+ -- contained in Freeze.
+
procedure Initialize;
-- Initialize internal tables for new compilation
diff --git a/gcc/ada/style.ads b/gcc/ada/style.ads
index 170857376f5..4dbc55cef63 100644
--- a/gcc/ada/style.ads
+++ b/gcc/ada/style.ads
@@ -65,6 +65,16 @@ package Style is
renames Style_Inst.Check_Apostrophe;
-- Called after scanning an apostrophe to check spacing
+ procedure Check_Array_Attribute_Index
+ (N : Node_Id;
+ E1 : Node_Id;
+ D : Int)
+ renames Style_C_Inst.Check_Array_Attribute_Index;
+ -- Called for an array attribute specifying an index number. N is the
+ -- node for the attribute, and E1 is the index expression (Empty if none
+ -- present). If E1 is present, it is known to be a static integer. D is
+ -- the number of dimensions of the array.
+
procedure Check_Arrow
renames Style_Inst.Check_Arrow;
-- Called after scanning out an arrow to check spacing
diff --git a/gcc/ada/styleg-c.adb b/gcc/ada/styleg-c.adb
index d9c1049107f..fa3690ea427 100644
--- a/gcc/ada/styleg-c.adb
+++ b/gcc/ada/styleg-c.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2006, 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- --
@@ -67,6 +67,29 @@ package body Styleg.C is
end if;
end Body_With_No_Spec;
+ ---------------------------------
+ -- Check_Array_Attribute_Index --
+ ---------------------------------
+
+ procedure Check_Array_Attribute_Index
+ (N : Node_Id;
+ E1 : Node_Id;
+ D : Int)
+ is
+ begin
+ if Style_Check_Array_Attribute_Index then
+ if D = 1 and then Present (E1) then
+ Error_Msg_N
+ ("(style) index number not allowed for one dimensional array",
+ E1);
+ elsif D > 1 and then No (E1) then
+ Error_Msg_N
+ ("(style) index number required for multi-dimensional array",
+ N);
+ end if;
+ end if;
+ end Check_Array_Attribute_Index;
+
----------------------
-- Check_Identifier --
----------------------
diff --git a/gcc/ada/styleg-c.ads b/gcc/ada/styleg-c.ads
index 1ba9826a609..23072da91b8 100644
--- a/gcc/ada/styleg-c.ads
+++ b/gcc/ada/styleg-c.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2006, 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- --
@@ -38,6 +38,15 @@ package Styleg.C is
-- Called where N is a subprogram body node for a subprogram body
-- for which no spec was given, i.e. a body acting as its own spec.
+ procedure Check_Array_Attribute_Index
+ (N : Node_Id;
+ E1 : Node_Id;
+ D : Int);
+ -- Called for an array attribute specifying an index number. N is the
+ -- node for the attribute, and E1 is the index expression (Empty if none
+ -- present). If E1 is present, it is known to be a static integer. D is
+ -- the number of dimensions of the array.
+
procedure Check_Identifier
(Ref : Node_Or_Entity_Id;
Def : Node_Or_Entity_Id);
diff --git a/gcc/ada/stylesw.adb b/gcc/ada/stylesw.adb
index e1eda448945..b27d4e03409 100644
--- a/gcc/ada/stylesw.adb
+++ b/gcc/ada/stylesw.adb
@@ -35,28 +35,29 @@ package body Stylesw is
procedure Reset_Style_Check_Options is
begin
- Style_Check_Indentation := 0;
- Style_Check_Attribute_Casing := False;
- Style_Check_Blanks_At_End := False;
- Style_Check_Blank_Lines := False;
- Style_Check_Comments := False;
- Style_Check_DOS_Line_Terminator := False;
- Style_Check_End_Labels := False;
- Style_Check_Form_Feeds := False;
- Style_Check_Horizontal_Tabs := False;
- Style_Check_If_Then_Layout := False;
- Style_Check_Keyword_Casing := False;
- Style_Check_Layout := False;
- Style_Check_Max_Line_Length := False;
- Style_Check_Max_Nesting_Level := False;
- Style_Check_Mode_In := False;
- Style_Check_Order_Subprograms := False;
- Style_Check_Pragma_Casing := False;
- Style_Check_References := False;
- Style_Check_Specs := False;
- Style_Check_Standard := False;
- Style_Check_Tokens := False;
- Style_Check_Xtra_Parens := False;
+ Style_Check_Indentation := 0;
+ Style_Check_Array_Attribute_Index := False;
+ Style_Check_Attribute_Casing := False;
+ Style_Check_Blanks_At_End := False;
+ Style_Check_Blank_Lines := False;
+ Style_Check_Comments := False;
+ Style_Check_DOS_Line_Terminator := False;
+ Style_Check_End_Labels := False;
+ Style_Check_Form_Feeds := False;
+ Style_Check_Horizontal_Tabs := False;
+ Style_Check_If_Then_Layout := False;
+ Style_Check_Keyword_Casing := False;
+ Style_Check_Layout := False;
+ Style_Check_Max_Line_Length := False;
+ Style_Check_Max_Nesting_Level := False;
+ Style_Check_Mode_In := False;
+ Style_Check_Order_Subprograms := False;
+ Style_Check_Pragma_Casing := False;
+ Style_Check_References := False;
+ Style_Check_Specs := False;
+ Style_Check_Standard := False;
+ Style_Check_Tokens := False;
+ Style_Check_Xtra_Parens := False;
end Reset_Style_Check_Options;
------------------------------
@@ -64,7 +65,7 @@ package body Stylesw is
------------------------------
procedure Save_Style_Check_Options (Options : out Style_Check_Options) is
- P : Natural := 0;
+ P : Natural := 0;
procedure Add (C : Character; S : Boolean);
-- Add given character C to string if switch S is true
@@ -109,6 +110,7 @@ package body Stylesw is
Style_Check_Indentation /= 0);
Add ('a', Style_Check_Attribute_Casing);
+ Add ('A', Style_Check_Array_Attribute_Index);
Add ('b', Style_Check_Blanks_At_End);
Add ('c', Style_Check_Comments);
Add ('d', Style_Check_DOS_Line_Terminator);
@@ -155,7 +157,7 @@ package body Stylesw is
procedure Set_Default_Style_Check_Options is
begin
Reset_Style_Check_Options;
- Set_Style_Check_Options ("3abcefhiklmnprst");
+ Set_Style_Check_Options ("3aAbcefhiklmnprst");
end Set_Default_Style_Check_Options;
-----------------------------
@@ -228,37 +230,40 @@ package body Stylesw is
Character'Pos (C) - Character'Pos ('0');
when 'a' =>
- Style_Check_Attribute_Casing := True;
+ Style_Check_Attribute_Casing := True;
+
+ when 'A' =>
+ Style_Check_Array_Attribute_Index := True;
when 'b' =>
- Style_Check_Blanks_At_End := True;
+ Style_Check_Blanks_At_End := True;
when 'c' =>
- Style_Check_Comments := True;
+ Style_Check_Comments := True;
when 'd' =>
- Style_Check_DOS_Line_Terminator := True;
+ Style_Check_DOS_Line_Terminator := True;
when 'e' =>
- Style_Check_End_Labels := True;
+ Style_Check_End_Labels := True;
when 'f' =>
- Style_Check_Form_Feeds := True;
+ Style_Check_Form_Feeds := True;
when 'h' =>
- Style_Check_Horizontal_Tabs := True;
+ Style_Check_Horizontal_Tabs := True;
when 'i' =>
- Style_Check_If_Then_Layout := True;
+ Style_Check_If_Then_Layout := True;
when 'I' =>
- Style_Check_Mode_In := True;
+ Style_Check_Mode_In := True;
when 'k' =>
- Style_Check_Keyword_Casing := True;
+ Style_Check_Keyword_Casing := True;
when 'l' =>
- Style_Check_Layout := True;
+ Style_Check_Layout := True;
when 'L' =>
Style_Max_Nesting_Level := 0;
@@ -289,11 +294,11 @@ package body Stylesw is
Style_Check_Max_Nesting_Level := Style_Max_Nesting_Level /= 0;
when 'm' =>
- Style_Check_Max_Line_Length := True;
- Style_Max_Line_Length := 79;
+ Style_Check_Max_Line_Length := True;
+ Style_Max_Line_Length := 79;
when 'M' =>
- Style_Max_Line_Length := 0;
+ Style_Max_Line_Length := 0;
if Err_Col > Options'Last
or else Options (Err_Col) not in '0' .. '9'
@@ -321,34 +326,34 @@ package body Stylesw is
or else Options (Err_Col) not in '0' .. '9';
end loop;
- Style_Check_Max_Line_Length := Style_Max_Line_Length /= 0;
+ Style_Check_Max_Line_Length := Style_Max_Line_Length /= 0;
when 'n' =>
- Style_Check_Standard := True;
+ Style_Check_Standard := True;
when 'N' =>
Reset_Style_Check_Options;
when 'o' =>
- Style_Check_Order_Subprograms := True;
+ Style_Check_Order_Subprograms := True;
when 'p' =>
- Style_Check_Pragma_Casing := True;
+ Style_Check_Pragma_Casing := True;
when 'r' =>
- Style_Check_References := True;
+ Style_Check_References := True;
when 's' =>
- Style_Check_Specs := True;
+ Style_Check_Specs := True;
when 't' =>
- Style_Check_Tokens := True;
+ Style_Check_Tokens := True;
when 'u' =>
- Style_Check_Blank_Lines := True;
+ Style_Check_Blank_Lines := True;
when 'x' =>
- Style_Check_Xtra_Parens := True;
+ Style_Check_Xtra_Parens := True;
when ' ' =>
null;
diff --git a/gcc/ada/stylesw.ads b/gcc/ada/stylesw.ads
index 42e1774103e..85b823051ca 100644
--- a/gcc/ada/stylesw.ads
+++ b/gcc/ada/stylesw.ads
@@ -47,6 +47,12 @@ package Stylesw is
-- through a call to Set_Default_Style_Check_Options. They should
-- not be set directly in any other manner.
+ Style_Check_Array_Attribute_Index : Boolean := False;
+ -- This can be set True by using -gnatg or -gnatyA switches. If it is True
+ -- then index numbers for array attributes (like Length) are required to
+ -- be absent for one-dimensional arrays and present for multi-dimensional
+ -- array attribute references.
+
Style_Check_Attribute_Casing : Boolean := False;
-- This can be set True by using the -gnatg or -gnatya switches. If
-- it is True, then attribute names (including keywords such as
diff --git a/gcc/ada/usage.adb b/gcc/ada/usage.adb
index f3bc06965b6..1da60acdee8 100644
--- a/gcc/ada/usage.adb
+++ b/gcc/ada/usage.adb
@@ -391,10 +391,10 @@ begin
Write_Line (" O turn off warnings for address clause overlay");
Write_Line (" p turn on warnings for ineffective pragma Inline");
Write_Line (" P* turn off warnings for ineffective pragma Inline");
- Write_Line (" q turn on warnings for questionable " &
- "missing paretheses");
- Write_Line (" Q* turn off warnings for questionable " &
- "missing paretheses");
+ Write_Line (" q* turn on warnings for questionable " &
+ "missing parentheses");
+ Write_Line (" Q turn off warnings for questionable " &
+ "missing parentheses");
Write_Line (" r turn on warnings for redundant construct");
Write_Line (" R* turn off warnings for redundant construct");
Write_Line (" s suppress all warnings");
@@ -409,6 +409,8 @@ begin
"assumption");
Write_Line (" x* turn on warnings for export/import");
Write_Line (" X turn off warnings for export/import");
+ Write_Line (" .x* turn on warnings for non-local exceptions");
+ Write_Line (" .X turn off warnings for non-local exceptions");
Write_Line (" y* turn on warnings for Ada 2005 incompatibility");
Write_Line (" Y turn off warnings for Ada 2005 incompatibility");
Write_Line (" z* turn on size/align warnings for " &
@@ -452,6 +454,7 @@ begin
Write_Line ("Enable selected style checks xx = list of parameters:");
Write_Line (" 1-9 check indentation");
Write_Line (" a check attribute casing");
+ Write_Line (" A check array attribute indexes");
Write_Line (" b check no blanks at end of lines");
Write_Line (" c check comment format");
Write_Line (" d check no DOS line terminators");
@@ -472,7 +475,7 @@ begin
Write_Line (" s check separate subprogram specs present");
Write_Line (" t check token separation rules");
Write_Line (" u check no unnecessary blank lines");
- Write_Line (" x check extra parens around conditionals");
+ Write_Line (" x check extra parentheses around conditionals");
-- Lines for -gnatyN switch