[D] Fix crash when debug expression enabled.
authorIain Buclaw <ibuclaw@gdcproject.org>
Sun, 8 Jan 2017 10:17:54 +0000 (11:17 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Sun, 8 Jan 2017 10:20:56 +0000 (11:20 +0100)
While casting works as expected with expression debugging turned off,
this seems to be an indication that the D language parser function is
doing something wrong in the building of the expression.

Without changing the grammar, using UNOP_CAST_TYPE is the right thing to
do here, as the TypeExp handler has already wrapped the type around a
pair of OP_TYPE opcodes.

gdb/ChangeLog:

* d-exp.y (CastExpression): Emit UNOP_CAST_TYPE.

gdb/testsuite/ChangeLog:

* gdb.dlang/debug-expr.exp: New file.

gdb/ChangeLog
gdb/d-exp.y
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dlang/debug-expr.exp [new file with mode: 0644]

index fec9974d987aa1f262f525db0be7b0e8dae1d3c6..7f16a5f694eaf938a410a1b77d12dedaed8354aa 100644 (file)
@@ -1,3 +1,7 @@
+2017-01-08  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       * d-exp.y (CastExpression): Emit UNOP_CAST_TYPE.
+
 2017-01-06  Yao Qi  <yao.qi@linaro.org>
 
        * x86-linux-nat.h: Include gdb_proc_service.h.
index 077e645dec2bdd53954ff734d7c4a76a7a1aa8aa..b5265754ed0468537105ecc8ac486e551a54b3e6 100644 (file)
@@ -321,15 +321,12 @@ UnaryExpression:
 
 CastExpression:
        CAST_KEYWORD '(' TypeExp ')' UnaryExpression
-               { write_exp_elt_opcode (pstate, UNOP_CAST);
-                 write_exp_elt_type (pstate, $3);
-                 write_exp_elt_opcode (pstate, UNOP_CAST); }
+               { write_exp_elt_opcode (pstate, UNOP_CAST_TYPE); }
        /* C style cast is illegal D, but is still recognised in
           the grammar, so we keep this around for convenience.  */
 |      '(' TypeExp ')' UnaryExpression
-               { write_exp_elt_opcode (pstate, UNOP_CAST);
-                 write_exp_elt_type (pstate, $2);
-                 write_exp_elt_opcode (pstate, UNOP_CAST); }
+               { write_exp_elt_opcode (pstate, UNOP_CAST_TYPE); }
+
 ;
 
 PowExpression:
index d12072bd5a753c706e0507574a0f8032df7c8566..8a0328295ddc24fcfc5df9871b7482fdca0de555 100644 (file)
@@ -1,3 +1,7 @@
+2017-01-08  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       * gdb.dlang/debug-expr.exp: New file.
+
 2016-12-23  Luis Machado  <lgustavo@codesourcery.com>
 
        Fix test names for the following files:
diff --git a/gdb/testsuite/gdb.dlang/debug-expr.exp b/gdb/testsuite/gdb.dlang/debug-expr.exp
new file mode 100644 (file)
index 0000000..d62dcc6
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright 2017 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/>.
+
+# Test "set debug expr 1" on d expressions.
+
+if { [skip_d_tests] } { return -1 }
+
+gdb_start
+gdb_test_no_output "set language d"
+gdb_test_no_output "set debug expression 1"
+
+# Test whether the expression debug machinery accepts the expression.
+
+proc test_debug_expr { cmd output } {
+    global gdb_prompt
+
+    gdb_test_multiple $cmd "" {
+       -re ".*Invalid expression.*\r\n$gdb_prompt $" {
+           fail $cmd
+       }
+       -re ".*\[\r\n\]$output\r\n$gdb_prompt $" {
+           pass $cmd
+       }
+    }
+}
+
+# This caused gdb to segfault.
+test_debug_expr "print *(int*)(0)" "Cannot access memory at address 0x0"