[multiple changes]
2010-06-18 Thomas Quinot <quinot@adacore.com> * sem_eval.adb (Test_In_Range): New subprogram, factoring duplicated code between... (Is_In_Range, Is_Out_Of_Range): Reimplement in terms of call to Test_In_Range. 2010-06-18 Robert Dewar <dewar@adacore.com> * sprint.adb: Minor change in output format for expression wi actions. * par-ch3.adb: Minor code reorganization. Minor reformatting. * sem_ch5.adb: Minor comment fix. 2010-06-18 Robert Dewar <dewar@adacore.com> * debug.adb: New debug flag -gnatd.L to control Back_End_Handles_Limited_Types. * exp_ch4.adb (Expand_N_Conditional_Expression): Let back end handle limited case if Back_End_Handles_Limited_Types is True. (Expand_N_Conditional_Expression): Use N_Expression_With_Actions to simplify expansion if Use_Expression_With_Actions is True. * gnat1drv.adb (Adjust_Global_Switches): Set Back_End_Handles_Limited_Types. * opt.ads (Back_End_Handles_Limited_Types): New flag. 2010-06-18 Ed Schonberg <schonberg@adacore.com> * sem_res.adb (Rewrite_Operator_As_Call): Do not rewrite user-defined intrinsic operator if expansion is not enabled, because in an instantiation the original operator must be present to verify the legality of the operation. From-SVN: r160969
This commit is contained in:
parent
e1be7706e0
commit
305caf424d
@ -1,3 +1,35 @@
|
||||
2010-06-18 Thomas Quinot <quinot@adacore.com>
|
||||
|
||||
* sem_eval.adb (Test_In_Range): New subprogram, factoring duplicated
|
||||
code between...
|
||||
(Is_In_Range, Is_Out_Of_Range): Reimplement in terms of call to
|
||||
Test_In_Range.
|
||||
|
||||
2010-06-18 Robert Dewar <dewar@adacore.com>
|
||||
|
||||
* sprint.adb: Minor change in output format for expression wi actions.
|
||||
* par-ch3.adb: Minor code reorganization. Minor reformatting.
|
||||
* sem_ch5.adb: Minor comment fix.
|
||||
|
||||
2010-06-18 Robert Dewar <dewar@adacore.com>
|
||||
|
||||
* debug.adb: New debug flag -gnatd.L to control
|
||||
Back_End_Handles_Limited_Types.
|
||||
* exp_ch4.adb (Expand_N_Conditional_Expression): Let back end handle
|
||||
limited case if Back_End_Handles_Limited_Types is True.
|
||||
(Expand_N_Conditional_Expression): Use N_Expression_With_Actions to
|
||||
simplify expansion if Use_Expression_With_Actions is True.
|
||||
* gnat1drv.adb (Adjust_Global_Switches): Set
|
||||
Back_End_Handles_Limited_Types.
|
||||
* opt.ads (Back_End_Handles_Limited_Types): New flag.
|
||||
|
||||
2010-06-18 Ed Schonberg <schonberg@adacore.com>
|
||||
|
||||
* sem_res.adb (Rewrite_Operator_As_Call): Do not rewrite user-defined
|
||||
intrinsic operator if expansion is not enabled, because in an
|
||||
instantiation the original operator must be present to verify the
|
||||
legality of the operation.
|
||||
|
||||
2010-06-18 Robert Dewar <dewar@adacore.com>
|
||||
|
||||
* exp_disp.adb, sem_ch12.adb: Minor reformatting
|
||||
|
@ -76,7 +76,7 @@ package body Debug is
|
||||
-- dJ Output debugging trace info for JGNAT (Java VM version of GNAT)
|
||||
-- dK Kill all error messages
|
||||
-- dL Output trace information on elaboration checking
|
||||
-- dM Asssume all variables are modified (no current values)
|
||||
-- dM Assume all variables are modified (no current values)
|
||||
-- dN No file name information in exception messages
|
||||
-- dO Output immediate error messages
|
||||
-- dP Do not check for controlled objects in preelaborable packages
|
||||
@ -129,7 +129,7 @@ package body Debug is
|
||||
-- d.I SCIL generation mode
|
||||
-- d.J Parallel SCIL generation mode
|
||||
-- d.K
|
||||
-- d.L
|
||||
-- d.L Depend on back end for limited types in conditional expressions
|
||||
-- d.M
|
||||
-- d.N
|
||||
-- d.O Dump internal SCO tables
|
||||
@ -567,6 +567,11 @@ package body Debug is
|
||||
-- This means in particular not writing the same files under the
|
||||
-- same directory.
|
||||
|
||||
-- d.L Normally the front end generates special expansion for conditional
|
||||
-- expressions of a limited type. This debug flag removes this special
|
||||
-- case expansion, leaving it up to the back end to handle conditional
|
||||
-- expressions correctly.
|
||||
|
||||
-- d.O Dump internal SCO tables. Before outputting the SCO information to
|
||||
-- the ALI file, the internal SCO tables (SCO_Table/SCO_Unit_Table)
|
||||
-- are dumped for debugging purposes.
|
||||
|
@ -3882,7 +3882,7 @@ package body Exp_Ch4 is
|
||||
-- Expand_N_Conditional_Expression --
|
||||
-------------------------------------
|
||||
|
||||
-- Expand into expression actions if then/else actions present
|
||||
-- Deal with limited types and expression actions
|
||||
|
||||
procedure Expand_N_Conditional_Expression (N : Node_Id) is
|
||||
Loc : constant Source_Ptr := Sloc (N);
|
||||
@ -3898,26 +3898,11 @@ package body Exp_Ch4 is
|
||||
P_Decl : Node_Id;
|
||||
|
||||
begin
|
||||
-- If either then or else actions are present, then given:
|
||||
-- If the type is limited or unconstrained, we expand as follows to
|
||||
-- avoid any possibility of improper copies.
|
||||
|
||||
-- if cond then then-expr else else-expr end
|
||||
|
||||
-- we insert the following sequence of actions (using Insert_Actions):
|
||||
|
||||
-- Cnn : typ;
|
||||
-- if cond then
|
||||
-- <<then actions>>
|
||||
-- Cnn := then-expr;
|
||||
-- else
|
||||
-- <<else actions>>
|
||||
-- Cnn := else-expr
|
||||
-- end if;
|
||||
|
||||
-- and replace the conditional expression by a reference to Cnn
|
||||
|
||||
-- If the type is limited or unconstrained, the above expansion is
|
||||
-- not legal, because it involves either an uninitialized object
|
||||
-- or an illegal assignment. Instead, we generate:
|
||||
-- Note: it may be possible to avoid this special processing if the
|
||||
-- back end uses its own mechanisms for handling by-reference types ???
|
||||
|
||||
-- type Ptr is access all Typ;
|
||||
-- Cnn : Ptr;
|
||||
@ -3931,7 +3916,12 @@ package body Exp_Ch4 is
|
||||
|
||||
-- and replace the conditional expresion by a reference to Cnn.all.
|
||||
|
||||
if Is_By_Reference_Type (Typ) then
|
||||
-- This special case can be skipped if the back end handles limited
|
||||
-- types properly and ensures that no incorrect copies are made.
|
||||
|
||||
if Is_By_Reference_Type (Typ)
|
||||
and then not Back_End_Handles_Limited_Types
|
||||
then
|
||||
Cnn := Make_Temporary (Loc, 'C', N);
|
||||
|
||||
P_Decl :=
|
||||
@ -3979,40 +3969,82 @@ package body Exp_Ch4 is
|
||||
-- associated with either branch.
|
||||
|
||||
elsif Present (Then_Actions (N)) or else Present (Else_Actions (N)) then
|
||||
Cnn := Make_Temporary (Loc, 'C', N);
|
||||
|
||||
Decl :=
|
||||
Make_Object_Declaration (Loc,
|
||||
Defining_Identifier => Cnn,
|
||||
Object_Definition => New_Occurrence_Of (Typ, Loc));
|
||||
-- We have two approaches to handling this. If we are allowed to use
|
||||
-- N_Expression_With_Actions, then we can just wrap the actions into
|
||||
-- the appropriate expression.
|
||||
|
||||
New_If :=
|
||||
Make_Implicit_If_Statement (N,
|
||||
Condition => Relocate_Node (Cond),
|
||||
if Use_Expression_With_Actions then
|
||||
if Present (Then_Actions (N)) then
|
||||
Rewrite (Thenx,
|
||||
Make_Expression_With_Actions (Sloc (Thenx),
|
||||
Actions => Then_Actions (N),
|
||||
Expression => Relocate_Node (Thenx)));
|
||||
Analyze_And_Resolve (Thenx, Typ);
|
||||
end if;
|
||||
|
||||
Then_Statements => New_List (
|
||||
Make_Assignment_Statement (Sloc (Thenx),
|
||||
Name => New_Occurrence_Of (Cnn, Sloc (Thenx)),
|
||||
Expression => Relocate_Node (Thenx))),
|
||||
if Present (Else_Actions (N)) then
|
||||
Rewrite (Elsex,
|
||||
Make_Expression_With_Actions (Sloc (Elsex),
|
||||
Actions => Else_Actions (N),
|
||||
Expression => Relocate_Node (Elsex)));
|
||||
Analyze_And_Resolve (Elsex, Typ);
|
||||
end if;
|
||||
|
||||
Else_Statements => New_List (
|
||||
Make_Assignment_Statement (Sloc (Elsex),
|
||||
Name => New_Occurrence_Of (Cnn, Sloc (Elsex)),
|
||||
Expression => Relocate_Node (Elsex))));
|
||||
return;
|
||||
|
||||
Set_Assignment_OK (Name (First (Then_Statements (New_If))));
|
||||
Set_Assignment_OK (Name (First (Else_Statements (New_If))));
|
||||
-- if we can't use N_Expression_With_Actions nodes, then we insert
|
||||
-- the following sequence of actions (using Insert_Actions):
|
||||
|
||||
New_N := New_Occurrence_Of (Cnn, Loc);
|
||||
-- Cnn : typ;
|
||||
-- if cond then
|
||||
-- <<then actions>>
|
||||
-- Cnn := then-expr;
|
||||
-- else
|
||||
-- <<else actions>>
|
||||
-- Cnn := else-expr
|
||||
-- end if;
|
||||
|
||||
-- and replace the conditional expression by a reference to Cnn
|
||||
|
||||
else
|
||||
Cnn := Make_Temporary (Loc, 'C', N);
|
||||
|
||||
Decl :=
|
||||
Make_Object_Declaration (Loc,
|
||||
Defining_Identifier => Cnn,
|
||||
Object_Definition => New_Occurrence_Of (Typ, Loc));
|
||||
|
||||
New_If :=
|
||||
Make_Implicit_If_Statement (N,
|
||||
Condition => Relocate_Node (Cond),
|
||||
|
||||
Then_Statements => New_List (
|
||||
Make_Assignment_Statement (Sloc (Thenx),
|
||||
Name => New_Occurrence_Of (Cnn, Sloc (Thenx)),
|
||||
Expression => Relocate_Node (Thenx))),
|
||||
|
||||
Else_Statements => New_List (
|
||||
Make_Assignment_Statement (Sloc (Elsex),
|
||||
Name => New_Occurrence_Of (Cnn, Sloc (Elsex)),
|
||||
Expression => Relocate_Node (Elsex))));
|
||||
|
||||
Set_Assignment_OK (Name (First (Then_Statements (New_If))));
|
||||
Set_Assignment_OK (Name (First (Else_Statements (New_If))));
|
||||
|
||||
New_N := New_Occurrence_Of (Cnn, Loc);
|
||||
end if;
|
||||
|
||||
-- If no actions then no expansion needed, gigi will handle it using
|
||||
-- the same approach as a C conditional expression.
|
||||
|
||||
else
|
||||
-- No expansion needed, gigi handles it like a C conditional
|
||||
-- expression.
|
||||
|
||||
return;
|
||||
end if;
|
||||
|
||||
-- Move the SLOC of the parent If statement to the newly created one and
|
||||
-- Fall through here for either the limited expansion, or the case of
|
||||
-- inserting actions for non-limited types. In both these cases, we must
|
||||
-- move the SLOC of the parent If statement to the newly created one and
|
||||
-- change it to the SLOC of the expression which, after expansion, will
|
||||
-- correspond to what is being evaluated.
|
||||
|
||||
@ -4143,7 +4175,8 @@ package body Exp_Ch4 is
|
||||
Analyze_And_Resolve (N, Rtyp);
|
||||
|
||||
Error_Msg_N ("?explicit membership test may be optimized away", N);
|
||||
Error_Msg_N ("\?use ''Valid attribute instead", N);
|
||||
Error_Msg_N -- CODEFIX
|
||||
("\?use ''Valid attribute instead", N);
|
||||
return;
|
||||
end Substitute_Valid_Check;
|
||||
|
||||
@ -4267,8 +4300,10 @@ package body Exp_Ch4 is
|
||||
|
||||
if Lcheck = LT or else Ucheck = GT then
|
||||
if Warn1 then
|
||||
Error_Msg_N ("?range test optimized away", N);
|
||||
Error_Msg_N ("\?value is known to be out of range", N);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?range test optimized away", N);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\?value is known to be out of range", N);
|
||||
end if;
|
||||
|
||||
Rewrite (N,
|
||||
@ -4283,8 +4318,10 @@ package body Exp_Ch4 is
|
||||
|
||||
elsif Lcheck in Compare_GE and then Ucheck in Compare_LE then
|
||||
if Warn1 then
|
||||
Error_Msg_N ("?range test optimized away", N);
|
||||
Error_Msg_N ("\?value is known to be in range", N);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?range test optimized away", N);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\?value is known to be in range", N);
|
||||
end if;
|
||||
|
||||
Rewrite (N,
|
||||
@ -4300,8 +4337,10 @@ package body Exp_Ch4 is
|
||||
|
||||
elsif Lcheck in Compare_GE then
|
||||
if Warn2 and then not In_Instance then
|
||||
Error_Msg_N ("?lower bound test optimized away", Lo);
|
||||
Error_Msg_N ("\?value is known to be in range", Lo);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?lower bound test optimized away", Lo);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\?value is known to be in range", Lo);
|
||||
end if;
|
||||
|
||||
Rewrite (N,
|
||||
@ -4318,8 +4357,10 @@ package body Exp_Ch4 is
|
||||
|
||||
elsif Ucheck in Compare_LE then
|
||||
if Warn2 and then not In_Instance then
|
||||
Error_Msg_N ("?upper bound test optimized away", Hi);
|
||||
Error_Msg_N ("\?value is known to be in range", Hi);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?upper bound test optimized away", Hi);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\?value is known to be in range", Hi);
|
||||
end if;
|
||||
|
||||
Rewrite (N,
|
||||
@ -4343,25 +4384,25 @@ package body Exp_Ch4 is
|
||||
-- Result is out of range for valid value
|
||||
|
||||
if Lcheck = LT or else Ucheck = GT then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?value can only be in range if it is invalid", N);
|
||||
|
||||
-- Result is in range for valid value
|
||||
|
||||
elsif Lcheck in Compare_GE and then Ucheck in Compare_LE then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?value can only be out of range if it is invalid", N);
|
||||
|
||||
-- Lower bound check succeeds if value is valid
|
||||
|
||||
elsif Warn2 and then Lcheck in Compare_GE then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?lower bound check only fails if it is invalid", Lo);
|
||||
|
||||
-- Upper bound check succeeds if value is valid
|
||||
|
||||
elsif Warn2 and then Ucheck in Compare_LE then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?upper bound check only fails for invalid values", Hi);
|
||||
end if;
|
||||
end if;
|
||||
@ -9692,7 +9733,7 @@ package body Exp_Ch4 is
|
||||
and then Is_Integer_Type (Etype (Left_Opnd (N)))
|
||||
and then not Has_Warnings_Off (Etype (Left_Opnd (N)))
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("can never be greater than, could replace by ""'=""?", N);
|
||||
Warning_Generated := True;
|
||||
end if;
|
||||
@ -9717,7 +9758,7 @@ package body Exp_Ch4 is
|
||||
and then Is_Integer_Type (Etype (Left_Opnd (N)))
|
||||
and then not Has_Warnings_Off (Etype (Left_Opnd (N)))
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("can never be less than, could replace by ""'=""?", N);
|
||||
Warning_Generated := True;
|
||||
end if;
|
||||
@ -9755,11 +9796,11 @@ package body Exp_Ch4 is
|
||||
and then not In_Instance
|
||||
then
|
||||
if True_Result then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("condition can only be False if invalid values present?",
|
||||
N);
|
||||
elsif False_Result then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("condition can only be True if invalid values present?",
|
||||
N);
|
||||
end if;
|
||||
|
@ -359,6 +359,30 @@ procedure Gnat1drv is
|
||||
else
|
||||
Use_Expression_With_Actions := False;
|
||||
end if;
|
||||
|
||||
-- Set switch indicating if back end can handle limited types, and
|
||||
-- guarantee that no incorrect copies are made (e.g. in the context
|
||||
-- of a conditional expression).
|
||||
|
||||
-- Debug flag -gnatd.L decisively sets usage on
|
||||
|
||||
if Debug_Flag_Dot_XX then
|
||||
Back_End_Handles_Limited_Types := True;
|
||||
|
||||
-- If no debug flag, usage off for AAMP, VM, SCIL cases
|
||||
|
||||
elsif AAMP_On_Target
|
||||
or else VM_Target /= No_VM
|
||||
or else Generate_SCIL
|
||||
then
|
||||
Back_End_Handles_Limited_Types := False;
|
||||
|
||||
-- Otherwise normal gcc back end, for now still turn flag off by
|
||||
-- default, since we have not verified proper back end handling.
|
||||
|
||||
else
|
||||
Back_End_Handles_Limited_Types := False;
|
||||
end if;
|
||||
end Adjust_Global_Switches;
|
||||
|
||||
--------------------
|
||||
|
@ -172,6 +172,15 @@ package Opt is
|
||||
-- also set true if certain Unchecked_Conversion instantiations require
|
||||
-- checking based on annotated values.
|
||||
|
||||
Back_End_Handles_Limited_Types : Boolean;
|
||||
-- This flag is set true if the back end can properly handle limited or
|
||||
-- other by reference types, and avoid copies. If this flag is False, then
|
||||
-- the front end does special expansion for conditional expressions to make
|
||||
-- sure that no copy occurs. If the flag is True, then the expansion for
|
||||
-- conditional expressions relies on the back end properly handling things.
|
||||
-- Currently the default is False for all cases (set in gnat1drv). The
|
||||
-- default can be modified using -gnatd.L (sets the flag True).
|
||||
|
||||
Bind_Alternate_Main_Name : Boolean := False;
|
||||
-- GNATBIND
|
||||
-- True if main should be called Alternate_Main_Name.all.
|
||||
@ -1239,12 +1248,12 @@ package Opt is
|
||||
-- Set to True if -h (-gnath for the compiler) switch encountered
|
||||
-- requesting usage information
|
||||
|
||||
Use_Expression_With_Actions : Boolean := False;
|
||||
Use_Expression_With_Actions : Boolean;
|
||||
-- The N_Expression_With_Actions node has been introduced relatively
|
||||
-- recently, and not all back ends are prepared to handle it yet. So
|
||||
-- we use this flag to suppress its use during a transitional period.
|
||||
-- Currently the default is False for all cases except the standard
|
||||
-- GCC back end. The default can be modified using -gnatd.X/-gnatd.Y.
|
||||
-- Currently the default is False for all cases (set in gnat1drv).
|
||||
-- The default can be modified using -gnatd.X/-gnatd.Y.
|
||||
|
||||
Use_Pragma_Linker_Constructor : Boolean := False;
|
||||
-- GNATBIND
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-2010, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -125,7 +125,7 @@ package body Ch3 is
|
||||
elsif Nkind_In (N, N_In, N_Not_In)
|
||||
and then Paren_Count (N) = 0
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("|this expression must be parenthesized!", N);
|
||||
Error_Msg_N
|
||||
("\|since extensions (and set notation) are allowed", N);
|
||||
@ -385,7 +385,8 @@ package body Ch3 is
|
||||
Scan; -- past = used in place of IS
|
||||
|
||||
elsif Token = Tok_Renames then
|
||||
Error_Msg_SC ("RENAMES should be IS");
|
||||
Error_Msg_SC -- CODEFIX
|
||||
("RENAMES should be IS");
|
||||
Scan; -- past RENAMES used in place of IS
|
||||
|
||||
else
|
||||
@ -440,7 +441,8 @@ package body Ch3 is
|
||||
or else Token = Tok_Record
|
||||
or else Token = Tok_Null
|
||||
then
|
||||
Error_Msg_AP ("TAGGED expected");
|
||||
Error_Msg_AP -- CODEFIX???
|
||||
("TAGGED expected");
|
||||
end if;
|
||||
end if;
|
||||
|
||||
@ -455,7 +457,8 @@ package body Ch3 is
|
||||
-- Special check for misuse of Aliased
|
||||
|
||||
if Token = Tok_Aliased or else Token_Name = Name_Aliased then
|
||||
Error_Msg_SC ("ALIASED not allowed in type definition");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("ALIASED not allowed in type definition");
|
||||
Scan; -- past ALIASED
|
||||
end if;
|
||||
|
||||
@ -677,7 +680,8 @@ package body Ch3 is
|
||||
elsif Abstract_Present
|
||||
and then Prev_Token /= Tok_Tagged
|
||||
then
|
||||
Error_Msg_SP ("TAGGED expected");
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("TAGGED expected");
|
||||
end if;
|
||||
|
||||
Typedef_Node := P_Record_Definition;
|
||||
@ -812,7 +816,7 @@ package body Ch3 is
|
||||
if Nkind (Typedef_Node) =
|
||||
N_Derived_Type_Definition
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("SYNCHRONIZED not allowed for record extension",
|
||||
Typedef_Node);
|
||||
else
|
||||
@ -827,7 +831,8 @@ package body Ch3 is
|
||||
|
||||
else
|
||||
if Token /= Tok_Interface then
|
||||
Error_Msg_SC ("NEW or INTERFACE expected");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("NEW or INTERFACE expected");
|
||||
end if;
|
||||
|
||||
Typedef_Node :=
|
||||
@ -918,7 +923,8 @@ package body Ch3 is
|
||||
Set_Abstract_Present (Typedef_Node, Abstract_Present);
|
||||
|
||||
elsif Abstract_Present then
|
||||
Error_Msg ("ABSTRACT not allowed here, ignored", Abstract_Loc);
|
||||
Error_Msg -- CODEFIX???
|
||||
("ABSTRACT not allowed here, ignored", Abstract_Loc);
|
||||
end if;
|
||||
|
||||
Decl_Node := New_Node (N_Full_Type_Declaration, Type_Loc);
|
||||
@ -972,7 +978,8 @@ package body Ch3 is
|
||||
TF_Is;
|
||||
|
||||
if Token = Tok_New then
|
||||
Error_Msg_SC ("NEW ignored (only allowed in type declaration)");
|
||||
Error_Msg_SC -- CODEFIX
|
||||
("NEW ignored (only allowed in type declaration)");
|
||||
Scan; -- past NEW
|
||||
end if;
|
||||
|
||||
@ -1034,11 +1041,13 @@ package body Ch3 is
|
||||
end if;
|
||||
|
||||
else
|
||||
Error_Msg_SP ("NULL expected");
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("NULL expected");
|
||||
end if;
|
||||
|
||||
if Token = Tok_New then
|
||||
Error_Msg ("`NOT NULL` comes after NEW, not before", Not_Loc);
|
||||
Error_Msg -- CODEFIX???
|
||||
("`NOT NULL` comes after NEW, not before", Not_Loc);
|
||||
end if;
|
||||
|
||||
return True;
|
||||
@ -1090,7 +1099,8 @@ package body Ch3 is
|
||||
return Subtype_Mark;
|
||||
else
|
||||
if Not_Null_Present then
|
||||
Error_Msg_SP ("`NOT NULL` not allowed if constraint given");
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("`NOT NULL` not allowed if constraint given");
|
||||
end if;
|
||||
|
||||
Indic_Node := New_Node (N_Subtype_Indication, Sloc (Subtype_Mark));
|
||||
@ -1358,8 +1368,9 @@ package body Ch3 is
|
||||
procedure No_List is
|
||||
begin
|
||||
if Num_Idents > 1 then
|
||||
Error_Msg ("identifier list not allowed for RENAMES",
|
||||
Sloc (Idents (2)));
|
||||
Error_Msg -- CODEFIX???
|
||||
("identifier list not allowed for RENAMES",
|
||||
Sloc (Idents (2)));
|
||||
end if;
|
||||
|
||||
List_OK := False;
|
||||
@ -1379,7 +1390,8 @@ package body Ch3 is
|
||||
Check_Misspelling_Of (Tok_Renames);
|
||||
|
||||
if Token = Tok_Renames then
|
||||
Error_Msg_SP ("|extra "":"" ignored");
|
||||
Error_Msg_SP -- CODEFIX
|
||||
("|extra "":"" ignored");
|
||||
Scan; -- past RENAMES
|
||||
return True;
|
||||
else
|
||||
@ -1433,7 +1445,8 @@ package body Ch3 is
|
||||
Scan; -- past :=
|
||||
|
||||
if Token = Tok_Constant then
|
||||
Error_Msg_SP ("colon expected");
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("colon expected");
|
||||
|
||||
else
|
||||
Restore_Scan_State (Scan_State);
|
||||
@ -1553,7 +1566,7 @@ package body Ch3 is
|
||||
|
||||
if Present (Init_Expr) then
|
||||
if Not_Null_Present then
|
||||
Error_Msg_SP
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("`NOT NULL` not allowed in numeric expression");
|
||||
end if;
|
||||
|
||||
@ -1604,7 +1617,7 @@ package body Ch3 is
|
||||
end if;
|
||||
|
||||
if Token = Tok_Renames then
|
||||
Error_Msg
|
||||
Error_Msg -- CODEFIX???
|
||||
("CONSTANT not permitted in renaming declaration",
|
||||
Con_Loc);
|
||||
Scan; -- Past renames
|
||||
@ -1720,7 +1733,7 @@ package body Ch3 is
|
||||
|
||||
if Token_Is_Renames then
|
||||
if Ada_Version < Ada_05 then
|
||||
Error_Msg_SP
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("`NOT NULL` not allowed in object renaming");
|
||||
raise Error_Resync;
|
||||
|
||||
@ -1750,9 +1763,10 @@ package body Ch3 is
|
||||
-- illegal
|
||||
|
||||
if Token_Is_Renames then
|
||||
Error_Msg_N ("constraint not allowed in object renaming "
|
||||
& "declaration",
|
||||
Constraint (Object_Definition (Decl_Node)));
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("constraint not allowed in object renaming "
|
||||
& "declaration",
|
||||
Constraint (Object_Definition (Decl_Node)));
|
||||
raise Error_Resync;
|
||||
end if;
|
||||
end if;
|
||||
@ -1812,7 +1826,7 @@ package body Ch3 is
|
||||
-- a constraint on the Type_Node and renames, which is illegal
|
||||
|
||||
if Token_Is_Renames then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("constraint not allowed in object renaming declaration",
|
||||
Constraint (Object_Definition (Decl_Node)));
|
||||
raise Error_Resync;
|
||||
@ -1965,7 +1979,8 @@ package body Ch3 is
|
||||
end loop;
|
||||
|
||||
if Token /= Tok_With then
|
||||
Error_Msg_SC ("WITH expected");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("WITH expected");
|
||||
raise Error_Resync;
|
||||
end if;
|
||||
end if;
|
||||
@ -1981,7 +1996,7 @@ package body Ch3 is
|
||||
T_With; -- past WITH or give error message
|
||||
|
||||
if Token = Tok_Limited then
|
||||
Error_Msg_SC
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("LIMITED keyword not allowed in private extension");
|
||||
Scan; -- ignore LIMITED
|
||||
end if;
|
||||
@ -2107,7 +2122,6 @@ package body Ch3 is
|
||||
Range_Node : Node_Id;
|
||||
Save_Loc : Source_Ptr;
|
||||
|
||||
|
||||
-- Start of processing for P_Range_Or_Subtype_Mark
|
||||
|
||||
begin
|
||||
@ -2170,6 +2184,11 @@ package body Ch3 is
|
||||
return Expr_Node;
|
||||
end if;
|
||||
|
||||
-- Simple expression case
|
||||
|
||||
elsif Expr_Form = EF_Simple and then Allow_Simple_Expression then
|
||||
return Expr_Node;
|
||||
|
||||
-- Here we have some kind of error situation. Check for junk parens
|
||||
-- then return what we have, caller will deal with other errors.
|
||||
|
||||
@ -2177,7 +2196,8 @@ package body Ch3 is
|
||||
if Nkind (Expr_Node) in N_Subexpr
|
||||
and then Paren_Count (Expr_Node) /= 0
|
||||
then
|
||||
Error_Msg ("|parentheses not allowed for subtype mark", Save_Loc);
|
||||
Error_Msg -- CODEFIX???
|
||||
("|parentheses not allowed for subtype mark", Save_Loc);
|
||||
Set_Paren_Count (Expr_Node, 0);
|
||||
end if;
|
||||
|
||||
@ -2652,7 +2672,8 @@ package body Ch3 is
|
||||
end if;
|
||||
|
||||
if Aliased_Present then
|
||||
Error_Msg_SP ("ALIASED not allowed here");
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("ALIASED not allowed here");
|
||||
end if;
|
||||
|
||||
Set_Subtype_Indication (CompDef_Node, Empty);
|
||||
@ -3299,7 +3320,8 @@ package body Ch3 is
|
||||
|
||||
if Token = Tok_Colon then
|
||||
Restore_Scan_State (Scan_State);
|
||||
Error_Msg_SC ("component may not follow variant part");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("component may not follow variant part");
|
||||
Discard_Junk_Node (P_Component_List);
|
||||
|
||||
elsif Token = Tok_Case then
|
||||
@ -3392,7 +3414,8 @@ package body Ch3 is
|
||||
Set_Defining_Identifier (Decl_Node, Idents (Ident));
|
||||
|
||||
if Token = Tok_Constant then
|
||||
Error_Msg_SC ("constant components are not permitted");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("constant components are not permitted");
|
||||
Scan;
|
||||
end if;
|
||||
|
||||
@ -3420,7 +3443,8 @@ package body Ch3 is
|
||||
end if;
|
||||
|
||||
if Aliased_Present then
|
||||
Error_Msg_SP ("ALIASED not allowed here");
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("ALIASED not allowed here");
|
||||
end if;
|
||||
|
||||
Set_Subtype_Indication (CompDef_Node, Empty);
|
||||
@ -3434,7 +3458,7 @@ package body Ch3 is
|
||||
Set_Null_Exclusion_Present (CompDef_Node, Not_Null_Present);
|
||||
|
||||
if Token = Tok_Array then
|
||||
Error_Msg_SC
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("anonymous arrays not allowed as components");
|
||||
raise Error_Resync;
|
||||
end if;
|
||||
@ -3514,7 +3538,8 @@ package body Ch3 is
|
||||
Error_Msg ("discriminant name expected", Sloc (Case_Node));
|
||||
|
||||
elsif Paren_Count (Case_Node) /= 0 then
|
||||
Error_Msg ("|discriminant name may not be parenthesized",
|
||||
Error_Msg -- CODEFIX???
|
||||
("|discriminant name may not be parenthesized",
|
||||
Sloc (Case_Node));
|
||||
Set_Paren_Count (Case_Node, 0);
|
||||
end if;
|
||||
@ -3698,7 +3723,8 @@ package body Ch3 is
|
||||
end if;
|
||||
|
||||
if Token = Tok_Comma then
|
||||
Error_Msg_SC (""","" should be ""'|""");
|
||||
Error_Msg_SC -- CODEFIX
|
||||
(""","" should be ""'|""");
|
||||
else
|
||||
exit when Token /= Tok_Vertical_Bar;
|
||||
end if;
|
||||
@ -3745,8 +3771,9 @@ package body Ch3 is
|
||||
end if;
|
||||
|
||||
if Abstract_Present then
|
||||
Error_Msg_SP ("ABSTRACT not allowed in interface type definition " &
|
||||
"(RM 3.9.4(2/2))");
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("ABSTRACT not allowed in interface type definition " &
|
||||
"(RM 3.9.4(2/2))");
|
||||
end if;
|
||||
|
||||
Scan; -- past INTERFACE
|
||||
@ -3768,7 +3795,8 @@ package body Ch3 is
|
||||
|
||||
else
|
||||
if Token /= Tok_And then
|
||||
Error_Msg_AP ("AND expected");
|
||||
Error_Msg_AP -- CODEFIX???
|
||||
("AND expected");
|
||||
else
|
||||
Scan; -- past AND
|
||||
end if;
|
||||
@ -3854,7 +3882,8 @@ package body Ch3 is
|
||||
Scan; -- past possible junk subprogram name
|
||||
|
||||
if Token = Tok_Left_Paren or else Token = Tok_Semicolon then
|
||||
Error_Msg_SP ("unexpected subprogram name ignored");
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("unexpected subprogram name ignored");
|
||||
return;
|
||||
|
||||
else
|
||||
@ -4035,7 +4064,7 @@ package body Ch3 is
|
||||
|
||||
if Token = Tok_All then
|
||||
if Ada_Version < Ada_05 then
|
||||
Error_Msg_SP
|
||||
Error_Msg_SP -- CODEFIX???
|
||||
("ALL is not permitted for anonymous access types");
|
||||
end if;
|
||||
|
||||
@ -4246,7 +4275,8 @@ package body Ch3 is
|
||||
|
||||
when Tok_With =>
|
||||
Check_Bad_Layout;
|
||||
Error_Msg_SC ("WITH can only appear in context clause");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("WITH can only appear in context clause");
|
||||
raise Error_Resync;
|
||||
|
||||
-- BEGIN terminates the scan of a sequence of declarations unless
|
||||
@ -4284,7 +4314,8 @@ package body Ch3 is
|
||||
-- Otherwise we saved the semicolon position, so complain
|
||||
|
||||
else
|
||||
Error_Msg ("|"";"" should be IS", SIS_Semicolon_Sloc);
|
||||
Error_Msg -- CODEFIX
|
||||
("|"";"" should be IS", SIS_Semicolon_Sloc);
|
||||
end if;
|
||||
|
||||
-- The next job is to fix up any declarations that occurred
|
||||
@ -4410,7 +4441,8 @@ package body Ch3 is
|
||||
if In_Spec then
|
||||
Done := True;
|
||||
else
|
||||
Error_Msg_SC ("PRIVATE not allowed in body");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("PRIVATE not allowed in body");
|
||||
Scan; -- past PRIVATE
|
||||
end if;
|
||||
|
||||
@ -4519,17 +4551,17 @@ package body Ch3 is
|
||||
Kind = N_Task_Body or else
|
||||
Kind = N_Protected_Body
|
||||
then
|
||||
Error_Msg
|
||||
Error_Msg -- CODEFIX???
|
||||
("proper body not allowed in package spec", Sloc (Decl));
|
||||
|
||||
-- Test for body stub scanned, not acceptable as basic decl item
|
||||
|
||||
elsif Kind in N_Body_Stub then
|
||||
Error_Msg
|
||||
Error_Msg -- CODEFIX???
|
||||
("body stub not allowed in package spec", Sloc (Decl));
|
||||
|
||||
elsif Kind = N_Assignment_Statement then
|
||||
Error_Msg
|
||||
Error_Msg -- CODEFIX???
|
||||
("assignment statement not allowed in package spec",
|
||||
Sloc (Decl));
|
||||
end if;
|
||||
@ -4618,7 +4650,8 @@ package body Ch3 is
|
||||
-- not allowed in package spec. This message never gets changed.
|
||||
|
||||
if In_Spec then
|
||||
Error_Msg_SC ("statement not allowed in package spec");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("statement not allowed in package spec");
|
||||
|
||||
-- If in declarative part, then we give the message complaining
|
||||
-- about finding a statement when a declaration is expected. This
|
||||
@ -4626,7 +4659,8 @@ package body Ch3 is
|
||||
-- find that no BEGIN is present.
|
||||
|
||||
else
|
||||
Error_Msg_SC ("statement not allowed in declarative part");
|
||||
Error_Msg_SC -- CODEFIX???
|
||||
("statement not allowed in declarative part");
|
||||
end if;
|
||||
|
||||
-- Capture message Id. This is used for two purposes, first to
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-2010, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -558,7 +558,8 @@ package body Sem_Ch5 is
|
||||
and then not Is_Tag_Indeterminate (Rhs)
|
||||
and then not Is_Dynamically_Tagged (Rhs)
|
||||
then
|
||||
Error_Msg_N ("dynamically tagged expression required!", Rhs);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("dynamically tagged expression required!", Rhs);
|
||||
end if;
|
||||
|
||||
-- Propagate the tag from a class-wide target to the rhs when the rhs
|
||||
@ -572,7 +573,7 @@ package body Sem_Ch5 is
|
||||
and then Is_Entity_Name (Name (Rhs))
|
||||
and then Is_Abstract_Subprogram (Entity (Name (Rhs)))
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("call to abstract function must be dispatching", Name (Rhs));
|
||||
|
||||
elsif Nkind (Rhs) = N_Qualified_Expression
|
||||
@ -581,7 +582,7 @@ package body Sem_Ch5 is
|
||||
and then
|
||||
Is_Abstract_Subprogram (Entity (Name (Expression (Rhs))))
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("call to abstract function must be dispatching",
|
||||
Name (Expression (Rhs)));
|
||||
end if;
|
||||
@ -693,10 +694,10 @@ package body Sem_Ch5 is
|
||||
and then Nkind (Original_Node (Rhs)) not in N_Op
|
||||
then
|
||||
if Nkind (Lhs) in N_Has_Entity then
|
||||
Error_Msg_NE
|
||||
Error_Msg_NE -- CODEFIX
|
||||
("?useless assignment of & to itself!", N, Entity (Lhs));
|
||||
else
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX
|
||||
("?useless assignment of object to itself!", N);
|
||||
end if;
|
||||
end if;
|
||||
@ -948,7 +949,7 @@ package body Sem_Ch5 is
|
||||
-- the case statement has a non static choice.
|
||||
|
||||
procedure Process_Statements (Alternative : Node_Id);
|
||||
-- Analyzes all the statements associated to a case alternative.
|
||||
-- Analyzes all the statements associated with a case alternative.
|
||||
-- Needed by the generic instantiation below.
|
||||
|
||||
package Case_Choices_Processing is new
|
||||
@ -1635,10 +1636,11 @@ package body Sem_Ch5 is
|
||||
else
|
||||
-- Both of them are user-defined
|
||||
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("ambiguous bounds in range of iteration",
|
||||
R_Copy);
|
||||
Error_Msg_N ("\possible interpretations:", R_Copy);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\possible interpretations:", R_Copy);
|
||||
Error_Msg_NE ("\\} ", R_Copy, Found);
|
||||
Error_Msg_NE ("\\} ", R_Copy, It.Typ);
|
||||
exit;
|
||||
@ -1890,7 +1892,7 @@ package body Sem_Ch5 is
|
||||
if Compile_Time_Compare
|
||||
(L, H, Assume_Valid => False) = GT
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?loop range is null, "
|
||||
& "loop will not execute",
|
||||
DS);
|
||||
@ -1944,7 +1946,8 @@ package body Sem_Ch5 is
|
||||
Intval (Original_Node (H)) = Uint_1)
|
||||
then
|
||||
Error_Msg_N ("?loop range may be null", DS);
|
||||
Error_Msg_N ("\?bounds may be wrong way round", DS);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\?bounds may be wrong way round", DS);
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
@ -2241,7 +2244,8 @@ package body Sem_Ch5 is
|
||||
|
||||
-- Now issue the warning
|
||||
|
||||
Error_Msg ("?unreachable code!", Error_Loc);
|
||||
Error_Msg -- CODEFIX???
|
||||
("?unreachable code!", Error_Loc);
|
||||
end if;
|
||||
|
||||
-- If the unconditional transfer of control instruction is
|
||||
|
@ -126,6 +126,10 @@ package body Sem_Eval is
|
||||
-- This is the actual cache, with entries consisting of node/value pairs,
|
||||
-- and the impossible value Node_High_Bound used for unset entries.
|
||||
|
||||
type Range_Membership is (In_Range, Out_Of_Range, Unknown);
|
||||
-- Range membership may either be statically known to be in range or out
|
||||
-- of range, or not statically known. Used for Test_In_Range below.
|
||||
|
||||
-----------------------
|
||||
-- Local Subprograms --
|
||||
-----------------------
|
||||
@ -210,6 +214,18 @@ package body Sem_Eval is
|
||||
-- Same processing, except applies to an expression N with two operands
|
||||
-- Op1 and Op2.
|
||||
|
||||
function Test_In_Range
|
||||
(N : Node_Id;
|
||||
Typ : Entity_Id;
|
||||
Assume_Valid : Boolean;
|
||||
Fixed_Int : Boolean;
|
||||
Int_Real : Boolean) return Range_Membership;
|
||||
-- Common processing for Is_In_Range and Is_Out_Of_Range:
|
||||
-- Returns In_Range or Out_Of_Range if it can be guaranteed at compile time
|
||||
-- that expression N is known to be in or out of range of the subtype Typ.
|
||||
-- If not compile time known, Unknown is returned.
|
||||
-- See documentation of Is_In_Range for complete description of parameters.
|
||||
|
||||
procedure To_Bits (U : Uint; B : out Bits);
|
||||
-- Converts a Uint value to a bit string of length B'Length
|
||||
|
||||
@ -3896,70 +3912,9 @@ package body Sem_Eval is
|
||||
Fixed_Int : Boolean := False;
|
||||
Int_Real : Boolean := False) return Boolean
|
||||
is
|
||||
Val : Uint;
|
||||
Valr : Ureal;
|
||||
|
||||
pragma Warnings (Off, Assume_Valid);
|
||||
-- For now Assume_Valid is unreferenced since the current implementation
|
||||
-- always returns False if N is not a compile time known value, but we
|
||||
-- keep the parameter to allow for future enhancements in which we try
|
||||
-- to get the information in the variable case as well.
|
||||
|
||||
begin
|
||||
-- Universal types have no range limits, so always in range
|
||||
|
||||
if Typ = Universal_Integer or else Typ = Universal_Real then
|
||||
return True;
|
||||
|
||||
-- Never in range if not scalar type. Don't know if this can
|
||||
-- actually happen, but our spec allows it, so we must check!
|
||||
|
||||
elsif not Is_Scalar_Type (Typ) then
|
||||
return False;
|
||||
|
||||
-- Never in range unless we have a compile time known value
|
||||
|
||||
elsif not Compile_Time_Known_Value (N) then
|
||||
return False;
|
||||
|
||||
-- General processing with a known compile time value
|
||||
|
||||
else
|
||||
declare
|
||||
Lo : Node_Id;
|
||||
Hi : Node_Id;
|
||||
LB_Known : Boolean;
|
||||
UB_Known : Boolean;
|
||||
|
||||
begin
|
||||
Lo := Type_Low_Bound (Typ);
|
||||
Hi := Type_High_Bound (Typ);
|
||||
|
||||
LB_Known := Compile_Time_Known_Value (Lo);
|
||||
UB_Known := Compile_Time_Known_Value (Hi);
|
||||
|
||||
-- Fixed point types should be considered as such only if flag
|
||||
-- Fixed_Int is set to False.
|
||||
|
||||
if Is_Floating_Point_Type (Typ)
|
||||
or else (Is_Fixed_Point_Type (Typ) and then not Fixed_Int)
|
||||
or else Int_Real
|
||||
then
|
||||
Valr := Expr_Value_R (N);
|
||||
|
||||
return LB_Known and then Valr >= Expr_Value_R (Lo)
|
||||
and then
|
||||
UB_Known and then Valr <= Expr_Value_R (Hi);
|
||||
|
||||
else
|
||||
Val := Expr_Value (N);
|
||||
|
||||
return LB_Known and then Val >= Expr_Value (Lo)
|
||||
and then
|
||||
UB_Known and then Val <= Expr_Value (Hi);
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
return Test_In_Range (N, Typ, Assume_Valid, Fixed_Int, Int_Real)
|
||||
= In_Range;
|
||||
end Is_In_Range;
|
||||
|
||||
-------------------
|
||||
@ -4083,78 +4038,9 @@ package body Sem_Eval is
|
||||
Fixed_Int : Boolean := False;
|
||||
Int_Real : Boolean := False) return Boolean
|
||||
is
|
||||
Val : Uint;
|
||||
Valr : Ureal;
|
||||
|
||||
pragma Warnings (Off, Assume_Valid);
|
||||
-- For now Assume_Valid is unreferenced since the current implementation
|
||||
-- always returns False if N is not a compile time known value, but we
|
||||
-- keep the parameter to allow for future enhancements in which we try
|
||||
-- to get the information in the variable case as well.
|
||||
|
||||
begin
|
||||
-- Universal types have no range limits, so always in range
|
||||
|
||||
if Typ = Universal_Integer or else Typ = Universal_Real then
|
||||
return False;
|
||||
|
||||
-- Never out of range if not scalar type. Don't know if this can
|
||||
-- actually happen, but our spec allows it, so we must check!
|
||||
|
||||
elsif not Is_Scalar_Type (Typ) then
|
||||
return False;
|
||||
|
||||
-- Never out of range if this is a generic type, since the bounds
|
||||
-- of generic types are junk. Note that if we only checked for
|
||||
-- static expressions (instead of compile time known values) below,
|
||||
-- we would not need this check, because values of a generic type
|
||||
-- can never be static, but they can be known at compile time.
|
||||
|
||||
elsif Is_Generic_Type (Typ) then
|
||||
return False;
|
||||
|
||||
-- Never out of range unless we have a compile time known value
|
||||
|
||||
elsif not Compile_Time_Known_Value (N) then
|
||||
return False;
|
||||
|
||||
else
|
||||
declare
|
||||
Lo : Node_Id;
|
||||
Hi : Node_Id;
|
||||
LB_Known : Boolean;
|
||||
UB_Known : Boolean;
|
||||
|
||||
begin
|
||||
Lo := Type_Low_Bound (Typ);
|
||||
Hi := Type_High_Bound (Typ);
|
||||
|
||||
LB_Known := Compile_Time_Known_Value (Lo);
|
||||
UB_Known := Compile_Time_Known_Value (Hi);
|
||||
|
||||
-- Real types (note that fixed-point types are not treated as
|
||||
-- being of a real type if the flag Fixed_Int is set, since in
|
||||
-- that case they are regarded as integer types).
|
||||
|
||||
if Is_Floating_Point_Type (Typ)
|
||||
or else (Is_Fixed_Point_Type (Typ) and then not Fixed_Int)
|
||||
or else Int_Real
|
||||
then
|
||||
Valr := Expr_Value_R (N);
|
||||
|
||||
return (LB_Known and then Valr < Expr_Value_R (Lo))
|
||||
or else
|
||||
(UB_Known and then Expr_Value_R (Hi) < Valr);
|
||||
|
||||
else
|
||||
Val := Expr_Value (N);
|
||||
|
||||
return (LB_Known and then Val < Expr_Value (Lo))
|
||||
or else
|
||||
(UB_Known and then Expr_Value (Hi) < Val);
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
return Test_In_Range (N, Typ, Assume_Valid, Fixed_Int, Int_Real)
|
||||
= Out_Of_Range;
|
||||
end Is_Out_Of_Range;
|
||||
|
||||
---------------------
|
||||
@ -4472,12 +4358,12 @@ package body Sem_Eval is
|
||||
-- A constrained numeric subtype never matches an unconstrained
|
||||
-- subtype, i.e. both types must be constrained or unconstrained.
|
||||
|
||||
-- To understand the requirement for this test, see RM 4.9.1(1). As
|
||||
-- is made clear in RM 3.5.4(11), type Integer, for example is a
|
||||
-- constrained subtype with constraint bounds matching the bounds of
|
||||
-- its corresponding unconstrained base type. In this situation,
|
||||
-- Integer and Integer'Base do not statically match, even though they
|
||||
-- have the same bounds.
|
||||
-- To understand the requirement for this test, see RM 4.9.1(1).
|
||||
-- As is made clear in RM 3.5.4(11), type Integer, for example is
|
||||
-- a constrained subtype with constraint bounds matching the bounds
|
||||
-- of its corresponding unconstrained base type. In this situation,
|
||||
-- Integer and Integer'Base do not statically match, even though
|
||||
-- they have the same bounds.
|
||||
|
||||
-- We only apply this test to types in Standard and types that appear
|
||||
-- in user programs. That way, we do not have to be too careful about
|
||||
@ -4877,6 +4763,125 @@ package body Sem_Eval is
|
||||
end if;
|
||||
end Test_Expression_Is_Foldable;
|
||||
|
||||
-------------------
|
||||
-- Test_In_Range --
|
||||
-------------------
|
||||
|
||||
function Test_In_Range
|
||||
(N : Node_Id;
|
||||
Typ : Entity_Id;
|
||||
Assume_Valid : Boolean;
|
||||
Fixed_Int : Boolean;
|
||||
Int_Real : Boolean) return Range_Membership
|
||||
is
|
||||
Val : Uint;
|
||||
Valr : Ureal;
|
||||
|
||||
pragma Warnings (Off, Assume_Valid);
|
||||
-- For now Assume_Valid is unreferenced since the current implementation
|
||||
-- always returns Unknown if N is not a compile time known value, but we
|
||||
-- keep the parameter to allow for future enhancements in which we try
|
||||
-- to get the information in the variable case as well.
|
||||
|
||||
begin
|
||||
-- Universal types have no range limits, so always in range
|
||||
|
||||
if Typ = Universal_Integer or else Typ = Universal_Real then
|
||||
return In_Range;
|
||||
|
||||
-- Never known if not scalar type. Don't know if this can actually
|
||||
-- happen, but our spec allows it, so we must check!
|
||||
|
||||
elsif not Is_Scalar_Type (Typ) then
|
||||
return Unknown;
|
||||
|
||||
-- Never known if this is a generic type, since the bounds of generic
|
||||
-- types are junk. Note that if we only checked for static expressions
|
||||
-- (instead of compile time known values) below, we would not need this
|
||||
-- check, because values of a generic type can never be static, but they
|
||||
-- can be known at compile time.
|
||||
|
||||
elsif Is_Generic_Type (Typ) then
|
||||
return Unknown;
|
||||
|
||||
-- Never known unless we have a compile time known value
|
||||
|
||||
elsif not Compile_Time_Known_Value (N) then
|
||||
return Unknown;
|
||||
|
||||
-- General processing with a known compile time value
|
||||
|
||||
else
|
||||
declare
|
||||
Lo : Node_Id;
|
||||
Hi : Node_Id;
|
||||
|
||||
LB_Known : Boolean;
|
||||
HB_Known : Boolean;
|
||||
|
||||
begin
|
||||
Lo := Type_Low_Bound (Typ);
|
||||
Hi := Type_High_Bound (Typ);
|
||||
|
||||
LB_Known := Compile_Time_Known_Value (Lo);
|
||||
HB_Known := Compile_Time_Known_Value (Hi);
|
||||
|
||||
-- Fixed point types should be considered as such only if flag
|
||||
-- Fixed_Int is set to False.
|
||||
|
||||
if Is_Floating_Point_Type (Typ)
|
||||
or else (Is_Fixed_Point_Type (Typ) and then not Fixed_Int)
|
||||
or else Int_Real
|
||||
then
|
||||
Valr := Expr_Value_R (N);
|
||||
|
||||
if LB_Known and HB_Known then
|
||||
if Valr >= Expr_Value_R (Lo)
|
||||
and then
|
||||
Valr <= Expr_Value_R (Hi)
|
||||
then
|
||||
return In_Range;
|
||||
else
|
||||
return Out_Of_Range;
|
||||
end if;
|
||||
|
||||
elsif (LB_Known and then Valr < Expr_Value_R (Lo))
|
||||
or else
|
||||
(HB_Known and then Valr > Expr_Value_R (Hi))
|
||||
then
|
||||
return Out_Of_Range;
|
||||
|
||||
else
|
||||
return Unknown;
|
||||
end if;
|
||||
|
||||
else
|
||||
Val := Expr_Value (N);
|
||||
|
||||
if LB_Known and HB_Known then
|
||||
if Val >= Expr_Value (Lo)
|
||||
and then
|
||||
Val <= Expr_Value (Hi)
|
||||
then
|
||||
return In_Range;
|
||||
else
|
||||
return Out_Of_Range;
|
||||
end if;
|
||||
|
||||
elsif (LB_Known and then Val < Expr_Value (Lo))
|
||||
or else
|
||||
(HB_Known and then Val > Expr_Value (Hi))
|
||||
then
|
||||
return Out_Of_Range;
|
||||
|
||||
else
|
||||
return Unknown;
|
||||
end if;
|
||||
end if;
|
||||
end;
|
||||
end if;
|
||||
end Test_In_Range;
|
||||
|
||||
--------------
|
||||
-- To_Bits --
|
||||
--------------
|
||||
|
@ -214,7 +214,8 @@ package body Sem_Res is
|
||||
-- to the corresponding predefined operator, with suitable conversions.
|
||||
|
||||
procedure Resolve_Intrinsic_Unary_Operator (N : Node_Id; Typ : Entity_Id);
|
||||
-- Ditto, for unary operators (only arithmetic ones)
|
||||
-- Ditto, for unary operators (arithmetic ones and "not" on signed
|
||||
-- integer types for VMS).
|
||||
|
||||
procedure Rewrite_Operator_As_Call (N : Node_Id; Nam : Entity_Id);
|
||||
-- If an operator node resolves to a call to a user-defined operator,
|
||||
@ -273,19 +274,20 @@ package body Sem_Res is
|
||||
|
||||
begin
|
||||
if Nkind (C) = N_Character_Literal then
|
||||
Error_Msg_N ("ambiguous character literal", C);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("ambiguous character literal", C);
|
||||
|
||||
-- First the ones in Standard
|
||||
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\\possible interpretation: Character!", C);
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\\possible interpretation: Wide_Character!", C);
|
||||
|
||||
-- Include Wide_Wide_Character in Ada 2005 mode
|
||||
|
||||
if Ada_Version >= Ada_05 then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\\possible interpretation: Wide_Wide_Character!", C);
|
||||
end if;
|
||||
|
||||
@ -293,7 +295,8 @@ package body Sem_Res is
|
||||
|
||||
E := Current_Entity (C);
|
||||
while Present (E) loop
|
||||
Error_Msg_NE ("\\possible interpretation:}!", C, Etype (E));
|
||||
Error_Msg_NE -- CODEFIX???
|
||||
("\\possible interpretation:}!", C, Etype (E));
|
||||
E := Homonym (E);
|
||||
end loop;
|
||||
end if;
|
||||
@ -633,9 +636,10 @@ package body Sem_Res is
|
||||
procedure Check_For_Visible_Operator (N : Node_Id; T : Entity_Id) is
|
||||
begin
|
||||
if Is_Invisible_Operator (N, T) then
|
||||
Error_Msg_NE
|
||||
Error_Msg_NE -- CODEFIX
|
||||
("operator for} is not directly visible!", N, First_Subtype (T));
|
||||
Error_Msg_N ("use clause would make operation legal!", N);
|
||||
Error_Msg_N -- CODEFIX
|
||||
("use clause would make operation legal!", N);
|
||||
end if;
|
||||
end Check_For_Visible_Operator;
|
||||
|
||||
@ -1752,7 +1756,8 @@ package body Sem_Res is
|
||||
and then Is_Entity_Name (Name (Arg))
|
||||
and then Is_Overloaded (Name (Arg))
|
||||
then
|
||||
Error_Msg_NE ("ambiguous call to&", Arg, Name (Arg));
|
||||
Error_Msg_NE -- CODEFIX???
|
||||
("ambiguous call to&", Arg, Name (Arg));
|
||||
|
||||
-- Could use comments on what is going on here ???
|
||||
|
||||
@ -1761,9 +1766,11 @@ package body Sem_Res is
|
||||
Error_Msg_Sloc := Sloc (It.Nam);
|
||||
|
||||
if Nkind (Parent (It.Nam)) = N_Full_Type_Declaration then
|
||||
Error_Msg_N ("interpretation (inherited) #!", Arg);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("interpretation (inherited) #!", Arg);
|
||||
else
|
||||
Error_Msg_N ("interpretation #!", Arg);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("interpretation #!", Arg);
|
||||
end if;
|
||||
|
||||
Get_Next_Interp (I, It);
|
||||
@ -2058,7 +2065,7 @@ package body Sem_Res is
|
||||
if Nkind (N) = N_Function_Call
|
||||
and then Nkind (Name (N)) = N_Explicit_Dereference
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("ambiguous expression "
|
||||
& "(cannot resolve indirect call)!", N);
|
||||
else
|
||||
@ -2070,7 +2077,7 @@ package body Sem_Res is
|
||||
Ambiguous := True;
|
||||
|
||||
if Nkind (Parent (Seen)) = N_Full_Type_Declaration then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\\possible interpretation (inherited)#!", N);
|
||||
else
|
||||
Error_Msg_N -- CODEFIX
|
||||
@ -2148,19 +2155,19 @@ package body Sem_Res is
|
||||
if It.Typ = Universal_Fixed
|
||||
and then Scope (It.Nam) = Standard_Standard
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\\possible interpretation as " &
|
||||
"universal_fixed operation " &
|
||||
"(RM 4.5.5 (19))", N);
|
||||
else
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\\possible interpretation (predefined)#!", N);
|
||||
end if;
|
||||
|
||||
elsif
|
||||
Nkind (Parent (It.Nam)) = N_Full_Type_Declaration
|
||||
then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("\\possible interpretation (inherited)#!", N);
|
||||
else
|
||||
Error_Msg_N -- CODEFIX
|
||||
@ -2908,7 +2915,7 @@ package body Sem_Res is
|
||||
-- Introduce an implicit 'Access in prefix
|
||||
|
||||
if not Is_Aliased_View (Act) then
|
||||
Error_Msg_NE
|
||||
Error_Msg_NE -- CODEFIX???
|
||||
("object in prefixed call to& must be aliased"
|
||||
& " (RM-2005 4.3.1 (13))",
|
||||
Prefix (Act), Nam);
|
||||
@ -4199,7 +4206,8 @@ package body Sem_Res is
|
||||
declare
|
||||
Loc : constant Source_Ptr := Sloc (N);
|
||||
begin
|
||||
Error_Msg_N ("?allocation from empty storage pool!", N);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?allocation from empty storage pool!", N);
|
||||
Error_Msg_N ("\?Storage_Error will be raised at run time!", N);
|
||||
Insert_Action (N,
|
||||
Make_Raise_Storage_Error (Loc,
|
||||
@ -6352,7 +6360,8 @@ package body Sem_Res is
|
||||
and then Entity (R) = Standard_True
|
||||
and then Comes_From_Source (R)
|
||||
then
|
||||
Error_Msg_N ("?comparison with True is redundant!", R);
|
||||
Error_Msg_N -- CODEFIX
|
||||
("?comparison with True is redundant!", R);
|
||||
end if;
|
||||
|
||||
Check_Unset_Reference (L);
|
||||
@ -6676,6 +6685,13 @@ package body Sem_Res is
|
||||
Arg2 : Node_Id;
|
||||
|
||||
begin
|
||||
-- We must preserve the original entity in a generic setting, so that
|
||||
-- the legality of the operation can be verified in an instance.
|
||||
|
||||
if not Expander_Active then
|
||||
return;
|
||||
end if;
|
||||
|
||||
Op := Entity (N);
|
||||
while Scope (Op) /= Standard_Standard loop
|
||||
Op := Homonym (Op);
|
||||
@ -7365,7 +7381,7 @@ package body Sem_Res is
|
||||
|
||||
elsif Typ = Universal_Integer or else Typ = Any_Modular then
|
||||
if Parent_Is_Boolean then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("operand of not must be enclosed in parentheses",
|
||||
Right_Opnd (N));
|
||||
else
|
||||
@ -7387,7 +7403,8 @@ package body Sem_Res is
|
||||
and then not Is_Boolean_Type (Typ)
|
||||
and then Parent_Is_Boolean
|
||||
then
|
||||
Error_Msg_N ("?not expression should be parenthesized here!", N);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?not expression should be parenthesized here!", N);
|
||||
end if;
|
||||
|
||||
-- Warn on double negation if checking redundant constructs
|
||||
@ -7398,7 +7415,8 @@ package body Sem_Res is
|
||||
and then Root_Type (Typ) = Standard_Boolean
|
||||
and then Nkind (Right_Opnd (N)) = N_Op_Not
|
||||
then
|
||||
Error_Msg_N ("redundant double negation?", N);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("redundant double negation?", N);
|
||||
end if;
|
||||
|
||||
-- Complete resolution and evaluation of NOT
|
||||
@ -8578,7 +8596,8 @@ package body Sem_Res is
|
||||
|
||||
if From_With_Type (Opnd) then
|
||||
Error_Msg_Qual_Level := 99;
|
||||
Error_Msg_NE ("missing WITH clause on package &", N,
|
||||
Error_Msg_NE -- CODEFIX
|
||||
("missing WITH clause on package &", N,
|
||||
Cunit_Entity (Get_Source_Unit (Base_Type (Opnd))));
|
||||
Error_Msg_N
|
||||
("type conversions require visibility of the full view",
|
||||
@ -8590,7 +8609,8 @@ package body Sem_Res is
|
||||
and then Present (Non_Limited_View (Etype (Target))))
|
||||
then
|
||||
Error_Msg_Qual_Level := 99;
|
||||
Error_Msg_NE ("missing WITH clause on package &", N,
|
||||
Error_Msg_NE -- CODEFIX
|
||||
("missing WITH clause on package &", N,
|
||||
Cunit_Entity (Get_Source_Unit (Base_Type (Target))));
|
||||
Error_Msg_N
|
||||
("type conversions require visibility of the full view",
|
||||
@ -8682,7 +8702,7 @@ package body Sem_Res is
|
||||
Determine_Range (Right_Opnd (N), OK, Lo, Hi);
|
||||
|
||||
if OK and then Hi >= Lo and then Lo >= 0 then
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX
|
||||
("?abs applied to known non-negative value has no effect", N);
|
||||
end if;
|
||||
end if;
|
||||
@ -8820,7 +8840,7 @@ package body Sem_Res is
|
||||
|
||||
-- If we fall through warning should be issued
|
||||
|
||||
Error_Msg_N
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("?unary minus expression should be parenthesized here!", N);
|
||||
end if;
|
||||
end if;
|
||||
@ -9201,9 +9221,12 @@ package body Sem_Res is
|
||||
|
||||
procedure Fixed_Point_Error is
|
||||
begin
|
||||
Error_Msg_N ("ambiguous universal_fixed_expression", N);
|
||||
Error_Msg_NE ("\\possible interpretation as}", N, T1);
|
||||
Error_Msg_NE ("\\possible interpretation as}", N, T2);
|
||||
Error_Msg_N -- CODEFIX???
|
||||
("ambiguous universal_fixed_expression", N);
|
||||
Error_Msg_NE -- CODEFIX???
|
||||
("\\possible interpretation as}", N, T1);
|
||||
Error_Msg_NE -- CODEFIX???
|
||||
("\\possible interpretation as}", N, T2);
|
||||
end Fixed_Point_Error;
|
||||
|
||||
-- Start of processing for Unique_Fixed_Point_Type
|
||||
@ -10049,7 +10072,8 @@ package body Sem_Res is
|
||||
and then Is_Access_Type (Opnd_Type)
|
||||
then
|
||||
Error_Msg_N ("target type must be general access type!", N);
|
||||
Error_Msg_NE ("add ALL to }!", N, Target_Type);
|
||||
Error_Msg_NE -- CODEFIX
|
||||
("add ALL to }!", N, Target_Type);
|
||||
return False;
|
||||
|
||||
else
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-2010, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -1513,7 +1513,6 @@ package body Sprint is
|
||||
Indent_Begin;
|
||||
Write_Indent_Str_Sloc ("do");
|
||||
Indent_Begin;
|
||||
Write_Indent;
|
||||
Sprint_Node_List (Actions (Node));
|
||||
Indent_End;
|
||||
Write_Indent;
|
||||
|
Loading…
x
Reference in New Issue
Block a user