-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2021, 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- --
--- ware Foundation; either version 2, or (at your option) any later ver- --
+-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
--- Public License distributed with GNAT; see file COPYING. If not, write --
--- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
--- MA 02111-1307, USA. --
+-- Public License distributed with GNAT; see file COPYING3. If not, go to --
+-- http://www.gnu.org/licenses for a complete copy of the license. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
-with Atree; use Atree;
-with Errout; use Errout;
-with Opt; use Opt;
-with Restrict; use Restrict;
-with Rident; use Rident;
-with Sem_Ch8; use Sem_Ch8;
-with Sinfo; use Sinfo;
-with Stand; use Stand;
+with Atree; use Atree;
+with Einfo; use Einfo;
+with Einfo.Utils; use Einfo.Utils;
+with Namet; use Namet;
+with Opt; use Opt;
+with Restrict; use Restrict;
+with Rident; use Rident;
+with Sem_Ch8; use Sem_Ch8;
+with Sem_Dim; use Sem_Dim;
+with Sinfo; use Sinfo;
+with Sinfo.Nodes; use Sinfo.Nodes;
+with Stand; use Stand;
+with Uintp; use Uintp;
package body Sem_Ch2 is
Set_Is_Static_Expression (N);
if Comes_From_Source (N)
- and then not In_Character_Range (Char_Literal_Value (N))
+ and then not In_Character_Range (UI_To_CC (Char_Literal_Value (N)))
then
Check_Restriction (No_Wide_Characters, N);
end if;
-- this is the result of some kind of previous error generating a
-- junk identifier.
- if Chars (N) in Error_Name_Or_No_Name
- and then Total_Errors_Detected /= 0
- then
+ if not Is_Valid_Name (Chars (N)) and then Total_Errors_Detected /= 0 then
return;
else
Find_Direct_Name (N);
end if;
+
+ Analyze_Dimension (N);
end Analyze_Identifier;
-----------------------------
procedure Analyze_Integer_Literal (N : Node_Id) is
begin
- Set_Etype (N, Universal_Integer);
+ -- As a lexical element, an integer literal has type Universal_Integer,
+ -- i.e., is compatible with any integer type. This is semantically
+ -- consistent and simplifies type checking and subsequent constant
+ -- folding when needed. An exception is caused by 64-bit modular types,
+ -- whose upper bound is not representable in a nonstatic context that
+ -- will use 64-bit integers at run time. For such cases, we need to
+ -- preserve the information that the analyzed literal has that modular
+ -- type. For simplicity, we preserve the information for all integer
+ -- literals that result from a modular operation. This happens after
+ -- prior analysis (or construction) of the literal, and after type
+ -- checking and resolution.
+
+ if No (Etype (N)) or else not Is_Modular_Integer_Type (Etype (N)) then
+ Set_Etype (N, Universal_Integer);
+ end if;
+
Set_Is_Static_Expression (N);
end Analyze_Integer_Literal;