exp_ch7.adb, [...]: Minor reformatting.

2012-10-02  Robert Dewar  <dewar@adacore.com>

	* exp_ch7.adb, sem_dim.adb, sem_dim.ads, prj-part.adb, checks.adb,
	freeze.adb, sem_ch4.adb, sem_ch13.adb: Minor reformatting.

2012-10-02  Robert Dewar  <dewar@adacore.com>

	* sem_prag.adb (Analyze_Pragma, case Overflow_Checks): Fix
	typo preventing proper processing of Overflow_Checks pragmas
	for general case.

2012-10-02  Robert Dewar  <dewar@adacore.com>

	* exp_ch4.adb (Expand_N_Op_Mod): Fix crash in ELIMINATED overflow
	checks mode when bignum mode is used.

2012-10-02  Robert Dewar  <dewar@adacore.com>

	* stylesw.ads, gnat_ugn.texi: Document new style rule for NOT IN.
	* par-ch4.adb (P_Relational_Operator): Add style check for NOT IN.
	* style.ads, styleg.adb, styleg.ads (Check_Not_In): New procedure.

From-SVN: r191962
This commit is contained in:
Robert Dewar 2012-10-02 08:22:53 +00:00 committed by Arnaud Charlet
parent 07ef182e37
commit 9a6dc47083
17 changed files with 159 additions and 89 deletions

View file

@ -1,3 +1,25 @@
2012-10-02 Robert Dewar <dewar@adacore.com>
* exp_ch7.adb, sem_dim.adb, sem_dim.ads, prj-part.adb, checks.adb,
freeze.adb, sem_ch4.adb, sem_ch13.adb: Minor reformatting.
2012-10-02 Robert Dewar <dewar@adacore.com>
* sem_prag.adb (Analyze_Pragma, case Overflow_Checks): Fix
typo preventing proper processing of Overflow_Checks pragmas
for general case.
2012-10-02 Robert Dewar <dewar@adacore.com>
* exp_ch4.adb (Expand_N_Op_Mod): Fix crash in ELIMINATED overflow
checks mode when bignum mode is used.
2012-10-02 Robert Dewar <dewar@adacore.com>
* stylesw.ads, gnat_ugn.texi: Document new style rule for NOT IN.
* par-ch4.adb (P_Relational_Operator): Add style check for NOT IN.
* style.ads, styleg.adb, styleg.ads (Check_Not_In): New procedure.
2012-10-02 Vincent Pucci <pucci@adacore.com>
* sem_attr.adb (Analyze_Attribute): Check dimension for attribute

View file

@ -2075,7 +2075,8 @@ package body Checks is
-- IN IN
if Ekind (Formal_1) = E_In_Parameter
and then Ekind (Formal_2) = E_In_Parameter
and then
Ekind (Formal_2) = E_In_Parameter
then
return False;
@ -2342,9 +2343,11 @@ package body Checks is
-- Extract the subprogram specification and declaration nodes
Subp_Spec := Parent (Subp);
if Nkind (Subp_Spec) = N_Defining_Program_Unit_Name then
Subp_Spec := Parent (Subp_Spec);
end if;
Subp_Decl := Parent (Subp_Spec);
if not Comes_From_Source (Subp)
@ -2354,28 +2357,28 @@ package body Checks is
or else Is_Formal_Subprogram (Subp)
-- Do not process imported subprograms since pre and post conditions
-- are never verified on routines coming from a different language.
-- Do not process imported subprograms since pre and post conditions
-- are never verified on routines coming from a different language.
or else Is_Imported (Subp)
or else Is_Intrinsic_Subprogram (Subp)
-- The PPC pragmas generated by this routine do not correspond to
-- source aspects, therefore they cannot be applied to abstract
-- subprograms.
-- The PPC pragmas generated by this routine do not correspond to
-- source aspects, therefore they cannot be applied to abstract
-- subprograms.
or else Nkind (Subp_Decl) = N_Abstract_Subprogram_Declaration
-- Do not consider subprogram renaminds because the renamed entity
-- already has the proper PPC pragmas.
-- Do not consider subprogram renaminds because the renamed entity
-- already has the proper PPC pragmas.
or else Nkind (Subp_Decl) = N_Subprogram_Renaming_Declaration
-- Do not process null procedures because there is no benefit of
-- adding the checks to a no action routine.
-- Do not process null procedures because there is no benefit of
-- adding the checks to a no action routine.
or else (Nkind (Subp_Spec) = N_Procedure_Specification
and then Null_Present (Subp_Spec))
and then Null_Present (Subp_Spec))
then
return;
end if;
@ -2406,14 +2409,11 @@ package body Checks is
Next_Formal (Formal);
end loop;
-- Generate the following scalar initialization check for a function
-- result:
-- Generate following scalar initialization check for function result:
-- Post => Subp'Result'Valid[_Scalars]
if Check_Validity_Of_Parameters
and then Ekind (Subp) = E_Function
then
if Check_Validity_Of_Parameters and then Ekind (Subp) = E_Function then
Add_Validity_Check (Subp, Name_Postcondition, True);
end if;
end Apply_Parameter_Validity_Checks;
@ -2465,8 +2465,8 @@ package body Checks is
if Is_OK_Static_Expression (N) then
if Present (Static_Predicate (Typ)) then
if Operating_Mode < Generate_Code or else
Eval_Static_Predicate_Check (N, Typ)
if Operating_Mode < Generate_Code
or else Eval_Static_Predicate_Check (N, Typ)
then
return;
else

