https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96407
Bug ID: 96407 Summary: LTO inlined functions don't inherit disabled warnings Product: gcc Version: 10.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: rjones at redhat dot com Target Milestone: --- This is a very reduced example from some real code where we are using -Werror -Wstack-usage=5000. We want most functions to have limited stack usage, but in some cases we have carefully examined functions to ensure their stack usage isn't unbounded - but it's hard to prove it - so we have disabled the warning for those functions. --- test.c --- #include <string.h> #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstack-usage=" int test (int i) { char str[i]; memset (str, 0, sizeof str); return str[0]+i; } #pragma GCC diagnostic pop --- main.c --- #include <stdio.h> extern int test (int i); int main (int argc, char *argv[]) { int j = test (argc); printf ("%d\n", j); return 0; } --- $ gcc -O2 -flto main.c test.c -Werror -Wstack-usage=5000 -o a.out main.c: In function ‘main’: main.c:6:1: error: stack usage might be unbounded [-Werror=stack-usage=] 6 | main (int argc, char *argv[]) | ^ lto1: all warnings being treated as errors Note that if you combine these two functions into a single file, it does *not* warn/error, even though presumably it can easily inline the test() function. So LTO seems to be causing the difference.