On 7/26/2015 10:34 AM, Andrey Semashev wrote:
On 26.07.2015 17:20, Edward Diener wrote:
On 7/25/2015 2:48 AM, Matt Calabrese wrote:
On Fri, Jul 24, 2015 at 7:41 PM, Edward Diener
wrote: pointing to the line after it encounters 'struct size_t' as far as I can make out ( you need to preprocess the size_t.cpp test, comment out the #line directives and run the test against the preprocessed result to see what the compiler is objecting to ). It therefore fails a number of mpl tests which all prior versions of VC++ pass.
It flags this error in 5 mpl tests which use the boost::mpl::size_t integral wrapper, among which the easiest to analyze is the size_t.cpp test itself.
Anybody have any idea what is going on here with the compiler, or whether it can be fixed somehow in VC++14 for the mpl code ?
I don't have the compiler, but my guess is it's probably actually confused on the line:
typedef size_t type;
A simple workaround to try could be to change the typedef to:
typedef mpl::size_t<N> type;
If that fix works, I'd be surprised if such a change would break any other compilers. This is all just a guess, though.
My latest investigation, using the mpl::size_t code directly in a test, shows that:
// size_t_bug.cpp
#include <cstddef> namespace boost { namespace mpl { struct integral_c_tag { static const int value = 0; }; template< std::size_t N > struct size_t { static const std::size_t value = N; typedef size_t type; typedef std::size_t value_type; typedef integral_c_tag tag; typedef boost::mpl::size_t< static_caststd::size_t((value + 1)) > next; typedef boost::mpl::size_t< static_caststd::size_t((value - 1)) > prior; operator std::size_t() const { return static_caststd::size_t(this->value); } }; template< std::size_t N > std::size_t const boost::mpl::size_t< N >::value; }}
#include
int main() { return 0; } using namespace boost; using namespace mpl; fails under VC++14 with:
size_t_bug.cpp(26): error C2872: 'size_t': ambiguous symbol predefined C++ types (compiler internal)(16): note: could be 'unsigned int size_t' size_t_bug.cpp(6): note: or 'boost::mpl::size_t'
but if I comment out the include of lightweight test or if I comment out the using directive, the source compiles without error. How using directives which occur after all code can affect the compilation is beyond me.
Anybody who would like to pitch in and try to determine what is causing VC++14 to fail with the above code, which is essentially why it is failing with the MPL tests involving boost::mpl::size_t, please feel free to do so.
Needless to say VC++12 and below, as well as gcc and clang, compile the test without error.
This is obviously a compiler bug. Could you report it to MS Connect?
If you're still interested in experimenting, you could try reducing it further by, e.g. replacing lightweight_test.hpp with bits of code from it, starting from just header includes from lightweight_test.hpp.
Exactly what I intended to do. My experience with MS Connect is that unless I can reduce code to something which does not include any non-VC++ or non-Windows header they cannot figure out anything or take the bug report seriously.