[J3] BOZ in an array constructor

Steven G. Kargl kargl at troutmask.apl.washington.edu
Sun Jul 7 16:58:31 EDT 2019


Thanks, Bob.  I suppose we're looking at different documents.

I have N2146.pdf.  The constraint you reference is

C7109 (R766) digit shall have one of the values 0 through 7.

which applies to an octal number.  The code example I posted
uses hexadecimal.

>From N2146.pdf, the constraints I referenced are 

C7111 (R770) If type-spec is omitted, each ac-value expression in
   the array-constructor shall have the same declared type and kind
   type parameters.

C7112 (R770) If type-spec specifies an intrinsic type, each ac-value
   expression in the array-constructor shall be of an intrinsic type
   that is in type conformance with a variable of type type-spec as
   specified in Table 10.8.

For "integer(4) :: i(2) = [z'1234', z'5678']", it seems C7111 applies
as type-spec is omitted.  BOZ are typeless, so there is no "declared
type and kind type parameter".  The 'integer(8) :: j(2) = [integer(8) ::
z'1234', z'5678']", case would invoke C7112.  A BOZ is not "an
intrinsic type" in Table 10.8.

It seems a BOZ cannot appear in an array constructor unless it
is the argument to a conversion intrinsic such as "integer(4) ::
i(2) = [int(z'1234'), int(z'5678')]".

-- 
steve


On Sun, Jul 07, 2019 at 01:26:01PM -0700, Robert Corbett wrote:
> I think C7111 and C7112 are irrelevant.  I think C7109 is the relevant constraint.
> 
> Bob Corbett
> 
> > On Jul 7, 2019, at 12:43 PM, Steven G. Kargl via J3 <j3 at mailman.j3-fortran.org> wrote:
> > 
> > gfortran's handling of BOZ is rather broken, and I'm
> > currently investigating several fixes.  In writing 
> > a test program (assuming kind = 4 and 8 are valid), I 
> > came up with
> > 
> > program foo
> >  integer(kind=4) :: i(2) = int([z'1234', z'5678'])
> >  integer(kind=8) :: j(2) = int([integer(8) :: z'1234', z'5678'])
> >  print *, i
> > end program foo
> > 
> > It seems to me C7111 prevents the i(2) case and C7112 prevents
> > the j(2) case.  One would need to write
> > 
> > program foo
> >  integer(kind=4) :: i(2) = [int(z'1234'), int(z'5678')]
> >  integer(kind=8) :: j(2) = [integer(8) :: int(z'1234'), int(z'5678')]
> >  print *, i
> > end program foo
> > 
> > The j(2) case could also be written as
> > 
> >  integer(kind=8) :: j(2) = [int(z'1234', 8), int(z'5678, 8)]
> > 
> > Is my interpretation of C7111 and C7112 correct?
> > 
> > -- 
> > Steve
> 

-- 
Steve


More information about the J3 mailing list