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.