View file

@ -7808,6 +7808,10 @@ package body Exp_Ch4 is
begin
Binary_Op_Validity_Checks (N);
if Is_Integer_Type (Etype (N)) then
Apply_Divide_Checks (N);
end if;
Determine_Range (Right, ROK, Rlo, Rhi, Assume_Valid => True);
Determine_Range (Left, LOK, Llo, Lhi, Assume_Valid => True);
@ -7839,10 +7843,6 @@ package body Exp_Ch4 is
-- Otherwise, normal mod processing
else
if Is_Integer_Type (Etype (N)) then
Apply_Divide_Checks (N);
end if;
-- Apply optimization x mod 1 = 0. We don't really need that with
-- gcc, but it is useful with other back ends (e.g. AAMP), and is
-- certainly harmless.
@ -7870,32 +7870,39 @@ package body Exp_Ch4 is
-- the mod value is always 0, and we can just ignore the left operand
-- completely in this case.
-- The operand type may be private (e.g. in the expansion of an
-- intrinsic operation) so we must use the underlying type to get the
-- bounds, and convert the literals explicitly.
-- This only applies if we still have a mod operator. Skip if we
-- have already rewritten this (e.g. in the case of eliminated
-- overflow checks which have driven us into bignum mode).
LLB :=
Expr_Value
(Type_Low_Bound (Base_Type (Underlying_Type (Etype (Left)))));
if Nkind (N) = N_Op_Mod then
if ((not ROK) or else (Rlo <= (-1) and then (-1) <= Rhi))
and then
((not LOK) or else (Llo = LLB))
then
Rewrite (N,
Make_Conditional_Expression (Loc,
Expressions => New_List (
Make_Op_Eq (Loc,
Left_Opnd => Duplicate_Subexpr (Right),
Right_Opnd =>
Unchecked_Convert_To (Typ,
Make_Integer_Literal (Loc, -1))),
Unchecked_Convert_To (Typ,
Make_Integer_Literal (Loc, Uint_0)),
Relocate_Node (N))));
-- The operand type may be private (e.g. in the expansion of an
-- intrinsic operation) so we must use the underlying type to get
-- the bounds, and convert the literals explicitly.
Set_Analyzed (Next (Next (First (Expressions (N)))));
Analyze_And_Resolve (N, Typ);
LLB :=
Expr_Value
(Type_Low_Bound (Base_Type (Underlying_Type (Etype (Left)))));
if ((not ROK) or else (Rlo <= (-1) and then (-1) <= Rhi))
and then
((not LOK) or else (Llo = LLB))
then
Rewrite (N,
Make_Conditional_Expression (Loc,
Expressions => New_List (
Make_Op_Eq (Loc,
Left_Opnd => Duplicate_Subexpr (Right),
Right_Opnd =>
Unchecked_Convert_To (Typ,
Make_Integer_Literal (Loc, -1))),
Unchecked_Convert_To (Typ,
Make_Integer_Literal (Loc, Uint_0)),
Relocate_Node (N))));
Set_Analyzed (Next (Next (First (Expressions (N)))));
Analyze_And_Resolve (N, Typ);
end if;
end if;
end if;
end Expand_N_Op_Mod;

