diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2012-03-04 21:50:08 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2012-03-04 21:50:08 +0000 |
commit | 5bf5fa563aea3f8763d2c49d53bf8a0d8c1bc7c2 (patch) | |
tree | 7065977b6c71f54588660cd5fd71f801483a0a0b /gcc/fortran/class.c | |
parent | f0050a4b2a8ac6d61eeffcac8ad484be9ed462a3 (diff) | |
download | gcc-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.c | 33 |
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. */ |