[binutils-gdb/gdb-17-branch] [gdb/breakpoints] Don't ignore <file> in rbreak <file>:<regexp>

Tom de Vries via Gdb-cvs <[email protected]>
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=063b0d3f0b34799e2abf312936945c4297d22ce2

commit 063b0d3f0b34799e2abf312936945c4297d22ce2
Author: Tom de Vries <[email protected]>
Date:   Tue Apr 28 16:12:44 2026 +0200

    [gdb/breakpoints] Don't ignore <file> in rbreak <file>:<regexp>
    
    PR breakpoints/34112 reports that "rbreak <file>:<regexp>" sets breakpoints in
    files other than <file>.
    
    This is a regression since commit c4c093a31f6 ("Make
    global_symbol_searcher::filenames private"), which did:
    ...
       if (file_name != nullptr)
    -    spec.filenames.push_back (file_name);
    +    spec.add_filename (std::move (file_name));
    ...
    
    The std::move nullifies file_name, so a subsequent file_name check:
    ...
              if (file_name != nullptr)
    ...
    now always evaluates to false.
    
    Fix this by:
    - introducing a variable bool file_name_p, initialized before the
      std::move, and
    - using that instead.
    
    Tested on x86_64-linux.
    
    Approved-By: Tom Tromey <[email protected]>
    
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34112

Diff:
---
 gdb/symtab.c                      |  9 +++++++--
 gdb/testsuite/gdb.base/rbreak-2.c | 28 ++++++++++++++++++++++++++++
 gdb/testsuite/gdb.base/rbreak.c   | 30 ++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.base/rbreak.exp | 32 ++++++++++++++++++++++++++++++++
 4 files changed, 97 insertions(+), 2 deletions(-)

diff --git a/gdb/symtab.c b/gdb/symtab.c
index 34f38e24efb..ebd08cfeaa2 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -5648,8 +5648,13 @@ rbreak_command (const char *regexp, int from_tty)
 	}
     }
 
+  /* Compute this property now.  We want to use the property after
+     std::move (file_name), but at that point we can no longer compute it
+     because the std::move nullifies file_name.  */
+  bool file_name_p = file_name != nullptr;
+
   global_symbol_searcher spec (SEARCH_FUNCTION_DOMAIN, regexp);
-  if (file_name != nullptr)
+  if (file_name_p)
     spec.add_filename (std::move (file_name));
   std::vector<symbol_search> symbols = spec.search ();
 
@@ -5662,7 +5667,7 @@ rbreak_command (const char *regexp, int from_tty)
       std::string name;
       if (p.msymbol.minsym == nullptr)
 	{
-	  if (file_name != nullptr)
+	  if (file_name_p)
 	    {
 	      struct symtab *symtab = p.symbol->symtab ();
 	      const char *fullname = symtab_to_fullname (symtab);
diff --git a/gdb/testsuite/gdb.base/rbreak-2.c b/gdb/testsuite/gdb.base/rbreak-2.c
new file mode 100644
index 00000000000..f0d30df2f3c
--- /dev/null
+++ b/gdb/testsuite/gdb.base/rbreak-2.c
@@ -0,0 +1,28 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2026 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/>.  */
+
+static int
+foo (void)
+{
+  return 0;
+}
+
+int
+bar (void)
+{
+  return foo ();
+}
diff --git a/gdb/testsuite/gdb.base/rbreak.c b/gdb/testsuite/gdb.base/rbreak.c
new file mode 100644
index 00000000000..9df951f3397
--- /dev/null
+++ b/gdb/testsuite/gdb.base/rbreak.c
@@ -0,0 +1,30 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2026 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/>.  */
+
+static int
+foo (void)
+{
+  return 1;
+}
+
+extern int bar (void);
+
+int
+main (void)
+{
+  return foo () + bar ();
+}
diff --git a/gdb/testsuite/gdb.base/rbreak.exp b/gdb/testsuite/gdb.base/rbreak.exp
new file mode 100644
index 00000000000..94629357ef5
--- /dev/null
+++ b/gdb/testsuite/gdb.base/rbreak.exp
@@ -0,0 +1,32 @@
+#   Copyright 2026 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/>.
+
+# Check rbreak <file>:<regexp> command.
+
+standard_testfile .c -2.c
+
+if { [prepare_for_testing "failed to prepare" $testfile \
+	  [list $srcfile $srcfile2]] } {
+    return -1
+}
+
+# Regression test for PR34112.  Check that "rbreak $srcfile:foo" doesn't set
+# a breakpoint on $srcfile2:foo.
+set re_line \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal\\."
+gdb_test "rbreak $srcfile:foo" \
+    [multi_line \
+	 $re_line \
+	 ".*"]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.