Commit 9e6644c6 by Thomas Koenig

re PR fortran/86119 (Intrinsic len has wrong type if used within select type for a class(*) string)

2019-02-21  Thomas Koenig  <tkoenig@gcc.gnu.org>

    PR fortran/86119
    * class.c (gfc_get_len_component): Add argument k for kind.
    If the kind of the resulting expression is not equal to k,
    convert it.
    * gfortran.h (gfc_len_component): Adjust prototype.
    * simplify.c (gfc_simplify_len): Pass kind to
    gfc_get_len_component.

2019-02-21  Thomas Koenig  <tkoenig@gcc.gnu.org>

    PR fortran/86119
    * gfortran.dg/warn_conversion_11.f90: New test.

From-SVN: r269070
parent eb74a883
2019-02-21 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/86119
* class.c (gfc_get_len_component): Add argument k for kind.
If the kind of the resulting expression is not equal to k,
convert it.
* gfortran.h (gfc_len_component): Adjust prototype.
* simplify.c (gfc_simplify_len): Pass kind to
gfc_get_len_component.
2019-02-20 Martin Liska <mliska@suse.cz> 2019-02-20 Martin Liska <mliska@suse.cz>
* gfortran.texi: Change singular to plural. * gfortran.texi: Change singular to plural.
......
...@@ -565,7 +565,7 @@ gfc_intrinsic_hash_value (gfc_typespec *ts) ...@@ -565,7 +565,7 @@ gfc_intrinsic_hash_value (gfc_typespec *ts)
ref to the _len component. */ ref to the _len component. */
gfc_expr * gfc_expr *
gfc_get_len_component (gfc_expr *e) gfc_get_len_component (gfc_expr *e, int k)
{ {
gfc_expr *ptr; gfc_expr *ptr;
gfc_ref *ref, **last; gfc_ref *ref, **last;
...@@ -590,6 +590,14 @@ gfc_get_len_component (gfc_expr *e) ...@@ -590,6 +590,14 @@ gfc_get_len_component (gfc_expr *e)
} }
/* And replace if with a ref to the _len component. */ /* And replace if with a ref to the _len component. */
gfc_add_len_component (ptr); gfc_add_len_component (ptr);
if (k != ptr->ts.kind)
{
gfc_typespec ts;
gfc_clear_ts (&ts);
ts.type = BT_INTEGER;
ts.kind = k;
gfc_convert_type_warn (ptr, &ts, 2, 0);
}
return ptr; return ptr;
} }
......
...@@ -3479,7 +3479,7 @@ bool gfc_is_class_scalar_expr (gfc_expr *); ...@@ -3479,7 +3479,7 @@ bool gfc_is_class_scalar_expr (gfc_expr *);
bool gfc_is_class_container_ref (gfc_expr *e); bool gfc_is_class_container_ref (gfc_expr *e);
gfc_expr *gfc_class_initializer (gfc_typespec *, gfc_expr *); gfc_expr *gfc_class_initializer (gfc_typespec *, gfc_expr *);
unsigned int gfc_hash_value (gfc_symbol *); unsigned int gfc_hash_value (gfc_symbol *);
gfc_expr *gfc_get_len_component (gfc_expr *e); gfc_expr *gfc_get_len_component (gfc_expr *e, int);
bool gfc_build_class_symbol (gfc_typespec *, symbol_attribute *, bool gfc_build_class_symbol (gfc_typespec *, symbol_attribute *,
gfc_array_spec **); gfc_array_spec **);
gfc_symbol *gfc_find_derived_vtab (gfc_symbol *); gfc_symbol *gfc_find_derived_vtab (gfc_symbol *);
......
...@@ -4474,7 +4474,7 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind) ...@@ -4474,7 +4474,7 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
/* The expression in assoc->target points to a ref to the _data component /* The expression in assoc->target points to a ref to the _data component
of the unlimited polymorphic entity. To get the _len component the last of the unlimited polymorphic entity. To get the _len component the last
_data ref needs to be stripped and a ref to the _len component added. */ _data ref needs to be stripped and a ref to the _len component added. */
return gfc_get_len_component (e->symtree->n.sym->assoc->target); return gfc_get_len_component (e->symtree->n.sym->assoc->target, k);
else else
return NULL; return NULL;
} }
......
2019-02-21 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/86119
* gfortran.dg/warn_conversion_11.f90: New test.
2019-02-21 H.J. Lu <hongjiu.lu@intel.com> 2019-02-21 H.J. Lu <hongjiu.lu@intel.com>
PR target/87412 PR target/87412
......
! { dg-do compile }
! { dg-options "-Wconversion" }
! PR 86119 - this used to warn.
program proglen
implicit none
class(*), allocatable :: s
integer :: l2
allocate(s, source = '123 ')
select type(s)
type is (character(len=*))
l2 = len(s)
end select
end program proglen
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment