Closed
Description
Recall
class DialectRegistry {
...
private:
llvm::MapVector<TypeID, std::unique_ptr<DialectExtensionBase>> extensions;
}
then
template <typename T> void wrap_copy(void *dst, const void *src) {
new ((T *) dst) T(*(const T *) src);
}
foo() {
(void)wrap_copy<mlir::DialectRegistry>;
}
will produce
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_algobase.h:385:18: error: object of type 'std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>>' cannot be assigned because its copy assignment operator is implicitly deleted
385 | *__result = *__first;
| ^
on
(eudsl) mlevental@Shark17:~/dev_projects/eudsl/projects/eudsl-py/src$ clang-20 --version
Ubuntu clang version 20.0.0 (++20241108053735+b613a54075c6-1~exp1~20241108053914.2037)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-20/bin
The copy offending copy comes from SmallVectorImpl::operator=(const SmallVectorImpl<T> &RHS)
:
llvm-project/llvm/include/llvm/ADT/SmallVector.h
Line 1017 in 9d85ba5
I don't know what the correct solution is (should SmallVector
be smarter?) but doing
DialectRegistry(const DialectRegistry&) = delete;
fixes (in the sense that wrap_copy
reports a call to a deleted ctor, and/or std::is_copy_constructible<mlir::DialectRegistry>::value == false
).
Full compile error stack follows.
In file included from /home/mlevental/dev_projects/eudsl/projects/eudsl-py/src/eudsl_ext.cpp:1:
In file included from /home/mlevental/miniconda3/envs/eudsl/lib/python3.11/site-packages/nanobind/include/nanobind/nanobind.h:32:
In file included from /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/stdexcept:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string:53:
In file included from /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_string.h:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ext/alloc_traits.h:34:
In file included from /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/alloc_traits.h:33:
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_construct.h:119:25: error: call to implicitly-deleted copy constructor of 'std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>>'
119 | ::new((void*)__p) _Tp(std::forward<_Args>(__args)...);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_uninitialized.h:120:11: note: in instantiation of function template specialization 'std::_Construct<std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>>, const std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> &>' requested here
120 | std::_Construct(std::__addressof(*__cur), *__first);
| ^
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_uninitialized.h:137:16: note: in instantiation of function template specialization 'std::__do_uninit_copy<const std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> *, std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> *>' requested here
137 | { return std::__do_uninit_copy(__first, __last, __result); }
| ^
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_uninitialized.h:185:2: note: in instantiation of function template specialization 'std::__uninitialized_copy<false>::__uninit_copy<const std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> *, std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> *>' requested here
185 | __uninit_copy(__first, __last, __result);
| ^
/home/mlevental/dev_projects/eudsl/llvm-install/include/llvm/ADT/SmallVector.h:356:10: note: in instantiation of function template specialization 'std::uninitialized_copy<const std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> *, std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> *>' requested here
356 | std::uninitialized_copy(I, E, Dest);
| ^
/home/mlevental/dev_projects/eudsl/llvm-install/include/llvm/ADT/SmallVector.h:1043:9: note: in instantiation of function template specialization 'llvm::SmallVectorTemplateBase<std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>>>::uninitialized_copy<const std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> *, std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>> *>' requested here
1043 | this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
| ^
/home/mlevental/dev_projects/eudsl/llvm-install/include/llvm/ADT/SmallVector.h:1238:27: note: in instantiation of member function 'llvm::SmallVectorImpl<std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>>>::operator=' requested here
1238 | SmallVectorImpl<T>::operator=(RHS);
| ^
/home/mlevental/dev_projects/eudsl/llvm-install/include/llvm/ADT/MapVector.h:36:7: note: in instantiation of member function 'llvm::SmallVector<std::pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>>, 0>::SmallVector' requested here
36 | class MapVector {
| ^
/home/mlevental/dev_projects/eudsl/projects/eudsl-py/src/eudsl_ext.cpp:282:9: note: in instantiation of function template specialization 'wrap_copy<mlir::DialectRegistry>' requested here
282 | (void)wrap_copy<mlir::DialectRegistry>;
| ^
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_pair.h:195:17: note: explicitly defaulted function was implicitly deleted here
195 | constexpr pair(const pair&) = default; ///< Copy constructor
| ^
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/stl_pair.h:192:11: note: copy constructor of 'pair<mlir::TypeID, std::unique_ptr<mlir::DialectExtensionBase>>' is implicitly deleted because field 'second' has a deleted copy constructor
192 | _T2 second; ///< The second member
| ^
/usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/unique_ptr.h:514:7: note: 'unique_ptr' has been explicitly marked deleted here
514 | unique_ptr(const unique_ptr&) = delete;