View file

@ -3643,8 +3643,8 @@ package body Exp_Ch7 is
-- iterator specification, where a block is created for the expression
-- that build the container.
elsif Nkind (Wrap_Node) = N_Iteration_Scheme
or else Nkind (Wrap_Node) = N_Iterator_Specification
elsif Nkind_In (Wrap_Node, N_Iteration_Scheme,
N_Iterator_Specification)
then
null;

View file

@ -2665,12 +2665,11 @@ package body Freeze is
Apply_Parameter_Validity_Checks (E);
end if;
-- Deal with delayed aspect specifications. The analysis of the
-- aspect is required to be delayed to the freeze point, thus we
-- analyze the pragma or attribute definition clause in the tree at
-- this point. We also analyze the aspect specification node at the
-- freeze point when the aspect doesn't correspond to
-- pragma/attribute definition clause.
-- Deal with delayed aspect specifications. The analysis of the aspect
-- is required to be delayed to the freeze point, thus we analyze the
-- pragma or attribute definition clause in the tree at this point. We
-- also analyze the aspect specification node at the freeze point when
-- the aspect doesn't correspond to pragma/attribute definition clause.
if Has_Delayed_Aspects (E) then
Analyze_Aspects_At_Freeze_Point (E);

View file

@ -6730,6 +6730,10 @@ A unary plus or minus may not be followed by a space.
A vertical bar must be surrounded by spaces.
@end itemize
@item
Exactly one blank (and no other white space) must appear between
a @code{not} token and a following @code{in} token.
@item ^u^UNNECESSARY_BLANK_LINES^
@emph{Check unnecessary blank lines.}
Unnecessary blank lines are not allowed. A blank line is considered

View file

@ -2706,7 +2706,16 @@ package body Ch4 is
Scan; -- past operator token
-- Deal with NOT IN, if previous token was NOT, we must have IN now
if Prev_Token = Tok_Not then
-- Style check, for NOT IN, we require one space between NOT and IN
if Style_Check and then Token = Tok_In then
Style.Check_Not_In;
end if;
T_In;
end if;

View file

@ -228,10 +228,12 @@ package body Prj.Part is
Env : in out Environment);
-- Parse the imported projects that have been stored in table Withs, if
-- any. From_Extended is used for the call to Parse_Single_Project below.
--
-- When In_Limited is True, the importing path includes at least one
-- "limited with". When Limited_Withs is False, only non limited withed
-- projects are parsed. When Limited_Withs is True, only limited withed
-- projects are parsed.
--
-- Is_Config_File should be set to True if the project represents a config
-- file (.cgpr) since some specific checks apply.
@ -943,8 +945,8 @@ package body Prj.Part is
-- If we have one, get the project id of the limited
-- imported project file, and do not parse it.
if (In_Limited or else Limited_Withs) and then
Project_Stack.Last > 1
if (In_Limited or Limited_Withs)
and then Project_Stack.Last > 1
then
declare
Canonical_Path_Name : Path_Name_Type;
@ -969,7 +971,7 @@ package body Prj.Part is
end;
end if;
-- Parse the imported project, if its project id is unknown
-- Parse the imported project if its project id is unknown
if No (Withed_Project) then
Parse_Single_Project
@ -979,7 +981,7 @@ package body Prj.Part is
Path_Name_Id => Imported_Path_Name_Id,
Extended => False,
From_Extended => From_Extended,
In_Limited => In_Limited or else Limited_Withs,
In_Limited => In_Limited or Limited_Withs,
Packages_To_Check => Packages_To_Check,
Depth => Depth,
Current_Dir => Current_Dir,

View file

