Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.502
diff -u -p -r1.502 form.inc
--- includes/form.inc	7 Oct 2010 17:31:39 -0000	1.502
+++ includes/form.inc	9 Oct 2010 03:01:23 -0000
@@ -1214,7 +1214,21 @@ function _form_validate(&$elements, &$fo
     else {
       drupal_static_reset('form_set_error:limit_validation_errors');
     }
+  }
+
+  // Call user-defined form level validators.
+  if (isset($form_id)) {
+    form_execute_handlers('validate', $elements, $form_state);
+  }
+  // Call any element-specific validators. These must act on the element
+  // #value data.
+  elseif (isset($elements['#element_validate'])) {
+    foreach ($elements['#element_validate'] as $function) {
+      $function($elements, $form_state, $form_state['complete form']);
+    }
+  }
 
+  if (!isset($elements['#validated']) || !$elements['#validated']) {
     // Make sure a value is passed when the field is required.
     if (isset($elements['#needs_validation']) && $elements['#required']) {
       // A simple call to empty() will not cut it here as some fields, like
@@ -1238,21 +1252,10 @@ function _form_validate(&$elements, &$fo
         }
       }
     }
-
-    // Call user-defined form level validators.
-    if (isset($form_id)) {
-      form_execute_handlers('validate', $elements, $form_state);
-    }
-    // Call any element-specific validators. These must act on the element
-    // #value data.
-    elseif (isset($elements['#element_validate'])) {
-      foreach ($elements['#element_validate'] as $function) {
-        $function($elements, $form_state, $form_state['complete form']);
-      }
-    }
-    $elements['#validated'] = TRUE;
   }
 
+  $elements['#validated'] = TRUE;
+
   // Done validating this element, so turn off error suppression.
   // _form_validate() turns it on again when starting on the next element, if
   // it's still appropriate to do so.
