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.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,9a4a0b8e5206a866 X-Google-Attributes: gid103376,public From: "David C. Hoos, Sr." Subject: Re: Conversion of Access Types Question Date: 1999/01/14 Message-ID: <77l492$b5s@hobbes.crc.com>#1/1 X-Deja-AN: 432579460 References: <369DFFFC.A160D47C@neta.com> X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 Organization: Coleman Research Corporation Newsgroups: comp.lang.ada Date: 1999-01-14T00:00:00+00:00 List-Id: Paul S. Heidmann wrote in message <369DFFFC.A160D47C@neta.com>... >Greetings fellow Ada lovers! > >I'm an experienced Ada83 programmer that is learning to use Ada95. >Things are going very well, but I don't understand the problems >that I'm having converting access types that point to variables of >class wide types. Consider the following piece of code: > >======================================= > >procedure Types is > > type T1 is tagged > record > I : Integer; > end record; > type A_T1 is access all T1'Class; > > type T2 is new T1 with > record > I2 : Integer; > end record; > type A_T2_Classwide is access all T2'Class; > type A_T2 is access T2; > > Thing1 : A_T1; > Thing2 : A_T2_Classwide; > Thing3 : A_T2; > >begin > Thing1 := new T2; > Thing2 := A_T2_Classwide (Thing1); > Thing3 := A_T2 (Thing1); -- illegal, types are not convertable. >end Types; > >======================================= > >My question is, why is the last line an illegal conversion, but the >second to last line not? > Compiling your code with gnat results in the following message: [hoosd@VISNT021 d:/gnat_examples]$ gcc -c types.adb types.adb:23:14: target type must be general access type types.adb:23:14: add "all" to type "A_T2" defined at line 14 Making the change the compiler directs solves the problem. i.e., change line 14 to read: type A_T2 is access all T2;