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.

Reply via email to