diff --git a/core/includes/form.inc b/core/includes/form.inc
index 6956f04..ab52a2e 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -2699,6 +2699,9 @@ function theme_select($variables) {
  */
 function form_select_options($element, $choices = NULL) {
   if (!isset($choices)) {
+    if (empty($element['#options'])) {
+      return '';
+    }
     $choices = $element['#options'];
   }
   // array_key_exists() accommodates the rare event where $element['#value'] is NULL.
diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php
index 15d12d8..ce05cca 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php
@@ -354,6 +354,15 @@ function testSelect() {
   }
 
   /**
+   * Tests a select element when #options is not set.
+   */
+  function testEmptySelect() {
+    $this->drupalGet('form-test/empty-select');
+    $this->assertFieldByXPath("//select[1]", NULL, 'Select element found.');
+    $this->assertNoFieldByXPath("//select[1]/option", NULL, 'No option element found.');
+  }
+
+  /**
    * Tests validation of #type 'number' and 'range' elements.
    */
   function testNumber() {
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 4475104..21a6c9a 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -467,6 +467,7 @@ function system_element_info() {
     '#process' => array('form_process_select', 'ajax_process_form'),
     '#theme' => 'select',
     '#theme_wrappers' => array('form_element'),
+    '#options' => array(),
   );
   $types['language_select'] = array(
     '#input' => TRUE,
diff --git a/core/modules/system/tests/modules/form_test/form_test.module b/core/modules/system/tests/modules/form_test/form_test.module
index 03b7cb8..0667364 100644
--- a/core/modules/system/tests/modules/form_test/form_test.module
+++ b/core/modules/system/tests/modules/form_test/form_test.module
@@ -142,6 +142,12 @@ function form_test_menu() {
     'page arguments' => array('form_test_select'),
     'access callback' => TRUE,
   );
+  $items['form-test/empty-select'] = array(
+    'title' => 'Empty Select Element',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_empty_select'),
+    'access callback' => TRUE,
+  );
   $items['form-test/language_select'] = array(
     'title' => t('Language Select'),
     'page callback' => 'drupal_get_form',
@@ -1262,6 +1268,19 @@ function form_test_select($form, &$form_state) {
 }
 
 /**
+ * Builds a form to test select elements when #options is not an array.
+ */
+function form_test_empty_select($form, &$form_state) {
+  $form['empty_select'] = array(
+    '#type' => 'select',
+    '#title' => t('Empty Select'),
+    '#multiple' => FALSE,
+    '#options' => NULL,
+  );
+  return $form;
+}
+
+/**
  * Builds a form to test the language select form element.
  */
 function form_test_language_select() {
