Hi Janne,

Thanks for the patch, it is hard and tedious work. Here is the formal review. I 
don’t want to be a pain, but I have several questions about the patch, and 
given its size and the importance I think we should be double-sure :)


> I also changed the _size member in vtables from int to size_t, as
> there were some cases where character lengths and sizes were
> apparently mixed up and caused regressions otherwise. Although I
> haven't tested, this might enable very large derived types as well.

Regarding that one, why are you making it an explicit size_t and not a charlen 
type? I know the two will be the same, at least for now, but given that it’s 
explicitly a character length we should use that variable type. This is a 
preexisting issue with the front-end and library, where we generally use a mix 
of types (because they end up being the same anyway, such as C int and 
GFC_INTEGER_4).

Regarding the introduction of is_charlen in gfc_typespec, I am unclear as to 
why it is needed. It is used exclusively in arith.c, which is not where we 
should be checking character lengths I think. It is visible by the fact that we 
normally shouldn’t need access to middle-end headers (tree.h and trans-types.h) 
at that level. So, can’t we make the check where we currently do it, i.e. later 
when we translate the constant string? That sounds more reasonable that 
introducing a new special-cased entity.

There are other cases (resolve.c, simplify.c) where you introduce a dependency 
on middle-end entities (tree.h, trans-types.h) in what are pure Fortran 
front-end stages. This breaks the separation that currently exists, and which I 
strongly think we should keep.



** libgfortran **

- in io/write.c, the “for” clauses in in namelist_write() have weird spacing 
around their semicolons (i.e. space should be after, not before)
- in intrinsics/extends_type_of.c, use gfc_charlen_type instead of size_t 
vtype->size

** front-end **

- class.c: use gfc_charlen_int_kind instead of gfc_size_kind
- class.c, in find_intrinsic_vtab(): in the call to gfc_get_int_expr, the third 
argument cannot be cast from (size_t) to (long), as this would fail on LLP64 
hosts
- expr.c, regarding gfc_extract_long(): we could definitely extract an host 
wide int or an mpz value. This new function is called twice: once in 
resolve_charlen() where we could use the GMP function mpz_sgn() to check if the 
constant value is negative; the second time in gfc_simplify_repeat, where we 
should simply bail out (return NULL) if the integer is too big to fit into a 
long (we would bail out a few lines later anyway, see “semi-arbitrary limit”).
- iresolve.c, extra space after NULL in call to gfc_get_int_expr() in 
gfc_resolve_repeat()
- match.c, in select_intrinsic_set_tmp(), charlen should be a gfc_charlen_t and 
mpz_get_si will break for long string sizes
- in resolve.c, like in arith.c, we should not use tree.h and trans-types.h. We 
should do the comparison by looking at integer kinds, not through the 
charlen_type_node
- in resolve.c, in resolve_select_type(), another case of mpz_get_si() that 
will break for long string sizes
- in simplify.c, again, we should not use tree.h and trans-types.h
- trans-decl.c seems like unrelated changes
- trans-types.h: why do we now need to include trans.h?


Thanks again for working on that!

FX

Reply via email to