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

            Bug ID: 77482
           Summary: Segfault when compiling ill-formed constexpr code
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: petschy at gmail dot com
  Target Milestone: ---

Created attachment 39561
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=39561&action=edit
C++ source

In fixbuf(), the return statement is commented out at line 76. This makes the
program ill-formed since the return type will be deduced to void, but the
caller expects a value returned. Instead of an error message, 7.0 segfaults and
6.2.1 gets confused.

g++-7.0.0 -O3 -Wall -Wextra -g 20160905-constexpr-segfault.cpp 
‘
In function ‘auto foo()’:
Segmentation fault
  constexpr auto x = fixbuf<13, 200>();

----
6.2.1 doesn't segfault, but something is definitely amiss:
g++-6.2.1 -O3 -Wall -Wextra -g 20160905-constexpr-segfault.cpp 
‘
20160905-constexpr-segfault.cpp:81: confused by earlier errors, bailing out

In a terminal window with black bg and gray font, the single quote is gray,
then the error message on the next line is bold white, and it stays so, so
anything I type after this will be bold white.

----
6.0 seems to be OK:
g++-6.0.0 -O3 -Wall -Wextra -g 20160905-constexpr-segfault.cpp 
20160905-constexpr-segfault.cpp: In function ‘auto foo()’:
20160905-constexpr-segfault.cpp:81:37: error: ‘constexpr const void x’ has
incomplete type
  constexpr auto x = fixbuf<13, 200>();
                                     ^
20160905-constexpr-segfault.cpp:82:9: error: unable to deduce ‘auto’ from ‘x’
  return x;
         ^
20160905-constexpr-segfault.cpp: In function ‘auto foo_sized()’:
20160905-constexpr-segfault.cpp:87:38: error: ‘constexpr const void s’ has
incomplete type
  constexpr auto s = fixbuf<13, 0, 1>();
                                      ^
20160905-constexpr-segfault.cpp:88:35: error: no matching function for call to
‘fixbuf()’
  constexpr auto x = fixbuf<13, s>();
                                   ^
20160905-constexpr-segfault.cpp:69:6: note: candidate: template<unsigned int N,
unsigned int S, bool BOS> constexpr auto fixbuf()
 auto fixbuf()
      ^~~~~~
20160905-constexpr-segfault.cpp:69:6: note:   template argument
deduction/substitution failed:
20160905-constexpr-segfault.cpp:88:35: error: could not convert template
argument ‘s’ to ‘unsigned int’
  constexpr auto x = fixbuf<13, s>();
                                   ^
20160905-constexpr-segfault.cpp:89:9: error: unable to deduce ‘auto’ from ‘x’
  return x;
         ^

Tested on Debian Jessie AMD64, the detailed gcc versions:

$ g++-7.0.0 -v
Using built-in specs.
COLLECT_GCC=g++-7.0.0
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-languages=c,c++ --disable-multilib
--program-suffix=-7.0.0 --disable-bootstrap CFLAGS='-O2 -march=native'
CXXFLAGS='-O2 -march=native'
Thread model: posix
gcc version 7.0.0 20160831 (experimental) (GCC) 

$ g++-6.2.1 -v
Using built-in specs.
COLLECT_GCC=g++-6.2.1
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/6.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-languages=c,c++ --disable-multilib
--program-suffix=-6.2.1 --disable-bootstrap CFLAGS='-O2 -march=native'
CXXFLAGS='-O2 -march=native'
Thread model: posix
gcc version 6.2.1 20160831 (GCC)

$ g++-6.0.0 -v
Using built-in specs.
COLLECT_GCC=g++-6.0.0
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/6.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-languages=c,c++ --disable-multilib
--program-suffix=-6.0.0
Thread model: posix
gcc version 6.0.0 20160302 (experimental) (GCC)

Reply via email to