https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125212

            Bug ID: 125212
           Summary: ICE when using lambdas as alias template parameters
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: joshua.maiche at gmail dot com
  Target Milestone: ---

Tested locally on `g++-15`, and remotely on godbolt's `x86-64 gcc (trunk)`

The issue seems to only happen when lambdas are passed in directly as alias
template parameters. If the lambda is stored in a constexpr variable, and that
variable is passed in, the compiler does not crash.

**main.cpp**
```
template <auto dummyVal>
struct MyStruct
{
    template<class Callable>
    static constexpr auto Invoke(Callable callable)
    {
        return callable.template operator() <decltype(val)> ();
    }

    static constexpr int val = 0;

    template <auto callable>
    using Alias = MyStruct<dummyVal>;
};

template <typename T>
constexpr auto IceFunction()
{
    using Alias1 = T::template Alias<[]<typename>() {}>;

    constexpr auto lambda = []<typename>() {};
    using Alias2 = T::template Alias<lambda>;

    // If we use Alias2 instead of Alias1, gcc does not crash.
    using Alias = Alias1;

    return Alias::Invoke([]<typename>{ return MyStruct<Alias::val>{}; });
}

int main()
{
    IceFunction<MyStruct<1>>();
}
```

**15.2 output (local)**
```
$ g++-15 -std=c++20 main.cpp -v
Using built-in specs.
COLLECT_GCC=g++-15
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/15/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 15.2.0-4ubuntu4'
--with-bugurl=file:///usr/share/doc/gcc-15/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2,rust,cobol,algol68
--prefix=/usr --with-gcc-major-version-only --program-suffix=-15
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace
--enable-gnu-unique-object --disable-vtable-verify --enable-plugin
--enable-default-pie --with-system-zlib --enable-libphobos-checking=release
--with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch
--disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none=/build/gcc-15-deiAlw/gcc-15-15.2.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-15-deiAlw/gcc-15-15.2.0/debian/tmp-gcn/usr
--enable-offload-defaulted --without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
--with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 15.2.0 (Ubuntu 15.2.0-4ubuntu4)
COLLECT_GCC_OPTIONS='-std=c++20' '-v' '-foffload-options=-l_GCC_stdc++'
'-foffload-options=-l_GCC_m' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
'-dumpdir' 'a-'
 /usr/libexec/gcc/x86_64-linux-gnu/15/cc1plus -quiet -v -imultiarch
x86_64-linux-gnu -D_GNU_SOURCE main.cpp -quiet -dumpdir a- -dumpbase main.cpp
-dumpbase-ext .cpp -mtune=generic -march=x86-64 -std=c++20 -version
-foffload-options=-l_GCC_stdc++ -foffload-options=-l_GCC_m
-fasynchronous-unwind-tables -fstack-protector-strong -Wformat
-Wformat-security -fstack-clash-protection -fcf-protection
-fzero-init-padding-bits=all -Wbidi-chars=any -o /tmp/ccRJhUFX.s
GNU C++20 (Ubuntu 15.2.0-4ubuntu4) version 15.2.0 (x86_64-linux-gnu)
        compiled by GNU C version 15.2.0, GMP version 6.3.0, MPFR version
4.2.2, MPC version 1.3.1, isl version isl-0.27-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/15"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-linux-gnu/15/include-fixed/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/15/include-fixed"
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-linux-gnu/15/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/15
 /usr/include/x86_64-linux-gnu/c++/15
 /usr/include/c++/15/backward
 /usr/lib/gcc/x86_64-linux-gnu/15/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
Compiler executable checksum: 303b1f6d80e10fe55145457c37243669
main.cpp: In instantiation of ‘IceFunction<MyStruct<1> >()::<lambda()> [with
<template-parameter-1-1> = const int]’:
main.cpp:7:61:   required from ‘static constexpr auto
MyStruct<dummyVal>::Invoke(Callable) [with Callable = IceFunction<MyStruct<1>
>()::<lambda()>; auto dummyVal = 1]’
    7 |         return callable.template operator() <decltype(val)> ();
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
main.cpp:27:25:   required from ‘constexpr auto IceFunction() [with T =
MyStruct<1>]’
   27 |     return Alias::Invoke([]<typename>{ return MyStruct<Alias::val>{};
});
      |           
~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:32:29:   required from here
   32 |     IceFunction<MyStruct<1>>();
      |     ~~~~~~~~~~~~~~~~~~~~~~~~^~
main.cpp:19:38: internal compiler error: Segmentation fault
   19 |     using Alias1 = T::template Alias<[]<typename>() {}>;
      |                                      ^~~~~~~~~~~~~~~~~
0x747403845f5f ???
        ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
0x74740382a574 __libc_start_call_main
        ../sysdeps/nptl/libc_start_call_main.h:58
0x74740382a627 __libc_start_main_impl
        ../csu/libc-start.c:360
Please submit a full bug report, with preprocessed source (by using
-freport-bug).
Please include the complete backtrace with any bug report.
See <file:///usr/share/doc/gcc-15/README.Bugs> for instructions.
```

