Opened 8 years ago
Last modified 6 years ago
#53226 assigned defect
gcc5 @5.4: error: 'std::log2' has not been declared
Reported by: | noloader (Jeffrey Walton) | Owned by: | macports-tickets@… |
---|---|---|---|
Priority: | Normal | Milestone: | |
Component: | ports | Version: | 2.3.5 |
Keywords: | powerpc | Cc: | ryandesign (Ryan Carsten Schmidt), cooljeanius (Eric Gallager) |
Port: | gcc5 |
Description
I'm working on a PowerMac G5. It runs OS X 10.5.8. It has MacPorts installed for updated gear. The machine survives specifically for big-endian PowerPC testing.
$ cat test.cxx #include <cmath> int main(int argc, char* argv[]) { double d = std::log2(2.3456789f); return 0; }
Compiling a program which uses log2
under C++11 results in a compile error 'std::log2' has not been declared
:
$ /opt/local/bin/g++-mp-5 -std=c++11 test.cxx -o test.exe test.cxx: In function 'int main(int, char**)': test.cxx:4:16: error: 'log2' is not a member of 'std' double d = std::log2(2.3456789f); ^ test.cxx:4:16: note: suggested alternative: In file included from /usr/include/math.h:26:0, from /opt/local/include/gcc5/c++/cmath:44, from test.cxx:1: /usr/include/architecture/ppc/math.h:431:15: note: 'log2' extern double log2( double ); ^
MacPorts is version 2.3.5 and fully patched. GCC version string is:
$ /opt/local/bin/g++-mp-5 --version g++-mp-5 (MacPorts gcc5 5.4.0_0) 5.4.0 Copyright (C) 2015 Free Software Foundation, Inc. ...
Change History (8)
comment:1 Changed 8 years ago by noloader (Jeffrey Walton)
comment:2 Changed 8 years ago by ryandesign (Ryan Carsten Schmidt)
Cc: | ryandesign added |
---|---|
Keywords: | powerpc added; c++11 cmath log2 removed |
Owner: | set to mww@… |
Port: | gcc5 added; g++-mp-5 removed |
Status: | new → assigned |
Summary: | PowerMac, GCC 5.4 and "error: 'std::log2' has not been declared" → gcc5 @5.4: error: 'std::log2' has not been declared |
I'm the one who has been updating the gcc ports for a few years, but I don't know C++ or the internals of gcc well enough to be able to help you with this. Markus is the maintainer, but he has been unresponsive for awhile. I suggest you test with gcc6 and gcc7. If the problem persists there, report the problem to the developers of gcc directly.
comment:3 Changed 8 years ago by kencu (Ken)
there is a slight difference in the way gcc work on 10.5 PPC, it appears.
On PPC, it works OK if you just leave the std:: part off:
#include <cmath> #include <stdio.h> int main(int argc, char* argv[]) { int i = 1000; double b = log2(i); printf("%f \n",b); double d = log2(2.3456789f); printf("%f \n",d); return 0; }
$ g++ -std=c++11 math.cxx -o math LeopardG5:mathtest $ ./math 9.965784 1.230005
The same code on the intel machine I'm using to compare works with the std:: part on or off.
Right at the moment, I don't have gcc installed on my 10.5 intel machine to see if it's a 10.5 difference or an intel/ppc difference.
comment:4 Changed 8 years ago by noloader (Jeffrey Walton)
Now open in the GCC issue tracker: Issue 79017: Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared"
comment:5 Changed 8 years ago by kencu (Ken)
some more data - from an Intel 10.5 machine. Same issue on the Intel machine, and also same issue with clang++. So it's looking more like a 10.5 issue than anything else, at the moment - not specific to gcc, and not specific to PPC. The llrint
missing definitions you noted are a recognized issue with systems < 10.7, btw, see <https://github.com/jeremyhu/libcxx/commit/720feba4874d4ca3131753dc31af127e3c509c36>
$ cat math.cxx #include <cmath> #include <stdio.h> int main(int argc, char* argv[]) { int i = 1000; double b = std::log2(i); printf("%f \n",b); double d = std::log2(2.3456789f); printf("%f \n",d); return 0; }
$ g++ --version i686-apple-darwin9-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5555) (LLVM build 2064.3) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -o math.intel math.cxx math.cxx: In function ‘int main(int, char**)’: math.cxx:6: error: ‘log2’ is not a member of ‘std’ math.cxx:9: error: ‘log2’ is not a member of ‘std’
$ clang++ --version clang version 3.7.1 (tags/RELEASE_371/final) Target: i686-apple-darwin9.8.0 Thread model: posix
$ clang++ -o math.intel math.cxx math.cxx:6:16: error: no member named 'log2' in namespace 'std'; did you mean simply 'log2'? double b = std::log2(i); ^~~~~~~~~ log2 /usr/include/architecture/i386/math.h:316:15: note: 'log2' declared here extern double log2 ( double ); ^ math.cxx:9:16: error: no member named 'log2' in namespace 'std'; did you mean simply 'log2'? double d = std::log2(2.3456789f); ^~~~~~~~~ log2 /usr/include/architecture/i386/math.h:316:15: note: 'log2' declared here extern double log2 ( double ); ^
comment:6 Changed 8 years ago by noloader (Jeffrey Walton)
Thanks Ken. I passed on the libc++ commit to Jonathan Wakely in the GCC bug report. It should be very helpful to him if he decides to proceed.
comment:7 Changed 8 years ago by kurthindenburg (Kurt Hindenburg)
Owner: | changed from mww@… to macports-tickets@… |
---|
comment:8 Changed 6 years ago by cooljeanius (Eric Gallager)
Cc: | cooljeanius added |
---|
I found I could work around the issue with the following. I'm not sure its a good workaround, though. I think I'm supposed to avoid adding symbols to std namespace like this.