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

            Bug ID: 92193
           Summary: Poor diagnostics when a constexpr function call
                    follows a failed static_assert
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
                CC: jason at gcc dot gnu.org
  Target Milestone: ---

If we compile this with NO_CONSTEXPR the diagnostic is fine:

template<typename T>
  struct has_foo
  { static constexpr bool value = false; };

template<typename T>
#ifndef NO_CONSTEXPR
  constexpr
#endif
  bool
  foo(T t) noexcept(noexcept(t.foo()))
  { return t.foo(); }

template<typename T>
  void
  maybe_foo(T t)
  {
    static_assert( has_foo<T>::value, "has foo" );
    foo(t);
  }

struct X { };

int main()
{
  X x;
  maybe_foo(x);
}


ce.cc: In instantiation of ‘void maybe_foo(T) [with T = X]’:
ce.cc:26:14:   required from here
ce.cc:17:20: error: static assertion failed: has foo
     static_assert( has_foo<T>::value, "has foo" );
                    ^~~~~~~~~~


However, when the function is constexpr the output is much worse:

ce.cc: In instantiation of ‘void maybe_foo(T) [with T = X]’:
ce.cc:23:14:   required from here
ce.cc:14:20: error: static assertion failed: has foo
     static_assert( has_foo<T>::value, "has foo" );
                    ^~~~~~~~~~
ce.cc: In instantiation of ‘constexpr bool foo(T) [with T = X]’:
ce.cc:15:8:   required from ‘void maybe_foo(T) [with T = X]’
ce.cc:23:14:   required from here
ce.cc:7:32: error: ‘struct X’ has no member named ‘foo’
   foo(T t) noexcept(noexcept(t.foo()))
                              ~~^~~
ce.cc: In instantiation of ‘constexpr bool foo(T) [with T = X]’:
ce.cc:15:8:   required from ‘void maybe_foo(T) [with T = X]’
ce.cc:23:14:   required from here
ce.cc:7:32: error: ‘struct X’ has no member named ‘foo’
ce.cc:8:14: error: ‘struct X’ has no member named ‘foo’
   { return t.foo(); }
            ~~^~~

The errors following the static assertion are not useful. The static_assert is
there precisely to make compilation fail, but it doesn't stop errors being
produced from the constexpr function that follows it (even though we're in a
non-constexpr function).

This affects libstdc++ because adding 'constexpr' throughout the library means
that suddenly we get loads more errors in the testsuite and need to tell
dejagnu to ignore them.

Reply via email to