diff --git a/gdb/testsuite/gdb.base/async-shell.exp b/gdb/testsuite/gdb.base/async-shell.exp
index e2d71826bab..2c09863ad59 100644
--- a/gdb/testsuite/gdb.base/async-shell.exp
+++ b/gdb/testsuite/gdb.base/async-shell.exp
@@ -34,7 +34,7 @@ save_vars { GDBFLAGS } {
 
 set gdbindex_warning_re "warning: Skipping \[^\r\n\]+ \\.gdb_index section \[^\r\n\]*\r\nDo \"set use-deprecated-index-sections on\" before the file is read\r\nto use the section anyway\\."
 
-gdb_test "run &" "Starting program: \[^\r\n\]*(\r\n$gdbindex_warning_re)?"
+gdb_test -no-prompt-anchor "run &" "Starting program: \[^\r\n\]*(\r\n$gdbindex_warning_re)?"
 
 # `sleep 5' here would workaround the bug, do not sleep here.
 # "shell" could eat waitpid event from the asynchronous inferior process.
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index ac28ede1b08..f53d90edd00 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -861,9 +861,18 @@ proc gdb_internal_error_resync {} {
 }
 
 # Fill in the default prompt if PROMPT_REGEXP is empty.
-proc fill_in_default_prompt {prompt_regexp} {
+#
+# If WITH_ANCHOR is true and the default prompt is used, append a `$` at the end
+# of the regexp, to anchor the match at the end of the buffer.
+proc fill_in_default_prompt {prompt_regexp with_anchor} {
     if { "$prompt_regexp" == "" } {
-	return "$::gdb_prompt $"
+	set prompt "$::gdb_prompt "
+
+	if { $with_anchor } {
+	    append prompt "$"
+	}
+
+	return $prompt
     }
     return $prompt_regexp
 }
@@ -993,7 +1002,7 @@ proc gdb_test_multiple { command message args } {
 	error "Too few arguments to gdb_test_multiple"
     }
 
-    set prompt_regexp [fill_in_default_prompt $prompt_regexp]
+    set prompt_regexp [fill_in_default_prompt $prompt_regexp true]
 
     if { $message == "" } {
 	set message $command
@@ -1369,6 +1378,10 @@ proc gdb_test_multiline { name args } {
 #
 # -prompt PROMPT_REGEXP specifies a regexp matching the expected prompt
 #   after the command output.  If empty, defaults to "$gdb_prompt $".
+# -no-prompt-anchor specifies that if the default prompt regexp is used, it
+#   should not be anchored at the end of the buffer.  This means that the
+#   pattern can match even if there is stuff output after the prompt.  Does not
+#   have any effect if -prompt is specified.
 # -lbl specifies that line-by-line matching will be used.
 # -nopass specifies that a PASS should not be issued.
 #
@@ -1383,6 +1396,7 @@ proc gdb_test { args } {
 
     parse_args {
 	{prompt ""}
+	{no-prompt-anchor}
 	{lbl}
 	{nopass}
     }
@@ -1398,7 +1412,7 @@ proc gdb_test { args } {
 	set message $command
     }
 
-    set prompt [fill_in_default_prompt $prompt]
+    set prompt [fill_in_default_prompt $prompt [expr !${no-prompt-anchor}]]
 
     set saw_question 0
 
@@ -1475,20 +1489,21 @@ if { [tcl_version_at_least 8 5] == 0 } {
 # gdb_test_no_output [-prompt PROMPT_REGEXP] [-nopass] COMMAND [MESSAGE]
 # Send a command to GDB and verify that this command generated no output.
 #
-# See gdb_test for a description of the -prompt, -nopass, COMMAND, and
-# MESSAGE parameters.
+# See gdb_test for a description of the -prompt, -no-prompt-anchor, -nopass,
+# COMMAND, and MESSAGE parameters.
 
 proc gdb_test_no_output { args } {
     global gdb_prompt
 
     parse_args {
 	{prompt ""}
+	{no-prompt-anchor}
 	{nopass}
     }
 
     lassign $args command message
 
-    set prompt [fill_in_default_prompt $prompt]
+    set prompt [fill_in_default_prompt $prompt [expr !${no-prompt-anchor}]]
 
     set command_regex [string_to_regexp $command]
     gdb_test_multiple $command $message -prompt $prompt {