@@ -2029,6 +2029,101 @@ class cppfront
2029
2029
}
2030
2030
2031
2031
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
+
2032
2127
// -----------------------------------------------------------------------
2033
2128
//
2034
2129
auto emit (selection_statement_node const & n)
@@ -2480,6 +2575,7 @@ class cppfront
2480
2575
try_emit<primary_expression_node::expression_list>(n.expr );
2481
2576
try_emit<primary_expression_node::id_expression >(n.expr );
2482
2577
try_emit<primary_expression_node::inspect >(n.expr , true );
2578
+ try_emit<primary_expression_node::requires_ >(n.expr );
2483
2579
try_emit<primary_expression_node::literal >(n.expr );
2484
2580
2485
2581
if (n.expr .index () == primary_expression_node::declaration)
0 commit comments