diff --git src/wp-includes/class-wp-theme.php src/wp-includes/class-wp-theme.php
index 77b5742a49..5a691b72db 100644
--- src/wp-includes/class-wp-theme.php
+++ src/wp-includes/class-wp-theme.php
@@ -267,6 +267,14 @@ final class WP_Theme implements ArrayAccess {
 			}
 		}
 
+		if ( ! $this->template && $this->stylesheet === $this->headers['Template'] ) {
+			/* translators: %s: Template */
+			$this->errors = new WP_Error( 'theme_child_invalid', sprintf( __( 'The theme defines itself as its parent theme. Please check the "%s" header.' ), 'Template' ) );
+			$this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet ) );
+
+			return;
+		}
+
 		// (If template is set from cache [and there are no errors], we know it's good.)
 		if ( ! $this->template && ! ( $this->template = $this->headers['Template'] ) ) {
 			$this->template = $this->stylesheet;
diff --git tests/phpunit/tests/theme/WPTheme.php tests/phpunit/tests/theme/WPTheme.php
index da7374e090..b0886e51d8 100644
--- tests/phpunit/tests/theme/WPTheme.php
+++ tests/phpunit/tests/theme/WPTheme.php
@@ -140,6 +140,16 @@ class Tests_Theme_WPTheme extends WP_UnitTestCase {
 		$this->assertFalse( $theme->display( 'Tags' ) );
 	}
 
+	/**
+	 * @ticket 40820
+	 */
+	function test_child_theme_with_itself_as_parent_should_appear_as_broken() {
+		$theme = new WP_Theme( 'child-parent-itself', $this->theme_root );
+		$errors = $theme->errors();
+		$this->assertWPError( $errors );
+		$this->assertEquals( 'theme_child_invalid', $errors->get_error_code() );
+	}
+
 
 	/**
 	 * Enable a single theme on a network.
diff --git tests/phpunit/tests/theme/themeDir.php tests/phpunit/tests/theme/themeDir.php
index ef6e64c210..67301429ef 100644
--- tests/phpunit/tests/theme/themeDir.php
+++ tests/phpunit/tests/theme/themeDir.php
@@ -175,8 +175,20 @@ class Tests_Theme_ThemeDir extends WP_UnitTestCase {
 	 * @expectedDeprecated get_broken_themes
 	 */
 	function test_broken_themes() {
-		$themes = get_themes();
-		$expected = array('broken-theme' => array('Name' => 'broken-theme', 'Title' => 'broken-theme', 'Description' => __('Stylesheet is missing.')));
+		$themes   = get_themes();
+
+		$expected = array(
+			'broken-theme'           => array(
+				'Name'        => 'broken-theme',
+				'Title'       => 'broken-theme',
+				'Description' => __( 'Stylesheet is missing.' ),
+			),
+			'Child and Parent Theme' => array(
+				'Name'        => 'Child and Parent Theme',
+				'Title'       => 'Child and Parent Theme',
+				'Description' => sprintf( __( 'The theme defines itself as its parent theme. Please check the "%s" header.' ), 'Template' ),
+			),
+		);
 
 		$this->assertEquals($expected, get_broken_themes() );
 	}
