https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79994
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
GCC 10 and above rejects reduced testcase in comment 1:
GCC 10:
<source>: In instantiation of 'void add(T&) [with T = Directed_Graph_impl]':
<source>:3:8: recursively required from 'void add(T&) [with T =
Directed_Graph_impl]'
<source>:3:8: required from 'void add(T&) [with T = Directed_Graph_impl]'
<source>:14:10: required from here
<source>:3:8: fatal error: template instantiation depth exceeds maximum of 900
(use '-ftemplate-depth=' to increase the maximum)
3 | add(g);
| ~~~^~~
GCC 11/trunk:
<source>: In substitution of 'template<class T> requires Graph<T> void
add(T&) [with T = Directed_Graph_impl]':
<source>:3:8: required by substitution of 'template<class T> requires
Graph<T> void add(T&) [with T = Directed_Graph_impl]'
<source>:14:8: required from here
<source>:2:14: required for the satisfaction of 'Graph<T>' [with T =
Directed_Graph_impl]
<source>:2:22: in requirements with 'G& g' [with G = Directed_Graph_impl]
<source>:2:22: error: satisfaction of atomic constraint 'requires(G& g)
{add(g);} [with G = T]' depends on itself
2 | concept bool Graph = requires (G& g) {
| ^~~~~~~~~~~~~~~~~
3 | add(g);
| ~~~~~~~
4 | };
| ~
<source>: In function 'int main()':
<source>:14:8: error: no matching function for call to
'add(Directed_Graph_impl&)'
14 | add(t);
| ~~~^~~
<source>:7:6: note: candidate: 'template<class T> requires Graph<T> void
add(T&)'
7 | void add(T& g) {
| ^~~
<source>:7:6: note: substitution of deduced template arguments resulted in
errors seen above