This is the mail archive of the
mailing list for the newlib project.
Re: ISO C99 support in <math.h> for C++98
- From: "Andre Vieira (lists)" <Andre dot SimoesDiasVieira at arm dot com>
- To: newlib at sourceware dot org
- Date: Tue, 22 Mar 2016 18:18:21 +0000
- Subject: Re: ISO C99 support in <math.h> for C++98
- Authentication-results: sourceware.org; auth=none
- References: <56F15C3B dot 5000407 at arm dot com> <56F167F6 dot 8030907 at cygwin dot com> <56F184E1 dot 5080708 at arm dot com> <56F18763 dot 6000005 at cygwin dot com>
On 22/03/16 17:56, Yaakov Selkowitz wrote:
> On 2016-03-22 12:46, Andre Vieira (lists) wrote:
>> On 22/03/16 15:42, Yaakov Selkowitz wrote:
>>> We also had issues enabling C99-in-C++ on Cygwin (which is based on
>>> newlib), which required a few patches:
>>> It is on my to-do list to get this working on newlib targets once we
>>> have a snapshot with the new feature test macros.
>> Ok so I now know where the problem is coming from, its the fact that
>> _GLIBCXX98_USE_C99_MATH is defined based on the configure which uses
>> -std=g++98, whereas the test in libstdc++ uses -std=gnu++98. The first
>> ends up with a __ISO_C_VISIBLE 1990 the latter 1999 because
>> _POSIX_C_SOURCE is defined as 200809L for gnu++98 and undefined for
>> This was working before because the C99 functions would always be
>> included when compiling for c++ due to the || defined(__cplusplus),
>> adding this back would fix it, but I'm assuming you removed it for a
>> reason. I will look further into why this discrepancy in macros for
>> c++98 and gnu++98.
> AFAICS the configure tests are incorrect here. C++98, which obviously
> predates C99, can not and should not rely upon nor expose the latter's
> features. The feature test macros *do* enable C99 and C11 when C++11 or
> newer is in effect.
> Note that this is part of a larger issue, which affects glibc as well:
> I do plan on working on this for newlib, and possibly even glibc, when I
> have a chance.
OK, so the configure test is working as intended and the same test when
compiled with -std=c++98 behaves fine too.
The problem comes from the fact that this test uses -std=gnu++98 and
gnu++98 reuses the same macro, _GLIBCXX98_USE_C99_MATH, set by that
configuration step. However, as I mentioned the ISO_C_VISIBLE values are
different for these two. I now figured out this is because c++98 sets
__STRICT_ANSI whereas gnu++98 does not. This together with the absence
of __XOPEN_SOURCE leads to 'newlib/libc/include/sys/features.h' defining
POSIX_C_SOURCE as 200809L and eventually the different ISO_C_VARIABLE.
Doesnt seem reasonable to set POSIX_C_SOURCE to 200809L for gnu++98.