comp.lang.ada
 help / color / mirror / Atom feed
From: dlc@ddsdx2.jhuapl.edu (Dave Collard x7468)
Subject: Re: Type conversion from Universal Integer
Date: Thu, 4 Mar 93 13:12:22 GMT
Date: 1993-03-04T13:12:22+00:00	[thread overview]
Message-ID: <1993Mar4.131222.871@aplcen.apl.jhu.edu> (raw)
In-Reply-To: 1993Mar3.224845.18874@saifr00.cfsat.honeywell.com

In <1993Mar3.224845.18874@saifr00.cfsat.honeywell.com> murali@saifr00.cfsat.honeywell.com (R. Muralidhar) writes:
> -------------------------------------------------------------------------
>package P is
>  type A is range 1 .. 10;
>  type Array_Constrained_Type is array ( A range <> ) of Integer;
>end P;

>with P;
>procedure test is 

> Const : constant := 5;
> type Local_A is range 1 .. 10;

> type Local_Array_Constrained_Type is array ( Local_A range <> ) of Integer;

> subtype Array_type1 is P.Array_Constrained_Type(1 .. (const/2)); -- Line A
> subtype Array_type2 is P.Array_Constrained_Type(1 .. P."/"(const,2)); -- Line B
> subtype Array_type3 is Local_Array_Constrained_Type(1 .. (const/2)); -- Line C

>begin
>  null;
>end test;
> -------------------------------------------------------------------------

> detect an error on DEC Ada compiler, in the line marked "Line A", saying:

>%ADAC-E-RESTYPINCON, (1) Result type of expression is inconsistent with its  
>        context, which requires integer type A in P at line 2 [LRM 8.7] 

>But the same piece of code compiled fine under Verdix Ada Compiler on Sun.
no comment.

>Line B compiled fine in both compilers, so did Line C.

>Am I dealing here with some interpretation of a language feature that is
>implementation dependent? Or is it that one or the other compiler is wrong?


>Also, LRM 4.6(15) says that "An implicit conversion of an operand of
>universal integer to another integer type, ..., can only be applied if the
>operand is either a numeric literal, a named number, or an attribute;"

>I take it that the compiler tries to implicitly convert to the integer type A,
>the upper and lower bounds of the specified ranges in all three lines, 
>Line A, Line B, and Line C. Since (const/2) is an expression and is not a
>numeric literal, not a named number, and not an attribute, the compiler(s)
>should have detected errors in all three lines.

Ah, but Const IS a named number and 2 is a numeric literal, so,
  In line B, Const and 2 are converted to type P.A because the only P."/" available
  that matches the required return type (P.A) is the inherited division operator
  for type P.A.

  In line C the same thing is true except replace P.A with Local_A.

  Now Line A.  The expression (const/2) MUST evaluate to type P.A.  The only 
  division operator available that returns P.A is the one inherited in package
  P when the type A was derived.  That operation is not visible (as you did not
  use P).  Therefore, no division operator is visible which returns type P.A.
  The DEC compiler is correct (as usual).


--Thor
collard@capsrv.jhuapl.edu
dlc@ddsdx2.jhuapl.edu



      reply	other threads:[~1993-03-04 13:12 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1993-03-03 22:48 Type conversion from Universal Integer R. Muralidhar
1993-03-04 13:12 ` Dave Collard x7468 [this message]
replies disabled

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