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

            Bug ID: 118285
           Summary: GCC rejects some constexpr std::string usages
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dangelog at gmail dot com
  Target Milestone: ---

Hi,

This is a spin-off of PR103924. 

The following testcase is rejected by GCC rejected by GCC but accepted by Clang
(with libstdc++):

https://gcc.godbolt.org/z/63Wss3Ej8

#include <string>

constexpr void f(std::initializer_list<std::string>) {}
constexpr bool test()
{
    f({"x"});
    return true;
}

static_assert(test());



<source>:10:19: error: non-constant condition for static assertion
   10 | static_assert(test());
      |               ~~~~^~
In file included from
/opt/compiler-explorer/gcc-14.2.0/include/c++/14.2.0/string:54,
                 from <source>:1:
<source>:10:19:   in 'constexpr' expansion of 'test()'
<source>:6:6:   in 'constexpr' expansion of
'((std::__cxx11::basic_string<char>*)<anonymous>)->std::__cxx11::basic_string<char>::~basic_string()'
/opt/compiler-explorer/gcc-14.2.0/include/c++/14.2.0/bits/basic_string.h:809:19:
  in 'constexpr' expansion of
'((std::__cxx11::basic_string<char>*)this)->std::__cxx11::basic_string<char>::_M_dispose()'
/opt/compiler-explorer/gcc-14.2.0/include/c++/14.2.0/bits/basic_string.h:288:22:
error: accessing 'std::__cxx11::basic_string<char>::<unnamed
union>::_M_allocated_capacity' member instead of initialized
'std::__cxx11::basic_string<char>::<unnamed union>::_M_local_buf' member in
constant expression
  288 |           _M_destroy(_M_allocated_capacity);
      |                      ^~~~~~~~~~~~~~~~~~~~~
Compiler returned: 1





I've been trying to minimize the testcase by removing clutter from
basic_string: https://gcc.godbolt.org/z/haxvvr1YK


The fun part is that if one deletes the copy constructor (which is actually
never called) the code is accepted by GCC.

That's what makes me think this is a compiler bug.

Reply via email to