@@ -2029,6 +2029,101 @@ class cppfront
20292029 }
20302030
20312031
2032+ // -----------------------------------------------------------------------
2033+ //
2034+ struct type_requirement_tag {};
2035+ struct simple_requirement_tag {};
2036+ struct nested_requirement_tag {};
2037+ struct negative_requirement_tag {};
2038+
2039+ auto emit (
2040+ type_id_node const & n,
2041+ type_requirement_tag
2042+ )
2043+ -> void
2044+ {
2045+ printer.print_cpp2 (" typename " , n.position ());
2046+ emit (n);
2047+ printer.print_cpp2 (" ;" , n.position ());
2048+ }
2049+
2050+ auto emit (
2051+ expression_node const & n,
2052+ simple_requirement_tag
2053+ )
2054+ -> void
2055+ {
2056+ emit (n);
2057+ printer.print_cpp2 (" ;" , n.position ());
2058+ }
2059+
2060+ auto emit (requires_expression_node::compound_requirement_node const & n)
2061+ -> void
2062+ {
2063+ assert (n.expression );
2064+ printer.print_cpp2 (" { " , n.expression ->position ());
2065+ emit (*n.expression );
2066+ printer.print_cpp2 (" }" , n.expression ->position ());
2067+ if (!n.throws ) {
2068+ printer.print_cpp2 (" noexcept" , n.expression ->position ());
2069+ }
2070+ if (n.type_constraint ) {
2071+ printer.print_cpp2 (" -> " , n.expression ->position ());
2072+ emit (*n.type_constraint );
2073+ }
2074+ printer.print_cpp2 (" ;" , n.expression ->position ());
2075+ }
2076+
2077+ auto emit (
2078+ logical_or_expression_node const & n,
2079+ nested_requirement_tag
2080+ )
2081+ -> void
2082+ {
2083+ printer.print_cpp2 (" requires " , n.position ());
2084+ emit (n);
2085+ printer.print_cpp2 (" ;" , n.position ());
2086+ }
2087+
2088+ auto emit (
2089+ requires_expression_node::requirement_node const & n,
2090+ negative_requirement_tag
2091+ )
2092+ -> void
2093+ {
2094+ printer.print_cpp2 (" requires " , n.position ());
2095+ printer.print_cpp2 (" !requires { " , n.position ());
2096+ emit (n);
2097+ printer.print_cpp2 (" };" , n.position ());
2098+ }
2099+
2100+ auto emit (requires_expression_node::requirement_node const & n)
2101+ -> void
2102+ {
2103+ try_emit<requires_expression_node::requirement_node::type >(n.requirement , type_requirement_tag{});
2104+ try_emit<requires_expression_node::requirement_node::expression>(n.requirement , simple_requirement_tag{});
2105+ try_emit<requires_expression_node::requirement_node::compound >(n.requirement );
2106+ try_emit<requires_expression_node::requirement_node::nested >(n.requirement , nested_requirement_tag{});
2107+ try_emit<requires_expression_node::requirement_node::negative >(n.requirement , negative_requirement_tag{});
2108+ }
2109+
2110+ auto emit (requires_expression_node const & n)
2111+ -> void
2112+ {
2113+ assert (n.identifier );
2114+ emit (*n.identifier );
2115+ if (n.parameters ) {
2116+ emit (*n.parameters );
2117+ }
2118+ printer.print_cpp2 (" {" , n.position ());
2119+ for (auto const & x : n.requirements ) {
2120+ assert (x);
2121+ emit (*x);
2122+ }
2123+ printer.print_cpp2 (" \n }" , n.position (), true );
2124+ }
2125+
2126+
20322127 // -----------------------------------------------------------------------
20332128 //
20342129 auto emit (selection_statement_node const & n)
@@ -2480,6 +2575,7 @@ class cppfront
24802575 try_emit<primary_expression_node::expression_list>(n.expr );
24812576 try_emit<primary_expression_node::id_expression >(n.expr );
24822577 try_emit<primary_expression_node::inspect >(n.expr , true );
2578+ try_emit<primary_expression_node::requires_ >(n.expr );
24832579 try_emit<primary_expression_node::literal >(n.expr );
24842580
24852581 if (n.expr .index () == primary_expression_node::declaration)
0 commit comments