-
-
Notifications
You must be signed in to change notification settings - Fork 80
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
unique_span assignement operator bug with C++20. #660
Comments
Well, I do compile an example program with C++20, and C++23 even... can you provide a program which fails, and the compiler/platform on which it fails? Still, I don't mind the change. |
Thanks for you reply ! Sure, the following code: #include <cuda/api.hpp>
int main() {
cuda::memory::host::unique_span<float> data1(nullptr, 0);
cuda::memory::host::unique_span<float> data2(nullptr, 0);
data1 = std::move(data2);
} with gcc 11, it produce this: In file included from /home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api/memory.hpp:36,
from /home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api/texture_view.hpp:14,
from /home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api.hpp:22,
from /home/jbernard/workspace/other/cuda-api-wrappers/examples/modified_cuda_samples/vectorAdd/vectorAdd.cpp:1:
/home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api/detail/unique_span.hpp: In instantiation of ‘cuda::unique_span<T, Deleter>& cuda::unique_span<T, Deleter>::operator=(cuda::unique_span<T, Deleter>&&) [with T = float; Deleter = cuda::memory::host::detail_::deleter]’:
/home/jbernard/workspace/other/cuda-api-wrappers/examples/modified_cuda_samples/vectorAdd/vectorAdd.cpp:7:25: required from here
/home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api/detail/unique_span.hpp:109:21: error: lvalue required as left operand of assignment
109 | data() = released.data();
| ~~~~^~
/home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api/detail/unique_span.hpp:110:21: error: lvalue required as left operand of assignment
110 | size() = released.size();
| ~~~~^~
/home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api/detail/unique_span.hpp:111:9: warning: no return statement in function returning non-void [-Wreturn-type]
110 | size() = released.size();
+++ |+ return *this;
111 | }
| ^ And with nvcc 12, it produces: /home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api/detail/unique_span.hpp(109): error: expression must be a modifiable lvalue
data() = released.data();
^
detected during instantiation of "cuda::unique_span<T, Deleter> &cuda::unique_span<T, Deleter>::operator=(cuda::unique_span<T, Deleter> &&) [with T=float, Deleter=cuda::memory::host::detail_::deleter]" at line 7 of /home/jbernard/workspace/other/cuda-api-wrappers/examples/modified_cuda_samples/vectorAdd/vectorAdd.cu
/home/jbernard/workspace/other/cuda-api-wrappers/src/cuda/api/detail/unique_span.hpp(110): error: expression must be a modifiable lvalue
size() = released.size();
^
detected during instantiation of "cuda::unique_span<T, Deleter> &cuda::unique_span<T, Deleter>::operator=(cuda::unique_span<T, Deleter> &&) [with T=float, Deleter=cuda::memory::host::detail_::deleter]" at line 7 of /home/jbernard/workspace/other/cuda-api-wrappers/examples/modified_cuda_samples/vectorAdd/vectorAdd.cu I forgot to mention the missing |
Hmm... I guess the compiler didn't complain about the unique_span because it doesn't get explicitly instantiated in any of the headers. |
I aught to pre-release a beta of 0.7.1 soon, I think. |
Yes, C++ template type's members are implicitly instantiated when used. Cheers |
The bug is only closed when the commit lands on the master branch (i.e. in a release)... in the mean time I mark it as resolved-on-development. Anyway, thanks for your kind words and this report. The best support I get is when people file issues or comment on questions/discussions; or use the library in a publicly-available project and mention it somewhere in the README/documentation. |
Does this bug impact the non-operator move constructor as well? I see that the move ctr just constructs from Asking cuz I seem to be unable to move |
Hi,
I notice that
cuda::unique_span
does not compile with C++20 (and I suppose it is also the case with older standards too)The issue comes from the move assignment operator:
std::span
data
&size
returns values, not references thus it is not possible to reassign them. I think what you did in the destructor is the correct approach.Thanks a lot for all the efforts you put in this project.
The text was updated successfully, but these errors were encountered: