Patchwork PR c++/50055: Location information for the throw() specification in a function may be incorrect

login
register
mail settings
Submitter Siddhesh Poyarekar
Date Aug. 12, 2011, 7:18 p.m.
Message ID <CAAHN_R2AiK_uCtc-eSv899=EpCK7RtKTN66XtTgUb=Yni3Ut=Q@mail.gmail.com>
Download mbox | patch
Permalink /patch/109882/
State New
Headers show

Comments

Siddhesh Poyarekar - Aug. 12, 2011, 7:18 p.m.
Hi,

When the location for throw() exception specification is not the same
as the function it is written against, it leads gcov to give incorrect
results. See bug 50055 for details of the the same. The following
patch makes sure that the exception specification block (nothrow or
otherwise) is always associated with the function definition line
number.

I have a test case included with the patch. I ran the c++ test suite
and found no regressions due to this patch.

--
Siddhesh

cp/ChangeLog:

    PR c++/50055
    * except.c (begin_eh_spec_block): Build EH_SPEC block on the
    same line as the function.

testsuite/ChangeLog:

    PR c++/50055
    * g++.dg/gcov/gcov-7.C: New test.
Jason Merrill - Aug. 23, 2011, 2:56 p.m.
On 08/12/2011 03:18 PM, Siddhesh Poyarekar wrote:
> When the location for throw() exception specification is not the same
> as the function it is written against, it leads gcov to give incorrect
> results. See bug 50055 for details of the the same. The following
> patch makes sure that the exception specification block (nothrow or
> otherwise) is always associated with the function definition line
> number.

I'm applying this patch, thanks.

This patch is small enough not to need it, but for future contributions 
please file a copyright assignment with the FSF.  Send email to 
assign@gnu.org for more information.

Jason
Jakub Jelinek - Aug. 23, 2011, 3:03 p.m.
On Tue, Aug 23, 2011 at 10:56:26AM -0400, Jason Merrill wrote:
> This patch is small enough not to need it, but for future
> contributions please file a copyright assignment with the FSF.  Send
> email to assign@gnu.org for more information.

I think Siddhesh should be covered by the Red Hat assignment (it would help
if the patch has been mailed from a redhat.com address to notice that).

	Jakub
Siddhesh Poyarekar - Aug. 23, 2011, 3:17 p.m.
On Tue, Aug 23, 2011 at 8:33 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Tue, Aug 23, 2011 at 10:56:26AM -0400, Jason Merrill wrote:
>> This patch is small enough not to need it, but for future
>> contributions please file a copyright assignment with the FSF.  Send
>> email to assign@gnu.org for more information.
>
> I think Siddhesh should be covered by the Red Hat assignment (it would help
> if the patch has been mailed from a redhat.com address to notice that).
>

Thanks! I will keep that in mind for future submissions.

Patch

Index: gcc/testsuite/g++.dg/gcov/gcov-7.C
===================================================================
--- gcc/testsuite/g++.dg/gcov/gcov-7.C	(revision 0)
+++ gcc/testsuite/g++.dg/gcov/gcov-7.C	(revision 0)
@@ -0,0 +1,28 @@ 
+/* Check that Exception handler specification is not
+   mapped to the curly braces below the function
+   declaration.  */
+
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+struct foo
+{
+  foo () throw (int)
+    {			/* count (-) */
+      throw (1);
+    }
+};
+
+int main ()
+{
+  try
+    {
+      foo f;
+    }
+  catch ( ...)
+    {
+      return 0;
+    }
+}
+
+/* { dg-final { run-gcov gcov-7.C } } */
Index: gcc/cp/except.c
===================================================================
--- gcc/cp/except.c	(revision 177613)
+++ gcc/cp/except.c	(working copy)
@@ -527,15 +527,17 @@ 
 begin_eh_spec_block (void)
 {
   tree r;
+  location_t spec_location = DECL_SOURCE_LOCATION (current_function_decl);
+
   /* A noexcept specification (or throw() with -fnothrow-opt) is a
      MUST_NOT_THROW_EXPR.  */
   if (TYPE_NOEXCEPT_P (TREE_TYPE (current_function_decl)))
     {
-      r = build_stmt (input_location, MUST_NOT_THROW_EXPR, NULL_TREE);
+      r = build_stmt (spec_location, MUST_NOT_THROW_EXPR, NULL_TREE);
       TREE_SIDE_EFFECTS (r) = 1;
     }
   else
-    r = build_stmt (input_location, EH_SPEC_BLOCK, NULL_TREE, NULL_TREE);
+    r = build_stmt (spec_location, EH_SPEC_BLOCK, NULL_TREE, NULL_TREE);
   add_stmt (r);
   TREE_OPERAND (r, 0) = push_stmt_list ();
   return r;