diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index d1955ec..503bbe0 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -13881,6 +13881,19 @@ breakpoint_re_set (void)
     scoped_restore save_input_radix = make_scoped_restore (&input_radix);
     scoped_restore_current_pspace_and_thread restore_pspace_thread;
 
+    /* breakpoint_re_set_one sets the current_language to the language
+       of the breakpoint it is resetting (see prepare_re_set_context)
+       before re-evaluating the breakpoint's location.  This change can
+       unfortunately get undone by accident if the language_mode is set
+       to auto, and we either switch frames, or more likely in this context,
+       we select the current frame.
+
+       We prevent this by temporarily turning the language_mode to
+       language_mode_manual.  We we restore it once all breakpoints
+       have been reset.  */
+    scoped_restore_current_language_mode save_language_mode;
+    language_mode = language_mode_manual;
+
     /* Note: we must not try to insert locations until after all
        breakpoints have been re-set.  Otherwise, e.g., when re-setting
        breakpoint 1, we'd insert the locations of breakpoint 2, which
diff --git a/gdb/language.h b/gdb/language.h
index 029de4a..3e2b90a 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -705,4 +705,30 @@ private:
   enum language m_lang;
 };
 
+/* Save the current language mode and restore it upon destruction.  */
+
+class scoped_restore_current_language_mode
+{
+public:
+
+  explicit scoped_restore_current_language_mode ()
+    : m_lang_mode (language_mode)
+  {
+  }
+
+  ~scoped_restore_current_language_mode ()
+  {
+    language_mode = m_lang_mode;
+  }
+
+  scoped_restore_current_language_mode
+      (const scoped_restore_current_language_mode &) = delete;
+  scoped_restore_current_language_mode &operator=
+      (const scoped_restore_current_language_mode &) = delete;
+
+private:
+
+  enum language_mode m_lang_mode;
+};
+
 #endif /* defined (LANGUAGE_H) */
diff --git a/gdb/testsuite/gdb.ada/bp_fun_addr.exp b/gdb/testsuite/gdb.ada/bp_fun_addr.exp
new file mode 100644
index 0000000..aa1261b
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/bp_fun_addr.exp
@@ -0,0 +1,35 @@
+# Copyright 2016-2018 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "ada.exp"
+
+if { [skip_ada_tests] } { return -1 }
+
+standard_ada_testfile a
+
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} {
+    return -1
+}
+
+clean_restart ${testfile}
+
+gdb_test "break *a'address" \
+         "Breakpoint \[0-9\]+ at.*: file .*a.adb, line \[0-9\]+."
+
+gdb_run_cmd
+gdb_test "" \
+         "Breakpoint $decimal, a \\(\\).*" \
+         "Run until breakpoint at a'address"
+
diff --git a/gdb/testsuite/gdb.ada/bp_fun_addr/a.adb b/gdb/testsuite/gdb.ada/bp_fun_addr/a.adb
new file mode 100644
index 0000000..00e2e86
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/bp_fun_addr/a.adb
@@ -0,0 +1,19 @@
+--  Copyright 2016-2018 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+procedure A is
+begin
+   null;
+end A;
