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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|2017-03-13 00:00:00         |2018-11-14

--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
No, the finish location is still wrong on trunk.

Reduced:

namespace ns {
template<typename T> struct trait;
}

struct any
{
  static unsigned const size = 3 * sizeof(void*);
  static unsigned const alignment = alignof(void*);

  template <typename T>
  static constexpr bool fits = sizeof(T) <= size
                            && alignof(T) <= alignment
                            && ns::trait<T>::value;

  template <typename T = int, bool = fits<T>>
  any();
};

any x;


The output on trunk includes:

expr-loc-bug.cpp:13:29: error: incomplete type 'ns::trait<int>' used in nested
name specifier
   11 |   static constexpr bool fits = sizeof(T) <= size
      |                                ~~~~~~~~~~~~~~~~~
   12 |                             && alignof(T) <= alignment
      |                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
   13 |                             && ns::trait<T>::value;
      |                             ^~~~~

I'd even argue the stating location still isn't right in this version, as the
error comes from ns::trait<T>::value not the logical expression containing it.

Reply via email to