This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] [RFC] PR debug/49951 - jumpy stepping at end of scope in C++
- From: Dodji Seketeli <dodji at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: Jakub Jelinek <jakub at redhat dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 02 Jan 2012 17:41:28 +0100
- Subject: Re: [PATCH] [RFC] PR debug/49951 - jumpy stepping at end of scope in C++
- References: <m3zkf9tt7h.fsf@redhat.com> <4EEB9E6D.2090204@redhat.com> <m339cgp3yr.fsf@redhat.com> <20111219225805.GN1957@tyan-ft48-01.lab.bos.redhat.com> <m3vcpcnof5.fsf@redhat.com> <4EF024EF.3060804@redhat.com>
Jason Merrill <jason@redhat.com> writes:
> OK.
I'd like to apply this patch to 4.5 and 4.6 as I find the jumpy stepping
behaviour very annoying while using 4.6 myself.
I have bootstrapped and tested the patch on these branches
for x86_64-unknown-linux-gnu successfully.
Would this be OK?
For the record, here is the commit I have tested on these branches.
commit 399ff82d2ff78acb066b91e5940e815fcdc82ed7
Author: dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue Dec 20 13:36:04 2011 +0000
PR debug/49951 - jumpy stepping at end of scope in C++
gcc/cp/
PR debug/49951
* decl.c (cxx_maybe_build_cleanup): Don't set location of the call
to the destructor.
gcc/testsuite/
PR debug/49951
* g++.dg/gcov/gcov-2.C: Adjust.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182532 138bc75d-0d04-0410-961f-82ee72b054a4
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -13363,8 +13363,17 @@ cxx_maybe_build_cleanup (tree decl)
cleanup = call;
}
+ /* build_delete sets the location of the destructor call to the
+ current location, even though the destructor is going to be
+ called later, at the end of the current scope. This can lead to
+ a "jumpy" behaviour for users of debuggers when they step around
+ the end of the block. So let's unset the location of the
+ destructor call instead. */
+ if (cleanup != NULL && EXPR_P (cleanup))
+ SET_EXPR_LOCATION (cleanup, UNKNOWN_LOCATION);
return cleanup;
}
/* When a stmt has been parsed, this function is called. */
diff --git a/gcc/testsuite/g++.dg/gcov/gcov-2.C b/gcc/testsuite/g++.dg/gcov/gcov-2.C
index 6d002f5..66d8af3 100644
--- a/gcc/testsuite/g++.dg/gcov/gcov-2.C
+++ b/gcc/testsuite/g++.dg/gcov/gcov-2.C
@@ -20,7 +20,7 @@ private:
void foo()
{
- C c; /* count(2) */
+ C c; /* count(1) */
c.seti (1); /* count(1) */
}
--
Dodji