Skip to content

Commit b16efa6

Browse files
authored
[mlir][python] Fix PyObjectRef copy/move assignment for MSVC (llvm#186758)
PyObjectRef has a user-declared move constructor but no explicit copy/move assignment operators. On at least some version of MSVC, instantiation of operator= is forced, causing a compile error: ``` In file included from mlir/lib/Bindings/Python/Globals.cpp:9: In file included from mlir/include/mlir/Bindings/Python/IRCore.h:16: <MSVC>/include/vector(1461,27): error: object of type 'value_type' (aka 'mlir::python::mlir::PyDiagnostic::DiagnosticInfo') cannot be assigned because its copy assignment operator is implicitly deleted 1461 | *_Mid = *_First; | ^ <MSVC>/include/vector(1539,9): note: in instantiation of function template specialization 'std::vector<mlir::python::mlir::PyDiagnostic::DiagnosticInfo>::_Assign_counted_range<mlir::python::mlir::PyDiagnostic::DiagnosticInfo *>' requested here 1539 | _Assign_counted_range(_Right_data._Myfirst, static_cast<size_type>(_Right_data._Mylast - _Right_data._Myfirst)); | ^ mlir/include/mlir/Bindings/Python/IRCore.h(1317,33): note: in instantiation of member function 'std::vector<mlir::python::mlir::PyDiagnostic::DiagnosticInfo>::operator=' requested here 1317 | struct MLIR_PYTHON_API_EXPORTED MLIRError { | ^ mlir/include/mlir/Bindings/Python/IRCore.h(369,16): note: copy assignment operator of 'DiagnosticInfo' is implicitly deleted because field 'location' has a deleted copy assignment operator 369 | PyLocation location; | ^ mlir/include/mlir/Bindings/Python/IRCore.h(304,45): note: copy assignment operator of 'PyLocation' is implicitly deleted because base class 'BaseContextObject' has a deleted copy assignment operator 304 | class MLIR_PYTHON_API_EXPORTED PyLocation : public BaseContextObject { | ^ mlir/include/mlir/Bindings/Python/IRCore.h(300,20): note: copy assignment operator of 'BaseContextObject' is implicitly deleted because field 'contextRef' has a deleted copy assignment operator 300 | PyMlirContextRef contextRef; | ^ mlir/include/mlir/Bindings/Python/IRCore.h(73,3): note: copy assignment operator is implicitly deleted because 'PyObjectRef<mlir::python::mlir::PyMlirContext>' has a user-declared move constructor 73 | PyObjectRef(PyObjectRef &&other) noexcept | ^ 1 error generated. ``` Encountered on this env: ``` Compiler: clang-cl 20.1.8 STL: MSVC 14.44.35207 (Visual Studio 2022 Enterprise) Runner: windows-2022 (GitHub Actions) ```
1 parent 7bda811 commit b16efa6

1 file changed

Lines changed: 12 additions & 0 deletions

File tree

  • mlir/include/mlir/Bindings/Python

mlir/include/mlir/Bindings/Python/IRCore.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ class MLIR_PYTHON_API_EXPORTED PyObjectRef {
7878
}
7979
PyObjectRef(const PyObjectRef &other)
8080
: referrent(other.referrent), object(other.object /* copies */) {}
81+
PyObjectRef &operator=(const PyObjectRef &other) {
82+
referrent = other.referrent;
83+
object = other.object;
84+
return *this;
85+
}
86+
PyObjectRef &operator=(PyObjectRef &&other) noexcept {
87+
referrent = other.referrent;
88+
object = std::move(other.object);
89+
other.referrent = nullptr;
90+
assert(!other.object);
91+
return *this;
92+
}
8193
~PyObjectRef() = default;
8294

8395
int getRefCount() {

0 commit comments

Comments
 (0)