Quuxplusone / LLVMBugzillaTest

0 stars 0 forks source link

clang-cl /MDd fails to compile vector with a custom allocator #34456

Open Quuxplusone opened 6 years ago

Quuxplusone commented 6 years ago
Bugzilla Link PR35483
Status NEW
Importance P enhancement
Reported by Veranika Liaukevich (veronika.levkevich@gmail.com)
Reported on 2017-11-30 12:05:34 -0800
Last modified on 2017-12-20 16:12:13 -0800
Version trunk
Hardware PC other
CC llvm-bugs@lists.llvm.org, rnk@google.com
Fixed by commit(s)
Attachments
Blocks
Blocked by
See also
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 <vector>
template<typename T>
  class fuzzer_allocator: public std::allocator<T> {
    public:
      template<class Other>
      struct rebind { typedef fuzzer_allocator<Other> other;  };
  };
int some_func() {
  std::vector<int, fuzzer_allocator<int>> 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<int> > >::_Alproxy' (aka '(anonymous namespace)::fuzzer_allocator<std::_Container_proxy>')
                _Alproxy _Proxy_allocator(_Getal());
                         ^                ~~~~~~~~
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_allocator<int> > >::_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<int> > >::~_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<int> >::vector' requested here
  std::vector<int, fuzzer_allocator<int>> v;
                                          ^
.\repro.cc(7,9):  note: candidate constructor (the implicit copy constructor)
not viable: no known conversion from 'fuzzer_allocator<int>' to 'const
fuzzer_allocator<std::_Container_proxy>' for 1st argument
  class fuzzer_allocator: public std::allocator<T> {
        ^
.\repro.cc(7,9):  note: candidate constructor (the implicit move constructor)
not viable: no known conversion from 'fuzzer_allocator<int>' to
'fuzzer_allocator<std::_Container_proxy>' for 1st argument
.\repro.cc(7,9):  note: candidate constructor (the implicit default
constructor) not viable: requires 0 arguments, but 1 was provided
===================

The 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)
Quuxplusone commented 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<Other>::fuzzer_allocator(fuzzer_allocator<Other>
&&)': cannot convert argument 1 from 'fuzzer_allocator<int>' to 'const
fuzzer_allocator<Other> &'
        with
        [
            Other=std::_Container_proxy
        ]
C:/PROGRA~2/MICROS~1/2017/PROFES~1/VC/Tools/MSVC/14.11.25503/include\vector(555):
note: Reason: cannot convert from 'fuzzer_allocator<int>' to 'const
fuzzer_allocator<Other>'
        with
        [
            Other=std::_Container_proxy
        ]
C:/PROGRA~2/MICROS~1/2017/PROFES~1/VC/Tools/MSVC/14.11.25503/include\vector(555):
note: No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called
C:/PROGRA~2/MICROS~1/2017/PROFES~1/VC/Tools/MSVC/14.11.25503/include\vector(554):
note: while compiling class template member function 'void
std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>::_Free_proxy(void)'
        with
        [
            _Ty=int,
            _Alloc=fuzzer_allocator<int>
        ]
C:/PROGRA~2/MICROS~1/2017/PROFES~1/VC/Tools/MSVC/14.11.25503/include\vector(506):
note: see reference to function template instantiation 'void
std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>::_Free_proxy(void)' being
compiled
        with
        [
            _Ty=int,
            _Alloc=fuzzer_allocator<int>
        ]
C:/PROGRA~2/MICROS~1/2017/PROFES~1/VC/Tools/MSVC/14.11.25503/include\vector(660):
note: see reference to class template instantiation
'std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>' being compiled
        with
        [
            _Ty=int,
            _Alloc=fuzzer_allocator<int>
        ]
t.cpp(9): note: see reference to class template instantiation
'std::vector<int,fuzzer_allocator<int>>' being compiled