On 7/2/21 2:52 PM, David Malcolm wrote:
...
@@ -11425,10 +11425,10 @@ expand_expr_real_1 (tree exp, rtx
target, machine_mode tmode,
                                          DECL_ATTRIBUTES
(fndecl))) != NULL)
           {
             const char *ident = lang_hooks.decl_printable_name
(fndecl, 1);
-           warning_at (tree_nonartificial_location (exp),
+           warning_at (EXPR_LOCATION (exp),

Are we preserving the existing behavior for
__attribute__((__artificial__)) here?
Is this behavior handled somewhere else in the patch kit?

Yes.  The warning infrastructure (set_inlining_locations) uses
the location of the site into which the statement has been inlined
regardless of whether the inlined function is artificial.

Do we have test coverage for this, though?

[...]
Attached is the revised patch for reference.  Since it just removes
the uses of the %K and %G directives made redundant by the first
patch in the series I'll go ahead and commit it as obvious in a day
or so after patch 1 unless someone has further questions or requests
for changes.

Please can you look into the "__artificial__" test coverage, and
address the line number thing above.

There are a bunch of tests for it but I couldn't find one that
verifies the inlining stack.  I always struggle with the DejaGnu
directives for these things (I couldn't get dg-multiline-output
to do what I wanted) so I cribbed the approach from
plugin/diagnostic-test-inlining-*.c.

Since I was changing the directives I got rid of the line numbers
from their comments but instead hardcoded them in the search pattern,
making the tests tighter.  That's a good thing but it does of course
mean that when new lines are added to the tests the directives will
fail and the patterns will need to be updated.

Attached is a patch with just the test I'm adding.

Martin
diff --git a/gcc/testsuite/gcc.dg/Wfree-nonheap-object-6.c b/gcc/testsuite/gcc.dg/Wfree-nonheap-object-6.c
new file mode 100644
index 00000000000..c109558838b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wfree-nonheap-object-6.c
@@ -0,0 +1,49 @@
+/* Similar to Wfree-nonheap-object-5.c but with attribute artificial:
+   verify that warnings for the same call site from distinct callers
+   include the correct function names in the inlining stack.
+   { dg-do compile }
+   { dg-options "-O1 -Wall" } */
+
+struct A
+{
+  void *p;
+};
+
+__attribute__ ((always_inline, artificial))
+inline void f0 (struct A *p)
+{
+  __builtin_free (p->p);      // { dg-warning "\\\[-Wfree-nonheap-object" }
+}
+
+// Expect two instances of the text below:
+// { dg-regexp "In function 'f0'," "first f0 prefix" { target *-*-* } 0 }
+// { dg-regexp "In function 'f0'," "second f0 prefix" { target *-*-* } 0 }
+
+__attribute__ ((always_inline, artificial))
+inline void f1 (struct A *p) { f0 (p); }
+__attribute__ ((always_inline, artificial))
+inline void f2 (struct A *p) { f1 (p); }
+
+extern int array[];
+// Also expect two instances of the note:
+// { dg-regexp "declared here" "first note for array" { target *-*-* } .-2 }
+// { dg-regexp "declared here" "second note for array" { target *-*-* } .-3 }
+
+void foo (struct A *p)
+{
+  p->p = array + 1;
+  f0 (p);
+}
+
+// { dg-regexp " +inlined from 'foo' at \[^:\]+Wfree-nonheap-object-6.c:35:\\d+:" "inlined from foo" }
+
+
+void bar (struct A *p)
+{
+  p->p = array + 2;
+  f2 (p);
+}
+
+// { dg-regexp " +inlined from 'f1' at \[^:\]+Wfree-nonheap-object-6.c:23:\\d+," "inlined from f1" }
+// { dg-regexp " +inlined from 'f2' at \[^:\]+Wfree-nonheap-object-6.c:25:\\d+," "inlined from f2" }
+// { dg-regexp " +inlined from 'bar' at \[^:\]+Wfree-nonheap-object-6.c:44:\\d+:" "inlined from bar" }

Reply via email to