diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 47cfead00e0e47ca2e4b6fc983ba010fef9a2fcf..5bf0ccc7aaac2097b1a98cc48e4b4f326fc73a30 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,12 @@
+2009-11-04  Tobias Burnus <burnus@gcc.gnu.org>
+	    Janus Weil  <janus@gcc.gnu.org>
+
+	PR fortran/41556
+	PR fortran/41937
+	* interface.c (gfc_check_operator_interface): Handle CLASS arguments.
+	* resolve.c (resolve_allocate_expr): Handle allocatable components of
+	CLASS variables.
+
 2009-11-04  Richard Guenther  <rguenther@suse.de>
 
 	* options.c (gfc_post_options): Rely on common code processing
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 0fd4742a1de895e3eecacf08dc64b550dabd2df1..05e5d2d8a1f2dfc366974f044c3d8a92072f7a30 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -626,6 +626,7 @@ gfc_check_operator_interface (gfc_symbol *sym, gfc_intrinsic_op op,
 	 - Types and kinds do not conform, and
 	 - First argument is of derived type.  */
       if (sym->formal->sym->ts.type != BT_DERIVED
+	  && sym->formal->sym->ts.type != BT_CLASS
 	  && (r1 == 0 || r1 == r2)
 	  && (sym->formal->sym->ts.type == sym->formal->next->sym->ts.type
 	      || (gfc_numeric_ts (&sym->formal->sym->ts)
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 5a5fcccc1f8fc3c278e93ce8ab88545a5e3f6197..4a83f22dfd45b65945e2ca0b7003160af6080c6e 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -6198,7 +6198,7 @@ check_symbols:
 	  sym = a->expr->symtree->n.sym;
 
 	  /* TODO - check derived type components.  */
-	  if (sym->ts.type == BT_DERIVED)
+	  if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
 	    continue;
 
 	  if ((ar->start[i] != NULL
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 67869642dbeb9f17a5e4de89cee81467b790aa68..3066e3d17ff47aab9d034abacbdc9c2b42b1fbcf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2009-11-04  Janus Weil  <janus@gcc.gnu.org>
+
+	PR fortran/41556
+	PR fortran/41937
+	* gfortran.dg/class_11.f03: New test.
+
 2009-11-04  Jason Merrill  <jason@redhat.com>
 
 	PR c++/35067
diff --git a/gcc/testsuite/gfortran.dg/class_11.f03 b/gcc/testsuite/gfortran.dg/class_11.f03
new file mode 100644
index 0000000000000000000000000000000000000000..bf80c4e00e61fb66abd1495e8d32feeace784de1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/class_11.f03
@@ -0,0 +1,37 @@
+! { dg-do compile }
+!
+! PR 41556
+! Contributed by Damian Rouson <damian@rouson.net>
+
+  implicit none
+
+  type ,abstract :: object
+  contains
+    procedure(assign_interface) ,deferred :: assign   
+    generic  :: assignment(=) => assign
+  end type 
+
+  abstract interface
+    subroutine assign_interface(lhs,rhs) 
+      import :: object 
+      class(object) ,intent(inout) :: lhs
+      class(object) ,intent(in)    :: rhs
+    end subroutine 
+  end interface
+
+! PR 41937
+! Contributed by Juergen Reuter <reuter@physik.uni-freiburg.de>
+
+  type, abstract :: cuba_abstract_type
+     integer :: dim_f = 1
+     real, dimension(:), allocatable :: integral
+  end type cuba_abstract_type
+
+contains
+
+    subroutine cuba_abstract_alloc_dim_f(this)
+      class(cuba_abstract_type) :: this
+      allocate(this%integral(this%dim_f))
+    end subroutine cuba_abstract_alloc_dim_f
+
+end