diff options
author | Hristian Kirtchev <kirtchev@adacore.com> | 2019-07-11 08:01:49 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-11 08:01:49 +0000 |
commit | dd8b4c118e15b03a9f8ca748be0c3415e8df788a (patch) | |
tree | ad86ed3a16f65bf6b64c9bc8d0a23a629d89ab72 | |
parent | e2a2d49440c8f8253d15054b6147810a88a10242 (diff) | |
download | gcc-dd8b4c118e15b03a9f8ca748be0c3415e8df788a.zip gcc-dd8b4c118e15b03a9f8ca748be0c3415e8df788a.tar.gz gcc-dd8b4c118e15b03a9f8ca748be0c3415e8df788a.tar.bz2 |
[Ada] Link error due to negated intrinsic comparison
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.
2019-07-11 Hristian Kirtchev <kirtchev@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.
From-SVN: r273385
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/sem_res.adb | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/equal9.adb | 26 |
4 files changed, 42 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 79ee0b1..9d5a50f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2019-07-11 Hristian Kirtchev <kirtchev@adacore.com> + + * sem_res.adb (Resolve_Op_Not): Do not rewrite an equality + operator into a function call when the operator is intrinsic. + 2019-07-11 Thomas Quinot <quinot@adacore.com> * sem_prag.adb (Analyze_Pragma, case pragma Check): Do not call diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 78cbac0..c17b28d 100644 --- a/gcc/ada/sem_res.adb +++ b/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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 66d1e3e..a761f79 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-07-11 Hristian Kirtchev <kirtchev@adacore.com> + + * gnat.dg/equal9.adb: New testcase. + 2019-07-11 Thomas Quinot <quinot@adacore.com> * gnat.dg/scos1.adb: New testcase. diff --git a/gcc/testsuite/gnat.dg/equal9.adb b/gcc/testsuite/gnat.dg/equal9.adb new file mode 100644 index 0000000..aa60d5b --- /dev/null +++ b/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; |