https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120185
Bug ID: 120185
Summary: [16 Regression] ncc-3.11 ICE since
r16-479-gabab79397ef97a in
type_has_converting_constructor
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: slyfox at gcc dot gnu.org
Target Milestone: ---
Today's gcc SIGSEGVs when compiling nss-3.11. Bisected down to
r16-479-gabab79397ef97a
commit abab79397ef97acf7c689c43e27d58d8d7d5c599
Author: Jason Merrill <[email protected]>
Date: Sat May 3 09:30:01 2025 -0400
c++: adjust PR99599/CWG2369 workaround
Mildly reduced example:
$ cat pk11_cbc_unittest.cc.cc
template <unsigned long...> struct IndexSequence {
using type = IndexSequence;
};
template <typename, unsigned long> struct DoubleSequence;
template <unsigned long... I, unsigned long sizeofT>
struct DoubleSequence<IndexSequence<I...>, sizeofT> {
using type = IndexSequence<1, sizeofT>;
};
template <int N>
struct MakeIndexSequenceImpl
: DoubleSequence<typename MakeIndexSequenceImpl<N / 2>::type, 2> {};
template <> struct MakeIndexSequenceImpl<0> : IndexSequence<> {};
template <long N>
using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::type;
template <int> struct Ignore {
Ignore(...);
};
template <typename> struct ElemFromListImpl;
template <unsigned long... I> struct ElemFromListImpl<IndexSequence<I...>> {
template <typename R> static void Apply(Ignore<I>..., R);
};
template <int N, typename... T> struct ElemFromList {
using type =
decltype(ElemFromListImpl<typename MakeIndexSequence<N>::type>::Apply(
static_cast<T *>(nullptr)...));
};
template <typename...> class FlatTuple;
template <typename, typename> struct FlatTupleBase;
template <unsigned long... Idx, typename... T>
struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>> {
template <long I> typename ElemFromList<I, T...>::type Get();
template <typename F> auto Apply() -> decltype(F(Get<Idx>()...));
};
template <typename... T>
struct FlatTuple
: FlatTupleBase<FlatTuple<T...>,
typename MakeIndexSequence<sizeof...(T)>::type> {};
template <typename... Ts> struct ValueArray {
FlatTuple<Ts...> v_;
};
void gtest_EncryptDecryptPkcs11CbcPadTest_EvalGenerateName_() {
ValueArray<long, long, long> __trans_tmp_1;
}
Crashing:
gcc/xg++ -B gcc -c -O0 -std=c++11 -c pk11_cbc_unittest.cc.cc
pk11_cbc_unittest.cc.cc: In instantiation of ‘struct ElemFromList<2, long int,
long int, long int>’:
pk11_cbc_unittest.cc.cc:31:58: required by substitution of ‘template<long int
I> typename ElemFromList<I, long int, long int, long int>::type
FlatTupleBase<FlatTuple<long int, long int, long int>, IndexSequence<1, 2>
>::Get() [with long int I = 2]’
31 | template <long I> typename ElemFromList<I, T...>::type Get();
| ^~~
pk11_cbc_unittest.cc.cc:32:60: required from ‘struct
FlatTupleBase<FlatTuple<long int, long int, long int>, IndexSequence<1, 2> >’
32 | template <typename F> auto Apply() -> decltype(F(Get<Idx>()...));
| ~~~~~~~~^~
pk11_cbc_unittest.cc.cc:35:8: required from ‘struct FlatTuple<long int, long
int, long int>’
35 | struct FlatTuple
| ^~~~~~~~~
pk11_cbc_unittest.cc.cc:39:20: required from ‘struct ValueArray<long int,
long int, long int>’
39 | FlatTuple<Ts...> v_;
| ^~
pk11_cbc_unittest.cc.cc:42:32: required from here
42 | ValueArray<long, long, long> __trans_tmp_1;
| ^~~~~~~~~~~~~
pk11_cbc_unittest.cc.cc:24:76: internal compiler error: Segmentation fault
24 | decltype(ElemFromListImpl<typename
MakeIndexSequence<N>::type>::Apply(
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
25 | static_cast<T *>(nullptr)...));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0x294b485 diagnostic_context::diagnostic_impl(rich_location*,
diagnostic_metadata const*, diagnostic_option_id, char const*, __va_list_tag
(*) [1], diagnostic_t)
???:0
0x2963a35 internal_error(char const*, ...)
???:0
0x12f95b7 crash_signal(int)
???:0
0x85e85c type_has_converting_constructor(tree_node*)
???:0
0xabe076 check_non_deducible_conversions(tree_node*, tree_node* const*,
unsigned int, tree_node*, unification_kind_t, int, conversion**, bool, bool)
???:0
0xb23e5e fn_type_unification(tree_node*, tree_node*, tree_node*, tree_node*
const*, unsigned int, tree_node*, unification_kind_t, int, conversion**, bool,
bool)
???:0
0x83f9c7 add_template_candidate_real(z_candidate**, tree_node*, tree_node*,
tree_node*, tree_node*, vec<tree_node*, va_gc, vl_embed> const*, tree_node*,
tree_node*, tree_node*, int, tree_node*, unification_kind_t, bool, int)
???:0
0x841301 add_candidates(tree_node*, tree_node*, vec<tree_node*, va_gc,
vl_embed> const*, tree_node*, tree_node*, bool, tree_node*, tree_node*, int,
z_candidate**, int)
???:0
0x82e692 build_new_method_call(tree_node*, tree_node*, vec<tree_node*, va_gc,
vl_embed>**, tree_node*, int, tree_node**, int)
???:0
0xb59202 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
???:0
0xaeba38 tsubst_expr(tree_node*, tree_node*, int, tree_node*)
???:0
0xae582b tsubst(tree_node*, tree_node*, int, tree_node*)
???:0
0xafb86b tsubst_decl(tree_node*, tree_node*, int, bool)
???:0
0xae2aee tsubst(tree_node*, tree_node*, int, tree_node*)
???:0
0xb2b282 instantiate_class_template(tree_node*)
???:0
0xb9b7b7 complete_type(tree_node*)
???:0
0xb9ba7f complete_type_or_maybe_complain(tree_node*, tree_node*, int)
???:0
0xae53c5 tsubst(tree_node*, tree_node*, int, tree_node*)
???:0
0xb02412 tsubst_function_type(tree_node*, tree_node*, int, tree_node*)
???:0
0xae31c1 tsubst(tree_node*, tree_node*, int, tree_node*)
???:0
gcc/xg++ -B gcc -v
Reading specs from gcc/specs
COLLECT_GCC=gcc/xg++
COLLECT_LTO_WRAPPER=gcc/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /home/slyfox/dev/git/gcc/configure --disable-multilib
--disable-bootstrap --disable-lto --disable-libsanitizer
--disable-libstdcxx-pch --enable-languages=c,c++ --disable-libgomp
--disable-libquadmath --disable-libvtv CFLAGS='-O1 -g0' CXXFLAGS='-O1 -g0'
LDFLAGS='-O1 -g0'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 16.0.0 20250509 (experimental) (GCC)