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=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "Alejandro R. Mosteo" Newsgroups: comp.lang.ada Subject: Re: Generic private type declaration Date: Mon, 28 Nov 2016 15:54:35 +0100 Organization: A noiseless patient Spider Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Mon, 28 Nov 2016 14:53:18 -0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="3237df158612239f87cf0330feb8bd63"; logging-data="31248"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/PQbH+dnaqvar5mIt7TAfA" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 In-Reply-To: Cancel-Lock: sha1:Xpw7VGNJUEDxhee2ZSPgfoIARyU= Xref: news.eternal-september.org comp.lang.ada:32487 Date: 2016-11-28T15:54:35+01:00 List-Id: On 25/11/16 20:17, Dmitry A. Kazakov wrote: > On 2016-11-25 18:36, Alejandro R. Mosteo wrote: > >> I need some eyes on this error because I'm missing something basic. When >> compiling this code: >> >> procedure B001_Tagged is >> >> generic >> type X is private; >> package Untagged is >> >> type Y is new X; >> >> end Untagged; >> >> package Ok is new Untagged (Integer); >> >> type Void is tagged null record; >> >> package Err is new Untagged (Void); -- Error here >> >> begin >> null; >> end B001_Tagged; >> >> I get in both gnat 4.9.3 and gpl2016 the following error: >> >> b001_tagged.adb:15:04: instantiation error at line 7 >> b001_tagged.adb:15:04: type derived from tagged type must have extension >> gnatmake: "b001_tagged.adb" compilation error >> >> I would expect that the view inside the generic package is untagged and >> so the type renaming in line 7 should be correct? Or I'm floundering >> with the generic parameter declaration? > > Yes, generics leak privacy and don't respect any contracts much. > Sometimes an actual tagged type matches formal private type and > sometimes it does not. Visibility rules are broken with respect to > tagged types even without generics (see earlier discussions about > private overriding). I'm still trying to come to terms with the RM and the other answers posted, but I must say that if GNAT is correct in this case, it makes me uneasily feel in C++ templating territory. Alex. > Ada lawyers will surely tell you that it is OK because it cannot be > fixed. In some sense generics are indeed beyond any hope being weakly > typed, but still most outrageous examples could be fixed nevertheless. > And visibility rules can be fixed for sure.