[Bug c++/101029] New: unexpected error: non-constant condition for static assertion in gcc 10/11, but not 9 (clang also fine)

jim.w.walker at gmail dot com gcc-bugzilla@gcc.gnu.org
Fri Jun 11 12:04:44 GMT 2021


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

            Bug ID: 101029
           Summary: unexpected error: non-constant condition for static
                    assertion in gcc 10/11, but not 9 (clang also fine)
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jim.w.walker at gmail dot com
  Target Milestone: ---

Created attachment 50984
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50984&action=edit
Output from -save-temps

A recent change to use unity builds in a product
(https://github.com/couchbase/kv_engine) I work on produced a build failure
which only occurred on our gcc 10.2 builder, it was fine on clang based builds. 

Further debugging of the issue revealed it appears to build fine on gcc 9. This
investigation also revealed I could make an unrelated code change preceding the
use of a templated type, and the code would then compile (details of this are
below). So far my conclusion is that this is an issue in gcc.

When compiled on gcc 10.2 the following error is seen.

/opt/gcc-10.2.0/include/c++/10.2.0/type_traits: In instantiation of ‘struct
std::is_default_constructible<const char>’:
/opt/gcc-10.2.0/include/c++/10.2.0/type_traits:143:12:   required from ‘struct
std::__and_<std::is_default_constructible<const char>,
std::is_default_constructible<char>,
std::__not_<std::__and_<std::__is_implicitly_default_constructible<const char>,
std::__is_implicitly_default_constructible<char> > > >’
/opt/gcc-10.2.0/include/c++/10.2.0/bits/stl_pair.h:244:59:   required by
substitution of ‘template<class _U1, class _U2, typename
std::enable_if<std::__and_<std::is_default_constructible<_U1>,
std::is_default_constructible<_U2>,
std::__not_<std::__and_<std::__is_implicitly_default_constructible<_U1>,
std::__is_implicitly_default_constructible<_U2> > > >::value, bool>::type
<anonymous> > constexpr std::pair<const char, char>::pair() [with _U1 = const
char; _U2 = char; typename
std::enable_if<std::__and_<std::is_default_constructible<_U1>,
std::is_default_constructible<_U2>,
std::__not_<std::__and_<std::__is_implicitly_default_constructible<_U1>,
std::__is_implicitly_default_constructible<_U2> > > >::value, bool>::type
<anonymous> = <missing>]’
tlm/deps/folly.exploded/include/folly/AtomicHashArray-inl.h:63:19:   required
from here
/opt/gcc-10.2.0/include/c++/10.2.0/type_traits:918:52: error: non-constant
condition for static assertion
  918 |      
static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
      |                    
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~

The complete gcc command used (this generated the attached file):

/opt/gcc-10.2.0/bin/g++
-DDESTINATION_ROOT=\"/mnt/Code/couchbase/docker/install\" -DEP_USE_ROCKSDB=1
-DFMT_LOCALE -DGLOG_NO_ABBREVIATED_SEVERITIES -DGOOGLE_GLOG_DLL_DECL=""
-DHAVE_BREAKPAD -DHAVE_JEMALLOC -DHAVE_JEMALLOC_SDALLOCX
-DLIBCOUCHSTORE_NO_VISIBILITY
-DMEMCACHED_VERSION=\"5c9636b6d00bf1f53f1302b7d76eee3ba9c0cd0d\"
-DOBJECT_ROOT=\"/home/couchbase/couchbase/kv_engine\"
-DPRODUCT_VERSION=\"0.0.0-0000\"
-DSOURCE_ROOT=\"/mnt/Code/couchbase/docker/kv_engine\" -DSPDLOG_COMPILED_LIB
-DSPDLOG_FMT_EXTERNAL -DSPDLOG_LEVEL_NAMES="{\"TRACE\", \"DEBUG\", \"INFO\",
\"WARNING\", \"ERROR\", \"CRITICAL\", \"OFF\"}" -D_FILE_OFFSET_BITS=64
-D_GNU_SOURCE=1 -D_POSIX_PTHREAD_SEMANTICS -D__EXTENSIONS__=1
-D__STDC_FORMAT_MACROS -Dgsl_CONFIG_CONTRACT_VIOLATION_THROWS
-Itlm/deps/prometheus-cpp.exploded/include -Ikv_engine/engines/ep
-Icouchstore/include -I/mnt/Code/couchbase/docker/couchstore/include
-I/mnt/Code/couchbase/docker/kv_engine/include
-I/mnt/Code/couchbase/docker/kv_engine/tracing
-I/mnt/Code/couchbase/docker/kv_engine/utilities
-I/mnt/Code/couchbase/docker/kv_engine
-I/mnt/Code/couchbase/docker/platform/external
-I/mnt/Code/couchbase/docker/platform/include
-Itlm/deps/flatbuffers.exploded/include -Itlm/deps/snappy.exploded/include
-Ikv_engine/engines/ep/src
-I/mnt/Code/couchbase/docker/kv_engine/engines/ep/src
-I/mnt/Code/couchbase/docker/kv_engine/engines/ep
-I/mnt/Code/couchbase/docker/install/include -Ikv_engine/include
-Iplatform/include
-I/mnt/Code/couchbase/docker/kv_engine/engines/ep/tools/couchfile_upgrade
-I/mnt/Code/couchbase/docker/third_party/spdlog/include -isystem
/mnt/Code/couchbase/docker/third_party/HdrHistogram_c/src -isystem
/mnt/Code/couchbase/docker/phosphor/include -isystem
tlm/deps/boost.exploded/include -isystem tlm/deps/json.exploded/include
-isystem /mnt/Code/couchbase/docker/third_party/gsl-lite/include -isystem
tlm/deps/libevent.exploded/include -isystem tlm/deps/openssl.exploded/include
-isystem tlm/deps/jemalloc.exploded/include -isystem
tlm/deps/rocksdb.exploded/include -isystem
/mnt/Code/couchbase/docker/third_party/googletest/googletest/include -isystem
/mnt/Code/couchbase/docker/third_party/googletest/googlemock/include -isystem
tlm/deps/folly.exploded/include -isystem
tlm/deps/double-conversion.exploded/include -isystem
tlm/deps/glog.exploded/include -isystem tlm/deps/fmt.exploded/include -isystem
tlm/deps/zlib.exploded/include -isystem
/home/couchbase/couchbase/tlm/deps/breakpad.exploded/include/breakpad
-fvisibility=hidden -pthread -pedantic -Wall -Wredundant-decls
-Werror=missing-braces -fno-strict-aliasing -Werror=switch -g -fPIC
-ftls-model=initial-exec -std=c++17 -MD -MT
kv_engine/engines/ep/CMakeFiles/ep_objs.dir/Unity/unity_3_cxx.cxx.o -MF
kv_engine/engines/ep/CMakeFiles/ep_objs.dir/Unity/unity_3_cxx.cxx.o.d -o
kv_engine/engines/ep/CMakeFiles/ep_objs.dir/Unity/unity_3_cxx.cxx.o -c
/mnt/Code/couchbase/docker/kv_engine/engines/ep/src/dcp/producer.cc -save-temps

Please find attached the -save-temps output from a failing build. The cc source
as input here is as small as I could get and keep the error reproduced. It is
completely non-functional but still quite large as a number of library
depdendencies (all open source) get embedded into the output.

As for "unrelated code change allows the code to build":

In the orginal c++ source file, we have a function call for some logging. The
call looks like logger->warn("{}", vbucket). It is the type of the parameter
that can influence if the build errors or succeeds.

In the attached file, this can be seen at line 110615, when I changed that call
to log the uint32_t parameter, the code builds, e.g.

- logger->warn("{}", vbucket);
+ logger->warn("{}", opaque);

This function and the 'vbucket' type are, I'm sure, unrelated from the
templated type on 110619 which is the source of the compiler error.

Note on comparing gcc 9/10/11:

The easiest path for me to test against 9/10/11 in this instance was to compile
using -E, take that output and strip away various external dependencies
(/usr/include and the stdlib etc..) and then use that code in godbolt to try
different gcc compiler. Using this technique I could get object code from gcc
9, but the same error on 10.2, 10.3 and 11.1

This code was used in that test
https://gist.github.com/jimwwalker/d62677965feb347f50c4c11bddc7ab6f


More information about the Gcc-bugs mailing list