public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
@ 2014-10-20 19:11 Siva Chandra
  2014-10-27 17:22 ` Siva Chandra
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Siva Chandra @ 2014-10-20 19:11 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 661 bytes --]

When evaluating method calls under EVAL_SKIP, the "object" and the
arguments to the method should also be evaluated under EVAL_SKIP,
instead of skipping to evaluate them. Getting this right fixes PR
c++/17494.

gdb/ChangeLog:

2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>

        PR c++/17494
        * eval.c (evaluate_subexp_standard): Evaluate the "object" and
        the method args also under EVAL_SKIP when evaluating method
        calls under EVAL_SKIP.

gdb/testsuite/ChangeLog:

2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>

        PR c++/17494
        * gdb.cp/pr17494.cc: New file.
        * gdb.cp/pr17494.exp: New file.

[-- Attachment #2: pr17494_v1.txt --]
[-- Type: text/plain, Size: 5746 bytes --]

diff --git a/gdb/eval.c b/gdb/eval.c
index 5906744..ab431c6 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1332,9 +1332,6 @@ evaluate_subexp_standard (struct type *expect_type,
 	  /* First, evaluate the structure into arg2.  */
 	  pc2 = (*pos)++;
 
-	  if (noside == EVAL_SKIP)
-	    goto nosideret;
-
 	  if (op == STRUCTOP_MEMBER)
 	    {
 	      arg2 = evaluate_subexp_for_address (exp, pos, noside);
@@ -1353,7 +1350,10 @@ evaluate_subexp_standard (struct type *expect_type,
 	  arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
 
 	  type = check_typedef (value_type (arg1));
-	  if (TYPE_CODE (type) == TYPE_CODE_METHODPTR)
+	  if (noside == EVAL_SKIP)
+	    tem = 1;  /* Set it to the right arg index so that all arguments
+			 can also be skipped.  */
+	  else if (TYPE_CODE (type) == TYPE_CODE_METHODPTR)
 	    {
 	      if (noside == EVAL_AVOID_SIDE_EFFECTS)
 		arg1 = value_zero (TYPE_TARGET_TYPE (type), not_lval);
@@ -1396,8 +1396,6 @@ evaluate_subexp_standard (struct type *expect_type,
 	  pc2 = (*pos)++;
 	  tem2 = longest_to_int (exp->elts[pc2 + 1].longconst);
 	  *pos += 3 + BYTES_TO_EXP_ELEM (tem2 + 1);
-	  if (noside == EVAL_SKIP)
-	    goto nosideret;
 
 	  if (op == STRUCTOP_STRUCT)
 	    {
@@ -1546,6 +1544,9 @@ evaluate_subexp_standard (struct type *expect_type,
       /* Signal end of arglist.  */
       argvec[tem] = 0;
 
+      if (noside == EVAL_SKIP)
+	goto nosideret;
+
       if (op == OP_ADL_FUNC)
         {
           struct symbol *symp;
diff --git a/gdb/testsuite/gdb.cp/pr17494.cc b/gdb/testsuite/gdb.cp/pr17494.cc
new file mode 100644
index 0000000..77653e1
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/pr17494.cc
@@ -0,0 +1,63 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2014 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/>.  */
+
+
+/* One could use unique_ptr instead, but that requires a GCC which can
+   support "-std=c++11".  */
+
+int
+func (int i, int j)
+{
+  return i + j;
+}
+
+class A
+{
+public:
+  A () { a = 12345; f = &func; }
+  int geta ();
+  int adda (int i);
+
+  int a;
+  int (*f) (int, int);
+};
+
+int
+A::geta ()
+{
+  return a;
+}
+
+int
+A::adda (int i)
+{
+  return a + i;
+}
+
+int
+main ()
+{
+  A a;
+  A *a_ptr = &a;
+  int (A::*m1) ();
+  int (A::*m2) (int);
+
+  m1 = &A::geta;
+  m2 = &A::adda;
+
+  return (a.*m1) () + (a.*m2) (12) + (a.*(&A::f)) (1, 2);  /* Break here  */
+}
diff --git a/gdb/testsuite/gdb.cp/pr17494.exp b/gdb/testsuite/gdb.cp/pr17494.exp
new file mode 100644
index 0000000..7f2e0cf
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/pr17494.exp
@@ -0,0 +1,57 @@
+# Copyright 2014 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/>.
+
+# This file is part of the gdb testsuite
+
+if {[skip_cplus_tests]} { continue }
+
+standard_testfile .cc
+
+if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
+    return -1
+}
+
+if {![runto_main]} {
+    return -1
+}
+
+gdb_breakpoint [gdb_get_line_number "Break here"]
+gdb_continue_to_breakpoint "Break here"
+
+gdb_test "p a.geta()" ".* = 12345" "a.geta()"
+gdb_test "p a_ptr->geta()" ".* = 12345" "a.geta()"
+
+gdb_test "p false ? a.geta() : 123" ".* = 123" "ternop 1"
+gdb_test "p false ? a_ptr->geta() : 123" ".* = 123" "ternop 2"
+gdb_test "p (true ? 123 : a.geta()) + 123" ".* = 246" "ternop 3"
+gdb_test "p (true ? 123 : a_ptr->geta()) + 123" ".* = 246" "ternop 4"
+gdb_test "p false ? (a.*m1)() : 123" ".* = 123" "ternop 5"
+gdb_test "p false ? (a_ptr->*m1)() : 123" ".* = 123" "ternop 6"
+gdb_test "p (true ? 123 : (a.*m1)()) + 123" ".* = 246" "ternop 7"
+gdb_test "p (true ? 123 : (a_ptr->*m1)()) + 123" ".* = 246" "ternop 8"
+
+gdb_test "p false ? a.adda(456) : 123" ".* = 123" "ternop 9"
+gdb_test "p false ? a_ptr->adda(456) : 123" ".* = 123" "ternop 10"
+gdb_test "p (true ? 123 : a.adda(456)) + 123" ".* = 246" "ternop 11"
+gdb_test "p (true ? 123 : a_ptr->adda(456)) + 123" ".* = 246" "ternop 12"
+gdb_test "p false ? (a.*m2)(123) : 123" ".* = 123" "ternop 13"
+gdb_test "p false ? (a_ptr->*m2)(123) : 123" ".* = 123" "ternop 14"
+gdb_test "p (true ? 123 : (a.*m2)(123)) + 123" ".* = 246" "ternop 15"
+gdb_test "p (true ? 123 : (a_ptr->*m2)(123)) + 123" ".* = 246" "ternop 16"
+
+gdb_test "p false ? (a.*(&A::f))(1, 2) : 123" ".* = 123" "ternop 17"
+gdb_test "p false ? (a_ptr->*(&A::f))(1, 2) : 123" ".* = 123" "ternop 18"
+gdb_test "p (true ? 123 : (a.*(&A::f))(1, 2)) + 123" ".* = 246" "ternop 19"
+gdb_test "p (true ? 123 : (a_ptr->*(&A::f))(1, 2)) + 123" ".* = 246" "ternop 20"

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
  2014-10-20 19:11 [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP Siva Chandra
@ 2014-10-27 17:22 ` Siva Chandra
  2014-11-03 14:35 ` Siva Chandra
  2014-11-03 15:08 ` Ulrich Weigand
  2 siblings, 0 replies; 10+ messages in thread
