public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/105644] New: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805
@ 2022-05-18 9:15 namniav at gmail dot com
2022-05-18 13:18 ` [Bug c++/105644] " marxin at gcc dot gnu.org
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: namniav at gmail dot com @ 2022-05-18 9:15 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105644
Bug ID: 105644
Summary: ICE in a fold expression with a requires expression:
in iterative_hash_template_arg, at cp/pt.cc:1805
Product: gcc
Version: 12.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: namniav at gmail dot com
Target Milestone: ---
https://godbolt.org/z/8qehadhbT
============
#include <concepts>
#include <type_traits>
#include <utility>
#include <tuple>
template<class T>
concept tuple_like =
[] <std::size_t...I> (std::index_sequence<I...>) {
return ((requires(T t) {
{ get<I>(t) } ->
std::convertible_to<std::tuple_element_t<I, T>&>;
}) && ...);
} (std::make_index_sequence<std::tuple_size_v<T>>{});
static_assert(tuple_like<std::tuple<int>>);
============
Both 12.1 and current trunk version on godbolt.org crashed.
There's no issue if `std::tuple_element_t<I, T>&` is replaced with `int&`.
Compiler output:
<source>: In instantiation of '<lambda(std::index_sequence<I ...>)> [with long
unsigned int ...I = {0}; std::index_sequence<I ...> =
std::integer_sequence<long unsigned int, 0>]':
<source>:13:7: required from here
<source>:11:23: internal compiler error: in iterative_hash_template_arg, at
cp/pt.cc:1805
11 | { get<I>(t) } ->
std::convertible_to<std::tuple_element_t<I, T>&>;
|
~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0x2204919 internal_error(char const*, ...)
???:0
0x744dd3 fancy_abort(char const*, int, char const*)
???:0
0x99a843 iterative_hash_template_arg(tree_node*, unsigned int)
???:0
0x7da898 sat_hasher::hash(sat_entry*)
???:0
0x7d52c7 satisfaction_cache::satisfaction_cache(tree_node*, tree_node*,
sat_info)
???:0
0x7d9c2a constraints_satisfied_p(tree_node*, tree_node*)
???:0
0x9b3ffe do_auto_deduction(tree_node*, tree_node*, tree_node*, int,
auto_deduction_context, tree_node*, int)
???:0
0x7d7ce2 tsubst_requires_expr(tree_node*, tree_node*, int, tree_node*)
???:0
0x9dd888 tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*)
???:0
0x9c8517 instantiate_decl(tree_node*, bool, bool)
???:0
0x864c7e maybe_instantiate_decl(tree_node*)
???:0
0x866758 mark_used(tree_node*, int)
???:0
0x77a52b build_op_call(tree_node*, vec<tree_node*, va_gc, vl_embed>**, int)
???:0
0xa31a87 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
???:0
0x7d9c88 evaluate_concept_check(tree_node*)
???:0
0x7c50ec maybe_constant_value(tree_node*, tree_node*, bool)
???:0
0xa3dafd finish_static_assert(tree_node*, tree_node*, unsigned int, bool, bool)
???:0
0x98c15d c_parse_file()
???:0
0xb20141 c_common_parse_file()
???:0
```
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105644] ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805
2022-05-18 9:15 [Bug c++/105644] New: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805 namniav at gmail dot com
@ 2022-05-18 13:18 ` marxin at gcc dot gnu.org
2022-10-27 8:04 ` marxin at gcc dot gnu.org
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: marxin at gcc dot gnu.org @ 2022-05-18 13:18 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105644
Martin Liška <marxin at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Status|UNCONFIRMED |NEW
Last reconfirmed| |2022-05-18
CC| |marxin at gcc dot gnu.org,
| |ppalka at gcc dot gnu.org
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105644] ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805
2022-05-18 9:15 [Bug c++/105644] New: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805 namniav at gmail dot com
2022-05-18 13:18 ` [Bug c++/105644] " marxin at gcc dot gnu.org
@ 2022-10-27 8:04 ` marxin at gcc dot gnu.org
2023-03-30 16:22 ` ppalka at gcc dot gnu.org
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: marxin at gcc dot gnu.org @ 2022-10-27 8:04 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105644
--- Comment #1 from Martin Liška <marxin at gcc dot gnu.org> ---
The original code is valid (accepted) by clang. But it's hard to reduce it as
clang++ does not accept's gcc's -E output and vice versa :/
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105644] ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805
2022-05-18 9:15 [Bug c++/105644] New: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805 namniav at gmail dot com
2022-05-18 13:18 ` [Bug c++/105644] " marxin at gcc dot gnu.org
2022-10-27 8:04 ` marxin at gcc dot gnu.org
@ 2023-03-30 16:22 ` ppalka at gcc dot gnu.org
2023-08-11 0:19 ` namniav at gmail dot com
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: ppalka at gcc dot gnu.org @ 2023-03-30 16:22 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105644
Patrick Palka <ppalka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |ppalka at gcc dot gnu.org
Status|NEW |ASSIGNED
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105644] ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805
2022-05-18 9:15 [Bug c++/105644] New: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805 namniav at gmail dot com
` (2 preceding siblings ...)
2023-03-30 16:22 ` ppalka at gcc dot gnu.org
@ 2023-08-11 0:19 ` namniav at gmail dot com
2023-08-15 17:54 ` ppalka at gcc dot gnu.org
2024-05-13 18:26 ` mpolacek at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: namniav at gmail dot com @ 2023-08-11 0:19 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105644
--- Comment #2 from Namniav <namniav at gmail dot com> ---
Now Clang also crashes on the original
example(https://github.com/llvm/llvm-project/issues/64607), although its cause
may be different to GCC's.
I can't remember why I used `get` instead of `std::get` in original code
because I didn't really know how ADL finds function templates. The issue still
exists with `std::get`.
Here is a modified and GCC-only reduced version:
https://godbolt.org/z/MMYMrGE3z
```c++
template<typename T, int I>
concept C = (sizeof(I) + sizeof(T) > 0);
template<typename T, int...I>
constexpr bool check() {
return ((requires(T t) {
{ (I, t) } -> C<I>;
}) && ...);
}
template<class T>
concept tuple_like = check<T, 0>();
static_assert(tuple_like<int>);
```
Noted that GCC doesn't consider using `I` in `-> C<I>` as using a parameter
pack, I have to use it in comma expression `(I, t)` to get a fold expression,
otherwise GCC complains "operand of fold expression has no unexpanded parameter
packs". I suspect that GCC has problem with such case. It some how explains,
for GCC only, why replacing `std::tuple_element_t<I, T>&` with `int&` "fixes"
the issue.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105644] ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805
2022-05-18 9:15 [Bug c++/105644] New: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805 namniav at gmail dot com
` (3 preceding siblings ...)
2023-08-11 0:19 ` namniav at gmail dot com
@ 2023-08-15 17:54 ` ppalka at gcc dot gnu.org
2024-05-13 18:26 ` mpolacek at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: ppalka at gcc dot gnu.org @ 2023-08-15 17:54 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105644
Patrick Palka <ppalka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords|needs-reduction |
--- Comment #3 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Thanks for the reduction. Fixing this GCC bug(s) proved to be tricky, but one
should be able to reliably work around it by avoiding using a requires-expr
directly inside a pack expansion or fold expression and use it indirectly
instead, e.g.
template<class T, int I>
concept foo = requires(T t) { { (I, t) } -> C<I>; };
template<typename T, int...I>
constexpr bool check() {
return (foo<T, I> && ...);
}
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105644] ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805
2022-05-18 9:15 [Bug c++/105644] New: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805 namniav at gmail dot com
` (4 preceding siblings ...)
2023-08-15 17:54 ` ppalka at gcc dot gnu.org
@ 2024-05-13 18:26 ` mpolacek at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-05-13 18:26 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105644
Marek Polacek <mpolacek at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |hlewin at gmx dot de
--- Comment #4 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
*** Bug 115075 has been marked as a duplicate of this bug. ***
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-05-13 18:26 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-18 9:15 [Bug c++/105644] New: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805 namniav at gmail dot com
2022-05-18 13:18 ` [Bug c++/105644] " marxin at gcc dot gnu.org
2022-10-27 8:04 ` marxin at gcc dot gnu.org
2023-03-30 16:22 ` ppalka at gcc dot gnu.org
2023-08-11 0:19 ` namniav at gmail dot com
2023-08-15 17:54 ` ppalka at gcc dot gnu.org
2024-05-13 18:26 ` mpolacek at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).