comp.lang.ada
 help / color / mirror / Atom feed
From: anon@anon.org (anon)
Subject: Re: Out parameters and unconstrained variant types
Date: Fri, 27 Jun 2008 00:49:16 GMT
Date: 2008-06-27T00:49:16+00:00	[thread overview]
Message-ID: <gOW8k.75717$102.66342@bgtnsc05-news.ops.worldnet.att.net> (raw)
In-Reply-To: c6f8a097-4675-4335-bbda-ae552be2e8e6@m73g2000hsh.googlegroups.com

--
-- Except for a few typos it work just fine in Ada 95 / 2005 
-- using GNAT 3.15p and GNAT 2007 and 2008.
--

with Ada.Text_IO ;
use Ada.Text_IO ;

procedure Foo is

  type Conditional_Result (Exists : Boolean := False) is record 
      case Exists is
        when True  =>  Value : Natural;
        when False => null;
      end case ;
  end record;


  procedure Do_Something(x : in Natural; rtn : out Conditional_Result) is
    begin
      if x = 0 then
        rtn := (Exists => False);
      else
        rtn := (Exists => True, Value => x + 1);
      end if;
    end;

  rtn : Conditional_Result;


begin
  Do_Something(0, rtn);
  if rtn.Exists then
    Put_Line("Yes!");
  end if;

  Do_Something(1, rtn);
  if rtn.Exists then
    Put_Line("Yes!");
                                                   -- added to test value result.
    Put_Line("Value" & Integer'Image( rtn.Value) ); 
  end if;

end;


In <c6f8a097-4675-4335-bbda-ae552be2e8e6@m73g2000hsh.googlegroups.com>, Gene <gene.ressler@gmail.com> writes:
>Hello friends,
>
>I would like to do something like:
>
>type Conditional_Result (Exists : Boolean := False) is
>  record case Exists is
>    when True =>
>      Value : Natural;
>    when False => null;
>  end record;
>
>procedure Do_Something(x : in Natural; rtn : out Conditional_Result)
>is
>begin
>  if x = 0 then
>    rtn := (Exists => False);
>  else
>    rtn := (Exists => True; Value => x + 1);
>  end if;
>end;
>
>procedure Foo is
>  rtn : Conditional_Result;
>begin
>  Do_Something(0, rtn);
>  if rtn.Exists then
>    Put_Line("Yes!");
>  end if;
>  Do_Something(1, rtn);
>  if rtn.Exists then
>    Put_Line("Yes!");
>  end if;
>end;
>
>ALRM 2005 and Barnes seem to say the procedure Do_Something will know
>that rtn in foo is unconstrained and allow both calls to succeed.  In
>GNAT 2007, the second call fails with a constraint error at the
>assignment to rtn.  Can you tell me what I'm missing?
>
>Thanks!




  reply	other threads:[~2008-06-27  0:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-27  0:22 Out parameters and unconstrained variant types Gene
2008-06-27  0:49 ` anon [this message]
2008-06-27  2:40 ` Adam Beneschan
2008-06-27  7:11 ` Georg Bauhaus
2008-06-27  7:58 ` Dmitry A. Kazakov
replies disabled

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