aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2021-11-03 17:38:53 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2021-11-10 08:57:39 +0000
commit55a213950e9584ca84e96dc52ba496ff88de7bc8 (patch)
treead27000347565896828d64c5d5d94ec86afd6043 /gcc
parent94396a27bcfbdcb156586688de9a5a2e1bee2d4a (diff)
downloadgcc-55a213950e9584ca84e96dc52ba496ff88de7bc8.zip
gcc-55a213950e9584ca84e96dc52ba496ff88de7bc8.tar.gz
gcc-55a213950e9584ca84e96dc52ba496ff88de7bc8.tar.bz2
[Ada] Fix oversight in latest change to Has_Compatible_Type
gcc/ada/ * sem_type.ads (Has_Compatible_Type): Add For_Comparison parameter. * sem_type.adb (Has_Compatible_Type): Put back the reversed calls to Covers guarded with For_Comparison. * sem_ch4.adb (Analyze_Membership_Op) <Try_One_Interp>: Remove new reversed call to Covers and set For_Comparison to true instead. (Find_Comparison_Types) <Try_One_Interp>: Likewise (Find_Equality_Types) <Try_One_Interp>: Likewise.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/sem_ch4.adb9
-rw-r--r--gcc/ada/sem_type.adb16
-rw-r--r--gcc/ada/sem_type.ads10
3 files changed, 26 insertions, 9 deletions
diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb
index 6a3d857..77c1b97 100644
--- a/gcc/ada/sem_ch4.adb
+++ b/gcc/ada/sem_ch4.adb
@@ -3113,7 +3113,7 @@ package body Sem_Ch4 is
procedure Try_One_Interp (T1 : Entity_Id) is
begin
- if Has_Compatible_Type (R, T1) or else Covers (Etype (R), T1) then
+ if Has_Compatible_Type (R, T1, For_Comparison => True) then
if Found
and then Base_Type (T1) /= Base_Type (T_F)
then
@@ -6607,8 +6607,7 @@ package body Sem_Ch4 is
end if;
if Valid_Comparison_Arg (T1)
- and then (Has_Compatible_Type (R, T1)
- or else Covers (Etype (R), T1))
+ and then Has_Compatible_Type (R, T1, For_Comparison => True)
then
if Found and then Base_Type (T1) /= Base_Type (T_F) then
It := Disambiguate (L, I_F, Index, Any_Type);
@@ -7105,8 +7104,8 @@ package body Sem_Ch4 is
if T1 /= Standard_Void_Type
and then (Universal_Access
- or else Has_Compatible_Type (R, T1)
- or else Covers (Etype (R), T1))
+ or else
+ Has_Compatible_Type (R, T1, For_Comparison => True))
and then
((not Is_Limited_Type (T1)
diff --git a/gcc/ada/sem_type.adb b/gcc/ada/sem_type.adb
index 923c8f9..4419fb3 100644
--- a/gcc/ada/sem_type.adb
+++ b/gcc/ada/sem_type.adb
@@ -2438,8 +2438,9 @@ package body Sem_Type is
-------------------------
function Has_Compatible_Type
- (N : Node_Id;
- Typ : Entity_Id) return Boolean
+ (N : Node_Id;
+ Typ : Entity_Id;
+ For_Comparison : Boolean := False) return Boolean
is
I : Interp_Index;
It : Interp;
@@ -2479,6 +2480,12 @@ package body Sem_Type is
or else
(Nkind (N) = N_String_Literal
and then Present (Find_Aspect (Typ, Aspect_String_Literal)))
+
+ or else
+ (For_Comparison
+ and then not Is_Tagged_Type (Typ)
+ and then Ekind (Typ) /= E_Anonymous_Access_Type
+ and then Covers (Etype (N), Typ))
then
return True;
end if;
@@ -2503,6 +2510,11 @@ package body Sem_Type is
and then Covers (Typ, Corresponding_Record_Type
(Etype (It.Typ))))
+ or else
+ (For_Comparison
+ and then not Is_Tagged_Type (Typ)
+ and then Ekind (Typ) /= E_Anonymous_Access_Type
+ and then Covers (It.Typ, Typ))
then
return True;
end if;
diff --git a/gcc/ada/sem_type.ads b/gcc/ada/sem_type.ads
index 018c283..dfe4c7c 100644
--- a/gcc/ada/sem_type.ads
+++ b/gcc/ada/sem_type.ads
@@ -186,11 +186,17 @@ package Sem_Type is
-- right operand, which has one interpretation compatible with that of L.
-- Return the type intersection of the two.
- function Has_Compatible_Type (N : Node_Id; Typ : Entity_Id) return Boolean;
+ function Has_Compatible_Type
+ (N : Node_Id;
+ Typ : Entity_Id;
+ For_Comparison : Boolean := False) return Boolean;
-- Verify that some interpretation of the node N has a type compatible with
-- Typ. If N is not overloaded, then its unique type must be compatible
-- with Typ. Otherwise iterate through the interpretations of N looking for
- -- a compatible one.
+ -- a compatible one. If For_Comparison is true, the function is invoked for
+ -- a comparison (or equality) operator and also needs to verify the reverse
+ -- compatibility, because the implementation of type resolution for these
+ -- operators is not fully symmetrical.
function Hides_Op (F : Entity_Id; Op : Entity_Id) return Boolean;
-- A user-defined function hides a predefined operator if it matches the