@ -2073,7 +2073,8 @@ package body Sem_Ch13 is
Indexing_Found : Boolean;
procedure Check_One_Function (Subp : Entity_Id);
-- Check one possible interpretation
-- Check one possible interpretation. Sets Indexing_Found True if an
-- indexing function is found.
------------------------
-- Check_One_Function --
@ -2096,10 +2097,11 @@ package body Sem_Ch13 is
-- An indexing function must return either the default element of
-- the container, or a reference type. For variable indexing it
-- must be latter.
-- must be the latter.
if Present (Default_Element) then
Analyze (Default_Element);
if Is_Entity_Name (Default_Element)
and then Covers (Entity (Default_Element), Etype (Subp))
then
@ -2108,7 +2110,7 @@ package body Sem_Ch13 is
end if;
end if;
-- For variable_indexing the return type must be a reference type.
-- For variable_indexing the return type must be a reference type
if Attr = Name_Variable_Indexing
and then not Has_Implicit_Dereference (Etype (Subp))
@ -2153,10 +2155,11 @@ package body Sem_Ch13 is
Get_Next_Interp (I, It);
end loop;
if not Indexing_Found then
Error_Msg_NE (
"aspect Indexing requires a function that applies to type&",
Expr, Ent);
Error_Msg_NE
("aspect Indexing requires a function that "
& "applies to type&", Expr, Ent);
end if;
end;
end if;

View file

@ -3422,8 +3422,8 @@ package body Sem_Ch4 is
if Is_Array_Type (Typ)
and then Compile_Time_Known_Bounds (Typ)
and then
(Expr_Value (Type_Low_Bound (Etype (First_Index (Typ))))
> Expr_Value (Type_High_Bound (Etype (First_Index (Typ)))))
(Expr_Value (Type_Low_Bound (Etype (First_Index (Typ)))) >
Expr_Value (Type_High_Bound (Etype (First_Index (Typ)))))
then
Preanalyze_And_Resolve (Condition (N), Standard_Boolean);

View file

