This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Fix problematic overloading of operator in Ada 95 mode


The change reverts the test deciding whether an initialization procedure
can be inherited from parent to derived type to the original
implementation, which allowed inheriting a null procedure.

This prevents the creation of another null initialization procedure for
the derived type, which in turn can avoid an artificial overloading
which can wreak havoc in the analysis of private declarations of a
package.

Tested on x86_64-pc-linux-gnu, committed on trunk

2018-12-03  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* exp_ch3.adb (Build_Record_Init_Proc): Inherit an
	initialization procedure if it is present, even if it is null.

gcc/testsuite/

	* gnat.dg/overload2.adb, gnat.dg/overload2_p.adb,
	gnat.dg/overload2_p.ads, gnat.dg/overload2_q.adb,
	gnat.dg/overload2_q.ads: New testcase.
--- gcc/ada/exp_ch3.adb
+++ gcc/ada/exp_ch3.adb
@@ -3712,7 +3712,7 @@ package body Exp_Ch3 is
         and then not Is_Unchecked_Union (Rec_Type)
         and then not Has_New_Non_Standard_Rep (Rec_Type)
         and then not Parent_Subtype_Renaming_Discrims
-        and then Has_Non_Null_Base_Init_Proc (Etype (Rec_Type))
+        and then Present (Base_Init_Proc (Etype (Rec_Type)))
       then
          Copy_TSS (Base_Init_Proc (Etype (Rec_Type)), Rec_Type);
 

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/overload2.adb
@@ -0,0 +1,13 @@
+--  { dg-do compile }
+--  { dg-options "-gnat95" }
+
+with Overload2_P; use Overload2_P;
+with text_io; use text_io;
+procedure overload2 is
+  this, that: t;
+  yes : boolean := this /= that;
+begin
+  if not yes then
+     put_line ("FAILED");
+  end if;
+end;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/overload2_p.adb
@@ -0,0 +1,6 @@
+--  { dg-options "-gnat95 -gnatws" }
+
+package body overload2_p is
+   function "=" (this, that: t) return boolean is begin return True; end;
+   this, that : t;
+end;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/overload2_p.ads
@@ -0,0 +1,6 @@
+with overload2_q;
+package overload2_p is
+   type t is new overload2_q.t;
+private
+   function "=" (this, that: t) return boolean;
+end;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/overload2_q.adb
@@ -0,0 +1,5 @@
+--  { dg-options "-gnat95" }
+
+package body overload2_q is
+  function "=" (this, that: t) return boolean is begin return False; end;
+end;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/overload2_q.ads
@@ -0,0 +1,4 @@
+package overload2_q is
+  type t is null record;
+  function "=" (this, that: t) return boolean;
+end;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]