diff --git a/gdb/testsuite/gdb.base/default.exp b/gdb/testsuite/gdb.base/default.exp
index 0325b8045d..114831f2fc 100644
--- a/gdb/testsuite/gdb.base/default.exp
+++ b/gdb/testsuite/gdb.base/default.exp
@@ -604,6 +604,10 @@ set show_conv_list \
 	{$_cimag = <internal function _cimag>} \
 	{$_creal = <internal function _creal>} \
 	{$_isvoid = <internal function _isvoid>} \
+	{$_gdb_maint_setting_str = <internal function _gdb_maint_setting_str>} \
+	{$_gdb_maint_setting = <internal function _gdb_maint_setting>} \
+	{$_gdb_setting_str = <internal function _gdb_setting_str>} \
+	{$_gdb_setting = <internal function _gdb_setting>} \
 	{$_gdb_major = 8} \
 	{$_gdb_minor = 4} \
 	{$_shell_exitsignal = void} \
diff --git a/gdb/testsuite/gdb.base/setshow.exp b/gdb/testsuite/gdb.base/setshow.exp
index d807d75a66..4c25c7bb32 100644
--- a/gdb/testsuite/gdb.base/setshow.exp
+++ b/gdb/testsuite/gdb.base/setshow.exp
@@ -91,6 +91,9 @@ gdb_test "show args" "Argument list to give program being debugged when it is st
 gdb_test_no_output "set args foo bar blup baz bubble" "set args" 
 #test show args
 gdb_test "show args" "Argument list to give program being debugged when it is started is \"foo bar blup baz bubble\"..*" "show args"
