Regression for gdb.cp/exceptprint.exp [Re: [PATCH v6] Make chained function calls in expressions work]

Message ID CAGyQ6gw6pPYQoF-eyc44Kv2r-YonPhzaFkFDaAr8+7CeVR00NQ@mail.gmail.com
State New, archived
Headers

Commit Message

Siva Chandra Reddy Nov. 29, 2014, 10:16 a.m. UTC
  On Sat, Nov 29, 2014 at 12:26 AM, Jan Kratochvil
<jan.kratochvil@redhat.com> wrote:
> On Sat, 29 Nov 2014 01:03:57 +0100, Siva Chandra wrote:
>> I have now pushed this patch
>
> [bash]jkratoch@MOCK-fedora-21-x86_64:/home/jkratoch/redhat/gdb-clean/gdb/testsuite# git log
> commit 6c659fc2c7cd2da6d2b9a3d7c38597ad3821832a
> Author: Siva Chandra <sivachandra@chromium.org>
> Date:   Tue Nov 11 05:43:03 2014 -0800
>     Enable chained function calls in C++ expressions.
>
> On Fedora 21 x86_64 and x86_64-m32 (i686 not tested due to some unrelated
> regression).
>
>  print $_exception^M
> -$1 = 0x400b10 "hi bob"^M
> -(gdb) PASS: gdb.cp/exceptprint.exp: string: print exception value at throw
> -continue^M
> +thread.c:711: internal-error: value_in_thread_stack_temporaries: Assertion `tp != NULL && tp->stack_temporaries_enabled' failed.^M
> +A problem internal to GDB has been detected,^M
> +further debugging may prove unreliable.^M

What my patch did was to make evaluate_subexp non re-entrant. As in,
if evaluate_subexp is called with *pos == 0 while a top level
expression is under evaluation, then it will crash with symptoms
similar to the above. While I setup my VM/fedora box, can I ask you to
test the attached patch which should fix this (and hopefully fix the
regression)?

Thanks,
Siva Chandra
  

Comments

Jan Kratochvil Nov. 29, 2014, 12:38 p.m. UTC | #1
On Sat, 29 Nov 2014 11:16:08 +0100, Siva Chandra wrote:
> can I ask you to test the attached patch which should fix this (and
> hopefully fix the regression)?

Confirming it fixes the regression on
{x86_64,x86_64-m32,i686}-fedora21-linux-gnu and I see no other regressions
there.


Thanks,
Jan
  

Patch

diff --git a/gdb/eval.c b/gdb/eval.c
index a13793c..c2ab879 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -69,7 +69,8 @@  evaluate_subexp (struct type *expect_type, struct expression *exp,
   int cleanup_temps = 0;
 
   if (*pos == 0 && target_has_execution
-      && exp->language_defn->la_language == language_cplus)
+      && exp->language_defn->la_language == language_cplus
+      && !thread_stack_temporaries_enabled_p (inferior_ptid))
     {
       cleanups = enable_thread_stack_temporaries (inferior_ptid);
       cleanup_temps = 1;