[ 
https://issues.apache.org/jira/browse/TS-1680?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

James Peach updated TS-1680:
----------------------------

    Fix Version/s: 3.3.3
    
> build system (and code) have inconsistent checking for C++11 (library) 
> features
> -------------------------------------------------------------------------------
>
>                 Key: TS-1680
>                 URL: https://issues.apache.org/jira/browse/TS-1680
>             Project: Traffic Server
>          Issue Type: Bug
>          Components: Build
>            Reporter: Igor Galić
>             Fix For: 3.3.3
>
>
> Compilers on different Operating systems can use different standard 
> libraries. Just knowing the compilers name and version, or the OS isn't 
> enough.
> This is beautifully examplified by our C++11 code in {{proxy/logstats.cc}}. 
> Despite the 30~ lines of code to do various checks this still doesn't work 
> with all combinations of compilers:
> {noformat}
> c++ -DHAVE_CONFIG_H -I. -I/home/igalic/src/asf/trafficserver/proxy 
> -I../lib/ts  -I/home/igalic/src/asf/trafficserver/iocore/eventsystem 
> -I/home/igalic/src/asf/trafficserver/iocore/net 
> -I/home/igalic/src/asf/trafficserver/iocore/aio 
> -I/home/igalic/src/asf/trafficserver/iocore/hostdb 
> -I/home/igalic/src/asf/trafficserver/iocore/cache 
> -I/home/igalic/src/asf/trafficserver/iocore/cluster 
> -I/home/igalic/src/asf/trafficserver/iocore/utils 
> -I/home/igalic/src/asf/trafficserver/iocore/dns 
> -I/home/igalic/src/asf/trafficserver/lib/records 
> -I/home/igalic/src/asf/trafficserver/lib/ts 
> -I/home/igalic/src/asf/trafficserver/proxy/http 
> -I/home/igalic/src/asf/trafficserver/proxy/logging 
> -I/home/igalic/src/asf/trafficserver/proxy/http/remap 
> -I/home/igalic/src/asf/trafficserver/proxy/hdrs 
> -I/home/igalic/src/asf/trafficserver/mgmt 
> -I/home/igalic/src/asf/trafficserver/mgmt/preparse 
> -I/home/igalic/src/asf/trafficserver/mgmt/utils 
> -I/home/igalic/src/asf/trafficserver/proxy/api/ts -I. -I./api/ts 
> -I/home/igalic/src/asf/trafficserver/lib -D_LARGEFILE64_SOURCE=1 
> -D_COMPILE64BIT_SOURCE=1 -D_GNU_SOURCE -D_REENTRANT -Dfreebsd -DDEBUG 
> -D_DEBUG -I/usr/local/include -I/usr/local/include/tcl8.5  -std=c++11 -ggdb3 
> -pipe -Wall -Werror -Wno-invalid-offsetof -MT logstats.o -MD -MP -MF 
> .deps/logstats.Tpo -c -o logstats.o 
> /home/igalic/src/asf/trafficserver/proxy/logstats.cc
> /home/igalic/src/asf/trafficserver/proxy/logstats.cc:79:12: error: no member 
> named 'hash' in namespace 'std'
> using std::hash;
>       ~~~~~^
> /home/igalic/src/asf/trafficserver/proxy/logstats.cc:364:48: error: no 
> template named 'hash'; did you mean '__gnu_cxx::hash'?
> typedef hash_map <const char *, OriginStats *, hash <const char *>, eqstr> 
> OriginStorage;
>                                                ^~~~
>                                                __gnu_cxx::hash
> /usr/include/c++/4.2/ext/hash_fun.h:71:12: note: '__gnu_cxx::hash' declared 
> here
>     struct hash { };
>            ^
> /home/igalic/src/asf/trafficserver/proxy/logstats.cc:365:33: error: no 
> template named 'hash'; did you mean '__gnu_cxx::hash'?
> typedef hash_set <const char *, hash <const char *>, eqstr> OriginSet;
>                                 ^~~~
>                                 __gnu_cxx::hash
> /usr/include/c++/4.2/ext/hash_fun.h:71:12: note: '__gnu_cxx::hash' declared 
> here
>     struct hash { };
>            ^
> /home/igalic/src/asf/trafficserver/proxy/logstats.cc:374:54: error: no 
> template named 'hash'; did you mean '__gnu_cxx::hash'?
>   typedef hash_map<const char *, LruStack::iterator, hash <const char *>, 
> eqstr> LruHash;
>                                                      ^~~~
>                                                      __gnu_cxx::hash
> /usr/include/c++/4.2/ext/hash_fun.h:71:12: note: '__gnu_cxx::hash' declared 
> here
>     struct hash { };
>            ^
> 4 errors generated.
> gmake: *** [logstats.o] Error 1
> {noformat}
> vs:
> {noformat}
> clang++ -DHAVE_CONFIG_H -I. -I/home/igalic/src/asf/trafficserver/proxy 
> -I../lib/ts  -I/home/igalic/src/asf/trafficserver/iocore/eventsystem 
> -I/home/igalic/src/asf/trafficserver/iocore/net 
> -I/home/igalic/src/asf/trafficserver/iocore/aio 
> -I/home/igalic/src/asf/trafficserver/iocore/hostdb 
> -I/home/igalic/src/asf/trafficserver/iocore/cache 
> -I/home/igalic/src/asf/trafficserver/iocore/cluster 
> -I/home/igalic/src/asf/trafficserver/iocore/utils 
> -I/home/igalic/src/asf/trafficserver/iocore/dns 
> -I/home/igalic/src/asf/trafficserver/lib/records 
> -I/home/igalic/src/asf/trafficserver/lib/ts 
> -I/home/igalic/src/asf/trafficserver/proxy/http 
> -I/home/igalic/src/asf/trafficserver/proxy/logging 
> -I/home/igalic/src/asf/trafficserver/proxy/http/remap 
> -I/home/igalic/src/asf/trafficserver/proxy/hdrs 
> -I/home/igalic/src/asf/trafficserver/mgmt 
> -I/home/igalic/src/asf/trafficserver/mgmt/preparse 
> -I/home/igalic/src/asf/trafficserver/mgmt/utils 
> -I/home/igalic/src/asf/trafficserver/proxy/api/ts -I. -I./api/ts 
> -I/home/igalic/src/asf/trafficserver/lib -D_LARGEFILE64_SOURCE=1 
> -D_COMPILE64BIT_SOURCE=1 -D_GNU_SOURCE -D_REENTRANT -Dfreebsd -DDEBUG 
> -D_DEBUG -I/usr/local/include -I/usr/local/include/tcl8.5  --stdlib=libc++ 
> -std=c++11 -ggdb3 -pipe -Wall -Werror -Qunused-arguments 
> -Wno-invalid-offsetof -MT logstats.o -MD -MP -MF .deps/logstats.Tpo -c -o 
> logstats.o /home/igalic/src/asf/trafficserver/proxy/logstats.cc
> In file included from /home/igalic/src/asf/trafficserver/proxy/logstats.cc:58:
> /usr/include/c++/v1/ext/hash_map:209:2: error: Use of the header 
> <ext/hash_map> is deprecated. Migrate to <unordered_map> [-Werror,-W#warnings]
> #warning Use of the header <ext/hash_map> is deprecated.  Migrate to 
> <unordered_map>
>  ^
> In file included from /home/igalic/src/asf/trafficserver/proxy/logstats.cc:59:
> /usr/include/c++/v1/ext/hash_set:202:2: error: Use of the header 
> <ext/hash_set> is deprecated. Migrate to <unordered_set> [-Werror,-W#warnings]
> #warning Use of the header <ext/hash_set> is deprecated.  Migrate to 
> <unordered_set>
>  ^
> 2 errors generated.
> gmake: *** [logstats.o] Error 1
> {noformat}
> (With --stdlib=libc++)
> An other example can be found in {{libc++11api}} itself (This error is 
> produced by running {{ci/regression}} on FreeBSD 10):
> {noformat}
> gmake[2]: Leaving directory `/tmp/org.apache.trafficserver.17293/obj/lib/wccp'
> Making all in cpp11api
> gmake[2]: Entering directory 
> `/tmp/org.apache.trafficserver.17293/obj/lib/cpp11api'
>   CXX      cpp11api.lo
> In file included from 
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:24:
> /home/igalic/src/asf/trafficserver/lib/cpp11api/ts-cpp11.h:56:14: error: no 
> type named 'function' in namespace 'std'
> typedef std::function<NextState(Transaction &)> GlobalHookCallback;
>         ~~~~~^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/ts-cpp11.h:56:22: error: 
> expected unqualified-id
> typedef std::function<NextState(Transaction &)> GlobalHookCallback;
>                      ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/ts-cpp11.h:61:33: error: 
> unknown type name 'GlobalHookCallback'
> void CreateGlobalHook(HookType, GlobalHookCallback);
>                                 ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/ts-cpp11.h:62:53: error: 
> unknown type name 'GlobalHookCallback'
> void CreateTransactionHook(Transaction &, HookType, GlobalHookCallback);
>                                                     ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:33:3: error: 
> unknown type name 'GlobalHookCallback'
>   GlobalHookCallback callback;
>   ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:115:36: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   inet_ntop(AF_INET, &s_sockaddr_in->sin_addr, res, INET_ADDRSTRLEN);
>                                    ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:111:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * s_sockaddr_in =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:432:57: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
>                                                         ^
> /usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
> #define ntohs(x)        __ntohs(x)
>                                 ^
> /usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
> #define __ntohs(x)      __bswap16(x)
>                                   ^
> /usr/include/x86/endian.h:74:37: note: expanded from macro '__bswap16'
>         ((__uint16_t)(__builtin_constant_p(x) ? \
>                                            ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:428:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * client_sockaddr =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:432:57: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
>                                                         ^
> /usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
> #define ntohs(x)        __ntohs(x)
>                                 ^
> /usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
> #define __ntohs(x)      __bswap16(x)
>                                   ^
> /usr/include/x86/endian.h:75:33: note: expanded from macro '__bswap16'
>             __bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
>                                        ^
> /usr/include/x86/endian.h:66:40: note: expanded from macro '__bswap16_gen'
> #define __bswap16_gen(x)        (__uint16_t)((x) << 8 | (x) >> 8)
>                                               ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:428:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * client_sockaddr =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:432:57: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
>                                                         ^
> /usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
> #define ntohs(x)        __ntohs(x)
>                                 ^
> /usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
> #define __ntohs(x)      __bswap16(x)
>                                   ^
> /usr/include/x86/endian.h:75:33: note: expanded from macro '__bswap16'
>             __bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
>                                        ^
> /usr/include/x86/endian.h:66:51: note: expanded from macro '__bswap16_gen'
> #define __bswap16_gen(x)        (__uint16_t)((x) << 8 | (x) >> 8)
>                                                          ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:428:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * client_sockaddr =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:432:57: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
>                                                         ^
> /usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
> #define ntohs(x)        __ntohs(x)
>                                 ^
> /usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
> #define __ntohs(x)      __bswap16(x)
>                                   ^
> /usr/include/x86/endian.h:75:53: note: expanded from macro '__bswap16'
>             __bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
>                                                            ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:428:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * client_sockaddr =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:444:57: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
>                                                         ^
> /usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
> #define ntohs(x)        __ntohs(x)
>                                 ^
> /usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
> #define __ntohs(x)      __bswap16(x)
>                                   ^
> /usr/include/x86/endian.h:74:37: note: expanded from macro '__bswap16'
>         ((__uint16_t)(__builtin_constant_p(x) ? \
>                                            ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:440:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * client_sockaddr =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:444:57: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
>                                                         ^
> /usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
> #define ntohs(x)        __ntohs(x)
>                                 ^
> /usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
> #define __ntohs(x)      __bswap16(x)
>                                   ^
> /usr/include/x86/endian.h:75:33: note: expanded from macro '__bswap16'
>             __bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
>                                        ^
> /usr/include/x86/endian.h:66:40: note: expanded from macro '__bswap16_gen'
> #define __bswap16_gen(x)        (__uint16_t)((x) << 8 | (x) >> 8)
>                                               ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:440:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * client_sockaddr =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:444:57: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
>                                                         ^
> /usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
> #define ntohs(x)        __ntohs(x)
>                                 ^
> /usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
> #define __ntohs(x)      __bswap16(x)
>                                   ^
> /usr/include/x86/endian.h:75:33: note: expanded from macro '__bswap16'
>             __bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
>                                        ^
> /usr/include/x86/endian.h:66:51: note: expanded from macro '__bswap16_gen'
> #define __bswap16_gen(x)        (__uint16_t)((x) << 8 | (x) >> 8)
>                                                          ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:440:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * client_sockaddr =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:444:57: error: 
> member access into incomplete type 'const struct sockaddr_in'
>   return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
>                                                         ^
> /usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
> #define ntohs(x)        __ntohs(x)
>                                 ^
> /usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
> #define __ntohs(x)      __bswap16(x)
>                                   ^
> /usr/include/x86/endian.h:75:53: note: expanded from macro '__bswap16'
>             __bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
>                                                            ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:440:16: note: 
> forward declaration of 'sockaddr_in'
>   const struct sockaddr_in * client_sockaddr =
>                ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:527:5: error: 
> unknown type name 'GlobalHookCallback'
>     GlobalHookCallback callback) {
>     ^
> /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:544:48: error: 
> unknown type name 'GlobalHookCallback'
> void ats::api::CreateGlobalHook(HookType hook, GlobalHookCallback callback) {
>                                                ^
> 16 errors generated.
> gmake[2]: *** [cpp11api.lo] Error 1
> gmake[2]: Leaving directory 
> `/tmp/org.apache.trafficserver.17293/obj/lib/cpp11api'
> gmake[1]: *** [all-recursive] Error 1
> gmake[1]: Leaving directory `/tmp/org.apache.trafficserver.17293/obj/lib'
> gmake: *** [all-recursive] Error 1
> {noformat}
> One simple way to check for {{libc++}} is demonstrated here:
> {noformat}
> #include <ciso646>
> #if defined( _LIBCPP_VERSION )
> using std::hash;
> #else
> #include <tr1/unordered_map>
> using std::tr1::hash;
> #endif
> {noformat}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to