Bug 106125 - [c++2a] Segmentation fault in constexpr initialization of static variable
Summary: [c++2a] Segmentation fault in constexpr initialization of static variable
Status: RESOLVED DUPLICATE of bug 95291
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 10.3.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-06-28 17:20 UTC by Campos
Modified: 2022-06-28 17:35 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
Preprocessed file (compressed) (224.52 KB, application/gzip)
2022-06-28 17:20 UTC, Campos
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Campos 2022-06-28 17:20:23 UTC
Created attachment 53217 [details]
Preprocessed file (compressed)

The following code triggers a segfault. Tested with g++ 10.3.0, -O0 to -O3

/* starts here */
template<typename ... T>
struct DataStructure
{
};

template<size_t N>
struct StringLiteral 
{
    constexpr StringLiteral (const char (&str)[N]) 
    {
        std::copy_n(str, N, value); 
    }

    constexpr auto operator<=>(const StringLiteral&) const = default;
    constexpr bool operator==(const StringLiteral&) const  = default;
    static constexpr auto len = N; 
    char value[N];
};

////////////////////////////////////////////////////////////////////////

template <StringLiteral Name, typename T>
struct Item
{
    constexpr static auto item_name = Name;
    T data;
};

////////////////////////////////////////////////////////////////////////

template <StringLiteral Target, typename... Rest>
struct Test
{
    static constexpr auto eq = false;
};

template <StringLiteral Target, typename First, typename... Rest>
struct Test<Target, First, Rest...>
{
    static constexpr auto eq = (Target == First::item_name) || Test<Target, Rest...>::eq;
};

////////////////////////////////////////////////////////////////////////

template<typename T, typename ... Rest>
struct DataStructure<T, Rest ...>
{
    constexpr DataStructure()
        : first()
        , rest()
    {
        // this line!
        static_assert(!Test<T::item_name, Rest...>::eq, "repeated id in data structure");
    }

    T first;
    DataStructure<Rest ... > rest;
};

DataStructure<
    Item<"Ident::ZUM", int>, 
    Item<"Ident::FOO", float>,
    Item<"Ident::BAR", float>
> data;

/* ends here */

g++-10 -save-temps -std=c++2a test_segfault.cpp
test_segfault.cpp: In constructor ‘constexpr DataStructure<T, Rest ...>::DataStructure()’:
test_segfault.cpp:58:50: internal compiler error: Segmentation fault
   58 |         static_assert(!Test<T::item_name, Rest...>::eq, "repeated id in data structure");
      |                                                  ^
0x7f3d44ebe08f ???
	/build/glibc-SzIz7B/glibc-2.31/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
0x7f3d44e9f082 __libc_start_main
	../csu/libc-start.c:308
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <file:///usr/share/doc/gcc-10/README.Bugs> for instructions.
make: *** [Makefile:2: all] Error 1

//////////////////////////////////////////////////////////////////////////////////////
Compiler info:

Using built-in specs.
COLLECT_GCC=g++-10
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 10.3.0-1ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-10/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-10 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --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-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 --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-10-S4I5Pr/gcc-10-10.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-10-S4I5Pr/gcc-10-10.3.0/debian/tmp-gcn/usr,hsa --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-mutex
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.3.0 (Ubuntu 10.3.0-1ubuntu1~20.04)
Comment 1 Campos 2022-06-28 17:22:41 UTC
Command line: 
g++-10 -save-temps -std=c++2a test_segfault.cpp
Comment 2 Marek Polacek 2022-06-28 17:33:22 UTC
I think this was fixed in GCC 11.
Comment 3 Marek Polacek 2022-06-28 17:35:58 UTC
Dup.

*** This bug has been marked as a duplicate of bug 95291 ***