diff --git a/core/includes/form.inc b/core/includes/form.inc
index c94bc62..9acb3e8 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -2674,6 +2674,11 @@ function form_select_options($element, $choices = NULL) {
   if (!isset($choices)) {
     $choices = $element['#options'];
   }
+  // If there are no choices, <option> elements cannot be created.
+  if (!is_array($choices) || !(count($choices) > 0)) {
+    return '';
+  }
+
   // array_key_exists() accommodates the rare event where $element['#value'] is NULL.
   // isset() fails in this situation.
   $value_valid = isset($element['#value']) || array_key_exists('#value', $element);
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 20d1f56..5edfa3f 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Form/FormTest.php
@@ -305,6 +305,15 @@ class FormTest extends WebTestBase {
   }
 
   /**
+   * 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 b9558e5..7b19cd0 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -491,6 +491,7 @@ function system_element_info() {
     '#process' => array('form_process_select', 'ajax_process_form'),
     '#theme' => 'select',
     '#theme_wrappers' => array('form_element'),
+    '#options' => array(),
   );
   $types['weight'] = 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 f681c75..94e2826 100644
--- a/core/modules/system/tests/modules/form_test/form_test.module
+++ b/core/modules/system/tests/modules/form_test/form_test.module
@@ -133,6 +133,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/placeholder-text'] = array(
     'title' => 'Placeholder',
     'page callback' => 'drupal_get_form',
@@ -1204,6 +1210,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;
+}
+
+/**
  * Form submit handler for form_test_select().
  */
 function form_test_select_submit($form, &$form_state) {
