On Sat, Oct 07, 2017 at 12:37:03PM +0200, Dominique d'Humières wrote:
> (1) Typo in gcc/fortran/array.c
>
> + /* If an array contains a BT_BOZ, then array elements need to be converted
> + an INTEGER. This is an GNU Fortran extension. Mixing BOZ and non-BOZ
> missing ‘to’?
Thanks. I'll fix this
>
> (2) Compiling
>
> integer :: i = 1, j = 2
> print *, ble(i,j), blt(z'ff',z'fa')
> end
>
> gives an ICE
>
> f951: internal compiler error: in compare_bitwise, at fortran/simplify.c:1516
>
> which is
>
> gcc_assert (i->ts.type == BT_INTEGER);
> gcc_assert (j->ts.type == BT_INTEGER);
Whoops. Forgot to check the bge, blt, etc simplification routines.
>
> (3) Compiling (variant of pr54072)
>
> USE, INTRINSIC :: ISO_C_BINDING
> IMPLICIT NONE
> INTEGER, PARAMETER :: GLbitfield=C_INT
> INTEGER(GLbitfield), PARAMETER :: GL_CURRENT_BIT = INT(z'00000001') !
> 0x00000001
> INTEGER(GLbitfield), PARAMETER :: GL_CLIENT_ALL_ATTRIB_BITS = &
> transfer(z'ffffffff',GL_CURRENT_BIT) ! 0xffffffff
This is nonconforming code. A BOZ cannot appear as an arg to transfer.
> print *, GLbitfield, GL_CURRENT_BIT, GL_CLIENT_ALL_ATTRIB_BITS
> END
>
> gives an ICE
>
> f951: internal compiler error: Invalid expression in gfc_element_size.
I'll need to check how we get to gfc_element size from the BOZ
in transfer.
>
> (4) Compiling
>
> print *, INT(z'ffffffff',4)
> end
>
> gives
>
> print *, INT(z'ffffffff',4)
> 1
> Error: Arithmetic overflow converting INTEGER(-1) to INTEGER(4)
> at (1). This check can be disabled with the option '-fno-range-check’
>
> Should not it be -1?
Maybe. :-)
See my note to Jerry about needing to implement F2015 16.3.3 correctly.
Upon sleeping on this deficiency, I realized that 16.3.3 without stating
allows one to set the sign-bit. We find in 16.3.1 the statement
The interpretation of a negative integer as a sequence of bits
is processor dependent.
There is the bit model and integer model numbers. F2015 contrasts the
models and concludes with
In particular, whereas the models are identical for r = 2 and
$w_{z-1}$ = 0, they do not correspond for r = 2 or $w_{z-1} = 1$
and the interpretation of bits in such objects is processor dependent.
>
> (5) Compiling
>
> print *, real(z'ffffffff',4)
> end
>
> gives
>
> print *, real(z'ffffffff',4)
> 1
> Error: Arithmetic NaN converting REAL(4) to REAL(4) at (1).i
> This check can be disabled with the option '-fno-range-check’
>
> Why not a warning?
Ask Tobias. I retained his gfc_convert_boz function. He
calls range_check() at the end. You get this error prior
to my patch.
> (6) Compiling
>
> print *, storage_size(z'FFFFFFFF')
> end
>
> gives an ICE
>
> f951: internal compiler error: Invalid expression in gfc_element_size.
>
> The code is probably invalid, but I don’t know how to parse
Nonconforming code. A BOZ cannot be an actual arg to storage_size.
In F2008/2015, a BOZ is a typeless and kindless entity.
16.9.184 STORAGE_SIZE (A [, KIND])
A shall be a data object of any type.
7.1.2 Type classification
A type is either an intrinsic type or a derived type.
This document defines five intrinsic types: integer, real, complex,
character, and logical.
A derived type is one that is defined by a derived-type definition
(7.5.2) or by an intrinsic module.
7.7 Binary, octal, and hexadecimal literal constants
A binary, octal, or hexadecimal constant (boz-literal-constant) is a
sequence of digits that represents an ordered sequence of bits. Such a
constant has no type.
>
> Without the patch it returns 128 at run time.
>
That's because 13 to 15 years, I made gfortran convert a BOZ
to INTEGER(gfc_max_integer_kind) when a BOZ was parsed. The
internal representation a BOZ is INTEGER, so storage_size
thinks it is an integer.
--
Steve
20170425 https://www.youtube.com/watch?v=VWUpyCsUKR4
20161221 https://www.youtube.com/watch?v=IbCHE-hONow