From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,b1264e586250f470 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-07-14 11:35:02 PST Path: archiver1.google.com!postnews1.google.com!not-for-mail From: mheaney@on2.com (Matthew Heaney) Newsgroups: comp.lang.ada Subject: Re: Elaboration of nested generic package. Date: 14 Jul 2003 11:35:01 -0700 Organization: http://groups.google.com/ Message-ID: <1ec946d1.0307141035.3f1e4b80@posting.google.com> References: <5437fafb.0307071905.5d3bbc4e@posting.google.com> <1ec946d1.0307080946.7e61cda9@posting.google.com> <5437fafb.0307091710.5cb4b0eb@posting.google.com> <3F0CC2D1.10904@attbi.com> <1ec946d1.0307100612.20a3d000@posting.google.com> NNTP-Posting-Host: 66.162.65.162 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: posting.google.com 1058207702 14565 127.0.0.1 (14 Jul 2003 18:35:02 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: 14 Jul 2003 18:35:02 GMT Xref: archiver1.google.com comp.lang.ada:40264 Date: 2003-07-14T18:35:02+00:00 List-Id: Robert A Duff wrote in message news:... > mheaney@on2.com (Matthew Heaney) writes: > > > I would still like a definitive answer, though. In order to make a > > library-level package instantiation, do I need to use Elaborate_All on > > the generic unit? (As in the example above.) > > If the generic unit says Elaborate_Body, then you do not. However, > Elab_Body causes a problem: the body can't "with" its own children, > which is often useful. > > If you don't have Elab_Body, and you say "with Some_Generic", then you > should normally Elab_All of the generic, because your instances will > normally be at library level. If your instances are nested in > procedures, then you don't normally need to do that. There are some > rare cases where Elab_All won't work, and you have to use pragma > Elaborate instead. > > This part of the language is something of a mess. Pragma Elaborate was > added late in the game of Ada 83, and it was later realized that it > doesn't work well, and we tried to fix it in Ada 95, and pretty much > failed. We added some pragmas, but as evidenced by this thread, it's > not always clear when to use them. > > But if you use GNAT in its default mode, it will tell you where you need > the pragmas, mostly. It doesn't work in the case of > indirect/dispatching calls, though. > > > Also: do the categorization pragmas in a generic unit make any > > difference? In other words, you still need to say Elaborate_All, > > irrespective of what the generic unit says about categorization -- > > correct? > > I think there is an AI on this point. Sorry, I don't remember the > details. Things are even more weird, at least wrt GNAT. I have this: generic ... package GP is pragma Preelaborate; ... end GP; And then I instantiate it, like this: with GP; pragma Elaborate_All (GP); package P is new GP (...); I then with it from a normal packet that has a categorization pragma: with P; package Q is pragma Preelaborate; ... end Q; What's weird is that the compiler is telling me I'm not allowed to with P from a preelaborate package Q. I was surprised by this behavior, because GP says explicitly that it is Preelaborate categorization. To make the compiler happy I have to use a confirming pragma on the instantion of GP: with GP; pragma Elaborate_All (GP); package P is new GP (...); pragma Preelaborate (P); and then Q compiles without error. Is this normal behavior? This is the reason I was asking whether the categorization pragmas do anything if they're declared in a generic package. Is it necessary to use a categorization pragma on library-level package instantiations? -Matt