diff --git a/ChangeLog b/ChangeLog
index 3cc352e481f0804cb2280b9e9c739b8f8616500b..96ba359604856af28b0e76144c94be95f65052c5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,11 @@
 	whenever possible, so that ~user/file.txt and "~user/file.txt"
 	are treated the same way if ~user is a user's home directory.
 	* files.c (real_dir_from_tilde): Simplify.
+	* files.c (do_writeout): Properly display the warning in all
+	cases if we try to save (a) an existing file under a different
+	name, or (b) a file with no name under an existing file's name.
+	* files.c (do_writeout): Rename variable different_name to
+	do_warning, for clarity.
 	* rcfile.c (parse_include): Open files using their full paths
 	whenever possible, so that ~user/file.txt and "~user/file.txt"
 	are treated the same way if ~user is a user's home directory.
diff --git a/src/files.c b/src/files.c
index 2cd54d2fce00c165a9debe64c40ebb41149bb508..c5fbdbf1632e101cfc4d5de97da882dbe01b1f40 100644
--- a/src/files.c
+++ b/src/files.c
@@ -1892,7 +1892,7 @@ bool do_writeout(bool exiting)
 
 	    if (append == OVERWRITE) {
 		size_t answer_len = strlen(answer);
-		bool name_exists, different_name;
+		bool name_exists, do_warning;
 		char *full_answer, *full_filename;
 		struct stat st;
 
@@ -1900,12 +1900,14 @@ bool do_writeout(bool exiting)
 		 * full path. */
 		sunder(answer);
 
-		name_exists = (stat(answer, &st) != -1);
 		full_answer = get_full_path(answer);
 		full_filename = get_full_path(openfile->filename);
-		different_name = (strcmp((full_answer == NULL) ?
+		name_exists = (stat((full_answer == NULL) ? answer :
+			full_answer, &st) != -1);
+		do_warning = ((openfile->filename[0] == '\0' &&
+			name_exists) || (strcmp((full_answer == NULL) ?
 			answer : full_answer, (full_filename == NULL) ?
-			openfile->filename : full_filename) != 0);
+			openfile->filename : full_filename) != 0));
 
 		/* Convert nulls to newlines.  answer_len is the
 		 * string's real length. */
@@ -1916,7 +1918,7 @@ bool do_writeout(bool exiting)
 		if (full_answer != NULL)
 		    free(full_answer);
 
-		if (different_name) {
+		if (do_warning) {
 		    if (name_exists) {
 			/* If we're using restricted mode, we aren't
 			 * allowed to save a new file under the name of