From: Tom Tromey Date: Mon, 25 Mar 2013 17:26:18 +0000 (+0000) Subject: PR c++/9197: X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fce632b6dc97eaa7e9f10f5c2c7dd8fd55931a51;p=binutils-gdb.git PR c++/9197: * opencl-lang.c (evaluate_subexp_opencl) : Use value_struct_elt, not lookup_struct_elt_type. * eval.c (evaluate_subexp_standard) : Use value_struct_elt, not lookup_struct_elt_type. * expression.h (EVAL_AVOID_SIDE_EFFECTS): Update comment. gdb/testsuite * 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/ChangeLog b/gdb/ChangeLog index e065e94569b..4639417eede 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2013-03-25 Tom Tromey + + PR c++/9197: + * opencl-lang.c (evaluate_subexp_opencl) : Use + value_struct_elt, not lookup_struct_elt_type. + * eval.c (evaluate_subexp_standard) : Use value_struct_elt, not lookup_struct_elt_type. + * expression.h (EVAL_AVOID_SIDE_EFFECTS): Update comment. + 2013-03-25 Yao Qi * ctf.c [USE_WIN32API]: Undef 'mkdir' and use 'mkdir' diff --git a/gdb/eval.c b/gdb/eval.c index 146840e7843..a91ba2271ab 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -1847,18 +1847,9 @@ evaluate_subexp_standard (struct type *expect_type, arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; - if (noside == EVAL_AVOID_SIDE_EFFECTS) - return value_zero (lookup_struct_elt_type (value_type (arg1), - &exp->elts[pc + 2].string, - 0), - lval_memory); - else - { - struct value *temp = arg1; - - return value_struct_elt (&temp, NULL, &exp->elts[pc + 2].string, - NULL, "structure"); - } + /* Also handle EVAL_AVOID_SIDE_EFFECTS. */ + return value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string, + NULL, "structure"); case STRUCTOP_PTR: tem = longest_to_int (exp->elts[pc + 1].longconst); @@ -1908,18 +1899,9 @@ evaluate_subexp_standard (struct type *expect_type, } } - if (noside == EVAL_AVOID_SIDE_EFFECTS) - return value_zero (lookup_struct_elt_type (value_type (arg1), - &exp->elts[pc + 2].string, - 0), - lval_memory); - else - { - struct value *temp = arg1; - - return value_struct_elt (&temp, NULL, &exp->elts[pc + 2].string, - NULL, "structure pointer"); - } + /* Also handle EVAL_AVOID_SIDE_EFFECTS. */ + return value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string, + NULL, "structure pointer"); case STRUCTOP_MEMBER: case STRUCTOP_MPTR: diff --git a/gdb/expression.h b/gdb/expression.h index 6b96b12a783..9252dd25ef9 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -128,7 +128,10 @@ enum noside type (inaccuracy: anything that is listed as being in a register in the function in which it was - declared will be lval_register). */ + declared will be lval_register). + Ideally this would not even read + target memory, but currently it + does in many situations. */ }; extern struct value *evaluate_subexp_standard diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c index 819a83202aa..d7e66c46585 100644 --- a/gdb/opencl-lang.c +++ b/gdb/opencl-lang.c @@ -1035,15 +1035,10 @@ Cannot perform conditional operation on vectors with different sizes")); } else { - if (noside == EVAL_AVOID_SIDE_EFFECTS) - return - value_zero (lookup_struct_elt_type - (value_type (arg1),&exp->elts[pc + 2].string, 0), - lval_memory); - else - return value_struct_elt (&arg1, NULL, - &exp->elts[pc + 2].string, NULL, - "structure"); + /* Also handle EVAL_AVOID_SIDE_EFFECTS. */ + return value_struct_elt (&arg1, NULL, + &exp->elts[pc + 2].string, NULL, + "structure"); } } default: diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index beadddb26be..6e8a0f4cd2e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-03-25 Tom Tromey + + * gdb.cp/m-static.exp: Add constructor ptype tests. + * gdb.cp/m-static.cc (single_constructor): New class. + (main): Make instance of single_constructor. + 2013-03-22 Jan Kratochvil Pedro Alves diff --git a/gdb/testsuite/gdb.cp/m-static.cc b/gdb/testsuite/gdb.cp/m-static.cc index eadbdfc44ba..cb871e8d18e 100644 --- a/gdb/testsuite/gdb.cp/m-static.cc +++ b/gdb/testsuite/gdb.cp/m-static.cc @@ -31,6 +31,14 @@ public: } }; +// An object with a single constructor. +class single_constructor +{ +public: + single_constructor () { } + ~single_constructor () { } +}; + const bool gnu_obj_1::test; const int gnu_obj_1::key1; long gnu_obj_1::key2 = 77; @@ -81,6 +89,7 @@ int main() gnu_obj_2 test2(roman); gnu_obj_3 test3(greek); gnu_obj_4 test4; + single_constructor test5; test4.dummy = test4.elsewhere; test4.dummy = 0; diff --git a/gdb/testsuite/gdb.cp/m-static.exp b/gdb/testsuite/gdb.cp/m-static.exp index 5d1cb8b1aa2..b31922aae75 100644 --- a/gdb/testsuite/gdb.cp/m-static.exp +++ b/gdb/testsuite/gdb.cp/m-static.exp @@ -69,6 +69,16 @@ gdb_test "print test1.key2" "\\$\[0-9\]* = 77" "simple object, static long" # simple object, static enum gdb_test "print test1.value" "\\$\[0-9\]* = oriental" "simple object, static enum" +gdb_test "print test5.single_constructor" \ + { = {void \(single_constructor \* const\)} 0x[0-9a-f]+ } \ + "simple object instance, print constructor" +gdb_test "ptype test5.single_constructor" \ + {type = void \(single_constructor \* const\)} \ + "simple object instance, ptype constructor" +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]+ } \ "simple object instance, print quoted destructor"