Prev: finding an example about possible conflicts and modelling them using VDM
Next: compiler settings in AdaGIDE
From: (see below) on 22 Jul 2010 20:17 I have a package which is a grandchild, and GNAT issues elaboration warnings on its body, thus: > with IOC.shift; pragma Elaborate_All(IOC.shift); > package body IOC.shift.TR is > ... > overriding > procedure Initialize (the_reader : in out IOC.shift.TR.device) is > begin > ... > open(...); > | >>>> info: call to "open" during elaboration >>>> info: implicit pragma Elaborate_All for "IO" generated >>>> warning: "Initialize" called at line 31 >>>> warning: call to "open" in elaboration code requires pragma Elaborate_All >>>> on "IO" > ... > end Initialize; ... > end IOC.shift.TR; The "open" operation it is complaining about is in the the IO package. The ancestors of IOC.shift.TR begin thus: > with IOC; pragma Elaborate_All(IOC); > package IOC.shift is ... and: > with IO; pragma Elaborate_All(IO); > package IOC is ... How do I get rid of the warning? I cannot put an explicit "pragma Elaborate_All(IO)" in IOC.shift.TR, because it does not "with" IO. Surely I should not have to "with" IO all the way down the parent/child hierarchy? What am I doing wrong? -- Bill Findlay <surname><forename> chez blueyonder.co.uk
From: Adam Beneschan on 22 Jul 2010 22:10 On Jul 22, 5:17 pm, "(see below)" <yaldni...(a)blueyonder.co.uk> wrote: > I have a package which is a grandchild, and GNAT issues elaboration warnings > on its body, thus: > > > > > > > with IOC.shift; pragma Elaborate_All(IOC.shift); > > package body IOC.shift.TR is > > ... > > overriding > > procedure Initialize (the_reader : in out IOC.shift.TR.device) is > > begin > > ... > > open(...); > > | > >>>> info: call to "open" during elaboration > >>>> info: implicit pragma Elaborate_All for "IO" generated > >>>> warning: "Initialize" called at line 31 > >>>> warning: call to "open" in elaboration code requires pragma Elaborate_All > >>>> on "IO" > > ... > > end Initialize; ... > > end IOC.shift.TR; > > The "open" operation it is complaining about is in the the IO package. > > The ancestors of IOC.shift.TR begin thus: > > > with IOC; pragma Elaborate_All(IOC); > > package IOC.shift is ... > > and: > > > with IO; pragma Elaborate_All(IO); > > package IOC is ... > > How do I get rid of the warning? > > I cannot put an explicit "pragma Elaborate_All(IO)" in IOC.shift.TR, because > it does not "with" IO. > > Surely I should not have to "with" IO all the way down the parent/child > hierarchy? What am I doing wrong? If you want to reference "IO" in a pragma in the context clause, then yes, you do have to WITH it in the same context clause. This is because the visibility rules are different in context clauses. See 10.1.6, especially 10.1.6(3). I can understand why you think you "shouldn't have to" do this, because you don't have to do it when referencing IO inside the child package body. But the rules are different here. Sorry. -- Adam
From: (see below) on 23 Jul 2010 10:52
On 23/07/2010 03:10, in article b8dcce8d-979d-4347-a84f-a2a15a318285(a)m35g2000prn.googlegroups.com, "Adam Beneschan" <adam(a)irvine.com> wrote: > On Jul 22, 5:17�pm, "(see below)" <yaldni...(a)blueyonder.co.uk> wrote: >> I have a package which is a grandchild, and GNAT issues elaboration warnings >> on its body, thus: >> >> >> >> >> >>> with IOC.shift; pragma Elaborate_All(IOC.shift); >>> package body IOC.shift.TR is >>> ... >>> � �overriding >>> � �procedure Initialize (the_reader : in out IOC.shift.TR.device) is >>> � �begin >>> � � � ... >>> � � � open(...); >>> � � � | >>>>>> info: call to "open" during elaboration >>>>>> info: implicit pragma Elaborate_All for "IO" generated >>>>>> warning: "Initialize" called at line 31 >>>>>> warning: call to "open" in elaboration code requires pragma Elaborate_All >>>>>> on "IO" >>> � �... >>> � �end Initialize; ... >>> end IOC.shift.TR; >> >> The "open" operation it is complaining about is in the the IO package. >> >> The ancestors of IOC.shift.TR begin thus: >> >>> with IOC; pragma Elaborate_All(IOC); >>> package IOC.shift is ... >> >> and: >> >>> with IO; pragma Elaborate_All(IO); >>> package IOC is ... >> >> How do I get rid of the warning? >> >> I cannot put an explicit "pragma Elaborate_All(IO)" in IOC.shift.TR, because >> it does not "with" IO. >> >> Surely I should not have to "with" IO all the way down the parent/child >> hierarchy? What am I doing wrong? > > If you want to reference "IO" in a pragma in the context clause, then > yes, you do have to WITH it in the same context clause. This is > because the visibility rules are different in context clauses. See > 10.1.6, especially 10.1.6(3). I can understand why you think you > "shouldn't have to" do this, because you don't have to do it when > referencing IO inside the child package body. But the rules are > different here. Sorry. Thanks, Adam. BTW the code is part of an emulator for the English Electric KDF9 computer (announced 1960). It's about 19 KSLOC, so a non-trivial Ada 2005 program. See <http://www.findlayw.plus.com/KDF9>. This week it passed a strenuous test, correctly compiling and running the famous Whetstone Benchmark (which originated, in Algol 60, on the KDF9). Amusingly, the output was validated by also running the test on a virtual ICL 1904A, which dates from about 1970; but the 1904A emulator was written (by Bill Gallagher) in C++. -- Bill Findlay <surname><forename> chez blueyonder.co.uk |