diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-12-12 12:54:30 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-12-12 12:54:30 +0100 |
commit | 6bed26b5427ac521b5b1bea8d4f24f265980670d (patch) | |
tree | e566c00a722d5b074112e751aaa53d7d1d10dfdd /gcc/ada | |
parent | fe58fea70b2614f36fb9e1fde78af892426ad8a6 (diff) | |
download | gcc-6bed26b5427ac521b5b1bea8d4f24f265980670d.zip gcc-6bed26b5427ac521b5b1bea8d4f24f265980670d.tar.gz gcc-6bed26b5427ac521b5b1bea8d4f24f265980670d.tar.bz2 |
[multiple changes]
2011-12-12 Robert Dewar <dewar@adacore.com>
* sem_prag.adb (GNAT_Pragma): Check comes from source.
2011-12-12 Robert Dewar <dewar@adacore.com>
* gnatls.adb: Minor reformatting.
2011-12-12 Javier Miranda <miranda@adacore.com>
* a-tags.ads (Alignment): New TSD field.
(Max_Predef_Prims): Value lowered to 15 (or 9 in case of
configurable runtime) Update documentation of predefined
primitives since Alignment has been removed.
* exp_disp.ads Update documentation of slots of dispatching
primitives.
* exp_disp.adb (Default_Prim_Op_Position): Update slot
values since alignment is no longer a predefined primitive.
(Is_Predefined_Dispatch_Operation): Remove _alignment.
(Is_Predefined_Internal_Operation): Remove _alignment.
(Make_DT): Update static test on the value stored in a-tags.ads
for Max_Predef_Prims; store the value of 'alignment in the TSD.
* exp_atag.ads, exp_atag.adb (Build_Get_Alignment): New subprogram
that retrieves the alignment from the TSD
* exp_util.adb (Build_Allocated_Deallocate_Proc): For deallocation
of class-wide types obtain the value of alignment from the TSD.
* exp_attr.adb (Expand_N_Attribute_Reference): For 'alignment
applied to a class-wide type invoke Build_Get_Alignment to
generate code which retrieves the value of the alignment from
the TSD.
* rtsfind.ads (RE_Alignment): New Ada.Tags entity
* sem_ch13.adb (Analyze_Attribute_Definition_Clause): For tagged
types if the value of the alignment is bigger than the Maximum
alignment then set the value of the alignment to the Maximum
alignment and report a warning.
* exp_ch3.adb (Make_Predefined_Primitive_Specs): Do not generate
spec of _alignment.
(Predefined_Primitive_Bodies): Do not generate body of _alignment.
From-SVN: r182229
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 39 | ||||
-rw-r--r-- | gcc/ada/a-tags.ads | 34 | ||||
-rw-r--r-- | gcc/ada/exp_atag.adb | 19 | ||||
-rw-r--r-- | gcc/ada/exp_atag.ads | 7 | ||||
-rw-r--r-- | gcc/ada/exp_attr.adb | 16 | ||||
-rw-r--r-- | gcc/ada/exp_ch3.adb | 36 | ||||
-rw-r--r-- | gcc/ada/exp_disp.adb | 57 | ||||
-rw-r--r-- | gcc/ada/exp_disp.ads | 32 | ||||
-rw-r--r-- | gcc/ada/exp_util.adb | 27 | ||||
-rw-r--r-- | gcc/ada/gnatls.adb | 4 | ||||
-rw-r--r-- | gcc/ada/rtsfind.ads | 2 | ||||
-rw-r--r-- | gcc/ada/sem_ch13.adb | 15 | ||||
-rw-r--r-- | gcc/ada/sem_prag.adb | 9 |
13 files changed, 186 insertions, 111 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e644b7e..6653a2f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,42 @@ +2011-12-12 Robert Dewar <dewar@adacore.com> + + * sem_prag.adb (GNAT_Pragma): Check comes from source. + +2011-12-12 Robert Dewar <dewar@adacore.com> + + * gnatls.adb: Minor reformatting. + +2011-12-12 Javier Miranda <miranda@adacore.com> + + * a-tags.ads (Alignment): New TSD field. + (Max_Predef_Prims): Value lowered to 15 (or 9 in case of + configurable runtime) Update documentation of predefined + primitives since Alignment has been removed. + * exp_disp.ads Update documentation of slots of dispatching + primitives. + * exp_disp.adb (Default_Prim_Op_Position): Update slot + values since alignment is no longer a predefined primitive. + (Is_Predefined_Dispatch_Operation): Remove _alignment. + (Is_Predefined_Internal_Operation): Remove _alignment. + (Make_DT): Update static test on the value stored in a-tags.ads + for Max_Predef_Prims; store the value of 'alignment in the TSD. + * exp_atag.ads, exp_atag.adb (Build_Get_Alignment): New subprogram + that retrieves the alignment from the TSD + * exp_util.adb (Build_Allocated_Deallocate_Proc): For deallocation + of class-wide types obtain the value of alignment from the TSD. + * exp_attr.adb (Expand_N_Attribute_Reference): For 'alignment + applied to a class-wide type invoke Build_Get_Alignment to + generate code which retrieves the value of the alignment from + the TSD. + * rtsfind.ads (RE_Alignment): New Ada.Tags entity + * sem_ch13.adb (Analyze_Attribute_Definition_Clause): For tagged + types if the value of the alignment is bigger than the Maximum + alignment then set the value of the alignment to the Maximum + alignment and report a warning. + * exp_ch3.adb (Make_Predefined_Primitive_Specs): Do not generate + spec of _alignment. + (Predefined_Primitive_Bodies): Do not generate body of _alignment. + 2011-12-12 Gary Dismukes <dismukes@adacore.com> * freeze.adb (Freeze_Expression): Allow freezing of static diff --git a/gcc/ada/a-tags.ads b/gcc/ada/a-tags.ads index 5170793..6d94c3f 100644 --- a/gcc/ada/a-tags.ads +++ b/gcc/ada/a-tags.ads @@ -98,6 +98,8 @@ private -- : primitive ops : +-------------------+ -- | pointers | | access level | -- +--------------------+ +-------------------+ + -- | alignment | + -- +-------------------+ -- | expanded name | -- +-------------------+ -- | external tag | @@ -269,6 +271,7 @@ private -- function return, and class-wide stream I/O, the danger of objects -- outliving their type declaration can be eliminated (Ada 2005: AI-344) + Alignment : Natural; Expanded_Name : Cstring_Ptr; External_Tag : Cstring_Ptr; HT_Link : Tag_Ptr; @@ -545,25 +548,24 @@ private procedure Unregister_Tag (T : Tag); -- Remove a particular tag from the external tag hash table - Max_Predef_Prims : constant Positive := 16; + Max_Predef_Prims : constant Positive := 15; -- Number of reserved slots for the following predefined ada primitives: -- -- 1. Size - -- 2. Alignment, - -- 3. Read - -- 4. Write - -- 5. Input - -- 6. Output - -- 7. "=" - -- 8. assignment - -- 9. deep adjust - -- 10. deep finalize - -- 11. async select - -- 12. conditional select - -- 13. prim_op kind - -- 14. task_id - -- 15. dispatching requeue - -- 16. timed select + -- 2. Read + -- 3. Write + -- 4. Input + -- 5. Output + -- 6. "=" + -- 7. assignment + -- 8. deep adjust + -- 9. deep finalize + -- 10. async select + -- 11. conditional select + -- 12. prim_op kind + -- 13. task_id + -- 14. dispatching requeue + -- 15. timed select -- -- The compiler checks that the value here is correct diff --git a/gcc/ada/exp_atag.adb b/gcc/ada/exp_atag.adb index 6e86dbc..2b0a038 100644 --- a/gcc/ada/exp_atag.adb +++ b/gcc/ada/exp_atag.adb @@ -289,6 +289,25 @@ package body Exp_Atag is (RTE_Record_Component (RE_Access_Level), Loc)); end Build_Get_Access_Level; + ------------------------- + -- Build_Get_Alignment -- + ------------------------- + + function Build_Get_Alignment + (Loc : Source_Ptr; + Tag_Node : Node_Id) return Node_Id + is + begin + return + Make_Selected_Component (Loc, + Prefix => + Build_TSD (Loc, + Unchecked_Convert_To (RTE (RE_Address), Tag_Node)), + Selector_Name => + New_Reference_To + (RTE_Record_Component (RE_Alignment), Loc)); + end Build_Get_Alignment; + ------------------------------------------ -- Build_Get_Predefined_Prim_Op_Address -- ------------------------------------------ diff --git a/gcc/ada/exp_atag.ads b/gcc/ada/exp_atag.ads index 36382ea..7544925 100644 --- a/gcc/ada/exp_atag.ads +++ b/gcc/ada/exp_atag.ads @@ -66,6 +66,13 @@ package Exp_Atag is -- -- Generates: TSD (Tag).Access_Level + function Build_Get_Alignment + (Loc : Source_Ptr; + Tag_Node : Node_Id) return Node_Id; + -- Build code that retrieves the alignment of the tagged type. + -- + -- Generates: TSD (Tag).Alignment + procedure Build_Get_Predefined_Prim_Op_Address (Loc : Source_Ptr; Position : Uint; diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb index a4d9149..8258f71 100644 --- a/gcc/ada/exp_attr.adb +++ b/gcc/ada/exp_attr.adb @@ -1120,19 +1120,11 @@ package body Exp_Attr is elsif Is_Class_Wide_Type (Ptyp) then - -- No need to do anything else compiling under restriction - -- No_Dispatching_Calls. During the semantic analysis we - -- already notified such violation. - - if Restriction_Active (No_Dispatching_Calls) then - return; - end if; - New_Node := - Make_Function_Call (Loc, - Name => New_Reference_To - (Find_Prim_Op (Ptyp, Name_uAlignment), Loc), - Parameter_Associations => New_List (Pref)); + Build_Get_Alignment (Loc, + Make_Attribute_Reference (Loc, + Prefix => Pref, + Attribute_Name => Name_Tag)); if Typ /= Standard_Integer then diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index 1554723..ef672fe 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -250,7 +250,6 @@ package body Exp_Ch3 is -- Dispatching is required in general, since the result of the attribute -- will vary with the actual object subtype. -- - -- _alignment provides result of 'Alignment attribute -- _size provides result of 'Size attribute -- typSR provides result of 'Read attribute -- typSW provides result of 'Write attribute @@ -8156,18 +8155,6 @@ package body Exp_Ch3 is Ret_Type => Standard_Long_Long_Integer)); - -- Spec of _Alignment - - Append_To (Res, Predef_Spec_Or_Body (Loc, - Tag_Typ => Tag_Typ, - Name => Name_uAlignment, - Profile => New_List ( - Make_Parameter_Specification (Loc, - Defining_Identifier => Make_Defining_Identifier (Loc, Name_X), - Parameter_Type => New_Reference_To (Tag_Typ, Loc))), - - Ret_Type => Standard_Integer)); - -- Specs for dispatching stream attributes declare @@ -8740,29 +8727,6 @@ package body Exp_Ch3 is end loop; end if; - -- Body of _Alignment - - Decl := Predef_Spec_Or_Body (Loc, - Tag_Typ => Tag_Typ, - Name => Name_uAlignment, - Profile => New_List ( - Make_Parameter_Specification (Loc, - Defining_Identifier => Make_Defining_Identifier (Loc, Name_X), - Parameter_Type => New_Reference_To (Tag_Typ, Loc))), - - Ret_Type => Standard_Integer, - For_Body => True); - - Set_Handled_Statement_Sequence (Decl, - Make_Handled_Sequence_Of_Statements (Loc, New_List ( - Make_Simple_Return_Statement (Loc, - Expression => - Make_Attribute_Reference (Loc, - Prefix => Make_Identifier (Loc, Name_X), - Attribute_Name => Name_Alignment))))); - - Append_To (Res, Decl); - -- Body of _Size Decl := Predef_Spec_Or_Body (Loc, diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb index df998e9..bd6724f 100644 --- a/gcc/ada/exp_disp.adb +++ b/gcc/ada/exp_disp.adb @@ -579,32 +579,29 @@ package body Exp_Disp is if Chars (E) = Name_uSize then return Uint_1; - elsif Chars (E) = Name_uAlignment then - return Uint_2; - elsif TSS_Name = TSS_Stream_Read then - return Uint_3; + return Uint_2; elsif TSS_Name = TSS_Stream_Write then - return Uint_4; + return Uint_3; elsif TSS_Name = TSS_Stream_Input then - return Uint_5; + return Uint_4; elsif TSS_Name = TSS_Stream_Output then - return Uint_6; + return Uint_5; elsif Chars (E) = Name_Op_Eq then - return Uint_7; + return Uint_6; elsif Chars (E) = Name_uAssign then - return Uint_8; + return Uint_7; elsif TSS_Name = TSS_Deep_Adjust then - return Uint_9; + return Uint_8; elsif TSS_Name = TSS_Deep_Finalize then - return Uint_10; + return Uint_9; -- In VM targets unconditionally allow obtaining the position associated -- with predefined interface primitives since in these platforms any @@ -612,22 +609,22 @@ package body Exp_Disp is elsif Ada_Version >= Ada_2005 or else not Tagged_Type_Expansion then if Chars (E) = Name_uDisp_Asynchronous_Select then - return Uint_11; + return Uint_10; elsif Chars (E) = Name_uDisp_Conditional_Select then - return Uint_12; + return Uint_11; elsif Chars (E) = Name_uDisp_Get_Prim_Op_Kind then - return Uint_13; + return Uint_12; elsif Chars (E) = Name_uDisp_Get_Task_Id then - return Uint_14; + return Uint_13; elsif Chars (E) = Name_uDisp_Requeue then - return Uint_15; + return Uint_14; elsif Chars (E) = Name_uDisp_Timed_Select then - return Uint_16; + return Uint_15; end if; end if; @@ -1945,7 +1942,6 @@ package body Exp_Disp is TSS_Name := TSS_Name_Type (Name_Buffer (Name_Len - TSS_Name'Length + 1 .. Name_Len)); if Chars (E) = Name_uSize - or else Chars (E) = Name_uAlignment or else TSS_Name = TSS_Stream_Read or else TSS_Name = TSS_Stream_Write or else TSS_Name = TSS_Stream_Input @@ -1991,7 +1987,6 @@ package body Exp_Disp is (Name_Buffer (Name_Len - TSS_Name'Length + 1 .. Name_Len)); if Chars (E) = Name_uSize - or else Chars (E) = Name_uAlignment or else (Chars (E) = Name_Op_Eq and then Etype (First_Formal (E)) = Etype (Last_Formal (E))) @@ -4513,16 +4508,16 @@ package body Exp_Disp is end if; -- Ensure that the value of Max_Predef_Prims defined in a-tags is - -- correct. Valid values are 10 under configurable runtime or 16 + -- correct. Valid values are 9 under configurable runtime or 15 -- with full runtime. if RTE_Available (RE_Interface_Data) then - if Max_Predef_Prims /= 16 then + if Max_Predef_Prims /= 15 then Error_Msg_N ("run-time library configuration error", Typ); return Result; end if; else - if Max_Predef_Prims /= 10 then + if Max_Predef_Prims /= 9 then Error_Msg_N ("run-time library configuration error", Typ); Error_Msg_CRT ("tagged types", Typ); return Result; @@ -4846,6 +4841,7 @@ package body Exp_Disp is -- TSD : Type_Specific_Data (I_Depth) := -- (Idepth => I_Depth, -- Access_Level => Type_Access_Level (Typ), + -- Alignment => Typ'Alignment, -- Expanded_Name => Cstring_Ptr!(Exname'Address)) -- External_Tag => Cstring_Ptr!(Exname'Address)) -- HT_Link => HT_Link'Address, @@ -4895,6 +4891,23 @@ package body Exp_Disp is Append_To (TSD_Aggr_List, Make_Integer_Literal (Loc, Type_Access_Level (Typ))); + -- Alignment + + -- For CPP types we cannot rely on the value of 'Alignment provided + -- by the backend to initialize this TSD field. + + if Convention (Typ) = Convention_CPP + or else Is_CPP_Class (Root_Type (Typ)) + then + Append_To (TSD_Aggr_List, + Make_Integer_Literal (Loc, 0)); + else + Append_To (TSD_Aggr_List, + Make_Attribute_Reference (Loc, + Prefix => New_Reference_To (Typ, Loc), + Attribute_Name => Name_Alignment)); + end if; + -- Expanded_Name Append_To (TSD_Aggr_List, diff --git a/gcc/ada/exp_disp.ads b/gcc/ada/exp_disp.ads index 306cec2..9943bda 100644 --- a/gcc/ada/exp_disp.ads +++ b/gcc/ada/exp_disp.ads @@ -52,65 +52,61 @@ package Exp_Disp is -- type. Constructs of the form Prefix'Size are converted into -- Prefix._Size. - -- _Alignment (2) - implementation of the attribute 'Alignment for - -- any tagged type. Constructs of the form Prefix'Alignment are - -- converted into Prefix._Alignment. - - -- TSS_Stream_Read (3) - implementation of the stream attribute Read + -- TSS_Stream_Read (2) - implementation of the stream attribute Read -- for any tagged type. - -- TSS_Stream_Write (4) - implementation of the stream attribute Write + -- TSS_Stream_Write (3) - implementation of the stream attribute Write -- for any tagged type. - -- TSS_Stream_Input (5) - implementation of the stream attribute Input + -- TSS_Stream_Input (4) - implementation of the stream attribute Input -- for any tagged type. - -- TSS_Stream_Output (6) - implementation of the stream attribute + -- TSS_Stream_Output (5) - implementation of the stream attribute -- Output for any tagged type. - -- Op_Eq (7) - implementation of the equality operator for any non- + -- Op_Eq (6) - implementation of the equality operator for any non- -- limited tagged type. - -- _Assign (8) - implementation of the assignment operator for any + -- _Assign (7) - implementation of the assignment operator for any -- non-limited tagged type. - -- TSS_Deep_Adjust (9) - implementation of the finalization operation + -- TSS_Deep_Adjust (8) - implementation of the finalization operation -- Adjust for any non-limited tagged type. - -- TSS_Deep_Finalize (10) - implementation of the finalization + -- TSS_Deep_Finalize (9) - implementation of the finalization -- operation Finalize for any non-limited tagged type. - -- _Disp_Asynchronous_Select (11) - used in the expansion of ATC with + -- _Disp_Asynchronous_Select (10) - used in the expansion of ATC with -- dispatching triggers. Null implementation for limited interfaces, -- full body generation for types that implement limited interfaces, -- not generated for the rest of the cases. See Expand_N_Asynchronous_ -- Select in Exp_Ch9 for more information. - -- _Disp_Conditional_Select (12) - used in the expansion of conditional + -- _Disp_Conditional_Select (11) - used in the expansion of conditional -- selects with dispatching triggers. Null implementation for limited -- interfaces, full body generation for types that implement limited -- interfaces, not generated for the rest of the cases. See Expand_N_ -- Conditional_Entry_Call in Exp_Ch9 for more information. - -- _Disp_Get_Prim_Op_Kind (13) - helper routine used in the expansion + -- _Disp_Get_Prim_Op_Kind (12) - helper routine used in the expansion -- of ATC with dispatching triggers. Null implementation for limited -- interfaces, full body generation for types that implement limited -- interfaces, not generated for the rest of the cases. - -- _Disp_Get_Task_Id (14) - helper routine used in the expansion of + -- _Disp_Get_Task_Id (13) - helper routine used in the expansion of -- Abort, attributes 'Callable and 'Terminated for task interface -- class-wide types. Full body generation for task types, null -- implementation for limited interfaces, not generated for the rest -- of the cases. See Expand_N_Attribute_Reference in Exp_Attr and -- Expand_N_Abort_Statement in Exp_Ch9 for more information. - -- _Disp_Requeue (15) - used in the expansion of dispatching requeue + -- _Disp_Requeue (14) - used in the expansion of dispatching requeue -- statements. Null implementation is provided for protected, task -- and synchronized interfaces. Protected and task types implementing -- concurrent interfaces receive full bodies. See Expand_N_Requeue_ -- Statement in Exp_Ch9 for more information. - -- _Disp_Timed_Select (16) - used in the expansion of timed selects + -- _Disp_Timed_Select (15) - used in the expansion of timed selects -- with dispatching triggers. Null implementation for limited -- interfaces, full body generation for types that implement limited -- interfaces, not generated for the rest of the cases. See Expand_N_ diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index c67d011..3dd99e9 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -755,7 +755,32 @@ package body Exp_Util is Append_To (Actuals, New_Reference_To (Addr_Id, Loc)); Append_To (Actuals, New_Reference_To (Size_Id, Loc)); - Append_To (Actuals, New_Reference_To (Alig_Id, Loc)); + + if Is_Allocate + or else not Is_Class_Wide_Type (Desig_Typ) + then + Append_To (Actuals, New_Reference_To (Alig_Id, Loc)); + + -- For deallocation of class wide types we obtain the value of + -- alignment from the Type Specific Record of the deallocated object. + -- This is needed because the frontend expansion of class-wide types + -- into equivalent types confuses the backend. + + else + -- Generate: + -- Obj.all'Alignment + + -- ... because 'Alignment applied to class-wide types is expanded + -- into the code that reads the value of alignment from the TSD + -- (see Expand_N_Attribute_Reference) + + Append_To (Actuals, + Unchecked_Convert_To (RTE (RE_Storage_Offset), + Make_Attribute_Reference (Loc, + Prefix => + Make_Explicit_Dereference (Loc, Relocate_Node (Expr)), + Attribute_Name => Name_Alignment))); + end if; -- h) Is_Controlled diff --git a/gcc/ada/gnatls.adb b/gcc/ada/gnatls.adb index a1d0e8d..9c23106 100644 --- a/gcc/ada/gnatls.adb +++ b/gcc/ada/gnatls.adb @@ -1221,8 +1221,8 @@ procedure Gnatls is if Rts_Full_Path /= null then - -- Directory name was found on the project path. Look for the - -- include subdir(s). + -- Directory name was found on the project path. Look for the + -- include subdirectory(s). Src_Path := Get_RTS_Search_Dir (Rts_Full_Path.all, Include); diff --git a/gcc/ada/rtsfind.ads b/gcc/ada/rtsfind.ads index 261365d..e6ae088 100644 --- a/gcc/ada/rtsfind.ads +++ b/gcc/ada/rtsfind.ads @@ -570,6 +570,7 @@ package Rtsfind is RE_Unbounded_String, -- Ada.Strings.Unbounded RE_Access_Level, -- Ada.Tags + RE_Alignment, -- Ada.Tags RE_Address_Array, -- Ada.Tags RE_Addr_Ptr, -- Ada.Tags RE_Base_Address, -- Ada.Tags @@ -1768,6 +1769,7 @@ package Rtsfind is RE_Unbounded_String => Ada_Strings_Unbounded, RE_Access_Level => Ada_Tags, + RE_Alignment => Ada_Tags, RE_Address_Array => Ada_Tags, RE_Addr_Ptr => Ada_Tags, RE_Base_Address => Ada_Tags, diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 9ddabcc..8b543a3 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -2495,8 +2495,8 @@ package body Sem_Ch13 is -- Alignment attribute definition clause when Attribute_Alignment => Alignment : declare - Align : constant Uint := Get_Alignment_Value (Expr); - + Align : constant Uint := Get_Alignment_Value (Expr); + Max_Align : constant Uint := UI_From_Int (Maximum_Alignment); begin FOnly := True; @@ -2511,7 +2511,16 @@ package body Sem_Ch13 is elsif Align /= No_Uint then Set_Has_Alignment_Clause (U_Ent); - Set_Alignment (U_Ent, Align); + + if Is_Tagged_Type (U_Ent) + and then Align > Max_Align + then + Error_Msg_N + ("?alignment for & set to Maximum_Aligment", Nam); + Set_Alignment (U_Ent, Max_Align); + else + Set_Alignment (U_Ent, Align); + end if; -- For an array type, U_Ent is the first subtype. In that case, -- also set the alignment of the anonymous base type so that diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index c8daa8c..ad989d2 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -2709,7 +2709,14 @@ package body Sem_Prag is procedure GNAT_Pragma is begin - Check_Restriction (No_Implementation_Pragmas, N); + -- We need to check the No_Implementation_Pragmas restriction for + -- the case of a pragma from source. Note that the case of aspects + -- generating corresponding pragmas marks these pragmas as not being + -- from source, so this test also catches that case. + + if Comes_From_Source (N) then + Check_Restriction (No_Implementation_Pragmas, N); + end if; end GNAT_Pragma; -------------------------- |