Index: gcc/testsuite/gfortran.dg/allocate_class_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/allocate_class_1.f90	(revision 188139)
+++ gcc/testsuite/gfortran.dg/allocate_class_1.f90	(working copy)
@@ -7,5 +7,5 @@
  type :: t0
  end type
  class(t0) :: x  ! { dg-error "must be dummy, allocatable or pointer" }
- allocate(x)     ! { dg-error "is neither a nonprocedure pointer nor an allocatable variable" }
+ allocate(x)     ! { dg-error "is neither a data pointer nor an allocatable variable" }
  end
Index: gcc/testsuite/gfortran.dg/allocate_with_typespec_4.f90
===================================================================
--- gcc/testsuite/gfortran.dg/allocate_with_typespec_4.f90	(revision 188139)
+++ gcc/testsuite/gfortran.dg/allocate_with_typespec_4.f90	(working copy)
@@ -21,7 +21,7 @@ subroutine not_an_f03_intrinsic
    allocate(real*8 :: y(1))       ! { dg-error "Invalid type-spec at" }
    allocate(real*4 :: x8)         ! { dg-error "Invalid type-spec at" }
    allocate(real*4 :: y8(1))      ! { dg-error "Invalid type-spec at" }
-   allocate(double complex :: d1) ! { dg-error "neither a nonprocedure pointer nor an allocatable" }
+   allocate(double complex :: d1) ! { dg-error "neither a data pointer nor an allocatable" }
    allocate(real_type :: b)
    allocate(real_type :: c(1))
 
Index: gcc/testsuite/gfortran.dg/allocate_alloc_opt_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/allocate_alloc_opt_1.f90	(revision 188139)
+++ gcc/testsuite/gfortran.dg/allocate_alloc_opt_1.f90	(working copy)
@@ -24,7 +24,7 @@ program a
   allocate(i(2), errmsg=err) ! { dg-warning "useless without a STAT" }
   allocate(i(2), stat=j, errmsg=x) ! { dg-error "must be a scalar CHARACTER" }
 
-  allocate(err) ! { dg-error "neither a nonprocedure pointer nor an allocatable" }
+  allocate(err) ! { dg-error "neither a data pointer nor an allocatable" }
 
   allocate(error(2),stat=j,errmsg=error(1)) ! { dg-error "shall not be ALLOCATEd within" }
   allocate(i(2), stat = i(1))  ! { dg-error "shall not be ALLOCATEd within" }
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c	(revision 188139)
+++ gcc/fortran/resolve.c	(working copy)
@@ -6986,6 +6986,7 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code
 	}
     }
 
+  /* Check for F08:C628.  */
   if (allocatable == 0 && pointer == 0)
     {
       gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",
Index: gcc/fortran/match.c
===================================================================
--- gcc/fortran/match.c	(revision 188139)
+++ gcc/fortran/match.c	(working copy)
@@ -3533,6 +3533,28 @@ gfc_match_allocate (void)
 	    }
 	}
 
+      /* Check for F08:C628.  */
+      sym = tail->expr->symtree->n.sym;
+      b1 = !(tail->expr->ref
+	     && (tail->expr->ref->type == REF_COMPONENT
+		 || tail->expr->ref->type == REF_ARRAY));
+      if (sym && sym->ts.type == BT_CLASS && sym->attr.class_ok)
+	b2 = !(CLASS_DATA (sym)->attr.allocatable
+	       || CLASS_DATA (sym)->attr.class_pointer);
+      else
+	b2 = sym && !(sym->attr.allocatable || sym->attr.pointer
+		      || sym->attr.proc_pointer);
+      b3 = sym && sym->ns && sym->ns->proc_name
+	   && (sym->ns->proc_name->attr.allocatable
+	       || sym->ns->proc_name->attr.pointer
+	       || sym->ns->proc_name->attr.proc_pointer);
+      if (b1 && b2 && !b3)
+	{
+	  gfc_error ("Allocate-object at %L is neither a data pointer "
+		     "nor an allocatable variable", &tail->expr->where);
+	  goto cleanup;
+	}
+
       /* The ALLOCATE statement had an optional typespec.  Check the
 	 constraints.  */
       if (ts.type != BT_UNKNOWN)
@@ -3558,28 +3580,6 @@ gfc_match_allocate (void)
       if (tail->expr->ts.type == BT_DERIVED)
 	tail->expr->ts.u.derived = gfc_use_derived (tail->expr->ts.u.derived);
 
-      /* FIXME: disable the checking on derived types and arrays.  */
-      sym = tail->expr->symtree->n.sym;
-      b1 = !(tail->expr->ref
-	   && (tail->expr->ref->type == REF_COMPONENT
-		|| tail->expr->ref->type == REF_ARRAY));
-      if (sym && sym->ts.type == BT_CLASS && sym->attr.class_ok)
-	b2 = !(CLASS_DATA (sym)->attr.allocatable
-	       || CLASS_DATA (sym)->attr.class_pointer);
-      else
-	b2 = sym && !(sym->attr.allocatable || sym->attr.pointer
-		      || sym->attr.proc_pointer);
-      b3 = sym && sym->ns && sym->ns->proc_name
-	   && (sym->ns->proc_name->attr.allocatable
-		|| sym->ns->proc_name->attr.pointer
-		|| sym->ns->proc_name->attr.proc_pointer);
-      if (b1 && b2 && !b3)
-	{
-	  gfc_error ("Allocate-object at %L is neither a nonprocedure pointer "
-		     "nor an allocatable variable", &tail->expr->where);
-	  goto cleanup;
-	}
-
       if (gfc_peek_ascii_char () == '(' && !sym->attr.dimension)
 	{
 	  gfc_error ("Shape specification for allocatable scalar at %C");
