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 -- Processing for intrinsic subprogram declarations
28 with Atree
; use Atree
;
29 with Einfo
; use Einfo
;
30 with Errout
; use Errout
;
31 with Fname
; use Fname
;
33 with Namet
; use Namet
;
34 with Sem_Aux
; use Sem_Aux
;
35 with Sem_Eval
; use Sem_Eval
;
36 with Sem_Util
; use Sem_Util
;
37 with Sinfo
; use Sinfo
;
38 with Snames
; use Snames
;
39 with Stand
; use Stand
;
40 with Stringt
; use Stringt
;
41 with Targparm
; use Targparm
;
42 with Uintp
; use Uintp
;
44 package body Sem_Intr
is
46 -----------------------
47 -- Local Subprograms --
48 -----------------------
50 procedure Check_Exception_Function
(E
: Entity_Id
; N
: Node_Id
);
51 -- Check use of intrinsic Exception_Message, Exception_Info or
52 -- Exception_Name, as used in the DEC compatible Current_Exceptions
53 -- package. In each case we must have a parameterless function that
54 -- returns type String.
56 procedure Check_Intrinsic_Operator
(E
: Entity_Id
; N
: Node_Id
);
57 -- Check that operator is one of the binary arithmetic operators, and that
58 -- the types involved both have underlying integer types.
60 procedure Check_Shift
(E
: Entity_Id
; N
: Node_Id
);
61 -- Check intrinsic shift subprogram, the two arguments are the same
62 -- as for Check_Intrinsic_Subprogram (i.e. the entity of the subprogram
63 -- declaration, and the node for the pragma argument, used for messages)
65 procedure Errint
(Msg
: String; S
: Node_Id
; N
: Node_Id
);
66 -- Post error message for bad intrinsic, the message itself is posted
67 -- on the appropriate spec node and another message is placed on the
68 -- pragma itself, referring to the spec. S is the node in the spec on
69 -- which the message is to be placed, and N is the pragma argument node.
71 ------------------------------
72 -- Check_Exception_Function --
73 ------------------------------
75 procedure Check_Exception_Function
(E
: Entity_Id
; N
: Node_Id
) is
77 if not Ekind_In
(E
, E_Function
, E_Generic_Function
) then
79 ("intrinsic exception subprogram must be a function", E
, N
);
81 elsif Present
(First_Formal
(E
)) then
83 ("intrinsic exception subprogram may not have parameters",
87 elsif Etype
(E
) /= Standard_String
then
89 ("return type of exception subprogram must be String", E
, N
);
92 end Check_Exception_Function
;
94 --------------------------
95 -- Check_Intrinsic_Call --
96 --------------------------
98 procedure Check_Intrinsic_Call
(N
: Node_Id
) is
99 Nam
: constant Entity_Id
:= Entity
(Name
(N
));
100 Arg1
: constant Node_Id
:= First_Actual
(N
);
107 -- Set argument type if argument present
109 if Present
(Arg1
) then
111 Rtyp
:= Underlying_Type
(Root_Type
(Typ
));
114 -- Set intrinsic name (getting original name in the generic case)
116 Unam
:= Ultimate_Alias
(Nam
);
118 if Present
(Parent
(Unam
))
119 and then Present
(Generic_Parent
(Parent
(Unam
)))
121 Cnam
:= Chars
(Generic_Parent
(Parent
(Unam
)));
126 -- For Import_xxx calls, argument must be static string. A string
127 -- literal is legal even in Ada 83 mode, where such literals are
130 if Nam_In
(Cnam
, Name_Import_Address
,
131 Name_Import_Largest_Value
,
134 if Etype
(Arg1
) = Any_Type
135 or else Raises_Constraint_Error
(Arg1
)
139 elsif Nkind
(Arg1
) /= N_String_Literal
140 and then not Is_Static_Expression
(Arg1
)
143 ("call to & requires static string argument!", N
, Nam
);
144 Why_Not_Static
(Arg1
);
146 elsif String_Length
(Strval
(Expr_Value_S
(Arg1
))) = 0 then
148 ("call to & does not permit null string", N
, Nam
);
150 elsif OpenVMS_On_Target
151 and then String_Length
(Strval
(Expr_Value_S
(Arg1
))) > 31
154 ("argument in call to & must be 31 characters or less", N
, Nam
);
157 -- Check for the case of freeing a non-null object which will raise
158 -- Constraint_Error. Issue warning here, do the expansion in Exp_Intr.
160 elsif Cnam
= Name_Unchecked_Deallocation
161 and then Can_Never_Be_Null
(Etype
(Arg1
))
164 ("freeing `NOT NULL` object will raise Constraint_Error??", N
);
166 -- For unchecked deallocation, error to deallocate from empty pool.
167 -- Note: this test used to be in Exp_Intr as a warning, but AI 157
168 -- issues a binding interpretation that this should be an error, and
169 -- consequently it needs to be done in the semantic analysis so that
170 -- the error is issued even in semantics only mode.
172 elsif Cnam
= Name_Unchecked_Deallocation
173 and then No_Pool_Assigned
(Rtyp
)
175 Error_Msg_N
("deallocation from empty storage pool!", N
);
177 -- For now, no other special checks are required
182 end Check_Intrinsic_Call
;
184 ------------------------------
185 -- Check_Intrinsic_Operator --
186 ------------------------------
188 procedure Check_Intrinsic_Operator
(E
: Entity_Id
; N
: Node_Id
) is
189 Ret
: constant Entity_Id
:= Etype
(E
);
190 Nam
: constant Name_Id
:= Chars
(E
);
195 -- Arithmetic operators
197 if Nam_In
(Nam
, Name_Op_Add
, Name_Op_Subtract
, Name_Op_Multiply
,
198 Name_Op_Divide
, Name_Op_Rem
, Name_Op_Mod
, Name_Op_Abs
)
200 T1
:= Etype
(First_Formal
(E
));
202 if No
(Next_Formal
(First_Formal
(E
))) then
203 if Nam_In
(Nam
, Name_Op_Add
, Name_Op_Subtract
, Name_Op_Abs
) then
206 -- Previous error in declaration
213 T2
:= Etype
(Next_Formal
(First_Formal
(E
)));
216 -- Same types, predefined operator will apply
218 if Root_Type
(T1
) = Root_Type
(T2
)
219 or else Root_Type
(T1
) = Root_Type
(Ret
)
223 -- Expansion will introduce conversions if sizes are not equal
225 elsif Is_Integer_Type
(Underlying_Type
(T1
))
226 and then Is_Integer_Type
(Underlying_Type
(T2
))
227 and then Is_Integer_Type
(Underlying_Type
(Ret
))
233 ("types of intrinsic operator operands do not match", E
, N
);
236 -- Comparison operators
238 elsif Nam_In
(Nam
, Name_Op_Eq
, Name_Op_Ge
, Name_Op_Gt
, Name_Op_Le
,
239 Name_Op_Lt
, Name_Op_Ne
)
241 T1
:= Etype
(First_Formal
(E
));
243 -- Return if previous error in declaration, otherwise get T2 type
245 if No
(Next_Formal
(First_Formal
(E
))) then
246 Check_Error_Detected
;
250 T2
:= Etype
(Next_Formal
(First_Formal
(E
)));
253 if Root_Type
(T1
) /= Root_Type
(T2
) then
255 ("types of intrinsic operator must have the same size", E
, N
);
258 if Root_Type
(Ret
) /= Standard_Boolean
then
260 ("result type of intrinsic comparison must be boolean", E
, N
);
265 elsif Nam
= Name_Op_Expon
then
266 T1
:= Etype
(First_Formal
(E
));
268 if No
(Next_Formal
(First_Formal
(E
))) then
270 -- Previous error in declaration
275 T2
:= Etype
(Next_Formal
(First_Formal
(E
)));
278 if not (Is_Integer_Type
(T1
)
280 Is_Floating_Point_Type
(T1
))
281 or else Root_Type
(T1
) /= Root_Type
(Ret
)
282 or else Root_Type
(T2
) /= Root_Type
(Standard_Integer
)
284 Errint
("incorrect operands for intrinsic operator", N
, E
);
287 -- All other operators (are there any?) are not handled
290 Errint
("incorrect context for ""Intrinsic"" convention", E
, N
);
294 -- The type must be fully defined and numeric.
296 if No
(Underlying_Type
(T1
))
297 or else not Is_Numeric_Type
(Underlying_Type
(T1
))
299 Errint
("intrinsic operator can only apply to numeric types", E
, N
);
301 end Check_Intrinsic_Operator
;
303 --------------------------------
304 -- Check_Intrinsic_Subprogram --
305 --------------------------------
307 procedure Check_Intrinsic_Subprogram
(E
: Entity_Id
; N
: Node_Id
) is
308 Spec
: constant Node_Id
:= Specification
(Unit_Declaration_Node
(E
));
313 and then Present
(Generic_Parent
(Spec
))
315 Nam
:= Chars
(Generic_Parent
(Spec
));
320 -- Check name is valid intrinsic name
322 Get_Name_String
(Nam
);
324 if Name_Buffer
(1) /= 'O'
325 and then Nam
/= Name_Asm
326 and then Nam
/= Name_To_Address
327 and then Nam
not in First_Intrinsic_Name
.. Last_Intrinsic_Name
329 Errint
("unrecognized intrinsic subprogram", E
, N
);
331 -- We always allow intrinsic specifications in language defined units
332 -- and in expanded code. We assume that the GNAT implementors know what
333 -- they are doing, and do not write or generate junk use of intrinsic!
335 elsif not Comes_From_Source
(E
)
336 or else not Comes_From_Source
(N
)
337 or else Is_Predefined_File_Name
338 (Unit_File_Name
(Get_Source_Unit
(N
)))
342 -- Shift cases. We allow user specification of intrinsic shift
343 -- operators for any numeric types.
345 elsif Nam_In
(Nam
, Name_Rotate_Left
, Name_Rotate_Right
, Name_Shift_Left
,
346 Name_Shift_Right
, Name_Shift_Right_Arithmetic
)
350 elsif Nam_In
(Nam
, Name_Exception_Information
,
351 Name_Exception_Message
,
354 Check_Exception_Function
(E
, N
);
356 elsif Nkind
(E
) = N_Defining_Operator_Symbol
then
357 Check_Intrinsic_Operator
(E
, N
);
359 elsif Nam_In
(Nam
, Name_File
, Name_Line
, Name_Source_Location
,
360 Name_Enclosing_Entity
)
364 -- For now, no other intrinsic subprograms are recognized in user code
367 Errint
("incorrect context for ""Intrinsic"" convention", E
, N
);
369 end Check_Intrinsic_Subprogram
;
375 procedure Check_Shift
(E
: Entity_Id
; N
: Node_Id
) is
385 if not Ekind_In
(E
, E_Function
, E_Generic_Function
) then
386 Errint
("intrinsic shift subprogram must be a function", E
, N
);
390 Arg1
:= First_Formal
(E
);
392 if Present
(Arg1
) then
393 Arg2
:= Next_Formal
(Arg1
);
398 if Arg1
= Empty
or else Arg2
= Empty
then
399 Errint
("intrinsic shift function must have two arguments", E
, N
);
403 Typ1
:= Etype
(Arg1
);
404 Typ2
:= Etype
(Arg2
);
406 Ptyp1
:= Parameter_Type
(Parent
(Arg1
));
407 Ptyp2
:= Parameter_Type
(Parent
(Arg2
));
409 if not Is_Integer_Type
(Typ1
) then
410 Errint
("first argument to shift must be integer type", Ptyp1
, N
);
414 if Typ2
/= Standard_Natural
then
415 Errint
("second argument to shift must be type Natural", Ptyp2
, N
);
419 -- type'Size (not 'Object_Size!) must be one of the allowed values
421 Size
:= UI_To_Int
(RM_Size
(Typ1
));
423 if Size
/= 8 and then
429 ("first argument for shift must have size 8, 16, 32 or 64",
433 elsif Non_Binary_Modulus
(Typ1
) then
435 ("shifts not allowed for non-binary modular types", Ptyp1
, N
);
437 elsif Etype
(Arg1
) /= Etype
(E
) then
439 ("first argument of shift must match return type", Ptyp1
, N
);
448 procedure Errint
(Msg
: String; S
: Node_Id
; N
: Node_Id
) is
450 Error_Msg_N
(Msg
, S
);
451 Error_Msg_N
("incorrect intrinsic subprogram, see spec", N
);