2017-05-28 18:35 GMT+03:00 Vadim Zhukov <persg...@gmail.com>: > 2017-05-28 18:16 GMT+03:00 Ted Unangst <t...@tedunangst.com>: >> Vadim Zhukov wrote: >>> While working on getting Boost & its friends work under Clang, >>> I've stumbled upon the code that looks like the following: >>> >>> decltype(x, y) z = w; >> >> why not espie's fix from earlier? > > Because I've missed it. :( I have no idea why espie@ did it this way, > though... > > And what's more interesting we shouldn't get into this code when > compiling with Clang. This should happen only for old GCCs. See the > program: > > #define _LIBCPP_HAS_NO_DECLTYPE > #include <vector> > int main() { > int x; > double y; > decltype(x, y) z = y; > } > > If you comment out the first line, it compiles fine under Clang. So > basically the problem only raises when the program being compiled > plays dirty games with _GNU_VER or something like that...
Ah, now I've got it: it's compiling without -std=c++11 which triggers error. I.e., when run: clang++ x.cpp -o x you'll get error with current __config, and won't with patched. And this is how we compile boost - without c++11. And it's likely will be a pain and ever likely break stuff, if we'll switch boost to c++11 mode, since we'll have to switch all software depending on boost, either directly or indirectly (that's a really big number!), to eg++ on non-clang archs... >> but clang++ has variadic macros, like C99... the following patch allows >> macro decltype() to work a lot more like builtin __decltype in pre-C++11 >> >> (note that still works with -std=c++98 -pedantic, much to my surprise, but >> which is cool) >> >> Index: __config >> =================================================================== >> RCS file: /cvs/src/lib/libcxx/include/__config,v >> retrieving revision 1.3 >> diff -u -p -r1.3 __config >> --- __config 19 Sep 2016 22:17:22 -0000 1.3 >> +++ __config 5 May 2017 15:21:58 -0000 >> @@ -670,7 +670,7 @@ template <unsigned> struct __static_asse >> #ifdef _LIBCPP_HAS_NO_DECLTYPE >> // GCC 4.6 provides __decltype in all standard modes. >> #if !__is_identifier(__decltype) || _GNUC_VER >= 406 >> -# define decltype(__x) __decltype(__x) >> +# define decltype(__x, ...) __decltype(__x, ##__VA_ARGS__) >> #else >> # define decltype(__x) __typeof__(__x) >> #endif >> > > -- > WBR, > Vadim Zhukov -- WBR, Vadim Zhukov