aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2024-01-27 00:55:01 +0100
committerHans-Peter Nilsson <hp@bitrange.com>2024-01-27 00:55:01 +0100
commit4eb836704239de22078caafe5ce261c5378e73da (patch)
tree56ec73f82f486743ca6bb950d700dc66a17468c2
parentec57d183d35412aa5e0bcd7a448ccb75a4e1eab7 (diff)
downloadgcc-4eb836704239de22078caafe5ce261c5378e73da.zip
gcc-4eb836704239de22078caafe5ce261c5378e73da.tar.gz
gcc-4eb836704239de22078caafe5ce261c5378e73da.tar.bz2
c/c++: Tweak warning for 'always_inline function might not be inlinable'
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.
-rw-r--r--gcc/cgraphunit.cc3
-rw-r--r--gcc/testsuite/g++.dg/Wattributes-3.C4
-rw-r--r--gcc/testsuite/gcc.dg/fail_always_inline.c2
3 files changed, 5 insertions, 4 deletions
diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index 3805267..5c40525 100644
--- a/gcc/cgraphunit.cc
+++ b/gcc/cgraphunit.cc
@@ -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);
}
diff --git a/gcc/testsuite/g++.dg/Wattributes-3.C b/gcc/testsuite/g++.dg/Wattributes-3.C
index 208ec66..dd9c224 100644
--- a/gcc/testsuite/g++.dg/Wattributes-3.C
+++ b/gcc/testsuite/g++.dg/Wattributes-3.C
@@ -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__))
diff --git a/gcc/testsuite/gcc.dg/fail_always_inline.c b/gcc/testsuite/gcc.dg/fail_always_inline.c
index 86645b8..16a549c 100644
--- a/gcc/testsuite/gcc.dg/fail_always_inline.c
+++ b/gcc/testsuite/gcc.dg/fail_always_inline.c
@@ -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()