From: Siva Chandra @ 2014-10-27 17:22 UTC (permalink / raw)
  To: gdb-patches

On Mon, Oct 20, 2014 at 12:11 PM, Siva Chandra <sivachandra@google.com> wrote:
> When evaluating method calls under EVAL_SKIP, the "object" and the
> arguments to the method should also be evaluated under EVAL_SKIP,
> instead of skipping to evaluate them. Getting this right fixes PR
> c++/17494.
>
> gdb/ChangeLog:
>
> 2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>
>
>         PR c++/17494
>         * eval.c (evaluate_subexp_standard): Evaluate the "object" and
>         the method args also under EVAL_SKIP when evaluating method
>         calls under EVAL_SKIP.
>
> gdb/testsuite/ChangeLog:
>
> 2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>
>
>         PR c++/17494
>         * gdb.cp/pr17494.cc: New file.
>         * gdb.cp/pr17494.exp: New file.

Ping.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
  2014-10-20 19:11 [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP Siva Chandra
  2014-10-27 17:22 ` Siva Chandra
@ 2014-11-03 14:35 ` Siva Chandra
  2014-11-03 15:08 ` Ulrich Weigand
  2 siblings, 0 replies; 10+ messages in thread
From: Siva Chandra @ 2014-11-03 14:35 UTC (permalink / raw)
  To: gdb-patches

On Mon, Oct 20, 2014 at 12:11 PM, Siva Chandra <sivachandra@google.com> wrote:
> When evaluating method calls under EVAL_SKIP, the "object" and the
> arguments to the method should also be evaluated under EVAL_SKIP,
> instead of skipping to evaluate them. Getting this right fixes PR
> c++/17494.
>
> gdb/ChangeLog:
>
> 2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>
>
>         PR c++/17494
>         * eval.c (evaluate_subexp_standard): Evaluate the "object" and
>         the method args also under EVAL_SKIP when evaluating method
>         calls under EVAL_SKIP.
>
> gdb/testsuite/ChangeLog:
>
> 2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>
>
>         PR c++/17494
>         * gdb.cp/pr17494.cc: New file.
>         * gdb.cp/pr17494.exp: New file.

Ping.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
  2014-10-20 19:11 [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP Siva Chandra
  2014-10-27 17:22 ` Siva Chandra
  2014-11-03 14:35 ` Siva Chandra
@ 2014-11-03 15:08 ` Ulrich Weigand
  2014-11-04  2:08   ` Siva Chandra
  2 siblings, 1 reply; 10+ messages in thread
From: Ulrich Weigand @ 2014-11-03 15:08 UTC (permalink / raw)
  To: Siva Chandra; +Cc: gdb-patches

Siva Chandra wrote:

> When evaluating method calls under EVAL_SKIP, the "object" and the
> arguments to the method should also be evaluated under EVAL_SKIP,
> instead of skipping to evaluate them. Getting this right fixes PR
> c++/17494.

OK, this makes sense.

>gdb/ChangeLog:
>
>2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>
>
>        PR c++/17494
>        * eval.c (evaluate_subexp_standard): Evaluate the "object" and
>        the method args also under EVAL_SKIP when evaluating method
>        calls under EVAL_SKIP.
>
>gdb/testsuite/ChangeLog:
>
>2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>
>
>        PR c++/17494
>        * gdb.cp/pr17494.cc: New file.
>        * gdb.cp/pr17494.exp: New file.

This is OK.

Thanks,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
  2014-11-03 15:08 ` Ulrich Weigand
@ 2014-11-04  2:08   ` Siva Chandra
  2014-11-05  0:24     ` Alan Modra
  0 siblings, 1 reply; 10+ messages in thread
From: Siva Chandra @ 2014-11-04  2:08 UTC (permalink / raw)
  To: Ulrich Weigand; +Cc: gdb-patches

On Mon, Nov 3, 2014 at 7:08 AM, Ulrich Weigand <uweigand@de.ibm.com> wrote:
>>gdb/ChangeLog:
>>
>>2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>
>>
>>        PR c++/17494
>>        * eval.c (evaluate_subexp_standard): Evaluate the "object" and
>>        the method args also under EVAL_SKIP when evaluating method
>>        calls under EVAL_SKIP.
>>
>>gdb/testsuite/ChangeLog:
>>
>>2014-10-20  Siva Chandra Reddy  <sivachandra@google.com>
>>
>>        PR c++/17494
>>        * gdb.cp/pr17494.cc: New file.
>>        * gdb.cp/pr17494.exp: New file.
>
> This is OK.

Thanks for the review. Pushed: e0f52461c2467b6610391681fa27cd9b3c5def57

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
  2014-11-04  2:08   ` Siva Chandra
@ 2014-11-05  0:24     ` Alan Modra
  2014-11-05  0:33       ` Siva Chandra
  2014-11-05 11:00       ` James Greenhalgh
  0 siblings, 2 replies; 10+ messages in thread
From: Alan Modra @ 2014-11-05  0:24 UTC (permalink / raw)
  To: Siva Chandra; +Cc: Ulrich Weigand, gdb-patches

On Mon, Nov 03, 2014 at 06:08:15PM -0800, Siva Chandra wrote:
> >>        PR c++/17494
> >>        * eval.c (evaluate_subexp_standard): Evaluate the "object" and
> >>        the method args also under EVAL_SKIP when evaluating method
> >>        calls under EVAL_SKIP.
> 
> Thanks for the review. Pushed: e0f52461c2467b6610391681fa27cd9b3c5def57

After this patch, when using gcc-4.9.1 and gcc-5.0 (20140911) I see
what looks to me to be nonsense errors (ie. I'd suspect a compiler
bug).  Does anyone else see the same?  Nothing special in configure
options, x86_64-linux.

/src/binutils-gdb/gdb/eval.c: In function ‘evaluate_subexp_standard’:
/src/binutils-gdb/gdb/eval.c:745:16: error: ‘ret’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  struct value *ret = NULL;
                ^
In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
                 from /src/binutils-gdb/gdb/defs.h:28,
                 from /src/binutils-gdb/gdb/eval.c:20:
/src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
        SIGJMP_BUF *buf = \
                    ^
/src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
        SIGJMP_BUF *buf = \
                    ^
/src/binutils-gdb/gdb/eval.c:747:2: note: in expansion of macro ‘TRY_CATCH’
  TRY_CATCH (ex, RETURN_MASK_ERROR)
  ^
/src/binutils-gdb/gdb/eval.c:1429:19: error: ‘value’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
     struct value *value = NULL;
                   ^
In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
                 from /src/binutils-gdb/gdb/defs.h:28,
                 from /src/binutils-gdb/gdb/eval.c:20:
/src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
        SIGJMP_BUF *buf = \
                    ^
/src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
        SIGJMP_BUF *buf = \
                    ^
/src/binutils-gdb/gdb/eval.c:1430:5: note: in expansion of macro ‘TRY_CATCH’
     TRY_CATCH (except, RETURN_MASK_ERROR)
     ^
/src/binutils-gdb/gdb/eval.c:1846:18: error: ‘value’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
    struct value *value = NULL;
                  ^
In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
                 from /src/binutils-gdb/gdb/defs.h:28,
                 from /src/binutils-gdb/gdb/eval.c:20:
/src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
        SIGJMP_BUF *buf = \
                    ^
/src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
        SIGJMP_BUF *buf = \
                    ^
/src/binutils-gdb/gdb/eval.c:1847:4: note: in expansion of macro ‘TRY_CATCH’
    TRY_CATCH (except, RETURN_MASK_ERROR)
    ^
cc1: all warnings being treated as errors


-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
  2014-11-05  0:24     ` Alan Modra
@ 2014-11-05  0:33       ` Siva Chandra
  2014-11-05 11:00       ` James Greenhalgh
  1 sibling, 0 replies; 10+ messages in thread
From: Siva Chandra @ 2014-11-05  0:33 UTC (permalink / raw)
  To: Alan Modra; +Cc: Ulrich Weigand, gdb-patches

Sorry if I am at fault. My compiler is gcc-4.8.2 and I do not see
these errors. I will dig further as soon as I can (which is not likely
until tomorrow).

On Tue, Nov 4, 2014 at 4:24 PM, Alan Modra <amodra@gmail.com> wrote:
> On Mon, Nov 03, 2014 at 06:08:15PM -0800, Siva Chandra wrote:
>> >>        PR c++/17494
>> >>        * eval.c (evaluate_subexp_standard): Evaluate the "object" and
>> >>        the method args also under EVAL_SKIP when evaluating method
>> >>        calls under EVAL_SKIP.
>>
>> Thanks for the review. Pushed: e0f52461c2467b6610391681fa27cd9b3c5def57
>
> After this patch, when using gcc-4.9.1 and gcc-5.0 (20140911) I see
> what looks to me to be nonsense errors (ie. I'd suspect a compiler
> bug).  Does anyone else see the same?  Nothing special in configure
> options, x86_64-linux.
>
> /src/binutils-gdb/gdb/eval.c: In function ‘evaluate_subexp_standard’:
> /src/binutils-gdb/gdb/eval.c:745:16: error: ‘ret’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>   struct value *ret = NULL;
>                 ^
> In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
>                  from /src/binutils-gdb/gdb/defs.h:28,
>                  from /src/binutils-gdb/gdb/eval.c:20:
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/eval.c:747:2: note: in expansion of macro ‘TRY_CATCH’
>   TRY_CATCH (ex, RETURN_MASK_ERROR)
>   ^
> /src/binutils-gdb/gdb/eval.c:1429:19: error: ‘value’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>      struct value *value = NULL;
>                    ^
> In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
>                  from /src/binutils-gdb/gdb/defs.h:28,
>                  from /src/binutils-gdb/gdb/eval.c:20:
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/eval.c:1430:5: note: in expansion of macro ‘TRY_CATCH’
>      TRY_CATCH (except, RETURN_MASK_ERROR)
>      ^
> /src/binutils-gdb/gdb/eval.c:1846:18: error: ‘value’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>     struct value *value = NULL;
>                   ^
> In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
>                  from /src/binutils-gdb/gdb/defs.h:28,
>                  from /src/binutils-gdb/gdb/eval.c:20:
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/eval.c:1847:4: note: in expansion of macro ‘TRY_CATCH’
>     TRY_CATCH (except, RETURN_MASK_ERROR)
>     ^
> cc1: all warnings being treated as errors
>
>
> --
> Alan Modra
> Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
  2014-11-05  0:24     ` Alan Modra
  2014-11-05  0:33       ` Siva Chandra
@ 2014-11-05 11:00       ` James Greenhalgh
  2014-11-05 12:54         ` Alan Modra
  1 sibling, 1 reply; 10+ messages in thread
From: James Greenhalgh @ 2014-11-05 11:00 UTC (permalink / raw)
  To: Alan Modra; +Cc: Siva Chandra, Ulrich Weigand, gdb-patches

On Wed, Nov 05, 2014 at 12:24:16AM +0000, Alan Modra wrote:
> On Mon, Nov 03, 2014 at 06:08:15PM -0800, Siva Chandra wrote:
> > >>        PR c++/17494
> > >>        * eval.c (evaluate_subexp_standard): Evaluate the "object" and
> > >>        the method args also under EVAL_SKIP when evaluating method
> > >>        calls under EVAL_SKIP.
> > 
> > Thanks for the review. Pushed: e0f52461c2467b6610391681fa27cd9b3c5def57
> 
> After this patch, when using gcc-4.9.1 and gcc-5.0 (20140911) I see
> what looks to me to be nonsense errors (ie. I'd suspect a compiler
> bug).  Does anyone else see the same?  Nothing special in configure
> options, x86_64-linux.

For what it is worth, I'm seeing the same with my GCC 4.9.1 (x84_64-linux),
again nothing special in the configure options for GCC:

   ../gcc-4.9.1/configure --enable-checking=release --with-cpu=native 

Thanks,
James

> /src/binutils-gdb/gdb/eval.c: In function ‘evaluate_subexp_standard’:
> /src/binutils-gdb/gdb/eval.c:745:16: error: ‘ret’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>   struct value *ret = NULL;
>                 ^
> In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
>                  from /src/binutils-gdb/gdb/defs.h:28,
>                  from /src/binutils-gdb/gdb/eval.c:20:
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/eval.c:747:2: note: in expansion of macro ‘TRY_CATCH’
>   TRY_CATCH (ex, RETURN_MASK_ERROR)
>   ^
> /src/binutils-gdb/gdb/eval.c:1429:19: error: ‘value’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>      struct value *value = NULL;
>                    ^
> In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
>                  from /src/binutils-gdb/gdb/defs.h:28,
>                  from /src/binutils-gdb/gdb/eval.c:20:
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/eval.c:1430:5: note: in expansion of macro ‘TRY_CATCH’
>      TRY_CATCH (except, RETURN_MASK_ERROR)
>      ^
> /src/binutils-gdb/gdb/eval.c:1846:18: error: ‘value’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>     struct value *value = NULL;
>                   ^
> In file included from /src/binutils-gdb/gdb/common/common-defs.h:49:0,
>                  from /src/binutils-gdb/gdb/defs.h:28,
>                  from /src/binutils-gdb/gdb/eval.c:20:
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: error: ‘buf’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/common/common-exceptions.h:148:20: note: ‘buf’ was declared here
>         SIGJMP_BUF *buf = \
>                     ^
> /src/binutils-gdb/gdb/eval.c:1847:4: note: in expansion of macro ‘TRY_CATCH’
>     TRY_CATCH (except, RETURN_MASK_ERROR)
>     ^
> cc1: all warnings being treated as errors
> 
> 
> -- 
> Alan Modra
> Australia Development Lab, IBM
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP
  2014-11-05 11:00       ` James Greenhalgh
@ 2014-11-05 12:54         ` Alan Modra
  2014-11-10 14:24           ` [push] Work around GCC bug 63748 (Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP) Ulrich Weigand
  0 siblings, 1 reply; 10+ messages in thread
From: Alan Modra @ 2014-11-05 12:54 UTC (permalink / raw)
  To: James Greenhalgh; +Cc: Siva Chandra, Ulrich Weigand, gdb-patches

On Wed, Nov 05, 2014 at 11:00:26AM +0000, James Greenhalgh wrote:
> For what it is worth, I'm seeing the same with my GCC 4.9.1 (x84_64-linux),
> again nothing special in the configure options for GCC:

Thanks for the confirmation.  I've opened a gcc bugzilla.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63748

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [push] Work around GCC bug 63748 (Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP)
  2014-11-05 12:54         ` Alan Modra
@ 2014-11-10 14:24           ` Ulrich Weigand
  0 siblings, 0 replies; 10+ messages in thread
From: Ulrich Weigand @ 2014-11-10 14:24 UTC (permalink / raw)
  To: Alan Modra; +Cc: James Greenhalgh, Siva Chandra, gdb-patches

Alan Modra wrote:
> On Wed, Nov 05, 2014 at 11:00:26AM +0000, James Greenhalgh wrote:
> > For what it is worth, I'm seeing the same with my GCC 4.9.1 (x84_64-linux),
> > again nothing special in the configure options for GCC:
> 
> Thanks for the confirmation.  I've opened a gcc bugzilla.
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63748

While this GCC bug is in the process of being fixed, it would still be good
to allow GDB to be built with the affected GCC versions (in particular 4.9.x).

I've pushed the following workaround that changes the CFG of the affected
GDB routine in an equivalent way so that the GCC bug is no longer triggered.

Tested on x86_64-linux, pushed to mainline.

Bye,
Ulrich

gdb/ChangeLog:

	* eval.c (evaluate_subexp_standard): Work around GCC bug 63748.

diff --git a/gdb/eval.c b/gdb/eval.c
index c49f7b6..655ea22 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1696,8 +1696,6 @@ evaluate_subexp_standard (struct type *expect_type,
 
     do_call_it:
 
-      if (noside == EVAL_SKIP)
-	goto nosideret;
       if (argvec[0] == NULL)
 	error (_("Cannot evaluate function -- may be inlined"));
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
@@ -1804,6 +1802,8 @@ evaluate_subexp_standard (struct type *expect_type,
 	  for (; tem <= nargs; tem++)
 	    argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside);
 	  argvec[tem] = 0;	/* signal end of arglist */
+	  if (noside == EVAL_SKIP)
+	    goto nosideret;
 	  goto do_call_it;
 
 	default:

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  Ulrich.Weigand@de.ibm.com

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-11-10 14:24 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-20 19:11 [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP Siva Chandra
2014-10-27 17:22 ` Siva Chandra
2014-11-03 14:35 ` Siva Chandra
2014-11-03 15:08 ` Ulrich Weigand
2014-11-04  2:08   ` Siva Chandra
2014-11-05  0:24     ` Alan Modra
2014-11-05  0:33       ` Siva Chandra
2014-11-05 11:00       ` James Greenhalgh
2014-11-05 12:54         ` Alan Modra
2014-11-10 14:24           ` [push] Work around GCC bug 63748 (Re: [PATCH] PR c++/17494 - Fix evaluation of method calls under EVAL_SKIP) Ulrich Weigand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).