diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/c-exp.y | 43 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/m-static.exp | 7 |
4 files changed, 61 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4639417..2b2a089 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2013-03-25 Tom Tromey <tromey@redhat.com> + PR symtab/11462: + * c-exp.y (exp): Add new productions for destructors after '.' and + '->'. + (write_destructor_name): New function. + +2013-03-25 Tom Tromey <tromey@redhat.com> + PR c++/9197: * opencl-lang.c (evaluate_subexp_opencl) <STRUCTOP_STRUCT>: Use value_struct_elt, not lookup_struct_elt_type. diff --git a/gdb/c-exp.y b/gdb/c-exp.y index 0ab1cde..c3c7f16 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -167,6 +167,7 @@ void yyerror (char *); static int parse_number (char *, int, int, YYSTYPE *); static struct stoken operator_stoken (const char *); static void check_parameter_typelist (VEC (type_ptr) *); +static void write_destructor_name (struct stoken); static void c_print_token (FILE *file, int type, YYSTYPE value); #define YYPRINT(FILE, TYPE, VALUE) c_print_token (FILE, TYPE, VALUE) @@ -372,6 +373,19 @@ exp : exp ARROW COMPLETE write_exp_elt_opcode (STRUCTOP_PTR); } ; +exp : exp ARROW '~' name + { write_exp_elt_opcode (STRUCTOP_PTR); + write_destructor_name ($4); + write_exp_elt_opcode (STRUCTOP_PTR); } + ; + +exp : exp ARROW '~' name COMPLETE + { mark_struct_expression (); + write_exp_elt_opcode (STRUCTOP_PTR); + write_destructor_name ($4); + write_exp_elt_opcode (STRUCTOP_PTR); } + ; + exp : exp ARROW qualified_name { /* exp->type::name becomes exp->*(&type::name) */ /* Note: this doesn't work if name is a @@ -407,6 +421,19 @@ exp : exp '.' COMPLETE write_exp_elt_opcode (STRUCTOP_STRUCT); } ; +exp : exp '.' '~' name + { write_exp_elt_opcode (STRUCTOP_STRUCT); + write_destructor_name ($4); + write_exp_elt_opcode (STRUCTOP_STRUCT); } + ; + +exp : exp '.' '~' name COMPLETE + { mark_struct_expression (); + write_exp_elt_opcode (STRUCTOP_STRUCT); + write_destructor_name ($4); + write_exp_elt_opcode (STRUCTOP_STRUCT); } + ; + exp : exp '.' qualified_name { /* exp.type::name becomes exp.*(&type::name) */ /* Note: this doesn't work if name is a @@ -1592,6 +1619,22 @@ name_not_typename : NAME %% +/* Like write_exp_string, but prepends a '~'. */ + +static void +write_destructor_name (struct stoken token) +{ + char *copy = alloca (token.length + 1); + + copy[0] = '~'; + memcpy (©[1], token.ptr, token.length); + + token.ptr = copy; + ++token.length; + + write_exp_string (token); +} + /* Returns a stoken of the operator name given by OP (which does not include the string "operator"). */ static struct stoken diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 6e8a0f4..ad4fd40 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2013-03-25 Tom Tromey <tromey@redhat.com> + * gdb.cp/m-static.exp: Add destructor-printing tests. + +2013-03-25 Tom Tromey <tromey@redhat.com> + * gdb.cp/m-static.exp: Add constructor ptype tests. * gdb.cp/m-static.cc (single_constructor): New class. (main): Make instance of single_constructor. diff --git a/gdb/testsuite/gdb.cp/m-static.exp b/gdb/testsuite/gdb.cp/m-static.exp index b31922a..65ec6a0 100644 --- a/gdb/testsuite/gdb.cp/m-static.exp +++ b/gdb/testsuite/gdb.cp/m-static.exp @@ -79,6 +79,13 @@ gdb_test "ptype single_constructor::single_constructor" \ {type = void \(single_constructor \* const\)} \ "simple object class, ptype constructor" +gdb_test "print test1.~gnu_obj_1" \ + { = {void \(gnu_obj_1 \* const, int\)} 0x[0-9a-f]+ <gnu_obj_1::~gnu_obj_1\(\)>} \ + "simple object instance, print destructor" +gdb_test "ptype test1.~gnu_obj_1" \ + {type = void \(gnu_obj_1 \* const, int\)} \ + "simple object instance, ptype destructor" + gdb_test "print test1.'~gnu_obj_1'" \ { = {void \(gnu_obj_1 \*( const)?, int\)} 0x[0-9a-f]+ <gnu_obj_1::~gnu_obj_1\(\)>} \ "simple object instance, print quoted destructor" |