|
From: Eric Hughes on 19 Jun 2008 11:14 GNAT 2008 (just installed) fails to compile the following example, which was cut down from existing code to isolate the problem. This is the error message. > foo.ada-spec:16:34: actual for "Operation" in actual instance does not match formal Changing the syntax to eliminate "others =>", which is what the commented-out line does, allows the example to compile without error. Unfortunately, that's not a viable workaround, because the real code requires named parameters. At present I am assuming this is a defect with GNAT 2008 rather than with the Ada 2005 language definition. I had the identical problem with GNAT 2007. I had stopped development back then, a few months ago, in the apparently-misplaced hope that a new compiler version would fix this. I should point out, for those without significant experience in generic programming, that this defect completely blocks a huge class of generic layering techniques that are primarily of interest to library authors. Code that does not admit significant reconfiguration does not require this technique. Eric ======================================================= package Foo is pragma Elaborate_Body( Foo ) ; generic with procedure Operation is <> ; package Signature is end ; procedure Operation_Actual is null ; package Impl is new Signature( Operation => Operation_Actual ) ; generic with package S is new Signature( others => <> ) ; -- with package S is new Signature( <> ) ; package Module is end ; package M is new Module( S => Impl ) ; end ; =======================================================
From: Simon Wright on 19 Jun 2008 15:49 Eric Hughes <eric.eh9(a)gmail.com> writes: > At present I am assuming this is a defect with GNAT 2008 rather than > with the Ada 2005 language definition. I had the identical problem > with GNAT 2007. You don't mention the Bugzilla (or other) reference you reported this under?
From: Georg Bauhaus on 19 Jun 2008 18:48 Eric Hughes wrote: > GNAT 2008 (just installed) fails to compile the following example, .... > ======================================================= > package Foo is > pragma Elaborate_Body( Foo ) ; > > generic > with procedure Operation is <> ; > package Signature is end ; > > procedure Operation_Actual is null ; > package Impl is new Signature( Operation => Operation_Actual ) ; > > generic > with package S is new Signature( others => <> ) ; > -- with package S is new Signature( <> ) ; > package Module is end ; > > package M is new Module( S => Impl ) ; > end ; > ======================================================= Another workaround: package Foo is pragma Elaborate_Body( Foo ) ; generic with procedure Operation is <> ; package Signature is end ; procedure Operation is null ; package Impl is new Signature ; generic with package S is new Signature( others => <> ) ; package Module is end ; package M is new Module( S => Impl ) ; end ;
From: Eric Hughes on 20 Jun 2008 13:25 Eric Hughes wrote: > procedure Operation_Actual is null ; > package Impl is new Signature( Operation => Operation_Actual ) ; On Jun 19, 4:48 pm, Georg Bauhaus <rm.tsoh.plus- bug.bauh...(a)maps.futureapps.de> wrote: > Another workaround: > > procedure Operation is null ; > package Impl is new Signature ; The whole point is that I was stacking these package instantiations two layers deep, and this would cut out the second layer. Eric
From: Eric Hughes on 21 Jun 2008 14:42 On Jun 19, 1:49 pm, Simon Wright <simon.j.wri...(a)mac.com> wrote: > You don't mention the Bugzilla (or other) reference you reported this > under? Please feel free to do so. Eric
|
Pages: 1 Prev: gnat GPL 2008 and annex E Next: another way to shoot yourself in the foot? |