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

            Bug ID: 92530
           Summary: Absent error on static_assert expression
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pkeir at outlook dot com
  Target Milestone: ---

Created attachment 47272
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47272&action=edit
The code described in the bug report.

The static_assert expression in the C++11 code below is not an integral
constant expression. GCC trunk compiles this, while Clang reports the error
correctly. To quote Clang's Richard Smith:

"The evaluation semantics of the expression 'x' (because it's of reference
type) involve locating the object that the reference binds to, which can't be
done in this case because we don't know the value of the function parameter
'x'. So the evaluation of the static_assert condition is non-constant, which is
invalid."

The language rule that's violated is here:
http://eel.is/c++draft/expr.const#4.12

template <typename T>
constexpr bool bar(T &)  { return true; }

template <typename T>
constexpr bool foo(T &x) { static_assert(bar(x),""); return bar(x); }

int main(int argc, char *argv[])
{
  int i;
  constexpr bool y = foo(i);
  return 0;
}

Reply via email to