This is the mail archive of the
archer@sourceware.org
mailing list for the Archer project.
[expr] [patch] Fix "break expr if (cond)" regression
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Keith Seitz <keiths at redhat dot com>
- Cc: archer at sourceware dot org
- Date: Thu, 21 Jan 2010 17:40:53 +0100
- Subject: [expr] [patch] Fix "break expr if (cond)" regression
commit 21e418c04290aa5d2e75543d31fe3fe5d70d6d41
Checked-in on archer-jankratochvil-fedora13 but this regression is present on
just archer-keiths-expr-cumulative.
The regression has been introduced by:
commit 97a9a53e60460dd246de6a1d5ce50bf3497a1eb8
Author: keiths <keiths@redhat.com>
Date: Thu Jan 14 18:51:45 2010 -0800
* linespec.c (decode_line_1): Keep overload information for the
non-compound case.
(gdb) break marker1 if (1==1)
-Breakpoint 4 at 0x80485eb: file gdb/testsuite/gdb.base/break1.c, line 45.
-PASS: gdb.base/condbreak.exp: break marker1 if (1==1)
+Function "marker1 if (1==1)" not defined.
+Make breakpoint pending on future shared library load? (y or [n]) n
+FAIL: gdb.base/condbreak.exp: break marker1 if (1==1) (got interactive prompt)
I do not fully agree with my patch but I also do not fully agree with the
former patch, maybe bison should be used to parse the expression, but rather
someone (Tom? unaware) said that "break E [thread T] [if C]" should be rather
changed to the more parseable+standardized "break [-thread T] [-if C] E" so
that these expression parsing difficulties would be present only as a backward
compatibility and do not need to supersede the former functionality.
-FAIL: gdb.base/chng-syms.exp: setting conditional breakpoint on function (got interactive prompt)
-FAIL: gdb.base/chng-syms.exp: running to stop_here first time
-FAIL: gdb.base/chng-syms.exp: continue until exit at breakpoint first time through (the program is no longer running)
+PASS: gdb.base/chng-syms.exp: setting conditional breakpoint on function
+PASS: gdb.base/chng-syms.exp: continue until exit at breakpoint first time through
-FAIL: gdb.base/condbreak.exp: break marker1 if (1==1) (got interactive prompt)
+PASS: gdb.base/condbreak.exp: break marker1 if (1==1)
-FAIL: gdb.base/condbreak.exp: break marker2 if (a==43) (got interactive prompt)
-FAIL: gdb.base/condbreak.exp: break marker3 if (multi_line_if_conditional(1,1,1)==0) (got interactive prompt)
+PASS: gdb.base/condbreak.exp: break marker2 if (a==43)
+PASS: gdb.base/condbreak.exp: break marker3 if (multi_line_if_conditional(1,1,1)==0)
-FAIL: gdb.base/condbreak.exp: breakpoint info
+PASS: gdb.base/condbreak.exp: breakpoint info
-FAIL: gdb.base/condbreak.exp: run until breakpoint at marker1
-FAIL: gdb.base/condbreak.exp: run until breakpoint at marker2
-FAIL: gdb.base/condbreak.exp: break main if (1==1) thread 999 (got interactive prompt)
-FAIL: gdb.base/condbreak.exp: break main thread 999 if (1==1) (got interactive prompt)
+PASS: gdb.base/condbreak.exp: run until breakpoint at marker1
+PASS: gdb.base/condbreak.exp: run until breakpoint at marker2
+PASS: gdb.base/condbreak.exp: break main if (1==1) thread 999
+PASS: gdb.base/condbreak.exp: break main thread 999 if (1==1)
-FAIL: gdb.base/condbreak.exp: break *main if (1==1) task 999
-FAIL: gdb.base/condbreak.exp: break *main task 999 if (1==1)
+PASS: gdb.base/condbreak.exp: break *main if (1==1) task 999
+PASS: gdb.base/condbreak.exp: break *main task 999 if (1==1)
-FAIL: gdb.base/condbreak.exp: break *main if (1==1) ta 999
-FAIL: gdb.base/condbreak.exp: run until breakpoint at marker3 (the program is no longer running)
-FAIL: gdb.base/condbreak.exp: run until breakpoint at marker4 (the program is no longer running)
+PASS: gdb.base/condbreak.exp: break *main if (1==1) ta 999
+PASS: gdb.base/condbreak.exp: run until breakpoint at marker3
+PASS: gdb.base/condbreak.exp: run until breakpoint at marker4
* linespec.c: Include <ctype.h>.
(decode_line_1 <q != NULL>): Ignore '(' used after " if".
---
gdb/linespec.c | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/gdb/linespec.c b/gdb/linespec.c
index a9b4f1e..4e54a3a 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -40,6 +40,7 @@
#include "interps.h"
#include "mi/mi-cmds.h"
#include "target.h"
+#include <ctype.h>
/* We share this one with symtab.c, but it is not exported widely. */
@@ -822,7 +823,13 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
/* Keep method overload information. */
q = strchr (p, '(');
if (q != NULL)
- p = strrchr (q, ')') + 1;
+ {
+ /* Ignore '(' used after " if". */
+ while (q > p && isspace (q[-1]))
+ q--;
+ if (!(q >= p + 3 && strncmp (&q[-2], "if", 2) == 0 && isspace (q[-3])))
+ p = strrchr (q, ')') + 1;
+ }
/* Make sure we keep important kewords like "const" */
if (strncmp (p, " const", 6) == 0)
--
1.6.6