Bug 102301 - make_from_tuple can not work with subrange
Summary: make_from_tuple can not work with subrange
Status: ASSIGNED
Alias: None
Product: gcc
Classification: Unclassified
Component: libstdc++ (show other bugs)
Version: 12.0
: P3 normal
Target Milestone: 10.5
Assignee: Jonathan Wakely
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-09-13 03:54 UTC by 康桓瑋
Modified: 2022-06-28 10:46 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2021-09-13 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description 康桓瑋 2021-09-13 03:54:25 UTC
I don't know if it is a bug, because the standard does not specify whether make_from_tuple can be applied to subrange even if it looks well-formed, so this may only be regarded as a feature request. 

Given that MSVC-STL already supports it, I think it should have some value.

#include <ranges>
#include <vector>

int main() {
  auto v = std::make_from_tuple<std::vector<int>>(std::ranges::subrange(std::views::iota(0, 5)));
}

https://godbolt.org/z/Ebx83z4s1
Comment 1 Andrew Pinski 2021-09-13 04:04:29 UTC
Even LLVM's libc++ does not support this ...
Comment 2 康桓瑋 2021-09-13 04:22:31 UTC
(In reply to Andrew Pinski from comment #1)
> Even LLVM's libc++ does not support this ...

I think you are right, but I want to know what libstdc++ thinks about this issue.
Comment 3 Jonathan Wakely 2021-09-13 09:24:26 UTC
(In reply to Andrew Pinski from comment #1)
> Even LLVM's libc++ does not support this ...

Does libc++ even define subrange yet?

It looks like we don't define the tuple_size and tuple_element specializations for subrange, probably because I didn't realise they were needed.
Comment 4 Jonathan Wakely 2021-09-13 09:28:03 UTC
Oh no, Patrick added them in r10-6508, and after PR 97512 it should work. Hmm.
Comment 5 康桓瑋 2021-09-13 10:16:27 UTC
(In reply to Jonathan Wakely from comment #4)
> Oh no, Patrick added them in r10-6508, and after PR 97512 it should work.
> Hmm.

I think it should not work because make_from_tuple uses std::get inside and is defined before using ranges::get, this will cause some namespace and ADL mechanisms to prevent it from being selected.
Comment 6 Jonathan Wakely 2021-09-13 10:18:01 UTC
Ugh, std::get is such a fragile and horrible API.
Comment 7 康桓瑋 2021-09-13 10:29:04 UTC
(In reply to Jonathan Wakely from comment #6)
> Ugh, std::get is such a fragile and horrible API.

Agreed, BTW PR 97512 was the first libstdc++ bug I reported, thank you for letting me back to the old days.
Comment 8 Jiang An 2022-04-06 03:07:04 UTC
I've submitted an LWG issue for this.

BTW, it's unfortunate that the standard library has both tuple-like and variant-like std::get overloads, and they are not clearly distinguished in the specification...
Comment 9 Jonathan Wakely 2022-04-13 07:20:39 UTC
https://cplusplus.github.io/LWG/issue3690
Comment 10 Jakub Jelinek 2022-06-28 10:46:21 UTC
GCC 10.4 is being released, retargeting bugs to GCC 10.5.