diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c
index 595213f0420f524d8600b376b53faa8a085246c5..062730b6b43b5a85580a5087d36fb4966e66fa19 100644
--- a/src/bin/pg_basebackup/receivelog.c
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -503,26 +503,28 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
 	if (!CheckServerVersionForStreaming(conn))
 		return false;
 
+	/*
+	 * Decide whether we want to report the flush position. If we report
+	 * the flush position, the primary will know what WAL we'll
+	 * possibly re-request, and it can then remove older WAL safely.
+	 * We must always do that when we are using slots.
+	 *
+	 * Reporting the flush position makes one eligible as a synchronous
+	 * replica. People shouldn't include generic names in
+	 * synchronous_standby_names, but we've protected them against it so
+	 * far, so let's continue to do so unless specifically requested.
+	 */
 	if (replication_slot != NULL)
 	{
-		/*
-		 * Report the flush position, so the primary can know what WAL we'll
-		 * possibly re-request, and remove older WAL safely.
-		 *
-		 * We only report it when a slot has explicitly been used, because
-		 * reporting the flush position makes one eligible as a synchronous
-		 * replica. People shouldn't include generic names in
-		 * synchronous_standby_names, but we've protected them against it so
-		 * far, so let's continue to do so in the situations when possible. If
-		 * they've got a slot, though, we need to report the flush position,
-		 * so that the master can remove WAL.
-		 */
 		reportFlushPosition = true;
 		sprintf(slotcmd, "SLOT \"%s\" ", replication_slot);
 	}
 	else
 	{
-		reportFlushPosition = false;
+		if (stream->synchronous)
+			reportFlushPosition = true;
+		else
+			reportFlushPosition = false;
 		slotcmd[0] = 0;
 	}