1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Atree
; use Atree
;
27 with Casing
; use Casing
;
28 with Csets
; use Csets
;
29 with Einfo
; use Einfo
;
30 with Errout
; use Errout
;
31 with Namet
; use Namet
;
32 with Sinfo
; use Sinfo
;
33 with Sinput
; use Sinput
;
34 with Stand
; use Stand
;
35 with Stylesw
; use Stylesw
;
39 -----------------------
40 -- Body_With_No_Spec --
41 -----------------------
43 -- If the check specs mode (-gnatys) is set, then all subprograms must
44 -- have specs unless they are parameterless procedures at the library
45 -- level (i.e. they are possible main programs).
47 procedure Body_With_No_Spec
(N
: Node_Id
) is
49 if Style_Check_Specs
then
50 if Nkind
(Parent
(N
)) = N_Compilation_Unit
then
52 Spec
: constant Node_Id
:= Specification
(N
);
53 Defnm
: constant Node_Id
:= Defining_Unit_Name
(Spec
);
56 if Nkind
(Spec
) = N_Procedure_Specification
57 and then Nkind
(Defnm
) = N_Defining_Identifier
58 and then No
(First_Formal
(Defnm
))
65 Error_Msg_N
("(style) subprogram body has no previous spec", N
);
67 end Body_With_No_Spec
;
69 ---------------------------------
70 -- Check_Array_Attribute_Index --
71 ---------------------------------
73 procedure Check_Array_Attribute_Index
79 if Style_Check_Array_Attribute_Index
then
80 if D
= 1 and then Present
(E1
) then
81 Error_Msg_N
-- CODEFIX
82 ("(style) index number not allowed for one dimensional array",
84 elsif D
> 1 and then No
(E1
) then
85 Error_Msg_N
-- CODEFIX
86 ("(style) index number required for multi-dimensional array",
90 end Check_Array_Attribute_Index
;
92 ----------------------
93 -- Check_Identifier --
94 ----------------------
96 -- In check references mode (-gnatyr), identifier uses must be cased
97 -- the same way as the corresponding identifier declaration. If standard
98 -- references are checked (-gnatyn), then identifiers from Standard must
99 -- be cased as in the Reference Manual.
101 procedure Check_Identifier
102 (Ref
: Node_Or_Entity_Id
;
103 Def
: Node_Or_Entity_Id
)
105 Sref
: Source_Ptr
:= Sloc
(Ref
);
106 Sdef
: Source_Ptr
:= Sloc
(Def
);
107 Tref
: Source_Buffer_Ptr
;
108 Tdef
: Source_Buffer_Ptr
;
113 -- If reference does not come from source, nothing to check
115 if not Comes_From_Source
(Ref
) then
118 -- If previous error on either node/entity, ignore
120 elsif Error_Posted
(Ref
) or else Error_Posted
(Def
) then
123 -- Case of definition comes from source
125 elsif Comes_From_Source
(Def
) then
127 -- Check same casing if we are checking references
129 if Style_Check_References
then
130 Tref
:= Source_Text
(Get_Source_File_Index
(Sref
));
131 Tdef
:= Source_Text
(Get_Source_File_Index
(Sdef
));
133 -- Ignore operator name case completely. This also catches the
134 -- case of where one is an operator and the other is not. This
135 -- is a phenomenon from rewriting of operators as functions,
136 -- and is to be ignored.
138 if Tref
(Sref
) = '"' or else Tdef
(Sdef
) = '"' then
142 while Tref
(Sref
) = Tdef
(Sdef
) loop
144 -- If end of identifier, all done
146 if not Identifier_Char
(Tref
(Sref
)) then
149 -- Otherwise loop continues
157 -- Fall through loop when mismatch between identifiers
158 -- If either identifier is not terminated, error.
160 if Identifier_Char
(Tref
(Sref
))
162 Identifier_Char
(Tdef
(Sdef
))
164 Error_Msg_Node_1
:= Def
;
165 Error_Msg_Sloc
:= Sloc
(Def
);
167 ("(style) bad casing of & declared#", Sref
);
170 -- Else end of identifiers, and they match
178 -- Case of definition in package Standard
180 elsif Sdef
= Standard_Location
182 Sdef
= Standard_ASCII_Location
184 -- Check case of identifiers in Standard
186 if Style_Check_Standard
then
187 Tref
:= Source_Text
(Get_Source_File_Index
(Sref
));
191 if Tref
(Sref
) = '"' then
194 -- Otherwise determine required casing of Standard entity
197 -- ASCII is all upper case
199 if Entity
(Ref
) = Standard_ASCII
then
200 Cas
:= All_Upper_Case
;
202 -- Special handling for names in package ASCII
204 elsif Sdef
= Standard_ASCII_Location
then
206 Nam
: constant String := Get_Name_String
(Chars
(Def
));
214 -- All names longer than 4 characters are mixed case
216 elsif Nam
'Length > 4 then
219 -- All names shorter than 4 characters (other than Bar,
220 -- which we already tested for specially) are Upper case.
223 Cas
:= All_Upper_Case
;
227 -- All other entities are in mixed case
233 Nlen
:= Length_Of_Name
(Chars
(Ref
));
235 -- Now check if we have the right casing
238 (Tref
(Sref
.. Sref
+ Source_Ptr
(Nlen
) - 1)) = Cas
242 Name_Len
:= Integer (Nlen
);
243 Name_Buffer
(1 .. Name_Len
) :=
244 String (Tref
(Sref
.. Sref
+ Source_Ptr
(Nlen
) - 1));
246 Error_Msg_Name_1
:= Name_Enter
;
247 Error_Msg_N
-- CODEFIX
248 ("(style) bad casing of %% declared in Standard", Ref
);
253 end Check_Identifier
;
255 ------------------------
256 -- Missing_Overriding --
257 ------------------------
259 procedure Missing_Overriding
(N
: Node_Id
; E
: Entity_Id
) is
262 -- Perform the check on source subprograms and on subprogram instances,
263 -- because these can be primitives of untagged types.
265 if Style_Check_Missing_Overriding
266 and then (Comes_From_Source
(N
) or else Is_Generic_Instance
(E
))
268 if Nkind
(N
) = N_Subprogram_Body
then
269 Error_Msg_NE
-- CODEFIX
270 ("(style) missing OVERRIDING indicator in body of&", N
, E
);
272 Error_Msg_NE
-- CODEFIX
273 ("(style) missing OVERRIDING indicator in declaration of&",
277 end Missing_Overriding
;
279 -----------------------------------
280 -- Subprogram_Not_In_Alpha_Order --
281 -----------------------------------
283 procedure Subprogram_Not_In_Alpha_Order
(Name
: Node_Id
) is
285 if Style_Check_Order_Subprograms
then
286 Error_Msg_N
-- CODEFIX
287 ("(style) subprogram body& not in alphabetical order", Name
);
289 end Subprogram_Not_In_Alpha_Order
;