comp.lang.ada
 help / color / mirror / Atom feed
* Out parameters and unconstrained variant types
@ 2008-06-27  0:22 Gene
  2008-06-27  0:49 ` anon
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Gene @ 2008-06-27  0:22 UTC (permalink / raw)


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!



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Out parameters and unconstrained variant types
  2008-06-27  0:22 Out parameters and unconstrained variant types Gene
@ 2008-06-27  0:49 ` anon
  2008-06-27  2:40 ` Adam Beneschan
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: anon @ 2008-06-27  0:49 UTC (permalink / raw)


--
-- 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!




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Out parameters and unconstrained variant types
  2008-06-27  0:22 Out parameters and unconstrained variant types Gene
  2008-06-27  0:49 ` anon
@ 2008-06-27  2:40 ` Adam Beneschan
  2008-06-27  7:11 ` Georg Bauhaus
  2008-06-27  7:58 ` Dmitry A. Kazakov
  3 siblings, 0 replies; 5+ messages in thread
From: Adam Beneschan @ 2008-06-27  2:40 UTC (permalink / raw)


On Jun 26, 5:22 pm, Gene <gene.ress...@gmail.com> wrote:
> 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?

It should work, and "anon" says he did get it to work with GNAT 2007.
But your example isn't a complete program, so perhaps if you post the
complete program you tried (assuming it's not much larger than this
example), maybe we can see something additional that you did that
would cause a problem.

                            -- Adam




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Out parameters and unconstrained variant types
  2008-06-27  0:22 Out parameters and unconstrained variant types Gene
  2008-06-27  0:49 ` anon
  2008-06-27  2:40 ` Adam Beneschan
@ 2008-06-27  7:11 ` Georg Bauhaus
  2008-06-27  7:58 ` Dmitry A. Kazakov
  3 siblings, 0 replies; 5+ messages in thread
From: Georg Bauhaus @ 2008-06-27  7:11 UTC (permalink / raw)


Gene wrote:

> 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.

You can express your expectations in the program by adding

  pragma Assert(not rtn'Constrained);


-- Georg



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Out parameters and unconstrained variant types
  2008-06-27  0:22 Out parameters and unconstrained variant types Gene
                   ` (2 preceding siblings ...)
  2008-06-27  7:11 ` Georg Bauhaus
@ 2008-06-27  7:58 ` Dmitry A. Kazakov
  3 siblings, 0 replies; 5+ messages in thread
From: Dmitry A. Kazakov @ 2008-06-27  7:58 UTC (permalink / raw)


On Thu, 26 Jun 2008 17:22:29 -0700 (PDT), Gene wrote:

> type Conditional_Result (Exists : Boolean := False) is
[...] 
> 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.

Since you have a default value for the discriminant, it is perfectly OK to
assign it changing the constraint. This does not depend on wither the
parameter is in out or out. There shall be no Constraint_Error.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-06-27  7:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-06-27  0:22 Out parameters and unconstrained variant types Gene
2008-06-27  0:49 ` anon
2008-06-27  2:40 ` Adam Beneschan
2008-06-27  7:11 ` Georg Bauhaus
2008-06-27  7:58 ` Dmitry A. Kazakov

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