Open llvmbot opened 6 years ago
I think this is a bug or peculiarity of the Visual C++ debug iterator implementation, and not something clang is doing anything about. If I compile that program with MSVC, this is what I get:
$ cl -MDd -c t.cpp Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25508.2 for x64 Copyright (C) Microsoft Corporation. All rights reserved.
t.cpp
C:/PROGRA~2/MICROS~1/2017/PROFES~1/VC/Tools/MSVC/14.11.25503/include\vector(555): error C2664: 'fuzzer_allocator
Extended Description
clang-cl.exe fails to compile std::vector with a custom allocator when /MDd is provided as an argument. The issue seems to be triggered by the _DEBUG define.
Code sample to reproduce the issue:
include
template
class fuzzer_allocator: public std::allocator {
public:
template
struct rebind { typedef fuzzer_allocator other; };
};
int some_func() {
std::vector<int, fuzzer_allocator> v;
return v.size();
}
"clang-cl.exe /MDd repro.cc" gives the following output:
In file included from .\repro.cc:2: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\vector(555,12): error: no matching constructor for initialization of 'std::_Vector_alloc<std::_Vec_base_types<int, (anonymous namespace)::fuzzer_allocator > >::_Alproxy' (aka '(anonymous namespace)::fuzzer_allocator')
_Alproxy _Proxy_allocator(_Getal());
^ > >::_Free_proxy' requested here
_Free_proxy();
^
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\vector(683,2): note: in instantiation of member function 'std::_Vector_alloc<std::_Vec_base_types<int,
(anonymous namespace)::fuzzer_allocator > >::~_Vector_alloc' requested here
vector() _NOEXCEPT_COND(is_nothrow_default_constructible<_Alty>::value)
^
.\repro.cc(15,43): note: in instantiation of member function 'std::vector<int, (anonymous namespace)::fuzzer_allocator >::vector' requested here
std::vector<int, fuzzer_allocator> v;
^
.\repro.cc(7,9): note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'fuzzer_allocator' to 'const fuzzer_allocator' for 1st argument
class fuzzer_allocator: public std::allocator {
^
.\repro.cc(7,9): note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'fuzzer_allocator' to 'fuzzer_allocator' for 1st argument
.\repro.cc(7,9): note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided
~~~~ C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\vector(506,3): note: in instantiation of member function 'std::_Vector_alloc<std::_Vec_base_types<int, (anonymous namespace)::fuzzer_allocatorThe same code compiles fine when /MDd is not provided.
OS version: Windows 10 Enterprise 1607 MSVC C++ version: 14.11.25503 clang version 6.0.0 (trunk 318667)