aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/interface.c
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2013-11-25 10:45:40 +0100
committerJanus Weil <janus@gcc.gnu.org>2013-11-25 10:45:40 +0100
commit3436db7558562d59027e9ce4c530b660fe5c0011 (patch)
tree6c1218b6df0da65a7147f2d94d186b29707aa20d /gcc/fortran/interface.c
parent7c3001f41a2346db040675a26a14979d3bf76c2b (diff)
downloadgcc-3436db7558562d59027e9ce4c530b660fe5c0011.zip
gcc-3436db7558562d59027e9ce4c530b660fe5c0011.tar.gz
gcc-3436db7558562d59027e9ce4c530b660fe5c0011.tar.bz2
re PR fortran/59143 ([OOP] Bogus warning with array-valued type-bound procedure)
2013-11-25 Janus Weil <janus@gcc.gnu.org> PR fortran/59143 * interface.c (get_expr_storage_size): Handle array-valued type-bound procedures. 2013-11-25 Janus Weil <janus@gcc.gnu.org> PR fortran/59143 * gfortran.dg/typebound_proc_30.f90: New. From-SVN: r205345
Diffstat (limited to 'gcc/fortran/interface.c')
-rw-r--r--gcc/fortran/interface.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 5a0aa26..da3db7e 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -2426,6 +2426,24 @@ get_expr_storage_size (gfc_expr *e)
- mpz_get_si (ref->u.ar.as->lower[i]->value.integer));
}
}
+ else if (ref->type == REF_COMPONENT && ref->u.c.component->attr.function
+ && ref->u.c.component->attr.proc_pointer
+ && ref->u.c.component->attr.dimension)
+ {
+ /* Array-valued procedure-pointer components. */
+ gfc_array_spec *as = ref->u.c.component->as;
+ for (i = 0; i < as->rank; i++)
+ {
+ if (!as->upper[i] || !as->lower[i]
+ || as->upper[i]->expr_type != EXPR_CONSTANT
+ || as->lower[i]->expr_type != EXPR_CONSTANT)
+ return 0;
+
+ elements = elements
+ * (mpz_get_si (as->upper[i]->value.integer)
+ - mpz_get_si (as->lower[i]->value.integer) + 1L);
+ }
+ }
}
if (substrlen)