aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/class.c
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2012-03-04 21:50:08 +0000
committerMikael Morin <mikael@gcc.gnu.org>2012-03-04 21:50:08 +0000
commit5bf5fa563aea3f8763d2c49d53bf8a0d8c1bc7c2 (patch)
tree7065977b6c71f54588660cd5fd71f801483a0a0b /gcc/fortran/class.c
parentf0050a4b2a8ac6d61eeffcac8ad484be9ed462a3 (diff)
downloadgcc-5bf5fa563aea3f8763d2c49d53bf8a0d8c1bc7c2.zip
gcc-5bf5fa563aea3f8763d2c49d53bf8a0d8c1bc7c2.tar.gz
gcc-5bf5fa563aea3f8763d2c49d53bf8a0d8c1bc7c2.tar.bz2
re PR fortran/50981 ([OOP] Wrong-code for scalarizing ELEMENTAL call with absent OPTIONAL argument)
fortran/ PR fortran/50981 * gfortran.h (gfc_is_class_container_ref): New prototype. * class.c (gfc_is_class_container_ref): New function. * trans-expr.c (gfc_conv_procedure_call): Add a "_data" component reference to polymorphic actual arguments. testsuite/ PR fortran/50981 * gfortran.dg/elemental_optional_args_5.f03: Add subcomponent actual argument checks. From-SVN: r184904
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r--gcc/fortran/class.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index bfa8740..a275136 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -361,6 +361,39 @@ gfc_is_class_scalar_expr (gfc_expr *e)
}
+/* Tells whether the expression E is a reference to a (scalar) class container.
+ Scalar because array class containers usually have an array reference after
+ them, and gfc_fix_class_refs will add the missing "_data" component reference
+ in that case. */
+
+bool
+gfc_is_class_container_ref (gfc_expr *e)
+{
+ gfc_ref *ref;
+ bool result;
+
+ if (e->expr_type != EXPR_VARIABLE)
+ return e->ts.type == BT_CLASS;
+
+ if (e->symtree->n.sym->ts.type == BT_CLASS)
+ result = true;
+ else
+ result = false;
+
+ for (ref = e->ref; ref; ref = ref->next)
+ {
+ if (ref->type != REF_COMPONENT)
+ result = false;
+ else if (ref->u.c.component->ts.type == BT_CLASS)
+ result = true;
+ else
+ result = false;
+ }
+
+ return result;
+}
+
+
/* Build a NULL initializer for CLASS pointers,
initializing the _data component to NULL and
the _vptr component to the declared type. */