On Sat, 11 Dec 2021, 10:56 Olivier Hainque via Libstdc++, < libstd...@gcc.gnu.org> wrote:
> (Thanks for your feedback Jonathan) > > > On 10 Dec 2021, at 19:24, Jonathan Wakely <jwak...@redhat.com> wrote: > > > > I'm curious why _GLIBCXX_USE_C99_CTYPE_TR1 is not defined if VxWorks > > has isblank, the configure check is: > > Oh, hmm, very good point. The reason was that the definition > of isblank is conditioned on _C99/_HAS_C9X as well, so the need > for which we had introduced the definition in os_defines.h > would better be generalized. > > * config/vxworks.h (VXWORKS_OS_CPP_BUILTINS): Define > _C99 for C++. > > --- a/gcc/config/vxworks.h > +++ b/gcc/config/vxworks.h > @@ -328,6 +328,10 @@ extern void vxworks_asm_out_destructor (rtx symbol, > int priority); > if (!flag_isoc99 && !c_dialect_cxx()) \ > builtin_define ("_ALLOW_KEYWORD_MACROS"); \ > } \ > + /* C++ support relies on C99 features. Make sure they are \ > + exposed by the system headers. */ \ > + if (c_dialect_cxx()) \ > + builtin_define("_C99"); \ > } \ > while (0) > > > Works with the two libstdc++ changes reverted, and gives > "configure" a better view of what's there. > > Makes sense? Yes. I can't approve patches outside libstdc++, but that looks definitely correct for C++11 and later, because C++11 incorporates the whole C99 library by reference. So if that macro is needed to get the C99 library (because the vxworks libc doesn't check the__cplusplus macro and enable C99 features that way), then I agree _C99 should be defined for C++11. Defining it for C++11 is sufficient to solve the isblank problem, because std::isblank is only declared for C++11 and later. (std::tr1::isblank is declared for C++98 if the C library supports it, but nobody really cares about TR1 nowadays, and probably hardly anybody cares about C++98). Defining _C99 is not strictly correct for C++98 mode, because C++98 incorporates the C89 library by reference. But as you noted in the earlier patch, libstdc++ likes to have full C99 facilities available even for C++98 mode (so it can use them for std::tr1 features, among other things). So I think defining it even for C++98 is fine too.