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

--- Comment #3 from songb432 at gmail dot com ---
(In reply to Jonathan Wakely from comment #2)
> It's unclear which part you think is a bug.

Umm, don't know how to say that:
when I typed something like `template <class Alloc> concept has_usable_pointer
= Cpp17NullablePointer<typename Alloc::pointer>;`,
the compiler must ensure that `has_usable_pointer<my_allocator>` is true if and
only if `my_allocator` indeed has a member typedef `my_allocator::pointer`
(which is checked first) and `my_allocator::pointer` satisfy the concept
`Cpp17NullablePointer`,
but the current GCC compiler just ignores `my_allocator::pointer`. `Example2,
Example2_, Example3` are such cases.

In details, for `Example2`, `sad_nested_type<int>` should fail because it fails
`typename T::type`; for `Example2_` and `Example3`, the compiler errors are
wrong. `Example2_` should report `no candidate` instead of `ambiguous`.
`Example3` should just compiles with no error.

While for `Example1`, I think I was wrong. There's nothing wrong with
`Example1`, that static assertion should pass. Because `T::value` in the
definition of `concept A` is just the same as `template<typename T> concept Q =
T::value;` and `template<typename T> concept A = Q<T> || true;`.

Reply via email to