diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/c-exp.y | 35 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/exprs.exp | 4 |
4 files changed, 47 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cc6b0bb..f760632 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2008-10-22 Tom Tromey <tromey@redhat.com> + + PR gdb/2506: + * c-exp.y (string_exp): New production. + (exp): Use it. + 2008-10-21 Jan Kratochvil <jan.kratochvil@redhat.com> * mips-tdep.c (mips_n32n64_fp_arg_chunk_p): Update TYPE_FIELD_STATIC diff --git a/gdb/c-exp.y b/gdb/c-exp.y index 6d16940..153e2be 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -184,7 +184,7 @@ static int parse_number (char *, int, int, YYSTYPE *); %token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence. */ %token <voidval> COMPLETE %token <tsym> TYPENAME -%type <sval> name +%type <sval> name string_exp %type <ssym> name_not_typename %type <tsym> typename @@ -562,7 +562,34 @@ exp : SIZEOF '(' type ')' %prec UNARY write_exp_elt_opcode (OP_LONG); } ; -exp : STRING +string_exp: + STRING + { + /* We copy the string here, and not in the + lexer, to guarantee that we do not leak a + string. Note that we follow the + NUL-termination convention of the + lexer. */ + $$.length = $1.length; + $$.ptr = malloc ($1.length + 1); + memcpy ($$.ptr, $1.ptr, $1.length + 1); + } + + | string_exp STRING + { + /* Note that we NUL-terminate here, but just + for convenience. */ + struct stoken t; + t.length = $1.length + $2.length; + t.ptr = malloc (t.length + 1); + memcpy (t.ptr, $1.ptr, $1.length); + memcpy (t.ptr + $1.length, $2.ptr, $2.length + 1); + free ($1.ptr); + $$ = t; + } + ; + +exp : string_exp { /* C strings are converted into array constants with an explicit null byte added at the end. Thus the array upper bound is the string length. @@ -583,7 +610,9 @@ exp : STRING write_exp_elt_opcode (OP_ARRAY); write_exp_elt_longcst ((LONGEST) 0); write_exp_elt_longcst ((LONGEST) ($1.length)); - write_exp_elt_opcode (OP_ARRAY); } + write_exp_elt_opcode (OP_ARRAY); + free ($1.ptr); + } ; /* C++. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 9c3e624..dd4ccf5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-10-22 Tom Tromey <tromey@redhat.com> + + * gdb.base/exprs.exp (test_expr): Add test for string + concatenation. + 2008-10-19 Pedro Alves <pedro@codesourcery.com> * configure.ac: Output gdb.python/Makefile. diff --git a/gdb/testsuite/gdb.base/exprs.exp b/gdb/testsuite/gdb.base/exprs.exp index e25de77..484b5a4 100644 --- a/gdb/testsuite/gdb.base/exprs.exp +++ b/gdb/testsuite/gdb.base/exprs.exp @@ -248,3 +248,7 @@ gdb_test "print (void*) ((long long) (unsigned long) -1 + 1)" \ if [expr ! $ok] { setup_xfail "*-*-*" } gdb_test "print (void*) (~((long long)(unsigned long) -1) - 1)" \ "warning: value truncated.*" "truncate (void*) 0xffffffff00000000 - 1" + +# String concatentation. +test_expr "print \"x\" \"y\"" "\\$\[0-9\]* = \"xy\"" +test_expr "print \"x\" \"y\" \"z\"" "\\$\[0-9\]* = \"xyz\"" |