comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: making a son benefit access ton an instanciation of a generic package required as a formal parameter to his father and instanciated by him
Date: Mon, 22 Jan 2018 19:33:54 -0600
Date: 2018-01-22T19:33:54-06:00	[thread overview]
Message-ID: <p463e2$4aa$1@franka.jacob-sparre.dk> (raw)
In-Reply-To: ly8tcp28nv.fsf@pushface.org

"Simon Wright" <simon@pushface.org> wrote in message 
news:ly8tcp28nv.fsf@pushface.org...
> "J-P. Rosen" <rosen@adalog.fr> writes:
>
>> Right, and there is a good reason.
>> Assuming exception E is declared in generic package GP1:
>>
>> Imagine this:
>> generic
>>    package P1 is new GP1 (<>);
>>    package P2 is new GP1 (<>);
>> package GP2 is... end GP2;
>>
>> package body GP2 is
>>    ...
>> begin
>>    exception
>>       when P1.E =>  -- not allowed by Ada
>>          ...
>>       when P2.E =>  -- not allowed by Ada
>>          ...
>> end GP2;
>>
>> So far, so good. But then, if you instantiate:
>> package Inst1 is new GP1;
>>
>> package Inst2 is new GP2 (Inst1, Inst1);
>>
>> then you would end up with two different handlers for the same
>> exception (since formals P1 and P2 are actually the same package
>> Inst1). And
>
> This doesn't seem a million miles away from having name clashes caused
> by use-visibility.
>
> Agreed, the _instantiation_ must fail.

Ah, but remember the "language-lawyer" message I wrote a few minutes ago. 
Ada enforces Legality Rules in the body in an "assume-the-worst" manner. 
Thus, if any possible instantiation would cause a failure, it is illegal in 
a generic body.

This was done to make the contract model of generics sensible. If one can 
compile a generic body, then the body is always legal for an instantation. 
This allows sane separate compilation, where the body doesn't necessarily 
exist when the instantation is compiled. If the instantiation proves legal 
when compiled, it will stay that way regardless of what is in the body. 
Otherwise, you would have the legality of instantiations changing when a 
body is changed, meaning that you would be getting errors in far off 
compilation units.

Some compilers do in fact do pure macro substitutions, and give the effect 
of proper separate compilation by compiling the instances during binding. 
This is OK and not noticable to a user, because those instances have to be 
legal (modulo compiler bugs, of course). If a compiler worked this way 
without the assume-the-worst rules, you'd get lots of error messages at bind 
time, long after you thought you had a clean compile. That would be annoying 
at best.

                                      Randy.


  reply	other threads:[~2018-01-23  1:33 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-21 15:43 making a son benefit access ton an instanciation of a generic package required as a formal parameter to his father and instanciated by him Mehdi Saada
2018-01-21 15:58 ` Simon Wright
2018-01-21 17:30   ` Mehdi Saada
2018-01-21 17:39     ` Simon Wright
2018-01-21 17:50     ` Dmitry A. Kazakov
2018-01-21 20:15       ` Mehdi Saada
2018-01-21 20:41         ` Dmitry A. Kazakov
2018-01-21 21:29           ` Mehdi Saada
2018-01-21 21:31             ` Mehdi Saada
2018-01-21 22:20               ` Jeffrey R. Carter
2018-01-21 23:07                 ` Mehdi Saada
2018-01-21 23:10                   ` Mehdi Saada
2018-01-22  8:28                   ` Dmitry A. Kazakov
2018-01-22  9:25                     ` Simon Wright
2018-01-23  1:23           ` Randy Brukardt
2018-01-21 22:04         ` J-P. Rosen
2018-01-22 15:36           ` Mehdi Saada
2018-01-22 15:54             ` Mehdi Saada
2018-01-22 15:52           ` Simon Wright
2018-01-23  1:33             ` Randy Brukardt [this message]
2018-01-23 14:05   ` Mehdi Saada
2018-01-23  1:13 ` Randy Brukardt
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox