From: Eric Botcazou Date: Tue, 14 Apr 2020 09:20:18 +0000 (+0200) Subject: [Ada] Couple of small tweaks related to integer conversions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4ea4df3af88f33686813b7db70fbe3e37b7dfecc;p=gcc.git [Ada] Couple of small tweaks related to integer conversions 2020-06-17 Eric Botcazou gcc/ada/ * exp_attr.adb (Get_Integer_Type): Use standard types without a specific size. * sem_res.adb (Resolve_Unchecked_Type_Conversion): Remove a redundant intermediate conversion to Universal_Integer. --- diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb index ea36be02100..888b112d80e 100644 --- a/gcc/ada/exp_attr.adb +++ b/gcc/ada/exp_attr.adb @@ -1756,17 +1756,17 @@ package body Exp_Attr is begin -- We need to accommodate unsigned values - if Siz < 8 then - Int_Typ := Standard_Integer_8; + if Siz < RM_Size (Standard_Short_Short_Integer) then + Int_Typ := Standard_Short_Short_Integer; - elsif Siz < 16 then - Int_Typ := Standard_Integer_16; + elsif Siz < RM_Size (Standard_Short_Integer) then + Int_Typ := Standard_Short_Integer; - elsif Siz < 32 then - Int_Typ := Standard_Integer_32; + elsif Siz < RM_Size (Standard_Integer) then + Int_Typ := Standard_Integer; else - Int_Typ := Standard_Integer_64; + Int_Typ := Standard_Long_Long_Integer; end if; return Int_Typ; diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 4267626058e..7e653502889 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -11998,6 +11998,18 @@ package body Sem_Res is Resolve (Operand, Opnd_Type); + -- If the expression is a conversion to universal integer of an + -- an expression with an integer type, then we can eliminate the + -- intermediate conversion to universal integer. + + if Nkind (Operand) = N_Type_Conversion + and then Entity (Subtype_Mark (Operand)) = Universal_Integer + and then Is_Integer_Type (Etype (Expression (Operand))) + then + Rewrite (Operand, Relocate_Node (Expression (Operand))); + Analyze_And_Resolve (Operand); + end if; + -- In an inlined context, the unchecked conversion may be applied -- to a literal, in which case its type is the type of the context. -- (In other contexts conversions cannot apply to literals).