**trunk output (godbolt)**
```
$ -std=c++20 -v
Using built-in specs.
COLLECT_GCC=/opt/compiler-explorer/gcc-snapshot/bin/g++
Target: x86_64-linux-gnu
Configured with: ../gcc-trunk-20260506/configure
--prefix=/opt/compiler-explorer/gcc-build/staging --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu --disable-bootstrap
--enable-multiarch --with-abi=m64 --with-multilib-list=m32,m64,mx32
--enable-multilib --enable-clocale=gnu
--enable-languages=c,c++,fortran,ada,objc,obj-c++,go,d,rust,m2,cobol,algol68
--enable-ld=yes --enable-gold=yes --enable-libstdcxx-time=yes
--enable-linker-build-id --enable-lto --enable-plugins --enable-threads=posix
--with-pkgversion=Compiler-Explorer-Build-gcc-2cd9325e3ec1c14e6759e1ca798f2ea141dd145d-binutils-2.44
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 17.0.0 20260506 (experimental)
(Compiler-Explorer-Build-gcc-2cd9325e3ec1c14e6759e1ca798f2ea141dd145d-binutils-2.44)
 
COLLECT_GCC_OPTIONS='-fdiagnostics-color=always' '-g' '-o' '/app/output.s'
'-masm=intel' '-fno-verbose-asm' '-S' '-std=c++20' '-v' '-shared-libgcc'
'-mtune=generic' '-march=x86-64' '-dumpdir' '/app/'

/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../libexec/gcc/x86_64-linux-gnu/17.0.0/cc1plus
-quiet -v -imultiarch x86_64-linux-gnu -iprefix
/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/
-D_GNU_SOURCE <source> -quiet -dumpdir /app/ -dumpbase output.cpp -dumpbase-ext
.cpp -masm=intel -mtune=generic -march=x86-64 -g -std=c++20 -version
-fdiagnostics-color=always -fno-verbose-asm -o /app/output.s
GNU C++20
(Compiler-Explorer-Build-gcc-2cd9325e3ec1c14e6759e1ca798f2ea141dd145d-binutils-2.44)
version 17.0.0 20260506 (experimental) (x86_64-linux-gnu)
        compiled by GNU C version 11.4.0, GMP version 6.3.0, MPFR version
4.2.2, MPC version 1.3.1, isl version isl-0.24-GMP

GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
ignoring nonexistent directory
"/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/../../../../x86_64-linux-gnu/include"
ignoring duplicate directory
"/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/17.0.0/../../../../include/c++/17.0.0"
ignoring duplicate directory
"/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/17.0.0/../../../../include/c++/17.0.0/x86_64-linux-gnu"
ignoring duplicate directory
"/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/17.0.0/../../../../include/c++/17.0.0/backward"
ignoring duplicate directory
"/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/17.0.0/include"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring duplicate directory
"/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/17.0.0/include-fixed/x86_64-linux-gnu"
ignoring duplicate directory
"/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/17.0.0/include-fixed"
ignoring nonexistent directory
"/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/17.0.0/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:

/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/../../../../include/c++/17.0.0

/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/../../../../include/c++/17.0.0/x86_64-linux-gnu

/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/../../../../include/c++/17.0.0/backward

/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/include

/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/include-fixed/x86_64-linux-gnu

/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/include-fixed
 /usr/local/include

/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/../../include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
Compiler executable checksum: 92ff174fcd51b3859ad29f346c53330a
<source>: In instantiation of 'IceFunction<MyStruct<1> >()::<lambda()> [with
<template-parameter-1-1> = const int]':
<source>:7:61:   required from 'static constexpr auto
MyStruct<dummyVal>::Invoke(Callable) [with Callable = IceFunction<MyStruct<1>
>()::<lambda()>; auto dummyVal = 1]'
    7 |         return callable.template operator() <decltype(val)> ();
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
<source>:27:25:   required from 'constexpr auto IceFunction() [with T =
MyStruct<1>]'
   27 |     return Alias::Invoke([]<typename>{ return MyStruct<Alias::val>{};
});
      |           
~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:32:29:   required from here
   32 |     IceFunction<MyStruct<1>>();
      |     ~~~~~~~~~~~~~~~~~~~~~~~~^~
<source>:19:38: internal compiler error: Segmentation fault
   19 |     using Alias1 = T::template Alias<[]<typename>() {}>;
      |                                      ^~~~~~~~~~~~~~~~~
0x29af4f8 diagnostics::context::diagnostic_impl(rich_location*,
diagnostics::metadata const*, diagnostics::option_id, char const*,
__va_list_tag (*) [1], diagnostics::kind)
        ???:0
0x29a413b internal_error(char const*, ...)
        ???:0
0xd8df31 template_parms_to_args(tree_node*)
        ???:0
0xda6107 tsubst_lambda_expr(tree_node*, tree_node*, int, tree_node*)
        ???:0
0xdc2a49 tsubst_template_args(tree_node*, tree_node*, int, tree_node*)
        ???:0
0xdc2c41 tsubst_template_args(tree_node*, tree_node*, int, tree_node*)
        ???:0
0xdb59c9 tsubst(tree_node*, tree_node*, int, tree_node*)
        ???:0
0xdb5dfc tsubst(tree_node*, tree_node*, int, tree_node*)
        ???:0
0xdc2a49 tsubst_template_args(tree_node*, tree_node*, int, tree_node*)
        ???:0
0xdb58fd tsubst(tree_node*, tree_node*, int, tree_node*)
        ???:0
0xde0f2d instantiate_decl(tree_node*, bool, bool)
        ???:0
0xc49b63 maybe_instantiate_decl(tree_node*)
        ???:0
0xc4bb47 mark_used(tree_node*, int)
        ???:0
0xb4c0d3 build_new_method_call(tree_node*, tree_node*, vec<tree_node*, va_gc,
vl_embed>**, tree_node*, int, tree_node**, int)
        ???:0
0xe1dafc finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
        ???:0
0xde0f2d instantiate_decl(tree_node*, bool, bool)
        ???:0
0xc49b63 maybe_instantiate_decl(tree_node*)
        ???:0
0xc4bb47 mark_used(tree_node*, int)
        ???:0
0xb4c0d3 build_new_method_call(tree_node*, tree_node*, vec<tree_node*, va_gc,
vl_embed>**, tree_node*, int, tree_node**, int)
        ???:0
0xe1d290 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
        ???:0
/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../libexec/gcc/x86_64-linux-gnu/17.0.0/cc1plus
-quiet -v -imultiarch x86_64-linux-gnu -iprefix
/cefs/92/9269be2f3bb9bbf8ec2074f8_gcc-trunk-20260506/bin/../lib/gcc/x86_64-linux-gnu/17.0.0/
-D_GNU_SOURCE <source> -quiet -dumpdir /app/ -dumpbase output.cpp -dumpbase-ext
.cpp -masm=intel -mtune=generic -march=x86-64 -g -std=c++20 -version
-fdiagnostics-color=always -fno-verbose-asm -o /app/output.s
Please submit a full bug report, with preprocessed source (by using
-freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
Compiler returned: 1
```
  • [Bug c++/125212] New: ICE when... joshua.maiche at gmail dot com via Gcc-bugs

Reply via email to