diff -u b/core/includes/theme.inc b/core/includes/theme.inc
--- b/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -16,7 +16,6 @@
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Config\Config;
 use Drupal\Core\Config\StorageException;
-use Drupal\Core\Render\SafeString;
 use Drupal\Core\Template\Attribute;
 use Drupal\Core\Theme\ThemeSettings;
 use Drupal\Component\Utility\NestedArray;
@@ -1067,25 +1066,6 @@
 }
 
 /**
- * Prepares variables for inline list templates.
- *
- * Default template: inline-list.html.twig.
- *
- * @param array $variables
- *   An associative array containing:
- *   - items: An array of items to be displayed in the list.
- *   - separator: A string to separate list items.
- *   - empty: A message to display when there are no items.
- *
- * @see https://www.drupal.org/node/1842756
- */
-function template_preprocess_inline_list(&$variables) {
-  // Since the separator may be user-specified, it must be filtered to permit
-  // some HTML (such as <br />) to pass through.
-  $variables['separator'] = SafeString::create(Xss::filter($variables['separator'], ['br']));
-}
-
-/**
  * Returns HTML for an indentation div; used for drag and drop tables.
  *
  * @param $variables
@@ -1103,6 +1083,32 @@
 }
 
 /**
+ * Returns HTML for an inline list of items.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - items: A list of items.
+ *   - separator: A delimiter to separate the items in the list.
+ *
+ * @return string
+ *   HTML for an inline list of items.
+ *
+ * @ingroup themeable
+ */
+function theme_inline_list($variables) {
+  if (!SafeMarkup::isSafe($variables['separator'])) {
+    // Since the separator may be user-specified, it must be filtered to permit
+    // some HTML (such as <br />) to pass through.
+    $variables['separator'] = Xss::filter($variables['separator'], ['br']);
+  }
+  // Escape the items if they are unsafe.
+  $variables['items'] = array_map(['\Drupal\Component\Utility\SafeMarkup', 'escape'], $variables['items']);
+
+  // Return the inline list.
+  return implode($variables['separator'], $variables['items']);
+}
+
+/**
  * Prepares variables for container templates.
  *
  * Default template: container.html.twig.
@@ -1747,7 +1753,8 @@
       'variables' => array('items' => array(), 'title' => '', 'list_type' => 'ul', 'attributes' => array(), 'empty' => NULL, 'context' => array()),
     ),
     'inline_list' => array(
-      'variables' => array('items' => array(), 'separator' => ', ', 'attributes' => array(), 'empty' => NULL),
+      'variables' => array('items' => array(), 'separator' => ', '),
+      'function' => 'theme_inline_list',
     ),
     'feed_icon' => array(
       'variables' => array('url' => NULL, 'title' => NULL),
diff -u b/core/modules/system/src/Tests/Theme/FunctionsTest.php b/core/modules/system/src/Tests/Theme/FunctionsTest.php
--- b/core/modules/system/src/Tests/Theme/FunctionsTest.php
+++ b/core/modules/system/src/Tests/Theme/FunctionsTest.php
@@ -42,19 +42,6 @@
     $expected = '';
     $this->assertThemeOutput('item_list', $variables, $expected, 'Empty %callback with title generates no output.');
 
-    // Verify that empty items produce the empty string.
-    $variables = array();
-    $variables['empty'] = 'No items found.';
-    $expected = '<div class="item-list">No items found.</div>';
-    $this->assertThemeOutput('item_list', $variables, $expected, 'Empty %callback generates empty string.');
-
-    // Verify that empty items produce the empty string with title.
-    $variables = array();
-    $variables['title'] = 'Some title';
-    $variables['empty'] = 'No items found.';
-    $expected = '<div class="item-list"><h3>Some title</h3>No items found.</div>';
-    $this->assertThemeOutput('item_list', $variables, $expected, 'Empty %callback generates empty string with title.');
-
     // Verify that title set to 0 is output.
     $variables = array();
     $variables['title'] = 0;
@@ -168,7 +155,7 @@
   }
 
   /**
-   * Tests inline-list.html.twig.
+   * Tests theme_inline_list().
    */
   function testInlineList() {
     // Verify that empty items produce no output.
@@ -176,19 +163,6 @@
     $expected = '';
     $this->assertThemeOutput('inline_list', $variables, $expected, 'Empty %callback generates no output.');
 
-    // Verify that empty items produce the empty string.
-    $variables = array();
-    $variables['empty'] = 'No items found.';
-    $expected = 'No items found.';
-    $this->assertThemeOutput('inline_list', $variables, $expected, 'Empty %callback generates empty string.');
-
-    // Verify that empty text is not displayed when there are list items.
-    $variables = array();
-    $variables['empty'] = 'No items found.';
-    $variables['items'] = array('Rabbit', 'rabbit', 'rabbit');
-    $expected = 'Rabbit, rabbit, rabbit';
-    $this->assertThemeOutput('inline_list', $variables, $expected, '%callback does not print empty text when there are list items.');
-
     // Verify that a non-default separator is rendered.
     $variables = array();
     $variables['items'] = array('Un', 'Deux', 'Trois');
reverted:
--- b/core/modules/system/templates/inline-list.html.twig
+++ /dev/null
@@ -1,20 +0,0 @@
-{#
-/**
- * @file
- * Default theme implementation for an inline list of items.
- *
- * Available variables:
- * - items: A list of items.
- * - separator: A delimiter to separate the items in the list.
- * - empty: A message to display when there are no items.
- *
- * @see template_preprocess_inline_list()
- *
- * @ingroup themeable
- */
-#}
-{%- for item in items -%}
-  {{ item }}{{ loop.last ? '' : separator }}
-{%- else -%}
-  {{- empty -}}
-{%- endfor -%}
