On 2013-07-10 20:32, O. Hartmann wrote: > On Wed, 10 Jul 2013 18:04:16 +0100 > David Chisnall <theraven_at_FreeBSD.org> wrote: > >> On 10 Jul 2013, at 17:33, "O. Hartmann" <ohartman_at_zedat.fu-berlin.de> >> wrote: >> >>> Hi David, >>> >>> thanks for the fast response. >>> >>> The code I was told to check with is this: >>> >>> #include <iostream> >>> #include <typeinfo> >>> #include <cmath> >>> >>> int >>> main(void) >>> { >>> >>> std::cout << typeid(isnan(1.0)).name() << "\n"; >>> >>> } >>> >>> >>> If I compile it with >>> >>> c++ -o testme -std=c++11 -stdlib=libc++ source.cc >>> >>> and run the binary, the result is "i" which I interpret as "INT". >> >> I believe there is a bug, which is that the math.h things are being >> exposed but shouldn't be, however it is not the bug that you think it >> is. Try this line instead: >> >> std::cout << typeid(std::isnan(1.0)).name() << "\n"; >> >> We have a libm function, isnan(), and a libc++ function, >> std::isnan(). The former is detected if you do not specify a >> namespace. I am not sure what will happen if you do: >> >> #include <iostream> >> #include <typeinfo> >> #include <cmath> >> using namespace std; >> >> int >> main(void) >> { >> >> cout << typeid(isnan(1.0)).name() << "\n"; >> >> } >> >> This is considered bad form, but does happen in some code. I am not >> certain what the precedence rules are in this case and so I don't >> know what happens. >> >> To properly fix this, we'd need to namespace the libm functions when >> including math.h in C++. This would also include fixing tweaking the >> macros. >> >> A fix for your code is to ensure isnan() and isinf() are explicitly >> namespaced. Potentially, this may also work: >> >> using std::isinf; >> using std::isnan; >> >> David >> > > I tried in the test code I provided using > > > #include <iostream> > #include <typeinfo> > #include <cmath> > > int > main(void) > { > > std::cout << typeid(std::isnan(1.0)).name() << "\n"; > > } > > now std::isnan(). > > The result is the same, it flags "INT". > > Using > > #include <iostream> > #include <typeinfo> > #include <cmath> > > using namespace std; > > int > main(void) > { > > std::cout << typeid(std::isnan(1.0)).name() << "\n"; > > } > > which is considered "bad coding" also results in "INT" (it gives "i"). > > So, is this woth a PR? isnan is overloaded. There's "int isnan(double)" in math.h and "bool isnan(arithmetic)" in cmath. When you call isnan(1.0), isnan(double) is selected. I think isnan(double) and isinf(double) in math.h should only be visible if (_BSD_VISIBLE || _XSI_VISIBLE) && __ISO_C_VISIBLE < 1999. For C99 and higher there should only be the isnan/isinf macros. CCed standards_at_.
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:39 UTC