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

            Bug ID: 64085
           Summary: ICE on C++14 lambda by-reference capture with an
                    initializer
           Product: gcc
           Version: 4.9.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: maxim.yegorushkin at gmail dot com

$ cat test.cc 
    #include <functional>
    #include <iostream>

    template<class T>
    auto make_monad(T&& arg) {
        return [captive = std::forward<T>(arg)](auto&& a) {
            std::cout << __PRETTY_FUNCTION__ << " " << a << '\n';
            return 1;
        };
    }

    template<class T>
    auto make_monad(std::reference_wrapper<T> arg) {
        return [&captive = arg.get()](auto&& a) {
            std::cout << __PRETTY_FUNCTION__ << " " << a << '\n';
            return 1;
        };
    }

    int main() {
        auto monad = [](auto&& captive) {
            return make_monad(std::forward<decltype(captive)>(captive));
        };

        int n = 1;
        monad(1)(1);
        monad(n)(2);
        monad(std::ref(n))(3);
    }

$ /usr/local/ots/7/bin/g++ -v -c -o test.o -pthread -m64 -march=native
-W{all,extra,init-self,cast-align,missing-include-dirs,pointer-arith}
-Werror={return-type,format,format-extra-args,reorder,uninitialized,narrowing}
-Wno-{missing-field-initializers,unused-local-typedefs}
-f{align-functions,diagnostics-show-option,message-length=0} -std=gnu++1y
-Wno-non-virtual-dtor -ftemplate-backtrace-limit=0 -g test.cc
Using built-in specs.
COLLECT_GCC=/usr/local/ots/7/bin/g++49
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-4.9.2-src/configure --prefix=/usr/local/ots/7
--program-suffix=49 --disable-libunwind-exceptions --with-system-zlib
--enable-__cxa_atexit --enable-checking=release --disable-multiarch
--disable-multilib --with-gmp-include=/usr/local/ots/7/include
--with-mpfr-include=/usr/local/ots/7/include
--with-mpc-include=/usr/local/ots/7/include
--with-cloog-include=/usr/local/ots/7/include
--with-isl-include=/usr/local/ots/7/include
--with-binutils-include=/usr/local/ots/7/include
--with-gmp-lib=/usr/local/ots/7/lib64 --with-mpfr-lib=/usr/local/ots/7/lib64
--with-mpc-lib=/usr/local/ots/7/lib64 --with-cloog-lib=/usr/local/ots/7/lib64
--with-isl-lib=/usr/local/ots/7/lib64
--with-binutils-lib=/usr/local/ots/7/lib64 --enable-languages=c,c++,fortran,lto
--enable-plugin --enable-initfini-array --enable-gold=default
--enable-libstdcxx-time --enable-linker-build-id --with-linker-hash-style=gnu
--disable-libgcj
Thread model: posix
gcc version 4.9.2 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-c' '-o' 'test.o' '-pthread' '-m64' '-march=native'
'-Wall' '-Wextra' '-Winit-self' '-Wcast-align' '-Wmissing-include-dirs'
'-Wpointer-arith' '-Werror=return-type' '-Werror=format'
'-Werror=format-extra-args' '-Werror=reorder' '-Werror=uninitialized'
'-Werror=narrowing' '-Wno-missing-field-initializers'
'-Wno-unused-local-typedefs' '-falign-functions' '-fdiagnostics-show-option'
'-fmessage-length=0' '-std=gnu++1y' '-Wno-non-virtual-dtor'
'-ftemplate-backtrace-limit=0' '-g' '-shared-libgcc'
 /home/max/.ots/7/bin/../libexec/gcc/x86_64-unknown-linux-gnu/4.9.2/cc1plus
-quiet -v -iprefix
/home/max/.ots/7/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/ -D_GNU_SOURCE
-D_REENTRANT test.cc -march=sandybridge -mmmx -mno-3dnow -msse -msse2 -msse3
-mssse3 -mno-sse4a -mcx16 -msahf -mno-movbe -maes -mno-sha -mpclmul -mpopcnt
-mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx
-mno-avx2 -msse4.2 -msse4.1 -mno-lzcnt -mno-rtm -mno-hle -mno-rdrnd -mno-f16c
-mno-fsgsbase -mno-rdseed -mno-prfchw -mno-adx -mfxsr -mxsave -mxsaveopt
-mno-avx512f -mno-avx512er -mno-avx512cd -mno-avx512pf -mno-prefetchwt1 --param
l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=8192
-mtune=sandybridge -quiet -dumpbase test.cc -m64 -auxbase-strip test.o -g -Wall
-Wextra -Winit-self -Wcast-align -Wmissing-include-dirs -Wpointer-arith
-Werror=return-type -Werror=format -Werror=format-extra-args -Werror=reorder
-Werror=uninitialized -Werror=narrowing -Wno-missing-field-initializers
-Wno-unused-local-typedefs -Wno-non-virtual-dtor -std=gnu++1y -version
-falign-functions -fdiagnostics-show-option -fmessage-length=0
-ftemplate-backtrace-limit=0 -o /tmp/ccljVVdY.s
GNU C++ (GCC) version 4.9.2 (x86_64-unknown-linux-gnu)
    compiled by GNU C version 4.9.2, GMP version 4.3.2, MPFR version 2.4.2, MPC
