diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 3 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/class_56.f90 | 22 |
5 files changed, 40 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4431327..e7e5231 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2013-03-10 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/56575 + * expr.c (gfc_default_initializer): Check that a class declared + type has any components. + * resolve.c (resolve_fl_derived0): On failing the test for C437 + set the type to BT_UNKNOWN to prevent repeat error messages. + 2013-03-03 Mikael Morin <mikael@gcc.gnu.org> PR fortran/56477 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index fd17a05..1b74a44 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3886,7 +3886,8 @@ gfc_default_initializer (gfc_typespec *ts) types (otherwise we could use gfc_has_default_initializer()). */ for (comp = ts->u.derived->components; comp; comp = comp->next) if (comp->initializer || comp->attr.allocatable - || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable)) + || (comp->ts.type == BT_CLASS && CLASS_DATA (comp) + && CLASS_DATA (comp)->attr.allocatable)) break; if (!comp) diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 01e68ab..bb0b946 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -12866,6 +12866,8 @@ resolve_fl_derived0 (gfc_symbol *sym) { gfc_error ("Component '%s' with CLASS at %L must be allocatable " "or pointer", c->name, &c->loc); + /* Prevent a recurrence of the error. */ + c->ts.type = BT_UNKNOWN; return FAILURE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 15156f7..a63991e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-03-10 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/56575 + * gfortran.dg/class_56.f90: New test. + 2013-03-09 Richard Sandiford <rdsandiford@googlemail.com> PR middle-end/56524 @@ -330,7 +335,7 @@ 2013-02-21 Marek Polacek <polacek@redhat.com> PR tree-optimization/56398 - * g++.dg/torture/pr56398.C: New test. + * g++.dg/torture/pr56398.C: New test. 2013-02-21 Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/testsuite/gfortran.dg/class_56.f90 b/gcc/testsuite/gfortran.dg/class_56.f90 new file mode 100644 index 0000000..26df798 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_56.f90 @@ -0,0 +1,22 @@ +! { dg-do compile } +! Test fix for PR56575. +! +! Contributed by A Kasahara <latlon90180+gcc_bugzilla@gmail.com> +! +module lib_container + implicit none + + type:: Object + end type Object + + type:: Container + class(Object):: v ! { dg-error "must be allocatable or pointer" } + end type Container + +contains + + subroutine proc(self) + class(Container), intent(inout):: self + end subroutine proc +end module lib_container + |