@ -1519,6 +1519,7 @@ package body Sem_Dim is
-- Check the dimensions of the actuals, if any
if not Is_Empty_List (Actuals) then
-- Special processing for elementary functions
-- For Sqrt call, the resulting dimensions equal to half the
@ -1532,9 +1533,9 @@ package body Sem_Dim is
function Is_Elementary_Function_Entity
(Sub_Id : Entity_Id) return Boolean;
-- Given Sub_Id, the original subprogram entity, return True if
-- call is to an elementary function
-- (see Ada.Numerics.Generic_Elementary_Functions).
-- Given Sub_Id, the original subprogram entity, return True
-- if call is to an elementary function (see Ada.Numerics.
-- Generic_Elementary_Functions).
-----------------------------------
-- Is_Elementary_Function_Entity --
@ -1546,8 +1547,7 @@ package body Sem_Dim is
Loc : constant Source_Ptr := Sloc (Sub_Id);
begin
-- Is function entity in
-- Ada.Numerics.Generic_Elementary_Functions?
-- Is entity in Ada.Numerics.Generic_Elementary_Functions?
return
Loc > No_Location
@ -1560,8 +1560,7 @@ package body Sem_Dim is
-- Start of processing for Elementary_Function_Calls
begin
-- Get the original subprogram entity following the renaming
-- chain.
-- Get original subprogram entity following the renaming chain
if Present (Alias (Ent)) then
Ent := Alias (Ent);
@ -1570,6 +1569,7 @@ package body Sem_Dim is
-- Check the call is an Elementary function call
if Is_Elementary_Function_Entity (Ent) then
-- Sqrt function call case
if Chars (Ent) = Name_Sqrt then
@ -1582,8 +1582,7 @@ package body Sem_Dim is
for Position in Dims_Of_Call'Range loop
Dims_Of_Call (Position) :=
Dims_Of_Call (Position) *
Rational'(Numerator => 1,
Denominator => 2);
Rational'(Numerator => 1, Denominator => 2);
end loop;
Set_Dimensions (N, Dims_Of_Call);
@ -1597,8 +1596,7 @@ package body Sem_Dim is
while Present (Actual) loop
if Exists (Dimensions_Of (Actual)) then
-- Check if error has already been encountered so
-- far.
-- Check if error has already been encountered
if not Error_Detected then
Error_Msg_NE ("dimensions mismatch in call of&",
@ -1645,10 +1643,9 @@ package body Sem_Dim is
Error_Detected := True;
end if;
Error_Msg_N ("\expected dimension " &
Dimensions_Msg_Of (Formal_Typ) & ", found " &
Dimensions_Msg_Of (Actual),
Actual);
Error_Msg_N
("\expected dimension " & Dimensions_Msg_Of (Formal_Typ)
& ", found " & Dimensions_Msg_Of (Actual), Actual);
end if;
Next_Actual (Actual);
@ -1916,7 +1913,7 @@ package body Sem_Dim is
procedure Analyze_Dimension_Has_Etype (N : Node_Id) is
Etyp : constant Entity_Id := Etype (N);
Dims_Of_Etyp : Dimension_Type := Dimensions_Of (Etyp);
Dims_Of_Etyp : Dimension_Type := Dimensions_Of (Etyp);
begin
-- General case. Propagation of the dimensions from the type
@ -1955,7 +1952,6 @@ package body Sem_Dim is
-- Removal of dimensions in expression
case Nkind (N) is
when N_Attribute_Reference |
N_Indexed_Component =>
declare
@ -1981,7 +1977,6 @@ package body Sem_Dim is
Remove_Dimensions (Selector_Name (N));
when others => null;
end case;
end Analyze_Dimension_Has_Etype;

View file

@ -164,7 +164,7 @@ package Sem_Dim is
procedure Copy_Dimensions (From, To : Node_Id);
-- Copy dimension vector of node From to node To. Note that To must be a
-- node that is allowed to contain a dimension. (See OK_For_Dimension in
-- node that is allowed to contain a dimension (see OK_For_Dimension in
-- body of Sem_Dim).
procedure Eval_Op_Expon_For_Dimensioned_Type

View file

@ -11817,7 +11817,7 @@ package body Sem_Prag is
-- Process first argument
Suppress_Options.Overflow_Checks_General :=
Scope_Suppress.Overflow_Checks_General :=
Get_Check_Mode (Name_General, Arg1);
-- Case of only one argument

View file

@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2010, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2012, 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- --
@ -155,6 +155,11 @@ package Style is
-- check the line length (Len is the length of the current line). Note that
-- the terminator may be the EOF character.
procedure Check_Not_In
renames Style_Inst.Check_Not_In;
-- Called with Scan_Ptr pointing to an IN token, and Prev_Token_Ptr
-- pointing to a NOT token. Used to check proper layout of NOT IN.
procedure Check_Pragma_Name
renames Style_Inst.Check_Pragma_Name;
-- The current token is a pragma identifier. Check that it is spelled

View file

@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2012, 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- --
@ -764,6 +764,24 @@ package body Styleg is
end if;
end Check_Line_Terminator;
------------------
-- Check_Not_In --
------------------
-- In check tokens mode, only one space between NOT and IN
procedure Check_Not_In is
begin
if Style_Check_Tokens then
if Source (Token_Ptr - 1) /= ' '
or else Token_Ptr - Prev_Token_Ptr /= 4
then -- CODEFIX?
Error_Msg
("(style) single space must separate NOT and IN", Token_Ptr - 1);
end if;
end if;
end Check_Not_In;
--------------------------
-- Check_No_Space_After --
--------------------------

View file

@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2010, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2012, 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- --
@ -117,6 +117,10 @@ package Styleg is
-- the current line, used to check for appropriate line terminator usage.
-- The parameter Len is the length of the current line.
procedure Check_Not_In;
-- Called with Scan_Ptr pointing to an IN token, and Prev_Token_Ptr
-- pointing to a NOT token. Used to check proper layout of NOT IN.
procedure Check_Pragma_Name;
-- The current token is a pragma identifier. Check that it is spelled
-- properly (i.e. with an appropriate casing convention).

View file

@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2012, 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- --
@ -255,6 +255,8 @@ package Stylesw is
--
-- A unary plus or minus may not be followed by a space
--
-- There must be one blank (and no other white space) between NOT and IN
--
-- A vertical bar must be surrounded by spaces
--
-- Note that a requirement that a token be preceded by a space is met by