version 0.8.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory
"/home/max/.ots/7/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/include"
ignoring duplicate directory
"/home/max/.ots/7/bin/../lib/gcc/../../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2"
ignoring duplicate directory
"/home/max/.ots/7/bin/../lib/gcc/../../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/x86_64-unknown-linux-gnu"
ignoring duplicate directory
"/home/max/.ots/7/bin/../lib/gcc/../../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/backward"
ignoring duplicate directory
"/home/max/.ots/7/bin/../lib/gcc/../../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/include"
ignoring duplicate directory
"/home/max/.ots/7/bin/../lib/gcc/../../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/include-fixed"
ignoring nonexistent directory
"/home/max/.ots/7/bin/../lib/gcc/../../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:

/home/max/.ots/7/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2

/home/max/.ots/7/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/x86_64-unknown-linux-gnu

/home/max/.ots/7/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/backward
 /home/max/.ots/7/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/include
 /home/max/.ots/7/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/include-fixed
 /usr/local/include
 /home/max/.ots/7/bin/../lib/gcc/../../include
 /usr/include
End of search list.
GNU C++ (GCC) version 4.9.2 (x86_64-unknown-linux-gnu)
    compiled by GNU C version 4.9.2, GMP version 4.3.2, MPFR version 2.4.2, MPC
version 0.8.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 4745e1a90ce96a2734afd3f8df070d02
test.cc: In function ‘auto make_monad(std::reference_wrapper<_Tp>)’:
test.cc:14:36: internal compiler error: Segmentation fault
         return [&captive = arg.get()](auto&& a) {
                                    ^
0x98c36f crash_signal
    ../../gcc-4.9.2-src/gcc/toplev.c:337
0x644265 lvalue_kind(tree_node const*)
    ../../gcc-4.9.2-src/gcc/cp/tree.c:236
0x644468 real_lvalue_p(tree_node const*)
    ../../gcc-4.9.2-src/gcc/cp/tree.c:267
0x671672 add_capture(tree_node*, tree_node*, tree_node*, bool, bool)
    ../../gcc-4.9.2-src/gcc/cp/lambda.c:497
0x5df75d cp_parser_lambda_introducer
    ../../gcc-4.9.2-src/gcc/cp/parser.c:8999
0x5df75d cp_parser_lambda_expression
    ../../gcc-4.9.2-src/gcc/cp/parser.c:8721
0x5df75d cp_parser_primary_expression
    ../../gcc-4.9.2-src/gcc/cp/parser.c:4319
0x5e9a80 cp_parser_postfix_expression
    ../../gcc-4.9.2-src/gcc/cp/parser.c:5971
0x5ec0f6 cp_parser_unary_expression
    ../../gcc-4.9.2-src/gcc/cp/parser.c:7172
0x5ecd8f cp_parser_binary_expression
    ../../gcc-4.9.2-src/gcc/cp/parser.c:7877
0x5ed241 cp_parser_assignment_expression
    ../../gcc-4.9.2-src/gcc/cp/parser.c:8115
0x5ef32c cp_parser_expression
    ../../gcc-4.9.2-src/gcc/cp/parser.c:8277
0x600104 cp_parser_expression
    ../../gcc-4.9.2-src/gcc/cp/parser.c:8316
0x600104 cp_parser_jump_statement
    ../../gcc-4.9.2-src/gcc/cp/parser.c:10710
0x600104 cp_parser_statement
    ../../gcc-4.9.2-src/gcc/cp/parser.c:9384
0x600769 cp_parser_statement_seq_opt
    ../../gcc-4.9.2-src/gcc/cp/parser.c:9772
0x6008a6 cp_parser_compound_statement
    ../../gcc-4.9.2-src/gcc/cp/parser.c:9726
0x6009e3 cp_parser_function_body
    ../../gcc-4.9.2-src/gcc/cp/parser.c:18766
0x6009e3 cp_parser_ctor_initializer_opt_and_function_body
    ../../gcc-4.9.2-src/gcc/cp/parser.c:18802
0x6016b2 cp_parser_function_definition_after_declarator
    ../../gcc-4.9.2-src/gcc/cp/parser.c:22927
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.

Reply via email to