diff options
author | Janus Weil <janus@gcc.gnu.org> | 2010-05-05 09:44:33 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2010-05-05 09:44:33 +0200 |
commit | 371b334e65a898cd795259aebfd60b27d3b963b9 (patch) | |
tree | 23926038722f4a6af948a57c29017730e4298e45 /gcc/fortran | |
parent | ec6c345e9765f7c51739a61733b5acdb44feff17 (diff) | |
download | gcc-371b334e65a898cd795259aebfd60b27d3b963b9.zip gcc-371b334e65a898cd795259aebfd60b27d3b963b9.tar.gz gcc-371b334e65a898cd795259aebfd60b27d3b963b9.tar.bz2 |
re PR fortran/43696 ([OOP] Bogus error: Passed-object dummy argument must not be POINTER)
2010-05-05 Janus Weil <janus@gcc.gnu.org>
PR fortran/43696
* resolve.c (resolve_fl_derived): Some fixes for class variables.
* symbol.c (gfc_build_class_symbol): Add separate class container for
class pointers.
2010-05-05 Janus Weil <janus@gcc.gnu.org>
PR fortran/43696
* gfortran.dg/class_17.f03: New.
From-SVN: r159056
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 14 | ||||
-rw-r--r-- | gcc/fortran/symbol.c | 2 |
3 files changed, 21 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e61c737..0641cbf 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2010-05-05 Janus Weil <janus@gcc.gnu.org> + + PR fortran/43696 + * resolve.c (resolve_fl_derived): Some fixes for class variables. + * symbol.c (gfc_build_class_symbol): Add separate class container for + class pointers. + 2010-05-03 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/43592 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 93c5b48..d92c69c 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -10794,7 +10794,7 @@ resolve_fl_derived (gfc_symbol *sym) /* If this type is an extension, see if this component has the same name as an inherited type-bound procedure. */ - if (super_type + if (super_type && !sym->attr.is_class && gfc_find_typebound_proc (super_type, NULL, c->name, true, NULL)) { gfc_error ("Component '%s' of '%s' at %L has the same name as an" @@ -10841,7 +10841,7 @@ resolve_fl_derived (gfc_symbol *sym) } } - if (c->ts.type == BT_DERIVED && c->attr.pointer + if (!sym->attr.is_class && c->ts.type == BT_DERIVED && c->attr.pointer && c->ts.u.derived->components == NULL && !c->ts.u.derived->attr.zero_comp) { @@ -10851,6 +10851,16 @@ resolve_fl_derived (gfc_symbol *sym) return FAILURE; } + if (c->ts.type == BT_CLASS && c->ts.u.derived->components->attr.pointer + && c->ts.u.derived->components->ts.u.derived->components == NULL + && !c->ts.u.derived->components->ts.u.derived->attr.zero_comp) + { + gfc_error ("The pointer component '%s' of '%s' at %L is a type " + "that has not been declared", c->name, sym->name, + &c->loc); + return FAILURE; + } + /* C437. */ if (c->ts.type == BT_CLASS && !(c->ts.u.derived->components->attr.pointer diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index b19714c..8403578 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -4720,6 +4720,8 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr, sprintf (name, ".class.%s.%d.a", ts->u.derived->name, (*as)->rank); else if ((*as) && (*as)->rank) sprintf (name, ".class.%s.%d", ts->u.derived->name, (*as)->rank); + else if (attr->pointer) + sprintf (name, ".class.%s.p", ts->u.derived->name); else if (attr->allocatable) sprintf (name, ".class.%s.a", ts->u.derived->name); else |