aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/expr.c3
-rw-r--r--gcc/fortran/resolve.c2
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/class_56.f9022
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
+