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

            Bug ID: 116634
           Summary: constexpr string arrays dont compile in gcc 14.x but
                    works for gcc 13 and earlier.
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: horserad12 at outlook dot com
  Target Milestone: ---

Created attachment 59063
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59063&action=edit
preprocessed file

While declaring a constexpr string array, the first string argument appears to
get partially skipped. Only the string length gets inferred, but the string
itself is missing leading to a compilation error.

The code fails to compile in gcc 14.x. but has been tried and tested on gcc 9,
10, 11, 12 and 13. The bug also shows up in gcc-trunk as tested through
https://gcc.godbolt.org/




COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure
--enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust
--enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues
--with-build-config=bootstrap-lto --with-linker-hash-style=gnu
--with-system-zlib --enable-__cxa_atexit --enable-cet=auto
--enable-checking=release --enable-clocale=gnu --enable-default-pie
--enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object
--enable-libstdcxx-backtrace --enable-link-serialization=1
--enable-linker-build-id --enable-lto --enable-multilib --enable-plugin
--enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch
--disable-werror
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 14.2.1 20240805 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic'
'-march=x86-64' '-dumpdir' 'a-'
 /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/cc1plus -E -quiet -v -D_GNU_SOURCE
t1.cpp -mtune=generic -march=x86-64 -fpch-preprocess -o a-t1.ii
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../x86_64-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1

/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1/x86_64-pc-linux-gnu

/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1/backward
 /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/include
 /usr/local/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/include-fixed
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic'
'-march=x86-64' '-dumpdir' 'a-'
 /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/cc1plus -fpreprocessed a-t1.ii -quiet
-dumpdir a- -dumpbase t1.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64
-version -o a-t1.s
GNU C++17 (GCC) version 14.2.1 20240805 (x86_64-pc-linux-gnu)
        compiled by GNU C version 14.2.1 20240805, GMP version 6.3.0, MPFR
version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 438deb6040cbc4b51ad3ab8b369917b9
t1.cpp: In instantiation of ‘constexpr Any<N>::Any(ConstString (&&)[N]) [with
int N = 2]’:
t1.cpp:55:33:   required from here
   55 |     return {{ConstString(c1)...}};
      |                                 ^
t1.cpp:62:45:   in ‘constexpr’ expansion of ‘Any_of(const char (&)[N1]...)
[with int ...N1 = {5, 4}]("def")’
t1.cpp:45:44: error: invalid initializer for array member ‘ConstString
Any<2>::vec [2]’
   45 |     Any(ConstString (&&_vec)[N]) noexcept: vec(_vec){}
      |                                            ^~~~~~~~~
t1.cpp: In instantiation of ‘constexpr Any<N>::Any(ConstString (&&)[N]) [with
int N = 3]’:
t1.cpp:55:33:   required from here
   55 |     return {{ConstString(c1)...}};
      |                                 ^
t1.cpp:63:45:   in ‘constexpr’ expansion of ‘Any_of(const char (&)[N1]...)
[with int ...N1 = {3, 5, 4}]("abcd", "def")’
t1.cpp:45:44: error: invalid initializer for array member ‘ConstString
Any<3>::vec [3]’
   45 |     Any(ConstString (&&_vec)[N]) noexcept: vec(_vec){}
      |                                            ^~~~~~~~~

Reply via email to