This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/82239] New: Parentheses around constexpr template member break static_assert
- From: "edolstra at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 18 Sep 2017 16:23:44 +0000
- Subject: [Bug c++/82239] New: Parentheses around constexpr template member break static_assert
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82239
Bug ID: 82239
Summary: Parentheses around constexpr template member break
static_assert
Product: gcc
Version: 7.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: edolstra at gmail dot com
Target Milestone: ---
With GCC 6.4 or 7.2, the following example fails to compile in C++14 mode:
=== start ===
template<typename T>
struct C {
static constexpr int x = 5;
void f()
{
static_assert(0 < x, "x"); // ok
static_assert(0 < (x), "x"); // fails
static_assert(true || (0 < x), "x"); // ok
static_assert(true || (0 < (x)), "x"); // fails
}
};
=== end ===
$ g++ -c -std=c++14 foo.cc
foo.cc: In member function ‘void C<T>::f()’:
foo.cc:7:7: error: non-constant condition for static assertion
static_assert(0 < (x), "x"); // fails
^~~~~~~~~~~~~
foo.cc:9:7: error: non-constant condition for static assertion
static_assert(true || (0 < (x)), "x"); // fails
^~~~~~~~~~~~~
OTOH, -std=c++11 works fine. GCC 5.4 with -std=c++14 also compiles.
Also, removing "template<typename T>" or moving the definition of "x" out of
the template makes it compile.
Tested on x86_64-linux (NixOS). Compiler info:
$ g++ -v
Using built-in specs.
COLLECT_GCC=/nix/store/l9nq5bvqgjngqhlq7ks6cg0bdizn2l0v-gcc-7.2.0/bin/g++
COLLECT_LTO_WRAPPER=/nix/store/l9nq5bvqgjngqhlq7ks6cg0bdizn2l0v-gcc-7.2.0/libexec/gcc/x86_64-unknown-linux-gnu/7.2.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with:
Thread model: posix
gcc version 7.2.0 (GCC)