+gdb_test "p \$_gdb_setting(\"args\")" ".*\"foo bar blup baz bubble\"" \
+    "_gdb_setting args"
+
 
 # Don't test if we can't pass args or if we're using a stub.
 if { !$use_gdb_stub && ![target_info exists noargs] } {
@@ -100,17 +103,23 @@ if { !$use_gdb_stub && ![target_info exists noargs] } {
     gdb_test "run" "Starting program:.*foo bar blup baz bubble.*" "passing args"
 }
 #test set check range on
-gdb_test "set check range on" ".*" "set check range on" 
+gdb_test "set check range on" ".*" "set check range on"
+gdb_test "p \$_gdb_setting(\"check range\")" ".*\"on\"" \
+    "_gdb_setting check range on"
 #test show check range on
 gdb_test "show check range" "Range checking is \"on\"\..*" "show check range (on)" 
 #test set check range off with trailing space
 gdb_test_no_output "set check range off " "set check range off" 
 #test show check range off
 gdb_test "show check range" "Range checking is \"off\"\..*" "show check range (off)" 
+gdb_test "p \$_gdb_setting(\"check range\")" ".*\"off\"" \
+    "_gdb_setting check range off"
 #test set check range auto
 gdb_test_no_output "set check range auto" "set check range auto" 
 #test show check range auto
 gdb_test "show check range" "Range checking is \"auto; currently .*" "show check range (auto)"
+gdb_test "p \$_gdb_setting(\"check range\")" ".*\"auto\"" \
+    "_gdb_setting check range auto"
 
 # Test set check type on
 gdb_test "set check type on" ".*" "set check type on"
@@ -118,14 +127,49 @@ gdb_test "set check type on" ".*" "set check type on"
 # Test show check type on
 gdb_test "show check type" "Strict type checking is on\..*" \
     "show check type (on)"
+gdb_test "p \$_gdb_setting_str(\"check type\")" ".*\"on\"" \
+    "_gdb_setting_str check type on"
+gdb_test "p \$_gdb_setting(\"check type\")" ".*= 1" \
+    "_gdb_setting check type on 1"
 
 # Test set check type off with trailing space
 gdb_test_no_output "set check type off " "set check type off"
+gdb_test "p \$_gdb_setting_str(\"check type\")" ".*\"off\"" \
+    "_gdb_setting_str check type off"
+gdb_test "p \$_gdb_setting(\"check type\")" ".*= 0" \
+    "_gdb_setting check type off 0"
 
 # Test show check type off
 gdb_test "show check type" "Strict type checking is off\..*" \
     "show check type (off)"
 
+#test set breakpoint pending
+#test set breakpoint pending on
+gdb_test "set breakpoint pending on" ".*" "set breakpoint pending on"
+gdb_test "p \$_gdb_setting_str(\"breakpoint pending\")" ".*\"on\"" \
+    "_gdb_setting_str breakpoint pending on"
+gdb_test "p \$_gdb_setting(\"breakpoint pending\")" ".*= 1" \
+    "_gdb_setting breakpoint pending 1"
+#test show breakpoint pending on
+gdb_test "show breakpoint pending" ".* is on\..*" "show breakpoint pending on"
+#test show breakpoint pending off
+gdb_test "set breakpoint pending off" ".*" "set breakpoint pending off"
+gdb_test "show breakpoint pending" ".* is off\..*" "show breakpoint pending off"
+gdb_test "p \$_gdb_setting_str(\"breakpoint pending\")" ".*\"off\"" \
+    "_gdb_setting_str breakpoint pending off"
+gdb_test "p \$_gdb_setting(\"breakpoint pending\")" ".* = 0" \
+    "_gdb_setting breakpoint pending 0"
+#test set breakpoint pending auto
+gdb_test_no_output "set breakpoint pending auto" "set breakpoint pending auto"
+#test show breakpoint pending auto
+gdb_test "show breakpoint pending" " is auto.*" "show breakpoint pending auto"
+gdb_test "p \$_gdb_setting_str(\"breakpoint pending\")" ".*\"auto\"" \
+    "_gdb_setting_str breakpoint pending auto"
+gdb_test "p \$_gdb_setting(\"breakpoint pending\")" ".* = -1" \
+    "_gdb_setting breakpoint pending -1"
+
+
+
 #test set complaints 100
 gdb_test_no_output "set complaints 100" "set complaints 100" 
 #test show complaints 100
@@ -159,9 +203,17 @@ gdb_test "show environment FOOBARBAZ" "FOOBARBAZ = grbxgrbxgrbx.*"  "show enviro
 gdb_test_no_output "set height 100" "set height 100" 
 #test show height 100
 gdb_test "show height" "Number of lines gdb thinks are in a page is 100..*" "show height" 
+gdb_test "p \$_gdb_setting_str(\"height\")" ".*\"100\"" \
+    "_gdb_setting_str height 100"
+gdb_test "p \$_gdb_setting(\"height\")" ".*= 100" \
+    "_gdb_setting height 100"
 # Back to infinite height to avoid pagers.  While at it, check that
 # literal "unlimited" works just as well as 0.
 gdb_test_no_output "set height unlimited"
+gdb_test "p \$_gdb_setting_str(\"height\")" ".*\"unlimited\"" \
+    "_gdb_setting_str height unlimited"
+gdb_test "p \$_gdb_setting(\"height\")" ".*= 0" \
+    "_gdb_setting height unlimited"
 #test set history expansion on
 gdb_test_no_output "set history expansion on" "set history expansion on" 
 #test show history expansion on
@@ -182,6 +234,12 @@ gdb_test_no_output "set history filename ~/foobar.baz" \
 gdb_test "show history filename" \
     "The filename in which to record the command history is \"[string_to_regexp $HOME]/foobar.baz\"..*" \
     "show history filename (~/foobar.baz)"
+gdb_test "p \$_gdb_setting(\"history filename\")" \
+    ".*\"[string_to_regexp $HOME]/foobar.baz\"..*" \
+    "_gdb_setting history filename"
+gdb_test "p \$_gdb_setting_str(\"history filename\")" \
+    ".*\"[string_to_regexp $HOME]/foobar.baz\"..*" \
+    "_gdb_setting_str history filename"
 #get current working directory
 set PWD ""
 set test "show working directory"
diff --git a/gdb/testsuite/gdb.base/settings.exp b/gdb/testsuite/gdb.base/settings.exp
index 53049d6b59..102e0c57a4 100644
--- a/gdb/testsuite/gdb.base/settings.exp
+++ b/gdb/testsuite/gdb.base/settings.exp
@@ -35,13 +35,69 @@ if { ![readline_is_used] } {
 }
 
 # Test the show command SHOW_CMD.  EXPECTED_RE is the expected output.
-# This procedure exists in order to make it easier to make the test
+# Also verifies that $_gdb_maint_setting_str produces an equivalent output,
+# matching it with EXPECTED_RE.  EXPECTED_RE double quotes are escaped
+# unless EXPECTED_RE_QUOTED is 1, indicating the quotes in EXPECTED_RE
+# are already escaped.
+# The value for the setting corresponding to SHOW_CMD is then reset
+# to RESET_VALUE, then set again to the value given by $_gdb_maint_setting_str
+# and $_gdb_maint_setting.
+# The setting value must still be the one in force before calling show_setting.
+# In other words, this verifies that
+#   maint set test-settings <some_setting> $_gdb_maint_setting_str(<some_setting>)
+#   maint set test-settings <some_setting> $_gdb_maint_setting(<some_setting>)
+# do not change the setting value.
+# This procedure makes it easier to make the test
 # name/message unique, since we test the "show" commands many times.
 # EXPECTED_RE is made part of the test name.
-proc show_setting {show_cmd expected_re} {
+proc show_setting {show_cmd expected_re {expected_re_quoted 0} {reset_value 0}} {
+    global gdb_prompt
     gdb_test "$show_cmd" $expected_re "$show_cmd: $expected_re"
+
+    # Remove the first two words (such as "maint show") to have the
+    # setting name to use for $_gdb_maint_setting_str.
+    regsub "\[^ \]+ +\[^ \]+ +\(.*\)" $show_cmd "\\1" maint_setting
+    if {$expected_re_quoted == 1} {
+	set quoted_expected_re $expected_re
+    } else {
+	regsub -all "\"" $expected_re "\\\\\\\"" quoted_expected_re
+    }
+    set test "print \$_gdb_maint_setting_str(\"$maint_setting\") $quoted_expected_re $expected_re"
+    gdb_test_multiple "print \$_gdb_maint_setting_str(\"$maint_setting\")" $test {
+	-re ".*= \"\($quoted_expected_re\)\".*$gdb_prompt $" {
+	    set setting_str_value $expect_out(1,string)
+	    regsub -all "\\\\" $expect_out(1,string) "" setting_str_value
+	    pass "$test value $setting_str_value" 
+	}
+    }
+
+    # Change the setting value to RESET_VALUE, set it back to setting_str_value
+    # and check we still have the original value.
+    gdb_test_no_output "maintenance set $maint_setting $reset_value" "str reset $show_cmd: $expected_re"
+    gdb_test_no_output "maintenance set $maint_setting $setting_str_value" "str set again $show_cmd: $expected_re"
+    gdb_test "$show_cmd" $expected_re "str $show_cmd: $expected_re after reset+set again"
+
+    # Same test, but with value captured from $_gdb_maint_setting.
+    set test "print \$_gdb_maint_setting(\"$maint_setting\") $quoted_expected_re $expected_re"
+    gdb_test_multiple "print \$_gdb_maint_setting(\"$maint_setting\")" $test {
+	-re ".*= \"\(.*\)\".*$gdb_prompt $" {
+	    set setting_value $expect_out(1,string)
+	    regsub -all "\\\\" $expect_out(1,string) "" setting_value
+	    pass "$test quoted value $setting_value" 
+	}
+	-re ".*= \(.*\)\r\n$gdb_prompt $" {
+	    set setting_value $expect_out(1,string)
+	    pass "$test non quoted value $setting_value" 
+	}
+    }
+
+    gdb_test_no_output "maintenance set $maint_setting $reset_value" "reset $show_cmd: $expected_re"
+    gdb_test_no_output "maintenance set $maint_setting $setting_value" "set again $show_cmd: $expected_re"
+    gdb_test "$show_cmd" $expected_re "$show_cmd: $expected_re after reset+set again"
+
 }
 
+
 # var_Xinteger tests.  VARIANT determines which command/variant to
 # exercise.
 proc test-integer {variant} {
@@ -409,11 +465,11 @@ proc_with_prefix test-enum {} {
     # Various valid values.  Test both full value names and
     # abbreviations.
     gdb_test_no_output "$set_cmd x"
-    show_setting "$show_cmd" "xxx"
+    show_setting "$show_cmd" "xxx" 0 "zzz"
     gdb_test_no_output "$set_cmd yy"
-    show_setting "$show_cmd" "yyy"
+    show_setting "$show_cmd" "yyy" 0 "zzz"
     gdb_test_no_output "$set_cmd zzz"
-    show_setting "$show_cmd" "zzz"
+    show_setting "$show_cmd" "zzz" 0 "yyy"
 
     test_gdb_complete_multiple "$set_cmd " "" "" {
 	"xxx"
@@ -461,7 +517,7 @@ proc test-string {variant} {
     # A quoted string value.
     if {$variant == "string"} {
 	gdb_test_no_output "$set_cmd \"hello world\""
-	show_setting "$show_cmd" "\\\\\"hello world\\\\\""
+	show_setting "$show_cmd" "\\\\\"hello world\\\\\"" 1
     } else {
 	gdb_test_no_output "$set_cmd \"hello world\""
 	show_setting "$show_cmd" "\"hello world\""
