diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index b412d0a97b91281889a4346edbff3ef6965f10ae..f297deb93adde5f6b86e9f23fdc0b8c72cfeb588 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2013-01-15  Paul Thomas  <pault@gcc.gnu.org>
+
+	PR fortran/54286
+	* expr.c (gfc_check_pointer_assign): Check for presence of
+	's2' before using it.
+
 2013-01-14  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
 	PR fortran/55806
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 3010dd9e456972defb51b0059a05b66c5299fee6..f358ac7665eac840424d9857c3e0d9df21a6d6b4 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3537,7 +3537,7 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
 	  name = s2->name;
 	}
 
-      if (s2->attr.proc_pointer && s2->ts.interface)
+      if (s2 && s2->attr.proc_pointer && s2->ts.interface)
 	s2 = s2->ts.interface;
 
       if (s1 == s2 || !s1 || !s2)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e25cfc8bf0fcde52d2adf3ab4d0ec4a1d8179126..b3dba4969d688c772d547ded67d6387c12a7f62f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2013-01-15  Paul Thomas  <pault@gcc.gnu.org>
+
+	PR fortran/54286
+	* gfortran.dg/proc_ptr_result_8.f90 : Add module 'm' to check
+	case where interface is null.
+
 2013-01-14  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
 	PR fortran/55806
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_result_8.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_result_8.f90
index de6f39f910cc199fd1f6ab4bbb881ebb27553679..17812bc4422f4f64b45a685542740619cecb1e7e 100644
--- a/gcc/testsuite/gfortran.dg/proc_ptr_result_8.f90
+++ b/gcc/testsuite/gfortran.dg/proc_ptr_result_8.f90
@@ -2,7 +2,24 @@
 ! Test fix for PR54286.
 !
 ! Contributed by Janus Weil  <janus@gcc.gnu.org>
+! Module 'm' added later because original fix missed possibility of
+! null interfaces - thanks to Dominique Dhumieres  <dominiq@lps.ens.fr>
 !
+module m
+  type :: foobar
+    real, pointer :: array(:)
+    procedure (), pointer, nopass :: f
+  end type
+contains
+  elemental subroutine fooAssgn (a1, a2)
+    type(foobar), intent(out) :: a1
+    type(foobar), intent(in) :: a2
+    allocate (a1%array(size(a2%array)))
+    a1%array = a2%array
+    a1%f => a2%f
+  end subroutine
+end module m
+
 implicit integer (a)
 type :: t
   procedure(a), pointer, nopass :: p