Message ID | HE1PR07MB0905BE8B57CCF6328BE2A52FE4A40@HE1PR07MB0905.eurprd07.prod.outlook.com |
---|---|
State | New |
Headers | show |
On 23/02/16 07:15 +0000, Bernd Edlinger wrote: >as described in the PR 69881 it happens quite often that cstddef is >called with __need_size_t because we still support gmp-4.3.2 which >is installed by contrib/download_prerequisites. This causes a kind >of undefined behavior. It is just by chance that this does not cause >the gcc-6 boot-strap to fail, but it causes gcc-4.9 bootstrap to fail >when the gcc-6 version of cstddef is around. So it looks like a >regression, because the new cstddef is more fragile than before. Is it? cstddef hasn't been changed since 2013-06-11. cstdarg hasn't been changed since 2011-01-30. What made them more fragile?
On 23/02/15 10:42, Jonathan Wakely wrote: >On 23/02/16 07:15 +0000, Bernd Edlinger wrote: >>as described in the PR 69881 it happens quite often that cstddef is >>called with __need_size_t because we still support gmp-4.3.2 which >>is installed by contrib/download_prerequisites. This causes a kind >>of undefined behavior. It is just by chance that this does not cause >>the gcc-6 boot-strap to fail, but it causes gcc-4.9 bootstrap to fail >>when the gcc-6 version of cstddef is around. So it looks like a >>regression, because the new cstddef is more fragile than before. > >Is it? cstddef hasn't been changed since 2013-06-11. cstdarg hasn't >been changed since 2011-01-30. > >What made them more fragile? Good question. The cstddef had this even in gcc.4.9 that's true, but it was not used by default: #if __cplusplus >= 201103L namespace std { // We handle size_t, ptrdiff_t, and nullptr_t in c++config.h. using ::max_align_t; } #endif Previously the g++ default was --std=gnu++98, but gcc-6 changed the default to --std=gnu++14. And when building gcc-4.9, stage1 does not override that with --std=gnu++98. That has changed, and that triggers the latent bug. Bernd.
On Tue, Feb 23, 2016 at 10:00:58AM +0000, Bernd Edlinger wrote: > Previously the g++ default was --std=gnu++98, > but gcc-6 changed the default to --std=gnu++14. > > And when building gcc-4.9, stage1 does not override that with > --std=gnu++98. > > That has changed, and that triggers the latent bug. So just use -std=gnu++98 in STAGE1_CXXFLAGS or configure with CXX='g++ -std=gnu++98' if you try to build gcc-4.9 with gcc 6? I really don't think we should work around this in GCC 6. Jakub
On 23/02/16 10:00 +0000, Bernd Edlinger wrote: >On 23/02/15 10:42, Jonathan Wakely wrote: >>On 23/02/16 07:15 +0000, Bernd Edlinger wrote: >>>as described in the PR 69881 it happens quite often that cstddef is >>>called with __need_size_t because we still support gmp-4.3.2 which >>>is installed by contrib/download_prerequisites. This causes a kind >>>of undefined behavior. It is just by chance that this does not cause >>>the gcc-6 boot-strap to fail, but it causes gcc-4.9 bootstrap to fail >>>when the gcc-6 version of cstddef is around. So it looks like a >>>regression, because the new cstddef is more fragile than before. >> >>Is it? cstddef hasn't been changed since 2013-06-11. cstdarg hasn't >>been changed since 2011-01-30. >> >>What made them more fragile? > >Good question. > >The cstddef had this even in gcc.4.9 that's true, but it was not used >by default: > >#if __cplusplus >= 201103L >namespace std >{ > // We handle size_t, ptrdiff_t, and nullptr_t in c++config.h. > using ::max_align_t; >} >#endif > > >Previously the g++ default was --std=gnu++98, >but gcc-6 changed the default to --std=gnu++14. Ah yes. >And when building gcc-4.9, stage1 does not override that with >--std=gnu++98. > >That has changed, and that triggers the latent bug. Alright then, the patch is OK for trunk. I might revert it once we stop using the buggy GMP in contrib/download_prerequisites.
On 23/02/16 11:09 +0100, Jakub Jelinek wrote: >On Tue, Feb 23, 2016 at 10:00:58AM +0000, Bernd Edlinger wrote: >> Previously the g++ default was --std=gnu++98, >> but gcc-6 changed the default to --std=gnu++14. >> >> And when building gcc-4.9, stage1 does not override that with >> --std=gnu++98. >> >> That has changed, and that triggers the latent bug. > >So just use -std=gnu++98 in STAGE1_CXXFLAGS or configure with >CXX='g++ -std=gnu++98' if you try to build gcc-4.9 with gcc 6? > >I really don't think we should work around this in GCC 6. I agree, but #undefining those macros doesn't hurt, and hopefully the issue will go away.
2016-02-23 Bernd Edlinger <bernd.edlinger@hotmail.de> PR libstdc++/69881 * include/c_global/cstdarg: Undefine __need___va_list. * include/c_global/cstddef: Undefine all kinds of __need_*. Index: libstdc++-v3/include/c_global/cstdarg =================================================================== --- libstdc++-v3/include/c_global/cstdarg (revision 233604) +++ libstdc++-v3/include/c_global/cstdarg (working copy) @@ -38,6 +38,7 @@ #pragma GCC system_header +#undef __need___va_list #include <bits/c++config.h> #include <stdarg.h> Index: libstdc++-v3/include/c_global/cstddef =================================================================== --- libstdc++-v3/include/c_global/cstddef (revision 233604) +++ libstdc++-v3/include/c_global/cstddef (working copy) @@ -41,6 +41,11 @@ #pragma GCC system_header +#undef __need_wchar_t +#undef __need_ptrdiff_t +#undef __need_size_t +#undef __need_NULL +#undef __need_wint_t #include <bits/c++config.h> #include <stddef.h>