diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-01-20 16:01:22 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-01-20 16:01:22 +0000 |
commit | 4098232ed6ac89172843992091748d4a8f15c309 (patch) | |
tree | d8ec142379c7b7924fd770f6a516efecf89fcc58 /gcc/ada | |
parent | 03218544c6690f785a9e321072b7c28b23f07c26 (diff) | |
download | gcc-4098232ed6ac89172843992091748d4a8f15c309.tar.gz |
2014-01-20 Robert Dewar <dewar@adacore.com>
* checks.adb: Make warnings on exceptions into errors in GNATprove mode.
* errout.adb: Implement [ and ] insertion characters.
* errout.ads: Document new [ and ] insertion characters.
* sem_ch12.adb, restrict.adb, frontend.adb, exp_ch7.adb: Minor
addition of ??? comment.
* lib-xref.adb, exp_util.adb, gnat1drv.adb: Minor reformatting
* exp_ch4.adb, sem_ch3.adb, sem_ch4.adb, sem_ch6.adb, sem_elab.adb,
sem_eval.adb, sem_res.adb, sem_util.adb, sem_attr.adb, sem_aggr.adb:
Make warnings on exceptions into errors in GNATprove mode.
* sem_dim.adb: Minor reformatting throughout Quote [ and ]
in error messages.
2014-01-20 Ed Schonberg <schonberg@adacore.com>
* sem_ch13.adb: Code clean up.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206841 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 18 | ||||
-rw-r--r-- | gcc/ada/checks.adb | 48 | ||||
-rw-r--r-- | gcc/ada/errout.adb | 38 | ||||
-rw-r--r-- | gcc/ada/errout.ads | 31 | ||||
-rw-r--r-- | gcc/ada/exp_ch4.adb | 7 | ||||
-rw-r--r-- | gcc/ada/exp_ch7.adb | 2 | ||||
-rw-r--r-- | gcc/ada/exp_util.adb | 2 | ||||
-rw-r--r-- | gcc/ada/frontend.adb | 2 | ||||
-rw-r--r-- | gcc/ada/gnat1drv.adb | 14 | ||||
-rw-r--r-- | gcc/ada/lib-xref.adb | 6 | ||||
-rw-r--r-- | gcc/ada/restrict.adb | 2 | ||||
-rw-r--r-- | gcc/ada/sem_aggr.adb | 32 | ||||
-rw-r--r-- | gcc/ada/sem_attr.adb | 19 | ||||
-rw-r--r-- | gcc/ada/sem_ch12.adb | 3 | ||||
-rw-r--r-- | gcc/ada/sem_ch13.adb | 14 | ||||
-rw-r--r-- | gcc/ada/sem_ch3.adb | 6 | ||||
-rw-r--r-- | gcc/ada/sem_ch4.adb | 20 | ||||
-rw-r--r-- | gcc/ada/sem_ch6.adb | 47 | ||||
-rw-r--r-- | gcc/ada/sem_dim.adb | 208 | ||||
-rw-r--r-- | gcc/ada/sem_elab.adb | 28 | ||||
-rw-r--r-- | gcc/ada/sem_eval.adb | 6 | ||||
-rw-r--r-- | gcc/ada/sem_res.adb | 92 | ||||
-rw-r--r-- | gcc/ada/sem_util.adb | 59 |
23 files changed, 414 insertions, 290 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index d73b2ee40e6..fec727aab4f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,23 @@ 2014-01-20 Robert Dewar <dewar@adacore.com> + * checks.adb: Make warnings on exceptions into errors in GNATprove mode. + * errout.adb: Implement [ and ] insertion characters. + * errout.ads: Document new [ and ] insertion characters. + * sem_ch12.adb, restrict.adb, frontend.adb, exp_ch7.adb: Minor + addition of ??? comment. + * lib-xref.adb, exp_util.adb, gnat1drv.adb: Minor reformatting + * exp_ch4.adb, sem_ch3.adb, sem_ch4.adb, sem_ch6.adb, sem_elab.adb, + sem_eval.adb, sem_res.adb, sem_util.adb, sem_attr.adb, sem_aggr.adb: + Make warnings on exceptions into errors in GNATprove mode. + * sem_dim.adb: Minor reformatting throughout Quote [ and ] + in error messages. + +2014-01-20 Ed Schonberg <schonberg@adacore.com> + + * sem_ch13.adb: Code clean up. + +2014-01-20 Robert Dewar <dewar@adacore.com> + * errout.ads, errout.adb: Implement >? >x? >X? sequences in error messages. * sem_ch6.adb (Check_Statement_Sequence): Missing return is an diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index 1e4cff810c5..eb6c5b74343 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -2956,9 +2956,12 @@ package body Checks is Loc : constant Source_Ptr := Sloc (Ck_Node); Checks_On : constant Boolean := (not Index_Checks_Suppressed (Target_Typ)) - or else (not Length_Checks_Suppressed (Target_Typ)); + or else (not Length_Checks_Suppressed (Target_Typ)); begin + -- Note: this means that we lose some useful warnings if the expander + -- is not active, and we also lose these warnings in SPARK mode ??? + if not Expander_Active then return; end if; @@ -3694,15 +3697,30 @@ package body Checks is -- Here we have the optimizable case, warn if not short-circuited if K = N_Op_And or else K = N_Op_Or then + Error_Msg_Warn := not GNATprove_Mode; + case Check is when Access_Check => - Error_Msg_N - ("Constraint_Error may be raised (access check)??", - Parent (Nod)); + if GNATprove_Mode then + Error_Msg_N + ("Constraint_Error might have been raised (access check)", + Parent (Nod)); + else + Error_Msg_N + ("Constraint_Error may be raised (access check)??", + Parent (Nod)); + end if; + when Division_Check => - Error_Msg_N - ("Constraint_Error may be raised (zero divide)??", - Parent (Nod)); + if GNATprove_Mode then + Error_Msg_N + ("Constraint_Error might have been raised (zero divide)", + Parent (Nod)); + else + Error_Msg_N + ("Constraint_Error may be raised (zero divide)??", + Parent (Nod)); + end if; when others => raise Program_Error; @@ -3870,22 +3888,22 @@ package body Checks is N_Discriminant_Specification => Apply_Compile_Time_Constraint_Error (N => Expr, - Msg => "(Ada 2005) null not allowed " & - "in null-excluding components??", + Msg => "(Ada 2005) null not allowed " + & "in null-excluding components??", Reason => CE_Null_Not_Allowed); when N_Object_Declaration => Apply_Compile_Time_Constraint_Error (N => Expr, - Msg => "(Ada 2005) null not allowed " & - "in null-excluding objects?", + Msg => "(Ada 2005) null not allowed " + & "in null-excluding objects?", Reason => CE_Null_Not_Allowed); when N_Parameter_Specification => Apply_Compile_Time_Constraint_Error (N => Expr, - Msg => "(Ada 2005) null not allowed " & - "in null-excluding formals??", + Msg => "(Ada 2005) null not allowed " + & "in null-excluding formals??", Reason => CE_Null_Not_Allowed); when others => @@ -6682,9 +6700,7 @@ package body Checks is if not Inside_Init_Proc then Apply_Compile_Time_Constraint_Error - (N, - "null value not allowed here??", - CE_Access_Check_Failed); + (N, "null value not allowed here??", CE_Access_Check_Failed); else Insert_Action (N, Make_Raise_Constraint_Error (Loc, diff --git a/gcc/ada/errout.adb b/gcc/ada/errout.adb index 6679d6a1d28..6372fea3895 100644 --- a/gcc/ada/errout.adb +++ b/gcc/ada/errout.adb @@ -2712,19 +2712,20 @@ package body Errout is C : Character; -- Current character P : Natural; -- Current index; - procedure Set_Msg_Insertion_Warning; - -- Deal with ? ?? ?x? ?X? insertion sequences (also < <? <x? <X?). The - -- caller has already bumped the pointer past the initial ? or <. + procedure Set_Msg_Insertion_Warning (C : Character); + -- Deal with ? ?? ?x? ?X? insertion sequences (also < << <x< <X<). The + -- caller has already bumped the pointer past the initial ? or < and C + -- is set to this initial character (? or <). ------------------------------- -- Set_Msg_Insertion_Warning -- ------------------------------- - procedure Set_Msg_Insertion_Warning is + procedure Set_Msg_Insertion_Warning (C : Character) is begin Warning_Msg_Char := ' '; - if P <= Text'Last and then Text (P) = '?' then + if P <= Text'Last and then Text (P) = C then if Warning_Doc_Switch then Warning_Msg_Char := '?'; end if; @@ -2735,7 +2736,7 @@ package body Errout is and then (Text (P) in 'a' .. 'z' or else Text (P) in 'A' .. 'Z') - and then Text (P + 1) = '?' + and then Text (P + 1) = C then if Warning_Doc_Switch then Warning_Msg_Char := Text (P); @@ -2816,7 +2817,7 @@ package body Errout is null; -- already dealt with when '?' => - Set_Msg_Insertion_Warning; + Set_Msg_Insertion_Warning ('?'); when '<' => @@ -2825,7 +2826,7 @@ package body Errout is -- is False, the call to Set_Msg_Insertion_Warning here does -- no harm, since Warning_Msg_Char is ignored in that case. - Set_Msg_Insertion_Warning; + Set_Msg_Insertion_Warning ('<'); when '|' => null; -- already dealt with @@ -2853,6 +2854,24 @@ package body Errout is Set_Msg_Char (C); end if; + -- '[' (will be/would have been raised at run time) + + when '[' => + if Is_Warning_Msg then + Set_Msg_Str ("will be raised at run time"); + else + Set_Msg_Str ("would have been raised at run time"); + end if; + + -- ']' (may be/might have been raised at run time) + + when ']' => + if Is_Warning_Msg then + Set_Msg_Str ("may be raised at run time"); + else + Set_Msg_Str ("might have been raised at run time"); + end if; + -- Normal character with no special treatment when others => @@ -2960,6 +2979,9 @@ package body Errout is -- Suppress "size too small" errors in CodePeer mode and SPARK mode, -- since pragma Pack is also ignored in these configurations. + -- At least the comment is bogus, since you can have this message + -- with no pragma Pack in sight! ??? + if CodePeer_Mode or GNATprove_Mode then return True; diff --git a/gcc/ada/errout.ads b/gcc/ada/errout.ads index 4ae39044f1c..8e5874b139b 100644 --- a/gcc/ada/errout.ads +++ b/gcc/ada/errout.ads @@ -304,9 +304,9 @@ package Errout is -- Insertion character < (Less Than: conditional warning message) -- The character < appearing anywhere in a message is used for a -- conditional error message. If Error_Msg_Warn is True, then the - -- effect is the same as ? described above, and in particular <? and - -- <X? have the effect of ?? and ?X? respectively. If Error_Msg_Warn - -- is False, then the < <? or <X? sequence is ignored and the message + -- effect is the same as ? described above, and in particular << and + -- <X< have the effect of ?? and ?X? respectively. If Error_Msg_Warn + -- is False, then the < << or <X< sequence is ignored and the message -- is treated as a error rather than a warning. -- Insertion character A-Z (Upper case letter: Ada reserved word) @@ -355,6 +355,31 @@ package Errout is -- inserted to replace the ~ character. The string is inserted in the -- literal form it appears, without any action on special characters. + -- Insertion character [ (Left bracket: will/would be raised at run time) + -- This is used in messages about exceptions being raised at run-time. + -- If the current message is a warning message, then if the code is + -- executed, the exception will be raised, and [ inserts: + -- + -- will be raised at run time + -- + -- If the current message is an error message, then it is an error + -- because the exception would have been raised and [ inserts: + -- + -- would have been raised at run time + -- + -- Typically the message contains a < insertion which means that the + -- message is a warning or error depending on Error_Msg_Warn. This is + -- most typically used in the context of messages which are normally + -- warnings, but are errors in GNATprove mode, corresponding to the + -- permission in the definition of SPARK that allows an implementation + -- to reject a program as illegal if a situation arises in which the + -- compiler can determine that it is certain that a run-time check + -- would have fail if the statement was executed. + + -- Insertion character ] (Right bracket: may/might be raised at run time) + -- This is like [ except that the insertion messages say may/might, + -- instead of will/would. + ---------------------------------------- -- Specialization of Messages for VMS -- ---------------------------------------- diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 16ff6250588..b154a6f6e3f 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -9654,15 +9654,14 @@ package body Exp_Ch4 is procedure Raise_Accessibility_Error is begin + Error_Msg_Warn := not GNATprove_Mode; Rewrite (N, Make_Raise_Program_Error (Sloc (N), Reason => PE_Accessibility_Check_Failed)); Set_Etype (N, Target_Type); - Error_Msg_N - ("??accessibility check failure", N); - Error_Msg_NE - ("\??& will be raised at run time", N, Standard_Program_Error); + Error_Msg_N ("<<accessibility check failure", N); + Error_Msg_NE ("\<<& [", N, Standard_Program_Error); end Raise_Accessibility_Error; ---------------------- diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb index 9739cad5313..591606e6d84 100644 --- a/gcc/ada/exp_ch7.adb +++ b/gcc/ada/exp_ch7.adb @@ -937,6 +937,8 @@ package body Exp_Ch7 is -- Do not create finalization masters in SPARK mode because they result -- in unwanted expansion. + -- More detail would be useful here ??? + elsif GNATprove_Mode then return; end if; diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index 5bac112681e..cc5d3949791 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -2034,7 +2034,7 @@ package body Exp_Util is -- may be constants that depend on the bounds of a string literal, both -- standard string types and more generally arrays of characters. - -- In GNATprove mode, we also need the more precise subtype to be set. + -- In GNATprove mode, we also need the more precise subtype to be set if not (Expander_Active or GNATprove_Mode) and then (No (Etype (Exp)) or else not Is_String_Type (Etype (Exp))) diff --git a/gcc/ada/frontend.adb b/gcc/ada/frontend.adb index 2d5c36f0119..20a92f47980 100644 --- a/gcc/ada/frontend.adb +++ b/gcc/ada/frontend.adb @@ -360,6 +360,8 @@ begin -- Cleanup processing after completing main analysis + -- Comment needed for ASIS mode test and GNATprove mode test??? + if Operating_Mode = Generate_Code or else (Operating_Mode = Check_Semantics and then (ASIS_Mode or GNATprove_Mode)) diff --git a/gcc/ada/gnat1drv.adb b/gcc/ada/gnat1drv.adb index fd5063268c9..0816e896227 100644 --- a/gcc/ada/gnat1drv.adb +++ b/gcc/ada/gnat1drv.adb @@ -341,6 +341,8 @@ procedure Gnat1drv is -- trees between specs compiled as part of a main unit or as part of -- a with-clause. + -- Comment is incomplete, SPARK semantics rely on static mode no??? + Dynamic_Elaboration_Checks := False; -- Set STRICT mode for overflow checks if not set explicitly. This @@ -373,6 +375,8 @@ procedure Gnat1drv is -- Skip call to gigi + -- This debug flag is not documented, AARGH! ??? + Debug_Flag_HH := True; -- Enable assertions, since they give valuable extra information for @@ -1145,11 +1149,11 @@ begin -- since representations are largely symbolic there. if Back_End_Mode = Declarations_Only - and then - (not (Back_Annotate_Rep_Info or Generate_SCIL or GNATprove_Mode) - or else Main_Kind = N_Subunit - or else Targparm.Frontend_Layout_On_Target - or else Targparm.VM_Target /= No_VM) + and then + (not (Back_Annotate_Rep_Info or Generate_SCIL or GNATprove_Mode) + or else Main_Kind = N_Subunit + or else Targparm.Frontend_Layout_On_Target + or else Targparm.VM_Target /= No_VM) then Sem_Ch13.Validate_Unchecked_Conversions; Sem_Ch13.Validate_Address_Clauses; diff --git a/gcc/ada/lib-xref.adb b/gcc/ada/lib-xref.adb index 4cf52c9bd2b..14462ce93eb 100644 --- a/gcc/ada/lib-xref.adb +++ b/gcc/ada/lib-xref.adb @@ -645,8 +645,8 @@ package body Lib.Xref is or else (GNATprove_Mode - and then In_Extended_Main_Code_Unit (N) - and then (Typ = 'm' or else Typ = 'r' or else Typ = 's')) + and then In_Extended_Main_Code_Unit (N) + and then (Typ = 'm' or else Typ = 'r' or else Typ = 's')) then null; else @@ -1015,6 +1015,8 @@ package body Lib.Xref is Actual_Typ := 'P'; end if; + -- Comment needed here for special SPARK code ??? + if GNATprove_Mode then Ref := Sloc (Nod); Def := Sloc (Ent); diff --git a/gcc/ada/restrict.adb b/gcc/ada/restrict.adb index ff2d7eb93a6..e244526389d 100644 --- a/gcc/ada/restrict.adb +++ b/gcc/ada/restrict.adb @@ -538,6 +538,8 @@ package body Restrict is -- set in gnat1drv.adb so that we have consistency between each -- compilation. + -- Just checking, SPARK does not allow restrictions to be set ??? + if CodePeer_Mode or GNATprove_Mode then return; end if; diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb index 8593d025786..7096aae5bed 100644 --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -597,9 +597,9 @@ package body Sem_Aggr is elsif Expr_Value (This_Low) /= Expr_Value (Aggr_Low (Dim)) then Set_Raises_Constraint_Error (N); - Error_Msg_N ("sub-aggregate low bound mismatch??", N); - Error_Msg_N - ("\Constraint_Error will be raised at run time??", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("sub-aggregate low bound mismatch<<", N); + Error_Msg_N ("\Constraint_Error [<<", N); end if; end if; @@ -611,9 +611,9 @@ package body Sem_Aggr is Expr_Value (This_High) /= Expr_Value (Aggr_High (Dim)) then Set_Raises_Constraint_Error (N); - Error_Msg_N ("sub-aggregate high bound mismatch??", N); - Error_Msg_N - ("\Constraint_Error will be raised at run time??", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("sub-aggregate high bound mismatch<<", N); + Error_Msg_N ("\Constraint_Error [<<", N); end if; end if; end if; @@ -1456,8 +1456,9 @@ package body Sem_Aggr is if OK_BH and then OK_AH and then Val_BH < Val_AH then Set_Raises_Constraint_Error (N); - Error_Msg_N ("upper bound out of range??", AH); - Error_Msg_N ("\Constraint_Error will be raised at run time??", AH); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("upper bound out of range<<", AH); + Error_Msg_N ("\Constraint_Error [<<", AH); -- You need to set AH to BH or else in the case of enumerations -- indexes we will not be able to resolve the aggregate bounds. @@ -1499,14 +1500,16 @@ package body Sem_Aggr is if OK_L and then Val_L > Val_AL then Set_Raises_Constraint_Error (N); - Error_Msg_N ("lower bound of aggregate out of range??", N); - Error_Msg_N ("\Constraint_Error will be raised at run time??", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("lower bound of aggregate out of range<<", N); + Error_Msg_N ("\Constraint_Error [<<", N); end if; if OK_H and then Val_H < Val_AH then Set_Raises_Constraint_Error (N); - Error_Msg_N ("upper bound of aggregate out of range??", N); - Error_Msg_N ("\Constraint_Error will be raised at run time??", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("upper bound of aggregate out of range<<", N); + Error_Msg_N ("\Constraint_Error [<<", N); end if; end Check_Bounds; @@ -1545,8 +1548,9 @@ package body Sem_Aggr is if Range_Len < Len then Set_Raises_Constraint_Error (N); - Error_Msg_N ("too many elements??", N); - Error_Msg_N ("\Constraint_Error will be raised at run time??", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("too many elements<<", N); + Error_Msg_N ("\Constraint_Error [<<", N); end if; end Check_Length; diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index 8f1a1eef225..5ff96d7843e 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -5396,10 +5396,10 @@ package body Sem_Attr is Name_Simple_Storage_Pool_Type)) then Error_Msg_Name_1 := Aname; + Error_Msg_Warn := not GNATprove_Mode; Error_Msg_N ("cannot use % attribute for type with simple " - & "storage pool??", N); - Error_Msg_N - ("\Program_Error will be raised at run time??", N); + & "storage pool<<", N); + Error_Msg_N ("\Program_Error [<<", N); Rewrite (N, Make_Raise_Program_Error @@ -9311,10 +9311,10 @@ package body Sem_Attr is -- know will fail, so generate an appropriate warning. if In_Instance_Body then + Error_Msg_Warn := not GNATprove_Mode; Error_Msg_F - ("??non-local pointer cannot point to local object", P); - Error_Msg_F - ("\??Program_Error will be raised at run time", P); + ("non-local pointer cannot point to local object<<", P); + Error_Msg_F ("\Program_Error [<<", P); Rewrite (N, Make_Raise_Program_Error (Loc, Reason => PE_Accessibility_Check_Failed)); @@ -9792,10 +9792,11 @@ package body Sem_Attr is -- know will fail, so generate an appropriate warning. if In_Instance_Body then + Error_Msg_Warn := not GNATprove_Mode; Error_Msg_F - ("??non-local pointer cannot point to local object", P); - Error_Msg_F - ("\??Program_Error will be raised at run time", P); + ("non-local pointer cannot point to local object<<", P); + Error_Msg_F ("\Program_Error [<<", P); + Rewrite (N, Make_Raise_Program_Error (Loc, Reason => PE_Accessibility_Check_Failed)); diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index e0276a6be59..5388f63ca97 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -3722,6 +3722,9 @@ package body Sem_Ch12 is and then not Is_Actual_Pack and then not Inline_Now and then (Operating_Mode = Generate_Code + + -- Need comment for this check ??? + or else (Operating_Mode = Check_Semantics and then (ASIS_Mode or GNATprove_Mode))); diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 67dfd8d924b..9d452b13ea5 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -6047,6 +6047,20 @@ package body Sem_Ch13 is Set_Parent (Exp, N); Preanalyze_Assert_Expression (Exp, Standard_Boolean); + -- In ASIS mode, even if assertions are not enabled, we must + -- analyze the original expression in the aspect specification + -- because it is part of the original tree. + + if ASIS_Mode then + declare + Inv : constant Node_Id := + Expression (Corresponding_Aspect (Ritem)); + begin + Replace_Type_References (Inv, Chars (T)); + Preanalyze_Assert_Expression (Inv, Standard_Boolean); + end; + end if; + -- Build first two arguments for Check pragma Assoc := New_List ( diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 483e2be03bc..68cffb6ba37 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -3797,10 +3797,10 @@ package body Sem_Ch3 is and then Present (Get_Attribute_Definition_Clause (E, Attribute_Address)) then + Error_Msg_Warn := not GNATprove_Mode; Error_Msg_N - ("??more than one task with same entry address", N); - Error_Msg_N - ("\??Program_Error will be raised at run time", N); + ("more than one task with same entry address<<", N); + Error_Msg_N ("\Program_Error [<<", N); Insert_Action (N, Make_Raise_Program_Error (Loc, Reason => PE_Duplicated_Entry_Address)); diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 1a87557ac43..a95aea9e470 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -4627,23 +4627,17 @@ package body Sem_Ch4 is Set_Etype (Sel, Etype (Comp)); Set_Etype (N, Etype (Comp)); - -- Emit appropriate message. Gigi will replace the - -- node subsequently with the appropriate Raise. + -- Emit appropriate message. Gigi will replace the node + -- subsequently with the appropriate Raise. -- In SPARK mode, this is made into an error to simplify -- the processing of the formal verification backend. - if GNATprove_Mode then - Apply_Compile_Time_Constraint_Error - (N, "component not present in }", - CE_Discriminant_Check_Failed, - Ent => Prefix_Type, Rep => False); - else - Apply_Compile_Time_Constraint_Error - (N, "component not present in }??", - CE_Discriminant_Check_Failed, - Ent => Prefix_Type, Rep => False); - end if; + Error_Msg_Warn := not GNATprove_Mode; + Apply_Compile_Time_Constraint_Error + (N, "component not present in }<<", + CE_Discriminant_Check_Failed, + Ent => Prefix_Type, Rep => False); Set_Raises_Constraint_Error (N); return; diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 3105ac141d3..22b661a21ba 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -983,11 +983,9 @@ package body Sem_Ch6 is Reason => PE_Accessibility_Check_Failed)); Analyze (N); - Error_Msg_N - ("cannot return a local value by reference??", N); - Error_Msg_NE - ("\& will be raised at run time??", - N, Standard_Program_Error); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("cannot return a local value by reference<<", N); + Error_Msg_NE ("\& [<<", N, Standard_Program_Error); end if; end if; @@ -7225,21 +7223,12 @@ package body Sem_Ch6 is -- In GNATprove mode, it is an error to have a missing return - if GNATprove_Mode then - Error_Msg_N - ("RETURN statement missing following this statement!", - Last_Stm); - - -- Otherwise normal case of warning (RM insists this is legal) - - else - Error_Msg_N - ("RETURN statement missing following this statement??!", - Last_Stm); - Error_Msg_N - ("\Program_Error may be raised at run time??!", - Last_Stm); - end if; + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N + ("RETURN statement missing following this statement<<!", + Last_Stm); + Error_Msg_N + ("\Program_Error ]<<!", Last_Stm); end if; -- Note: we set Err even though we have not issued a warning @@ -7253,13 +7242,19 @@ package body Sem_Ch6 is else if not Raise_Exception_Call then - Error_Msg_N - ("implied return after this statement " & - "will raise Program_Error??", - Last_Stm); + if GNATprove_Mode then + Error_Msg_N + ("implied return after this statement " + & "would have raised Program_Error", Last_Stm); + else + Error_Msg_N + ("implied return after this statement " + & "will raise Program_Error??", Last_Stm); + end if; + + Error_Msg_Warn := not GNATprove_Mode; Error_Msg_NE - ("\procedure & is marked as No_Return??!", - Last_Stm, Proc); + ("\procedure & is marked as No_Return<<!", Last_Stm, Proc); end if; declare diff --git a/gcc/ada/sem_dim.adb b/gcc/ada/sem_dim.adb index 233e30168a2..4e4f248c9c5 100644 --- a/gcc/ada/sem_dim.adb +++ b/gcc/ada/sem_dim.adb @@ -107,14 +107,14 @@ package body Sem_Dim is type Name_Array is array (Dimension_Position range Low_Position_Bound .. High_Position_Bound) of Name_Id; - -- A data structure used to store the names of all units within a system + -- Store the names of all units within a system No_Names : constant Name_Array := (others => No_Name); type Symbol_Array is array (Dimension_Position range Low_Position_Bound .. High_Position_Bound) of String_Id; - -- A data structure used to store the symbols of all units within a system + -- Store the symbols of all units within a system No_Symbols : constant Symbol_Array := (others => No_String); @@ -291,12 +291,12 @@ package body Sem_Dim is (N : Node_Id; Description_Needed : Boolean := False) return String; -- Given a node N, return the dimension symbols of N, preceded by "has - -- dimension" if Description_Needed. if N is dimensionless, return "[]", or - -- "is dimensionless" if Description_Needed. + -- dimension" if Description_Needed. if N is dimensionless, return "'[']", + -- or "is dimensionless" if Description_Needed. procedure Dim_Warning_For_Numeric_Literal (N : Node_Id; Typ : Entity_Id); - -- Issue a warning on the given numeric literal N to indicate the - -- compilateur made the assumption that the literal is not dimensionless + -- Issue a warning on the given numeric literal N to indicate that the + -- compiler made the assumption that the literal is not dimensionless -- but has the dimension of Typ. procedure Eval_Op_Expon_With_Rational_Exponent @@ -320,7 +320,7 @@ package body Sem_Dim is -- Given a dimension vector and a dimension system, return the proper -- string of dimension symbols. If In_Error_Msg is True (i.e. the String_Id -- will be used to issue an error message) then this routine has a special - -- handling for the insertion character asterisk * which must be precede by + -- handling for the insertion characters * or [ which must be preceded by -- a quote ' to to be placed literally into the message. function From_Dim_To_Str_Of_Unit_Symbols @@ -365,15 +365,14 @@ package body Sem_Dim is function "+" (Right : Whole) return Rational is begin - return Rational'(Numerator => Right, - Denominator => 1); + return Rational'(Numerator => Right, Denominator => 1); end "+"; function "+" (Left, Right : Rational) return Rational is R : constant Rational := - Rational'(Numerator => Left.Numerator * Right.Denominator + - Left.Denominator * Right.Numerator, - Denominator => Left.Denominator * Right.Denominator); + Rational'(Numerator => Left.Numerator * Right.Denominator + + Left.Denominator * Right.Numerator, + Denominator => Left.Denominator * Right.Denominator); begin return Reduce (R); end "+"; @@ -384,14 +383,14 @@ package body Sem_Dim is function "-" (Right : Rational) return Rational is begin - return Rational'(Numerator => -Right.Numerator, + return Rational'(Numerator => -Right.Numerator, Denominator => Right.Denominator); end "-"; function "-" (Left, Right : Rational) return Rational is R : constant Rational := - Rational'(Numerator => Left.Numerator * Right.Denominator - - Left.Denominator * Right.Numerator, + Rational'(Numerator => Left.Numerator * Right.Denominator - + Left.Denominator * Right.Numerator, Denominator => Left.Denominator * Right.Denominator); begin @@ -404,7 +403,7 @@ package body Sem_Dim is function "*" (Left, Right : Rational) return Rational is R : constant Rational := - Rational'(Numerator => Left.Numerator * Right.Numerator, + Rational'(Numerator => Left.Numerator * Right.Numerator, Denominator => Left.Denominator * Right.Denominator); begin return Reduce (R); @@ -423,7 +422,7 @@ package body Sem_Dim is L.Numerator := Whole (-Integer (L.Numerator)); end if; - return Reduce (Rational'(Numerator => L.Numerator * R.Denominator, + return Reduce (Rational'(Numerator => L.Numerator * R.Denominator, Denominator => L.Denominator * R.Numerator)); end "/"; @@ -433,7 +432,7 @@ package body Sem_Dim is function "abs" (Right : Rational) return Rational is begin - return Rational'(Numerator => abs Right.Numerator, + return Rational'(Numerator => abs Right.Numerator, Denominator => Right.Denominator); end "abs"; @@ -493,6 +492,7 @@ package body Sem_Dim is -- Integer case if Is_Integer_Type (Def_Id) then + -- Dimension value must be an integer literal if Nkind (Expr) = N_Integer_Literal then @@ -644,8 +644,8 @@ package body Sem_Dim is N_String_Literal) then Num_Choices := Num_Choices + 1; - Error_Msg_N ("optional component Symbol expected, found&", - Choice); + Error_Msg_N + ("optional component Symbol expected, found&", Choice); end if; end if; end if; @@ -790,7 +790,7 @@ package body Sem_Dim is if Present (First (Expressions (Aggr))) and then (First (Expressions (Aggr)) /= Symbol_Expr - or else Present (Next (Symbol_Expr))) + or else Present (Next (Symbol_Expr))) and then (Num_Choices > 1 or else (Num_Choices = 1 and then not Others_Seen)) then @@ -931,8 +931,7 @@ package body Sem_Dim is Position := Position + 1; if Position > High_Position_Bound then - Error_Msg_N - ("too many dimensions in system", Aggr); + Error_Msg_N ("too many dimensions in system", Aggr); exit; end if; @@ -953,7 +952,7 @@ package body Sem_Dim is and then List_Length (Expressions (Dim_Aggr)) /= 3 then Error_Msg_N - ("three components expected in aggregate", Dim_Aggr); + ("three components expected in aggregate", Dim_Aggr); else -- Named dimension aggregate @@ -1000,7 +999,6 @@ package body Sem_Dim is or else Nkind (Choice) /= N_Identifier then Error_Msg_NE ("wrong syntax for aspect&", Choice, Id); - elsif Chars (Choice) /= Name_Dim_Symbol then Error_Msg_N ("expected Dim_Symbol, found&", Choice); end if; @@ -1083,8 +1081,7 @@ package body Sem_Dim is -- Verify that the string is not empty if String_Length (Dim_Symbols (Position)) = 0 then - Error_Msg_N - ("empty string not allowed here", Dim_Symbol); + Error_Msg_N ("empty string not allowed here", Dim_Symbol); end if; end if; end if; @@ -1242,11 +1239,8 @@ package body Sem_Dim is end if; Error_Msg_N - ("\expected dimension " - & Dimensions_Msg_Of (Comp_Typ) - & ", found " - & Dimensions_Msg_Of (Expr), - Expr); + ("\expected dimension " & Dimensions_Msg_Of (Comp_Typ) + & ", found " & Dimensions_Msg_Of (Expr), Expr); end if; -- Look at the named components right after the positional components @@ -1321,10 +1315,9 @@ package body Sem_Dim is procedure Error_Dim_Msg_For_Binary_Op (N, L, R : Node_Id) is begin - Error_Msg_NE ("both operands for operation& must have same " & - "dimensions", - N, - Entity (N)); + Error_Msg_NE + ("both operands for operation& must have same dimensions", + N, Entity (N)); Error_Msg_N ("\left operand " & Dimensions_Msg_Of (L, True), N); Error_Msg_N ("\right operand " & Dimensions_Msg_Of (R, True), N); end Error_Dim_Msg_For_Binary_Op; @@ -1337,13 +1330,13 @@ package body Sem_Dim is or else N_Kind in N_Op_Compare then declare - L : constant Node_Id := Left_Opnd (N); + L : constant Node_Id := Left_Opnd (N); Dims_Of_L : constant Dimension_Type := Dimensions_Of (L); - L_Has_Dimensions : constant Boolean := Exists (Dims_Of_L); - R : constant Node_Id := Right_Opnd (N); + L_Has_Dimensions : constant Boolean := Exists (Dims_Of_L); + R : constant Node_Id := Right_Opnd (N); Dims_Of_R : constant Dimension_Type := Dimensions_Of (R); - R_Has_Dimensions : constant Boolean := Exists (Dims_Of_R); - Dims_Of_N : Dimension_Type := Null_Dimension; + R_Has_Dimensions : constant Boolean := Exists (Dims_Of_R); + Dims_Of_N : Dimension_Type := Null_Dimension; begin -- N_Op_Add, N_Op_Mod, N_Op_Rem or N_Op_Subtract case @@ -1408,8 +1401,9 @@ package body Sem_Dim is if L_Has_Dimensions then if not Compile_Time_Known_Value (R) then - Error_Msg_N ("exponent of dimensioned operand must be " & - "known at compile time", N); + Error_Msg_N + ("exponent of dimensioned operand must be " + & "known at compile time", N); end if; declare @@ -1584,14 +1578,15 @@ package body Sem_Dim is -- Check if error has already been encountered if not Error_Detected then - Error_Msg_NE ("dimensions mismatch in call of&", - N, Name (N)); + Error_Msg_NE + ("dimensions mismatch in call of&", + N, Name (N)); Error_Detected := True; end if; - Error_Msg_N ("\expected dimension [], found " & - Dimensions_Msg_Of (Actual), - Actual); + Error_Msg_N + ("\expected dimension '['], found " + & Dimensions_Msg_Of (Actual), Actual); end if; Next_Actual (Actual); @@ -1610,7 +1605,6 @@ package body Sem_Dim is Actual := First_Actual (N); Formal := First_Formal (Nam); - while Present (Formal) loop -- A missing corresponding actual indicates that the analysis of @@ -1682,11 +1676,9 @@ package body Sem_Dim is Expr : Node_Id) is begin Error_Msg_N ("dimensions mismatch in component declaration", N); - Error_Msg_N ("\expected dimension " - & Dimensions_Msg_Of (Etyp) - & ", found " - & Dimensions_Msg_Of (Expr), - Expr); + Error_Msg_N + ("\expected dimension " & Dimensions_Msg_Of (Etyp) & ", found " + & Dimensions_Msg_Of (Expr), Expr); end Error_Dim_Msg_For_Component_Declaration; -- Start of processing for Analyze_Dimension_Component_Declaration @@ -1700,6 +1692,7 @@ package body Sem_Dim is -- Check dimensions match if Dims_Of_Etyp /= Dims_Of_Expr then + -- Numeric literal case. Issue a warning if the object type is not -- dimensionless to indicate the literal is treated as if its -- dimension matches the type dimension. @@ -1725,7 +1718,7 @@ package body Sem_Dim is procedure Analyze_Dimension_Extended_Return_Statement (N : Node_Id) is Return_Ent : constant Entity_Id := Return_Statement_Entity (N); Return_Etyp : constant Entity_Id := - Etype (Return_Applies_To (Return_Ent)); + Etype (Return_Applies_To (Return_Ent)); Return_Obj_Decls : constant List_Id := Return_Object_Declarations (N); Return_Obj_Decl : Node_Id; Return_Obj_Id : Entity_Id; @@ -1735,9 +1728,8 @@ package body Sem_Dim is (N : Node_Id; Return_Etyp : Entity_Id; Return_Obj_Typ : Entity_Id); - -- Error using Error_Msg_N at node N. Output the dimensions of the - -- returned type Return_Etyp and the returned object type Return_Obj_Typ - -- of N. + -- Error using Error_Msg_N at node N. Output dimensions of the returned + -- type Return_Etyp and the returned object type Return_Obj_Typ of N. ------------------------------------------------- -- Error_Dim_Msg_For_Extended_Return_Statement -- @@ -1750,11 +1742,9 @@ package body Sem_Dim is is begin Error_Msg_N ("dimensions mismatch in extended return statement", N); - Error_Msg_N ("\expected dimension " - & Dimensions_Msg_Of (Return_Etyp) - & ", found " - & Dimensions_Msg_Of (Return_Obj_Typ), - N); + Error_Msg_N + ("\expected dimension " & Dimensions_Msg_Of (Return_Etyp) + & ", found " & Dimensions_Msg_Of (Return_Obj_Typ), N); end Error_Dim_Msg_For_Extended_Return_Statement; -- Start of processing for Analyze_Dimension_Extended_Return_Statement @@ -1845,11 +1835,8 @@ package body Sem_Dim is end if; Error_Msg_N - ("\expected dimension " - & Dimensions_Msg_Of (Comp_Typ) - & ", found " - & Dimensions_Msg_Of (Expr), - Comp); + ("\expected dimension " & Dimensions_Msg_Of (Comp_Typ) + & ", found " & Dimensions_Msg_Of (Expr), Comp); end if; end if; @@ -1951,7 +1938,6 @@ package body Sem_Dim is declare Expr : Node_Id; Exprs : constant List_Id := Expressions (N); - begin if Present (Exprs) then Expr := First (Exprs); @@ -2003,11 +1989,8 @@ package body Sem_Dim is begin Error_Msg_N ("dimensions mismatch in object declaration", N); Error_Msg_N - ("\expected dimension " - & Dimensions_Msg_Of (Etyp) - & ", found " - & Dimensions_Msg_Of (Expr), - Expr); + ("\expected dimension " & Dimensions_Msg_Of (Etyp) & ", found " + & Dimensions_Msg_Of (Expr), Expr); end Error_Dim_Msg_For_Object_Declaration; -- Start of processing for Analyze_Dimension_Object_Declaration @@ -2078,11 +2061,8 @@ package body Sem_Dim is begin Error_Msg_N ("dimensions mismatch in object renaming declaration", N); Error_Msg_N - ("\expected dimension " - & Dimensions_Msg_Of (Sub_Mark) - & ", found " - & Dimensions_Msg_Of (Renamed_Name), - Renamed_Name); + ("\expected dimension " & Dimensions_Msg_Of (Sub_Mark) & ", found " + & Dimensions_Msg_Of (Renamed_Name), Renamed_Name); end Error_Dim_Msg_For_Object_Renaming_Declaration; -- Start of processing for Analyze_Dimension_Object_Renaming_Declaration @@ -2126,11 +2106,8 @@ package body Sem_Dim is begin Error_Msg_N ("dimensions mismatch in return statement", N); Error_Msg_N - ("\expected dimension " - & Dimensions_Msg_Of (Return_Etyp) - & ", found " - & Dimensions_Msg_Of (Expr), - Expr); + ("\expected dimension " & Dimensions_Msg_Of (Return_Etyp) + & ", found " & Dimensions_Msg_Of (Expr), Expr); end Error_Dim_Msg_For_Simple_Return_Statement; -- Start of processing for Analyze_Dimension_Simple_Return_Statement @@ -2167,7 +2144,6 @@ package body Sem_Dim is if Exists (Dims_Of_Id) then Error_Msg_N ("subtype& already" & Dimensions_Msg_Of (Id, True), N); - else Set_Dimensions (Id, Dims_Of_Etyp); Set_Symbol (Id, Symbol_Of (Etyp)); @@ -2195,12 +2171,12 @@ package body Sem_Dim is begin case Nkind (N) is when N_Op_Plus | N_Op_Minus | N_Op_Abs => + + -- Propagate the dimension if the operand is not dimensionless + declare R : constant Node_Id := Right_Opnd (N); - begin - -- Propagate the dimension if the operand is not dimensionless - Move_Dimensions (R, N); end; @@ -2298,10 +2274,11 @@ package body Sem_Dim is Right_Rat : Rational; begin - -- Both left and right operands are an integer literal + -- Both left and right operands are integer literals if Nkind (Left) = N_Integer_Literal - and then Nkind (Right) = N_Integer_Literal + and then + Nkind (Right) = N_Integer_Literal then Left_Rat := Process_Literal (Left); Right_Rat := Process_Literal (Right); @@ -2407,10 +2384,10 @@ package body Sem_Dim is elsif Description_Needed then Add_Str_To_Name_Buffer ("is dimensionless"); - -- Otherwise, return "[]" + -- Otherwise, return "'[']" else - Add_Str_To_Name_Buffer ("[]"); + Add_Str_To_Name_Buffer ("'[']"); end if; Dimensions_Msg := Name_Find; @@ -2441,12 +2418,12 @@ package body Sem_Dim is Add_String_To_Name_Buffer (String_From_Numeric_Literal (N)); -- Insert a blank between the literal and the symbol - Add_Str_To_Name_Buffer (" "); + Add_Str_To_Name_Buffer (" "); Add_String_To_Name_Buffer (Symbol_Of (Typ)); Error_Msg_Name_1 := Name_Find; - Error_Msg_N ("??assumed to be%%", N); + Error_Msg_N ("assumed to be%%??", N); end Dim_Warning_For_Numeric_Literal; ---------------------------------------- @@ -2492,11 +2469,11 @@ package body Sem_Dim is (N : Node_Id; Exponent_Value : Rational) is + Loc : constant Source_Ptr := Sloc (N); Dims_Of_N : constant Dimension_Type := Dimensions_Of (N); - L : constant Node_Id := Left_Opnd (N); - Etyp_Of_L : constant Entity_Id := Etype (L); - Btyp_Of_L : constant Entity_Id := Base_Type (Etyp_Of_L); - Loc : constant Source_Ptr := Sloc (N); + L : constant Node_Id := Left_Opnd (N); + Etyp_Of_L : constant Entity_Id := Etype (L); + Btyp_Of_L : constant Entity_Id := Base_Type (Etyp_Of_L); Actual_1 : Node_Id; Actual_2 : Node_Id; Dim_Power : Rational; @@ -2544,18 +2521,16 @@ package body Sem_Dim is -- Step 1: Generate the new aggregate for the aspect Dimension New_Aspects := Empty_List; - List_Of_Dims := New_List; + List_Of_Dims := New_List; for Position in Dims_Of_N'First .. System.Count loop Dim_Power := Dims_Of_N (Position); Append_To (List_Of_Dims, Make_Op_Divide (Loc, Left_Opnd => - Make_Integer_Literal (Loc, - Int (Dim_Power.Numerator)), + Make_Integer_Literal (Loc, Int (Dim_Power.Numerator)), Right_Opnd => - Make_Integer_Literal (Loc, - Int (Dim_Power.Denominator)))); + Make_Integer_Literal (Loc, Int (Dim_Power.Denominator)))); end loop; -- Step 2: Create the new Aspect Specification for Aspect Dimension @@ -2625,7 +2600,7 @@ package body Sem_Dim is New_N := Make_Type_Conversion (Loc, Subtype_Mark => New_Reference_To (New_Id, Loc), - Expression => + Expression => Make_Function_Call (Loc, Name => New_Reference_To (RTE (RE_Expon_LLF), Loc), Parameter_Associations => New_List ( @@ -2749,10 +2724,9 @@ package body Sem_Dim is Actual_Str : Node_Id; begin - Actual := First (Actuals); - -- Look for a symbols parameter association in the list of actuals + Actual := First (Actuals); while Present (Actual) loop -- Positional parameter association case when the actual is a @@ -3034,7 +3008,11 @@ package body Sem_Dim is -- Store the dimension symbols inside boxes - Store_String_Char ('['); + if In_Error_Msg then + Store_String_Chars ("'["); + else + Store_String_Char ('['); + end if; for Position in Dimension_Type'Range loop Dim_Power := Dims (Position); @@ -3051,6 +3029,7 @@ package body Sem_Dim is -- Positive dimension case if Dim_Power.Numerator > 0 then + -- Integer case if Dim_Power.Denominator = 1 then @@ -3094,7 +3073,12 @@ package body Sem_Dim is end if; end loop; - Store_String_Char (']'); + if In_Error_Msg then + Store_String_Chars ("']"); + else + Store_String_Char (']'); + end if; + return End_String; end From_Dim_To_Str_Of_Dim_Symbols; @@ -3128,7 +3112,6 @@ package body Sem_Dim is Dim_Power := Dims (Position); if Dim_Power /= Zero then - if First_Dim then First_Dim := False; else @@ -3289,7 +3272,7 @@ package body Sem_Dim is declare G : constant Int := GCD (X.Numerator, X.Denominator); begin - return Rational'(Numerator => Whole (Int (X.Numerator) / G), + return Rational'(Numerator => Whole (Int (X.Numerator) / G), Denominator => Whole (Int (X.Denominator) / G)); end; end Reduce; @@ -3369,8 +3352,9 @@ package body Sem_Dim is Sbuffer : constant Source_Buffer_Ptr := Source_Text (Get_Source_File_Index (Loc)); Src_Ptr : Source_Ptr := Loc; - C : Character := Sbuffer (Src_Ptr); - -- Current source program character + + C : Character := Sbuffer (Src_Ptr); + -- Current source program character function Belong_To_Numeric_Literal (C : Character) return Boolean; -- Return True if C belongs to a numeric literal diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb index 6d941025c0d..0c789c20211 100644 --- a/gcc/ada/sem_elab.adb +++ b/gcc/ada/sem_elab.adb @@ -1138,13 +1138,14 @@ package body Sem_Elab is -- Here we definitely have a bad instantiation - Error_Msg_NE ("??cannot instantiate& before body seen", N, Ent); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_NE ("cannot instantiate& before body seen<<", N, Ent); if Present (Instance_Spec (N)) then Supply_Bodies (Instance_Spec (N)); end if; - Error_Msg_N ("\??Program_Error will be raised at run time", N); + Error_Msg_N ("\Program_Error [<<", N); Insert_Elab_Check (N); Set_ABE_Is_Certain (N); end Check_Bad_Instantiation; @@ -2178,14 +2179,17 @@ package body Sem_Elab is -- level, and the ABE is bound to occur. if Elab_Call.Last = 0 then + Error_Msg_Warn := not GNATprove_Mode; + if Inst_Case then Error_Msg_NE - ("??cannot instantiate& before body seen", N, Orig_Ent); + ("cannot instantiate& before body seen<<", N, Orig_Ent); else - Error_Msg_NE ("??cannot call& before body seen", N, Orig_Ent); + Error_Msg_NE + ("cannot call& before body seen<<", N, Orig_Ent); end if; - Error_Msg_N ("\??Program_Error will be raised at run time", N); + Error_Msg_N ("\Program_Error [<<", N); Insert_Elab_Check (N); -- Call is not at outer level @@ -2259,17 +2263,19 @@ package body Sem_Elab is and then (Nkind (Original_Node (N)) /= N_Function_Call or else not In_Assertion_Expression (Original_Node (N))) then + Error_Msg_Warn := not GNATprove_Mode; + if Inst_Case then Error_Msg_NE - ("instantiation of& may occur before body is seen??", + ("instantiation of& may occur before body is seen<<", N, Orig_Ent); else Error_Msg_NE - ("call to& may occur before body is seen??", N, Orig_Ent); + ("call to& may occur before body is seen<<", N, Orig_Ent); end if; Error_Msg_N - ("\Program_Error may be raised at run time??", N); + ("\Program_Error ]<<", N); Output_Calls (N); end if; @@ -2364,11 +2370,11 @@ package body Sem_Elab is or else Scope (Proc) = Scope (Defining_Identifier (Decl))) then + Error_Msg_Warn := not GNATprove_Mode; Error_Msg_N - ("task will be activated before elaboration of its body??", + ("task will be activated before elaboration of its body<<", Decl); - Error_Msg_N - ("\Program_Error will be raised at run time??", Decl); + Error_Msg_N ("\Program_Error [<<", Decl); elsif Present (Corresponding_Body (Unit_Declaration_Node (Proc))) diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb index 99b6e775218..5ee8ecc0cc6 100644 --- a/gcc/ada/sem_eval.adb +++ b/gcc/ada/sem_eval.adb @@ -369,7 +369,7 @@ package body Sem_Eval is Intval (N) > Expr_Value (Type_High_Bound (Universal_Integer))) then Apply_Compile_Time_Constraint_Error - (N, "non-static universal integer value out of range??", + (N, "non-static universal integer value out of range<<", CE_Range_Check_Failed); -- Check out of range of base type @@ -390,7 +390,7 @@ package body Sem_Eval is elsif Is_Out_Of_Range (N, T, Assume_Valid => True) then Apply_Compile_Time_Constraint_Error - (N, "value not in range of}??", CE_Range_Check_Failed); + (N, "value not in range of}<<", CE_Range_Check_Failed); elsif Checks_On then Enable_Range_Check (N); @@ -5225,6 +5225,8 @@ package body Sem_Eval is Stat := False; Fold := False; + -- Inhibit folding if -gnatd.f flag set + if Debug_Flag_Dot_F and then In_Extended_Main_Source_Unit (N) then return; end if; diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index e9d62a48188..1b003772578 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -769,8 +769,9 @@ package body Sem_Res is and then Nkind (Parent (P)) = N_Subprogram_Body and then Is_Empty_List (Declarations (Parent (P))) then - Error_Msg_N ("!??infinite recursion", N); - Error_Msg_N ("\!??Storage_Error will be raised at run time", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("!infinite recursion<<", N); + Error_Msg_N ("\!Storage_Error [<<", N); Insert_Action (N, Make_Raise_Storage_Error (Sloc (N), Reason => SE_Infinite_Recursion)); @@ -867,8 +868,9 @@ package body Sem_Res is end if; end loop; - Error_Msg_N ("!??possible infinite recursion", N); - Error_Msg_N ("\!??Storage_Error may be raised at run time", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("!possible infinite recursion<<", N); + Error_Msg_N ("\!??Storage_Error ]<<", N); return True; end Check_Infinite_Recursion; @@ -4553,11 +4555,11 @@ package body Sem_Res is Deepest_Type_Access_Level (Typ) then if In_Instance_Body then + Error_Msg_Warn := not GNATprove_Mode; Error_Msg_N - ("??type in allocator has deeper level than " - & "designated class-wide type", E); - Error_Msg_N - ("\??Program_Error will be raised at run time", E); + ("type in allocator has deeper level than " + & "designated class-wide type<<", E); + Error_Msg_N ("\Program_Error [<<", E); Rewrite (N, Make_Raise_Program_Error (Sloc (N), Reason => PE_Accessibility_Check_Failed)); @@ -4664,8 +4666,9 @@ package body Sem_Res is and then Ekind (Current_Scope) = E_Package and then not In_Package_Body (Current_Scope) then - Error_Msg_N ("??cannot activate task before body seen", N); - Error_Msg_N ("\??Program_Error will be raised at run time", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("cannot activate task before body seen<<", N); + Error_Msg_N ("\Program_Error [<<", N); end if; -- Ada 2012 (AI05-0111-3): Detect an attempt to allocate a task or a @@ -4677,8 +4680,9 @@ package body Sem_Res is and then Present (Subpool_Handle_Name (N)) and then Has_Task (Desig_T) then - Error_Msg_N ("??cannot allocate task on subpool", N); - Error_Msg_N ("\??Program_Error will be raised at run time", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("cannot allocate task on subpool<<", N); + Error_Msg_N ("\Program_Error [<<", N); Rewrite (N, Make_Raise_Program_Error (Sloc (N), @@ -5392,11 +5396,11 @@ package body Sem_Res is and then Is_Entry_Barrier_Function (P)) then Rtype := Etype (N); + Error_Msg_Warn := not GNATprove_Mode; Error_Msg_NE - ("??& should not be used in entry body (RM C.7(17))", + ("& should not be used in entry body (RM C.7(17))<<", N, Nam); - Error_Msg_NE - ("\Program_Error will be raised at run time??", N, Nam); + Error_Msg_NE ("\Program_Error [<<", N, Nam); Rewrite (N, Make_Raise_Program_Error (Loc, Reason => PE_Current_Task_In_Entry_Body)); @@ -5693,10 +5697,9 @@ package body Sem_Res is -- Here warning is to be issued Set_Has_Recursive_Call (Nam); - Error_Msg_N - ("??possible infinite recursion!", N); - Error_Msg_N - ("\??Storage_Error may be raised at run time!", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("possible infinite recursion<<!", N); + Error_Msg_N ("\Storage_Error ]<<!", N); end if; exit Scope_Loop; @@ -6008,8 +6011,9 @@ package body Sem_Res is end loop; if not Call_OK then - Error_Msg_N ("!?? cannot determine tag of result", N); - Error_Msg_N ("!?? Program_Error will be raised", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_N ("!cannot determine tag of result<<", N); + Error_Msg_N ("\Program_Error [<<!", N); Insert_Action (N, Make_Raise_Program_Error (Sloc (N), Reason => PE_Explicit_Raise)); @@ -10873,12 +10877,11 @@ package body Sem_Res is Deepest_Type_Access_Level (Opnd_Type) then if In_Instance_Body then + Error_Msg_Warn := not GNATprove_Mode; Conversion_Error_N - ("??source array type has deeper accessibility " - & "level than target", Operand); - Conversion_Error_N - ("\??Program_Error will be raised at run time", - Operand); + ("source array type has deeper accessibility " + & "level than target<<", Operand); + Conversion_Error_N ("\Program_Error [<<", Operand); Rewrite (N, Make_Raise_Program_Error (Sloc (N), Reason => PE_Accessibility_Check_Failed)); @@ -11183,11 +11186,11 @@ package body Sem_Res is -- will be generated by Expand_N_Type_Conversion. if In_Instance_Body then + Error_Msg_Warn := not GNATprove_Mode; Conversion_Error_N - ("??cannot convert local pointer to non-local access type", + ("cannot convert local pointer to non-local access type<<", Operand); - Conversion_Error_N - ("\??Program_Error will be raised at run time", Operand); + Conversion_Error_N ("\Program_Error [<<", Operand); else Conversion_Error_N @@ -11216,12 +11219,14 @@ package body Sem_Res is -- will be generated by Expand_N_Type_Conversion. if In_Instance_Body then + Error_Msg_Warn := not GNATprove_Mode; Conversion_Error_N - ("??cannot convert access discriminant to non-local " - & "access type", Operand); - Conversion_Error_N - ("\??Program_Error will be raised at run time", - Operand); + ("cannot convert access discriminant to non-local " + & "access type<<", Operand); + Conversion_Error_N ("\Program_Error [<<", Operand); + + -- Real error if not in instance body + else Conversion_Error_N ("cannot convert access discriminant to non-local " @@ -11361,11 +11366,13 @@ package body Sem_Res is -- will be generated by Expand_N_Type_Conversion. if In_Instance_Body then + Error_Msg_Warn := not GNATprove_Mode; Conversion_Error_N - ("??cannot convert local pointer to non-local access type", + ("cannot convert local pointer to non-local access type<<", Operand); - Conversion_Error_N - ("\??Program_Error will be raised at run time", Operand); + Conversion_Error_N ("\Program_Error [<<", Operand); + + -- If not in an instance body, this is a real error else -- Avoid generation of spurious error message @@ -11399,12 +11406,13 @@ package body Sem_Res is -- will be generated by Expand_N_Type_Conversion. if In_Instance_Body then + Error_Msg_Warn := not GNATprove_Mode; Conversion_Error_N - ("??cannot convert access discriminant to non-local " - & "access type", Operand); - Conversion_Error_N - ("\??Program_Error will be raised at run time", - Operand); + ("cannot convert access discriminant to non-local " + & "access type<<", Operand); + Conversion_Error_N ("\Program_Error [<<", Operand); + + -- If not in an instance body, this is a real error else Conversion_Error_N diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 7664e60659d..cce45be570a 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -578,8 +578,9 @@ package body Sem_Util is begin if Has_Predicates (Typ) then if Is_Generic_Actual_Type (Typ) then - Error_Msg_FE (Msg & "??", N, Typ); - Error_Msg_F ("\Program_Error will be raised at run time??", N); + Error_Msg_Warn := not GNATprove_Mode; + Error_Msg_FE (Msg & "<<", N, Typ); + Error_Msg_F ("\Program_Error [<<", N); Insert_Action (N, Make_Raise_Program_Error (Sloc (N), Reason => PE_Bad_Predicated_Generic_Type)); @@ -3257,7 +3258,7 @@ package body Sem_Util is Warn : Boolean := False) return Node_Id is Msgc : String (1 .. Msg'Length + 3); - -- Copy of message, with room for possible ?? and ! at end + -- Copy of message, with room for possible ?? or << and ! at end Msgl : Natural; Wmsg : Boolean; @@ -3267,6 +3268,12 @@ package body Sem_Util is Eloc : Source_Ptr; begin + -- If this is a warning, convert it into an error if we are operating + -- in GNATprove mode, because in SPARK, we are allowed to consider + -- such warnings as illegalities, and we choose to do so! + + Error_Msg_Warn := not GNATprove_Mode; + -- A static constraint error in an instance body is not a fatal error. -- we choose to inhibit the message altogether, because there is no -- obvious node (for now) on which to post it. On the other hand the @@ -3281,12 +3288,22 @@ package body Sem_Util is Eloc := Sloc (N); end if; - Msgc (1 .. Msg'Length) := Msg; + -- Copy message to Msgc, converting any ? in the message into + -- < instead, so that we have an error in GNATprove mode. + Msgl := Msg'Length; + for J in 1 .. Msgl loop + if Msg (J) = '?' and then (J = 1 or else Msg (J) /= ''') then + Msgc (J) := '<'; + else + Msgc (J) := Msg (J); + end if; + end loop; + -- Message is a warning, even in Ada 95 case - if Msg (Msg'Last) = '?' then + if Msg (Msg'Last) = '?' or else Msg (Msg'Last) = '<' then Wmsg := True; -- In Ada 83, all messages are warnings. In the private part and @@ -3297,16 +3314,16 @@ package body Sem_Util is or else (Ada_Version = Ada_83 and then Comes_From_Source (N)) then Msgl := Msgl + 1; - Msgc (Msgl) := '?'; + Msgc (Msgl) := '<'; Msgl := Msgl + 1; - Msgc (Msgl) := '?'; + Msgc (Msgl) := '<'; Wmsg := True; elsif In_Instance_Not_Visible then Msgl := Msgl + 1; - Msgc (Msgl) := '?'; + Msgc (Msgl) := '<'; Msgl := Msgl + 1; - Msgc (Msgl) := '?'; + Msgc (Msgl) := '<'; Wmsg := True; -- Otherwise we have a real error message (Ada 95 static case) @@ -3397,6 +3414,8 @@ package body Sem_Util is end loop; if Msgs then + Error_Msg_Warn := not GNATprove_Mode; + if Present (Ent) then Error_Msg_NEL (Msgc (1 .. Msgl), N, Ent, Eloc); else @@ -3424,25 +3443,27 @@ package body Sem_Util is and then not Comes_From_Source (Conc_Typ) then Error_Msg_NEL - ("\??& will be raised at run time", - N, Standard_Constraint_Error, Eloc); + ("\& [<<", N, Standard_Constraint_Error, Eloc); else - Error_Msg_NEL - ("\??& will be raised for objects of this type", - N, Standard_Constraint_Error, Eloc); + if GNATprove_Mode then + Error_Msg_NEL + ("\& would have been raised for objects of this " + & "type", N, Standard_Constraint_Error, Eloc); + else + Error_Msg_NEL + ("\& will be raised for objects of this type??", + N, Standard_Constraint_Error, Eloc); + end if; end if; end; else - Error_Msg_NEL - ("\??& will be raised at run time", - N, Standard_Constraint_Error, Eloc); + Error_Msg_NEL ("\& [<<", N, Standard_Constraint_Error, Eloc); end if; else - Error_Msg - ("\static expression fails Constraint_Check", Eloc); + Error_Msg ("\static expression fails Constraint_Check", Eloc); Set_Error_Posted (N); end if; end if; |