This patch corrects the resolution of operator "not" when the expression
being negated is an equality operator to prevent the transformation of
an intrinsic equality operator into a function call.
Tested on x86_64-pc-linux-gnu, committed on trunk
2019-07-11 Hristian Kirtchev <kirtc...@adacore.com>
gcc/ada/
* sem_res.adb (Resolve_Op_Not): Do not rewrite an equality
operator into a function call when the operator is intrinsic.
gcc/testsuite/
* gnat.dg/equal9.adb: New testcase.
--- gcc/ada/sem_res.adb
+++ gcc/ada/sem_res.adb
@@ -10091,15 +10091,20 @@ package body Sem_Res is
declare
Opnd : constant Node_Id := Right_Opnd (N);
+ Op_Id : Entity_Id;
+
begin
if B_Typ = Standard_Boolean
and then Nkind_In (Opnd, N_Op_Eq, N_Op_Ne)
and then Is_Overloaded (Opnd)
then
Resolve_Equality_Op (Opnd, B_Typ);
+ Op_Id := Entity (Opnd);
- if Ekind (Entity (Opnd)) = E_Function then
- Rewrite_Operator_As_Call (Opnd, Entity (Opnd));
+ if Ekind (Op_Id) = E_Function
+ and then not Is_Intrinsic_Subprogram (Op_Id)
+ then
+ Rewrite_Operator_As_Call (Opnd, Op_Id);
end if;
if not Inside_A_Generic or else Is_Entity_Name (Opnd) then
--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/equal9.adb
@@ -0,0 +1,26 @@
+-- { dg-do run }
+
+with Ada.Text_IO; use Ada.Text_IO;
+with System; use System;
+
+procedure Equal9 is
+ Val : Address := Null_Address;
+begin
+ if Val = Null_Address then
+ Put_Line ("= OK");
+ else
+ raise Program_Error;
+ end if;
+
+ if Val /= Null_Address then
+ raise Program_Error;
+ else
+ Put_Line ("/= OK");
+ end if;
+
+ if not (Val = Null_Address) then
+ raise Program_Error;
+ else
+ Put_Line ("not = OK");
+ end if;
+end Equal9;