diff options
| author | A. Wilcox | 2018-06-23 17:57:48 -0500 |
|---|---|---|
| committer | sin | 2018-07-24 11:00:30 +0100 |
| commit | a9ffac8596b094da8563aa5dd5d81c946670afe5 (patch) | |
| tree | 7e8ab469005400603d788c1291fdd6dfb5ba1b4e /include/stdlib.h | |
| parent | 6e7e43ff992fa232b186cec9fc2920ca260c27a6 (diff) | |
Don't use __extension__ in C++ code
A few important notes:
* __extension__ is a GNU C "alternate" keyword, not a C++ keyword.[1]
* __extension__ is designed to work on "expressions"; it does work on
#include_next in C mode, but it has no effect in C++ mode; the
warning will still appear, if enabled, even with __extension__
preceding #include_next. This is because #include_next is not
considered an expression in C++, so the compiler attaches
__extension__ to the first expression of the header.
All of this leads us to a build failure while building at least all
Mozilla software. Moz has an alternate -isystem dir searched before
/usr/include that overrides some headers, including <features.h>. The
first statement in each of these headers is a #pragma, and since
__extension__ is looking for an expression, and #pragma is a "null"
expression, we end up with the following error:
dist/system_wrappers/features.h:1:9: error: '#pragma' is not allowed here
Since __extension__ has no effect on #include_next in C++ mode anyway,
and since it can cause breakage, this commit omits __extension__ in C++
mode.
[1]: https://gcc.gnu.org/onlinedocs/gcc-6.4.0/gcc/Alternate-Keywords.html
Diffstat (limited to 'include/stdlib.h')
| -rw-r--r-- | include/stdlib.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/include/stdlib.h b/include/stdlib.h index 7ff5746..ef70995 100644 --- a/include/stdlib.h +++ b/include/stdlib.h | |||
| @@ -16,12 +16,16 @@ | |||
| 16 | #ifndef _FORTIFY_STDLIB_H | 16 | #ifndef _FORTIFY_STDLIB_H |
| 17 | #define _FORTIFY_STDLIB_H | 17 | #define _FORTIFY_STDLIB_H |
| 18 | 18 | ||
| 19 | #ifndef __cplusplus | ||
| 19 | __extension__ | 20 | __extension__ |
| 21 | #endif | ||
| 20 | #include_next <stdlib.h> | 22 | #include_next <stdlib.h> |
| 21 | 23 | ||
| 22 | #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 | 24 | #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 |
| 23 | #if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) | 25 | #if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) |
| 26 | #ifndef __cplusplus | ||
| 24 | __extension__ | 27 | __extension__ |
| 28 | #endif | ||
| 25 | #include_next <limits.h> | 29 | #include_next <limits.h> |
| 26 | #endif | 30 | #endif |
| 27 | 31 | ||
