Search code examples
c++c++11macportsgcc5

error: 'log2' is not a member of 'std'


I'm not sure what I am seeing here. The test results below are from an old PowerMac G5 running OS X 10.5.8. Its still around for testing under the big-endian PowerPC cpu. The compiler is GCC 5.4, and its provided by MacPorts.

The test program is below. Compiling it results in an error error: 'log2' is not a member of 'std'.

$ cat test.cxx
#include <cmath>
int main(int argc, char* argv[])
{
    double d = std::log2(2.3456789f);
    return 0;
}

According to Is std::log2() an extension or C++ standard?, std::log2 should be available.

Why is the program failing to compile?


$ /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.

$ /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 );
               ^

This may be related because of the old hardware: C++11 cmath functions not in std namespace for android NDK w/gcc-4.8 or clang 3.4. I realize Android is a different platform.


Now open in the MacPorts issue tracker: Issue 53226: PowerMac, GCC 5.4 and "error: 'std::log2' has not been declared".

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"


Solution

  • Why is the program failing to compile?

    The GCC report at Issue 79017: Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared" got some good comments from the GCC devs.

    According to Jonathan Wakely and the results of the program below:

    test.cxx:53:21: error: 'llrint' was not declared in this scope
    llrint(0.0);
    
    test.cxx:54:23: error: 'llrintf' was not declared in this scope
    llrintf(0.0f);
    
    test.cxx:55:23: error: 'llrintl' was not declared in this scope
    llrintl(0.0l);
    
    test.cxx:56:22: error: 'llround' was not declared in this scope
    llround(0.0);
    
    test.cxx:57:24: error: 'llroundf' was not declared in this scope
    llroundf(0.0f);
    
    test.cxx:58:24: error: 'llroundl' was not declared in this scope
    llroundl(0.0l);   
    

    Because these six functions are missing we treat all C99 math functions as missing. We could split the checks into two pieces, so we check for these separately, which would allow the rest of the C99 math library to be imported into namespace std.


    #include <math.h>
    int main() {
              typedef double_t  my_double_t;
              typedef float_t   my_float_t;
              acosh(0.0);
              acoshf(0.0f);
              acoshl(0.0l);
              asinh(0.0);
              asinhf(0.0f);
              asinhl(0.0l);
              atanh(0.0);
              atanhf(0.0f);
              atanhl(0.0l);
              cbrt(0.0);
              cbrtf(0.0f);
              cbrtl(0.0l);
              copysign(0.0, 0.0);
              copysignf(0.0f, 0.0f);
              copysignl(0.0l, 0.0l);
              erf(0.0);
              erff(0.0f);
              erfl(0.0l);
              erfc(0.0);
              erfcf(0.0f);
              erfcl(0.0l);
              exp2(0.0);
              exp2f(0.0f);
              exp2l(0.0l);
              expm1(0.0);
              expm1f(0.0f);
              expm1l(0.0l);
              fdim(0.0, 0.0);
              fdimf(0.0f, 0.0f);
              fdiml(0.0l, 0.0l);
              fma(0.0, 0.0, 0.0);
              fmaf(0.0f, 0.0f, 0.0f);
              fmal(0.0l, 0.0l, 0.0l);
              fmax(0.0, 0.0);
              fmaxf(0.0f, 0.0f);
              fmaxl(0.0l, 0.0l);
              fmin(0.0, 0.0);
              fminf(0.0f, 0.0f);
              fminl(0.0l, 0.0l);
              hypot(0.0, 0.0);
              hypotf(0.0f, 0.0f);
              hypotl(0.0l, 0.0l);
              ilogb(0.0);
              ilogbf(0.0f);
              ilogbl(0.0l);
              lgamma(0.0);
              lgammaf(0.0f);
              lgammal(0.0l);
              llrint(0.0);
              llrintf(0.0f);
              llrintl(0.0l);
              llround(0.0);
              llroundf(0.0f);
              llroundl(0.0l);
              log1p(0.0);
              log1pf(0.0f);
              log1pl(0.0l);
              log2(0.0);
              log2f(0.0f);
              log2l(0.0l);
              logb(0.0);
              logbf(0.0f);
              logbl(0.0l);
              lrint(0.0);
              lrintf(0.0f);
              lrintl(0.0l);
              lround(0.0);
              lroundf(0.0f);
              lroundl(0.0l);
              nan(0);
              nanf(0);
              nanl(0);
              nearbyint(0.0);
              nearbyintf(0.0f);
              nearbyintl(0.0l);
              nextafter(0.0, 0.0);
              nextafterf(0.0f, 0.0f);
              nextafterl(0.0l, 0.0l);
              nexttoward(0.0, 0.0);
              nexttowardf(0.0f, 0.0f);
              nexttowardl(0.0l, 0.0l);
              remainder(0.0, 0.0);
              remainderf(0.0f, 0.0f);
              remainderl(0.0l, 0.0l);
              remquo(0.0, 0.0, 0);
              remquof(0.0f, 0.0f, 0);
              remquol(0.0l, 0.0l, 0);
              rint(0.0);
              rintf(0.0f);
              rintl(0.0l);
              round(0.0);
              roundf(0.0f);
              roundl(0.0l);
              scalbln(0.0, 0l);
              scalblnf(0.0f, 0l);
              scalblnl(0.0l, 0l);
              scalbn(0.0, 0);
              scalbnf(0.0f, 0);
              scalbnl(0.0l, 0);
              tgamma(0.0);
              tgammaf(0.0f);
              tgammal(0.0l);
              trunc(0.0);
              truncf(0.0f);
              truncl(0.0l);
              return 0;
    }