Index: src/wp-includes/query.php
===================================================================
--- src/wp-includes/query.php	(revision 27065)
+++ src/wp-includes/query.php	(working copy)
@@ -2756,8 +2756,10 @@
 				foreach ( $statuswheres as $index => $statuswhere )
 					$statuswheres[$index] = "($statuswhere OR ($wpdb->posts.post_status = 'inherit' AND " . str_replace($wpdb->posts, 'p2', $statuswhere) . "))";
 			}
-			foreach ( $statuswheres as $statuswhere )
-				$where .= " AND $statuswhere";
+			$where_status = implode( ' OR ', $statuswheres );
+			if ( ! empty( $where_status ) ) {
+				$where .= " AND ($where_status)";
+			} 
 		} elseif ( !$this->is_singular ) {
 			$where .= " AND ($wpdb->posts.post_status = 'publish'";
 
Index: tests/phpunit/tests/query/results.php
===================================================================
--- tests/phpunit/tests/query/results.php	(revision 27065)
+++ tests/phpunit/tests/query/results.php	(working copy)
@@ -533,4 +533,14 @@
 		$this->assertFalse( $this->q->is_month );
 		$this->assertFalse( $this->q->is_year );
 	}
+
+	function test_perm_with_status_array() {
+		global $wpdb;
+		$this->q->query( array( 'perm' => 'readable', 'post_status' => array( 'publish', 'private' ) ) );
+		$this->assertTrue( $this->q->have_posts() );
+		$this->assertContains( "(({$wpdb->posts}.post_status = 'publish') OR ({$wpdb->posts}.post_author = 0 AND ({$wpdb->posts}.post_status = 'private')))",
+			$this->q->request
+		);
+		$this->assertNotContains( "({$wpdb->posts}.post_status = 'publish') AND", $this->q->request );
+	}
 }
Index: tests/phpunit/tests/query.php
===================================================================
--- tests/phpunit/tests/query.php	(revision 27065)
+++ tests/phpunit/tests/query.php	(working copy)
@@ -76,6 +76,5 @@
 			$first_query->reset_postdata();
 			$this->assertEquals( get_the_ID(), $post_id );
 		}
-
 	}
 }
\ No newline at end of file
