https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67070
Bug ID: 67070 Summary: [concepts] Concept with negation and disjunction not checked correctly Product: gcc Version: c++-concepts Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: eric.niebler at gmail dot com Target Milestone: --- Created attachment 36093 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36093&action=edit preprocessed source archive The static assertion in the attached file fires when it shouldn't. If the _ContainerLike concept is changed from this: template <class T> concept bool _ContainerLike = Range<T>() && Range<const T>() && !Same<ReferenceType<IteratorType<T>>, ReferenceType<IteratorType<const T>>>(); ... to this: template <class T> constexpr bool __container_like() { return false; } template <Range T> requires Range<const T>() && !Same<ReferenceType<IteratorType<T>>, ReferenceType<IteratorType<const T>>>() constexpr bool __container_like() { return true; } template <class T> concept bool _ContainerLike = __container_like<T>(); ... the static assertion goes away. These two seem the same to me.