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)

Reply via email to