[J3] BOZ in an array constructor

Steven G. Kargl kargl at troutmask.apl.washington.edu
Sun Jul 7 18:12:21 EDT 2019


On Sun, Jul 07, 2019 at 02:33:26PM -0700, Robert Corbett wrote:
> Constraint C7109 says that a BOZ constant is allowed as an actual argument.

Agreed.  A scalar BOZ can be an actual argument to INT().

>  It does not say it is allowed as a value expression in an array constructor.

Well, yes that's my point.  A BOZ cannot appear in an array
constructor via C7110 or C7111.  It does not matter that INT
is elemental (or not).  It is not possible to build an array
actual argument from an array constructor with BOZ ac-values.

For INT([z'12', z'23']), where is it explicitly stated that
[z'12', z'23'] is not an array constructor or is exempted from
constraints C7110 (or C7111)?

If the argument is that C7110 (or C7111) does not apply because
INT([z'12',z'23']) should be interpreted as [int(z'12'), int(z'23')],
then is the following valid INT([4.2, z'12'])?

-- 
steve


> 
> Bob Corbett
> 
> > On Jul 7, 2019, at 2:24 PM, Steven G. Kargl <kargl at troutmask.apl.washington.edu> wrote:
> > 
> > N2146.pdf is the final committee draft of F2018.
> > 18-007r1.pdf appears to be the current working document.
> > J3 seems to have eliminated a constraint, so C7110
> > in N2146.pdf is now C7109 in 18-007r1.pdf.  The renumber
> > of constraints has its downside.
> > 
> > -- 
> > steve
> > 
> > 
> >> On Sun, Jul 07, 2019 at 09:13:58PM +0000, Bill Long wrote:
> >> The C7109 I was looking at says:
> >> 
> >> A boz-literal-constant shall appear only as a data-stmt-constant in a DATA statement, or where explicitly allowed in 16.9 as an actual argument of an intrinsic procedure.
> >> 
> >> 
> >> 
> >>> On Jul 7, 2019, at 3:58 PM, Steven G. Kargl via J3 <j3 at mailman.j3-fortran.org> wrote:
> >>> 
> >>> 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.
> >> 
> >> This is C7110 in the current standard. One of the objectives of the BITS data type proposal is to provide boz constants with an intrinsic type (type BITS).  
> >> 
> >> However, as I noted in my previous email, I have not yet found a compiler that gets this test case “wrong”.  All 5 compilers I tried, including 2 versions of gfortran, along with Cray, Intel, and PGI, compiled the program and produced the same output. I suspect it works because INT is elemental, so the function is applied to each element of the array separately. 
> >> 
> >> Cheers,
> >> Bill
> >> 
> >>> 
> >>> 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
> >> 
> >> Bill Long                                                                       longb at cray.com
> >> Principal Engineer, Fortran Technical Support &   voice:  651-605-9024
> >> Bioinformatics Software Development                      fax:  651-605-9143
> >> Cray Inc./ 2131 Lindau Lane/  Suite 1000/  Bloomington, MN  55425
> >> 
> >> 
> > 
> > -- 
> > Steve
> 

-- 
Steve


More information about the J3 mailing list