Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.497
diff -u -p -r1.497 form.inc
--- includes/form.inc	27 Sep 2010 00:53:55 -0000	1.497
+++ includes/form.inc	29 Sep 2010 20:29:55 -0000
@@ -2323,10 +2323,6 @@ function form_process_select($element) {
   if ($element['#multiple']) {
     $element['#attributes']['multiple'] = 'multiple';
     $element['#attributes']['name'] = $element['#name'] . '[]';
-    // If not explicitly set, #required has to default to FALSE (see below).
-    if (!isset($element['#required'])) {
-      $element['#required'] = FALSE;
-    }
   }
   // A non-#multiple select needs special handling to prevent user agents from
   // preselecting the first option without intention. #multiple select lists do
@@ -2334,41 +2330,23 @@ function form_process_select($element) {
   else {
     $add_empty_option = FALSE;
     // Select elements always have a value in HTML, so the expectation is that
-    // the user has to choose an option. Therefore, a select element is set to
-    // #required TRUE, unless it has been explicitly set to FALSE. This differs
-    // from every other element which gets a default of #required FALSE via
-    // form_builder(). To avoid this default, system_element_info() sets
-    // #required to NULL.
-    // If #required has been explicitly set to FALSE, the user may optionally
-    // choose an option, which can be "None".
-    if (isset($element['#required']) && !$element['#required']) {
-      $element['#required'] = FALSE;
+    // the user has to choose an option.
+    if (!$element['#required']) {
       $element += array(
         '#empty_value' => '',
         '#empty_option' => t('- None -'),
       );
       $add_empty_option = TRUE;
     }
-    // Otherwise, if #required is TRUE (or not set) and there is no
-    // #default_value, then the user has to choose an option, which makes this
-    // element #required.
+    // Otherwise, if #required is TRUE and there is no #default_value, then the
+    // user has to choose an option.
     elseif (!isset($element['#default_value'])) {
-      // By only conditionally setting #required to TRUE, we additionally ensure
-      // that the select element does not get a required marker if it already
-      // has a value.
-      $element['#required'] = TRUE;
       $element += array(
         '#empty_value' => '',
         '#empty_option' => t('- Select -'),
       );
       $add_empty_option = TRUE;
     }
-    // If there is a #default_value and #required is not explicitly FALSE, then
-    // there is no point in adding an empty option which is never valid, and we
-    // just retain API compatibility.
-    if (!isset($element['#required'])) {
-      $element['#required'] = FALSE;
-    }
     // If one of the above conditions is met, add a first empty default option,
     // which is always invalid for #required select lists that do not specify a
     // #default_value.
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.349
diff -u -p -r1.349 filter.module
--- modules/filter/filter.module	29 Sep 2010 14:58:24 -0000	1.349
+++ modules/filter/filter.module	29 Sep 2010 21:22:03 -0000
@@ -843,6 +843,7 @@ function filter_process_format($element)
   $element['format']['format'] = array(
     '#type' => 'select',
     '#title' => t('Text format'),
+    '#required' => TRUE,
     '#options' => $options,
     '#default_value' => $element['#format'],
     '#access' => count($formats) > 1,
Index: modules/simpletest/tests/form.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/form.test,v
retrieving revision 1.70
diff -u -p -r1.70 form.test
--- modules/simpletest/tests/form.test	28 Sep 2010 02:30:32 -0000	1.70
+++ modules/simpletest/tests/form.test	29 Sep 2010 20:30:17 -0000
@@ -164,6 +165,8 @@ class FormsTestCase extends DrupalWebTes
     // Posting without any values should throw validation errors.
     $this->drupalPost(NULL, array(), 'Submit');
     $this->assertNoText(t($error, array('!name' => $form['select']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['select_required']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['select_optional']['#title'])));
     $this->assertNoText(t($error, array('!name' => $form['empty_value']['#title'])));
     $this->assertNoText(t($error, array('!name' => $form['empty_value_one']['#title'])));
     $this->assertText(t($error, array('!name' => $form['no_default']['#title'])));
Index: modules/simpletest/tests/form_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/form_test.module,v
retrieving revision 1.50
diff -u -p -r1.50 form_test.module
--- modules/simpletest/tests/form_test.module	27 Sep 2010 00:53:56 -0000	1.50
+++ modules/simpletest/tests/form_test.module	29 Sep 2010 20:32:05 -0000
@@ -789,19 +789,32 @@ function form_test_select($form, &$form_
     '#title' => '#default_value one',
     '#default_value' => 'one',
   );
+  $form['select_required'] = $base + array(
+    '#title' => '#default_value one, #required',
+    '#required' => TRUE,
+    '#default_value' => 'one',
+  );
+  $form['select_optional'] = $base + array(
+    '#title' => '#default_value one, not #required',
+    '#required' => FALSE,
+    '#default_value' => 'one',
+  );
   $form['empty_value'] = $base + array(
-    '#title' => '#default_value one, #empty_value 0',
+    '#title' => '#default_value one, #required, #empty_value 0',
+    '#required' => TRUE,
     '#default_value' => 'one',
     '#empty_value' => 0,
   );
   $form['empty_value_one'] = $base + array(
-    '#title' => '#default_value = #empty_value',
+    '#title' => '#default_value = #empty_value, #required',
+    '#required' => TRUE,
     '#default_value' => 'one',
     '#empty_value' => 'one',
   );
 
   $form['no_default'] = $base + array(
-    '#title' => 'No #default_value',
+    '#title' => 'No #default_value, #required',
+    '#required' => TRUE,
   );
   $form['no_default_optional'] = $base + array(
     '#title' => 'No #default_value, not #required',
@@ -810,7 +823,8 @@ function form_test_select($form, &$form_
   );
 
   $form['no_default_empty_option'] = $base + array(
-    '#title' => 'No #default_value, #empty_option',
+    '#title' => 'No #default_value, #required, #empty_option',
+    '#required' => TRUE,
     '#empty_option' => '- Choose -',
   );
   $form['no_default_empty_option_optional'] = $base + array(
@@ -821,12 +835,14 @@ function form_test_select($form, &$form_
   );
 
   $form['no_default_empty_value'] = $base + array(
-    '#title' => 'No #default_value, #empty_value 0',
+    '#title' => 'No #default_value, #required, #empty_value 0',
+    '#required' => TRUE,
     '#empty_value' => 0,
     '#description' => 'Should never result in 0.',
   );
   $form['no_default_empty_value_one'] = $base + array(
-    '#title' => 'No #default_value, #empty_value one',
+    '#title' => 'No #default_value, #required, #empty_value one',
+    '#required' => TRUE,
     '#empty_value' => 'one',
     '#description' => 'A mistakenly assigned #empty_value contained in #options should not be valid.',
   );
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.967
diff -u -p -r1.967 system.module
--- modules/system/system.module	29 Sep 2010 16:06:11 -0000	1.967
+++ modules/system/system.module	29 Sep 2010 20:28:13 -0000
@@ -399,11 +399,6 @@ function system_element_info() {
   );
   $types['select'] = array(
     '#input' => TRUE,
-    // In order to be able to determine whether a select list needs an empty
-    // default option, #required has to be NULL by default, as form_builder()
-    // preemptively sets #required to FALSE for all elements.
-    // @see form_process_select()
-    '#required' => NULL,
     '#multiple' => FALSE,
     '#process' => array('form_process_select', 'ajax_process_form'),
     '#theme' => 'select',
