diff options
author | Harald Anlauf <anlauf@gmx.de> | 2022-03-27 21:35:15 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2022-03-29 20:30:56 +0200 |
commit | 0712f356374c2cf26015cccfa3141537e42cbb12 (patch) | |
tree | 4ec7eedb4089f2bae57143ee671c3f40a46149dd /gcc/fortran/resolve.cc | |
parent | d886a5248e66ab911391af18bf955beb87ee8461 (diff) | |
download | gcc-0712f356374c2cf26015cccfa3141537e42cbb12.zip gcc-0712f356374c2cf26015cccfa3141537e42cbb12.tar.gz gcc-0712f356374c2cf26015cccfa3141537e42cbb12.tar.bz2 |
Fortran: character length of pointer assignments in structure constructors
gcc/fortran/ChangeLog:
PR fortran/50549
* resolve.cc (resolve_structure_cons): Reject pointer assignments
of character with different lengths in structure constructor.
gcc/testsuite/ChangeLog:
PR fortran/50549
* gfortran.dg/char_pointer_assign_7.f90: New test.
Diffstat (limited to 'gcc/fortran/resolve.cc')
-rw-r--r-- | gcc/fortran/resolve.cc | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 5522be7..2907677 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -1375,11 +1375,22 @@ resolve_structure_cons (gfc_expr *expr, int init) && comp->ts.u.cl->length->expr_type == EXPR_CONSTANT && cons->expr->ts.u.cl && cons->expr->ts.u.cl->length && cons->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT - && cons->expr->rank != 0 && mpz_cmp (cons->expr->ts.u.cl->length->value.integer, comp->ts.u.cl->length->value.integer) != 0) { + if (comp->attr.pointer) + { + HOST_WIDE_INT la, lb; + la = gfc_mpz_get_hwi (comp->ts.u.cl->length->value.integer); + lb = gfc_mpz_get_hwi (cons->expr->ts.u.cl->length->value.integer); + gfc_error ("Unequal character lengths (%wd/%wd) for pointer " + "component %qs in constructor at %L", + la, lb, comp->name, &cons->expr->where); + t = false; + } + if (cons->expr->expr_type == EXPR_VARIABLE + && cons->expr->rank != 0 && cons->expr->symtree->n.sym->attr.flavor == FL_PARAMETER) { /* Wrap the parameter in an array constructor (EXPR_ARRAY) |