Date: Mon, 29 Jul 2013 18:31:22 +0300 From: Pasi Parviainen <pasi.parviainen@iki.fi> To: Raphael Kubo da Costa <rakuco@FreeBSD.org> Cc: Scot Hetzel <swhetzel@gmail.com>, "freebsd-standards@FreeBSD.org" <freebsd-standards@FreeBSD.org>, David Chisnall <theraven@FreeBSD.org>, "freebsd-toolchain@FreeBSD.org" <freebsd-toolchain@FreeBSD.org>, Garrett Wollman <wollman@csail.mit.edu>, FreeBSD Current <freebsd-current@FreeBSD.org>, Tijl Coosemans <tijl@FreeBSD.org>, "O. Hartmann" <ohartman@zedat.fu-berlin.de> Subject: Re: CURRENT: CLANG 3.3 and -stad=c++11 and -stdlib=libc++: isnan()/isninf() oddity Message-ID: <51F68ACA.8030500@iki.fi> In-Reply-To: <83zjt5mwri.fsf@FreeBSD.org> References: <20130710155809.0f589c22@thor.walstatt.dyndns.org> <CD51F125-AE9E-4461-916D-CF583002B47D@FreeBSD.org> <20130710183315.725dfde0@thor.walstatt.dyndns.org> <C8C94CF2-7D5A-471B-AD63-8E961AED6274@FreeBSD.org> <20130710203200.5359fd18@thor.walstatt.dyndns.org> <51DDC04B.6040209@FreeBSD.org> <20957.49978.73666.392417@khavrinen.csail.mit.edu> <20130711130043.R920@besplex.bde.org> <FD768A6B-8B72-44A1-BC1C-14FF44CB4643@FreeBSD.org> <20130711202908.L84170@besplex.bde.org> <C00DFA94-6182-4334-9C90-8012E576E475@FreeBSD.org> <CACdU%2Bf9RmwxSiMEjOwSXHtnDwKk4xY8fmA3aBE5mzrVUkrc1Nw@mail.gmail.com> <CACdU%2Bf-LKsHsPayUYAT-cip91O=CfQg2aJ1BKC5PRd6G9Kf28w@mail.gmail.com> <20130712234749.5afa3c9b@thor.walstatt.dyndns.org> <9B0A6D14-640E-4ADD-8E58-0B7867C7C674@FreeBSD.org> <51E145CC.8080900@iki.fi> <861u6iv0ih.fsf@orwell.Elisa> <BD6EC81A-C02D-4907-80D4-BEC141E9EA10@FreeBSD.org> <83zjt5mwri.fsf@FreeBSD.org>
index | next in thread | previous in thread | raw e-mail
On 29.7.2013 14:27, Raphael Kubo da Costa wrote:
> David Chisnall <theraven@FreeBSD.org> writes:
>
>> On 28 Jul 2013, at 22:27, Raphael Kubo da Costa <rakuco@freebsd.org> wrote:
>>
>>> This seems to have been committed in r253321, and broke some code that
>>> was working with r253320; namely, some code in x11/kde4-workspace
>>> includes math.h and calls isnan() with a const double.
>>
>> Please provide a test case. Specifically, I need to know what
>> language dialect this is using, because I have tested including math.h
>> and calling isnan(double) with c89, gnu89, c99, c11, c++03 and c++11
>> on gcc (for the modes that it supports) and clang.
>
> I get the following results with and without -std=c++11 and/or
> -stdlib=libc++:
>
> % cat isnan.cc
> #include <math.h>
> int main() {
> const double d = 42.0;
> return isnan(d) ? 1 : 0;
> }
>
> % clang++ isnan.cc
> isnan.cc:4:10: error: controlling expression type 'const double' not
> compatible with any generic association type
> return isnan(d) ? 1 : 0;
> ^~~~~~~~
> /usr/include/math.h:109:2: note: expanded from macro 'isnan'
> __fp_type_select(x, __inline_isnanf, __inline_isnan,
> __inline_isnanl)
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> /usr/include/math.h:86:49: note: expanded from macro '__fp_type_select'
> #define __fp_type_select(x, f, d, ld) _Generic((0,(x)),
> \
> ^~~~~
> 1 error generated.
>
In the first place C++ code should be using cmath instead of math.h.
That said, this is a result of just an another wonderful little
difference between C and C++. C standard explicitly states that comma
operator does not yield an lvalue but in C++ it can if the right most
operand is an lvalue. If C++ compatibility is desired then unary +
operator (e.g. _Generic(+(x),...) could be used for the same effect,
only downside with this is that the integer arguments are promoted, but
that doesn't matter in this case.
Pasi
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51F68ACA.8030500>
