[v2] c/c++: Tweak warning for 'always_inline function might not be inlinable'
Checks
Commit Message
Change from v1: The message is changed as per the review.
The powerpc test-case is dropped from the changes as the
part quoted in a comment now does not change and so cannot
cause further confusion. The commit message is tweaked.
It now also mentions clang. I intend to commit this on
Thursday 2024-01-25, as per Richard Biener's approval.
-- >8 --
When you're not regularly exposed to this warning, it is
easy to be misled by its wording, believing that there's
something else in the function that stops it from being
inlined, something other than the lack of also being
*declared* inline. Also, clang does not warn.
It's just a warning: without the inline directive, there has
to be a secondary reason for the function to be inlined,
other than the always_inline attribute, a reason that may be
in effect despite the warning.
Whenever the text is quoted in inline-related bugzilla
entries, there seems to often have been an initial step of
confusion that has to be cleared, for example in PR55830.
A file in the powerpc-specific parts of the test-suite,
gcc.target/powerpc/vec-extract-v16qiu-v2.h, has a comment
and seems to be another example, and I testify as the
first-hand third "experience". The wording has been the
same since the warning was added.
Let's just tweak the wording, adding the cause, so that the
reason for the warning is clearer. This hopefully stops the
user from immediately asking "'Might'? Because why?" and
then going off looking at the function body - or grepping
the gcc source or documentation, or enter a bug-report
subsequently closed as resolved/invalid.
Since the message is only appended with additional
information, no test-case actually required adjustment.
I still changed them, so the message is covered.
gcc:
* cgraphunit.cc (process_function_and_variable_attributes): Tweak
the warning for an attribute-always_inline without inline declaration.
gcc/testsuite:
* g++.dg/Wattributes-3.C: Adjust expected warning.
* gcc.dg/fail_always_inline.c: Ditto.
---
gcc/cgraphunit.cc | 3 ++-
gcc/testsuite/g++.dg/Wattributes-3.C | 4 ++--
gcc/testsuite/gcc.dg/fail_always_inline.c | 2 +-
3 files changed, 5 insertions(+), 4 deletions(-)
@@ -918,7 +918,8 @@ process_function_and_variable_attributes (cgraph_node *first,
/* redefining extern inline function makes it DECL_UNINLINABLE. */
&& !DECL_UNINLINABLE (decl))
warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes,
- "%<always_inline%> function might not be inlinable");
+ "%<always_inline%> function might not be inlinable"
+ " unless also declared %<inline%>");
process_common_attributes (node, decl);
}
@@ -26,7 +26,7 @@ B::operator char () const { return 0; }
ATTR ((__noinline__))
B::operator int () const // { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." }
-// { dg-warning "function might not be inlinable" "" { target *-*-* } .-1 }
+// { dg-warning "function might not be inlinable unless also declared .inline." "" { target *-*-* } .-1 }
{
return 0;
@@ -45,7 +45,7 @@ C::operator char () { return 0; }
ATTR ((__noinline__))
C::operator short () // { dg-warning "ignoring attribute .noinline. because it conflicts with attribute .always_inline." }
-// { dg-warning "function might not be inlinable" "" { target *-*-* } .-1 }
+// { dg-warning "function might not be inlinable unless also declared .inline." "" { target *-*-* } .-1 }
{ return 0; }
inline ATTR ((__noinline__))
@@ -2,7 +2,7 @@
/* { dg-add-options bind_pic_locally } */
extern __attribute__ ((always_inline)) void
- bar() { } /* { dg-warning "function might not be inlinable" } */
+ bar() { } /* { dg-warning "function might not be inlinable unless also declared .inline." } */
void
f()