cxx-pretty-print.cc revision 1.1.1.1 1 1.1 mrg /* Implementation of subroutines for the GNU C++ pretty-printer.
2 1.1 mrg Copyright (C) 2003-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Gabriel Dos Reis <gdr (at) integrable-solutions.net>
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg #include "config.h"
22 1.1 mrg #include "system.h"
23 1.1 mrg #include "coretypes.h"
24 1.1 mrg #include "cp-tree.h"
25 1.1 mrg #include "cxx-pretty-print.h"
26 1.1 mrg #include "tree-pretty-print.h"
27 1.1 mrg
28 1.1 mrg static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
29 1.1 mrg static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
30 1.1 mrg static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
31 1.1 mrg static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
32 1.1 mrg static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
33 1.1 mrg static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
34 1.1 mrg static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
35 1.1 mrg static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
36 1.1 mrg static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
37 1.1 mrg static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
38 1.1 mrg static void pp_cxx_unary_left_fold_expression (cxx_pretty_printer *, tree);
39 1.1 mrg static void pp_cxx_unary_right_fold_expression (cxx_pretty_printer *, tree);
40 1.1 mrg static void pp_cxx_binary_fold_expression (cxx_pretty_printer *, tree);
41 1.1 mrg static void pp_cxx_concept_definition (cxx_pretty_printer *, tree);
42 1.1 mrg
43 1.1 mrg
45 1.1 mrg static inline void
46 1.1 mrg pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
47 1.1 mrg {
48 1.1 mrg const char *p = pp_last_position_in_text (pp);
49 1.1 mrg
50 1.1 mrg if (p != NULL && *p == c)
51 1.1 mrg pp_cxx_whitespace (pp);
52 1.1 mrg pp_character (pp, c);
53 1.1 mrg pp->padding = pp_none;
54 1.1 mrg }
55 1.1 mrg
56 1.1 mrg #define pp_cxx_expression_list(PP, T) \
57 1.1 mrg pp_c_expression_list (PP, T)
58 1.1 mrg #define pp_cxx_space_for_pointer_operator(PP, T) \
59 1.1 mrg pp_c_space_for_pointer_operator (PP, T)
60 1.1 mrg #define pp_cxx_init_declarator(PP, T) \
61 1.1 mrg pp_c_init_declarator (PP, T)
62 1.1 mrg #define pp_cxx_call_argument_list(PP, T) \
63 1.1 mrg pp_c_call_argument_list (PP, T)
64 1.1 mrg
65 1.1 mrg void
66 1.1 mrg pp_cxx_colon_colon (cxx_pretty_printer *pp)
67 1.1 mrg {
68 1.1 mrg pp_colon_colon (pp);
69 1.1 mrg pp->padding = pp_none;
70 1.1 mrg }
71 1.1 mrg
72 1.1 mrg void
73 1.1 mrg pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
74 1.1 mrg {
75 1.1 mrg pp_cxx_nonconsecutive_character (pp, '<');
76 1.1 mrg }
77 1.1 mrg
78 1.1 mrg void
79 1.1 mrg pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
80 1.1 mrg {
81 1.1 mrg pp_cxx_nonconsecutive_character (pp, '>');
82 1.1 mrg }
83 1.1 mrg
84 1.1 mrg void
85 1.1 mrg pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
86 1.1 mrg {
87 1.1 mrg pp_separate_with (pp, c);
88 1.1 mrg pp->padding = pp_none;
89 1.1 mrg }
90 1.1 mrg
91 1.1 mrg /* Expressions. */
92 1.1 mrg
93 1.1 mrg /* conversion-function-id:
94 1.1 mrg operator conversion-type-id
95 1.1 mrg
96 1.1 mrg conversion-type-id:
97 1.1 mrg type-specifier-seq conversion-declarator(opt)
98 1.1 mrg
99 1.1 mrg conversion-declarator:
100 1.1 mrg ptr-operator conversion-declarator(opt) */
101 1.1 mrg
102 1.1 mrg static inline void
103 1.1 mrg pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
104 1.1 mrg {
105 1.1 mrg pp_cxx_ws_string (pp, "operator");
106 1.1 mrg pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
107 1.1 mrg }
108 1.1 mrg
109 1.1 mrg static inline void
110 1.1 mrg pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
111 1.1 mrg {
112 1.1 mrg pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
113 1.1 mrg pp_cxx_begin_template_argument_list (pp);
114 1.1 mrg pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
115 1.1 mrg pp_cxx_end_template_argument_list (pp);
116 1.1 mrg }
117 1.1 mrg
118 1.1 mrg /* Prints the unqualified part of the id-expression T.
119 1.1 mrg
120 1.1 mrg unqualified-id:
121 1.1 mrg identifier
122 1.1 mrg operator-function-id
123 1.1 mrg conversion-function-id
124 1.1 mrg ~ class-name
125 1.1 mrg template-id */
126 1.1 mrg
127 1.1 mrg static void
128 1.1 mrg pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
129 1.1 mrg {
130 1.1 mrg enum tree_code code = TREE_CODE (t);
131 1.1 mrg switch (code)
132 1.1 mrg {
133 1.1 mrg case RESULT_DECL:
134 1.1 mrg pp->translate_string ("<return-value>");
135 1.1 mrg break;
136 1.1 mrg
137 1.1 mrg case OVERLOAD:
138 1.1 mrg t = OVL_FIRST (t);
139 1.1 mrg /* FALLTHRU */
140 1.1 mrg case VAR_DECL:
141 1.1 mrg case PARM_DECL:
142 1.1 mrg case CONST_DECL:
143 1.1 mrg case TYPE_DECL:
144 1.1 mrg case FUNCTION_DECL:
145 1.1 mrg case NAMESPACE_DECL:
146 1.1 mrg case FIELD_DECL:
147 1.1 mrg case LABEL_DECL:
148 1.1 mrg case USING_DECL:
149 1.1 mrg case TEMPLATE_DECL:
150 1.1 mrg t = DECL_NAME (t);
151 1.1 mrg /* FALLTHRU */
152 1.1 mrg
153 1.1 mrg case IDENTIFIER_NODE:
154 1.1 mrg if (t == NULL)
155 1.1 mrg pp->translate_string ("<unnamed>");
156 1.1 mrg else if (IDENTIFIER_CONV_OP_P (t))
157 1.1 mrg pp_cxx_conversion_function_id (pp, t);
158 1.1 mrg else
159 1.1 mrg pp_cxx_tree_identifier (pp, t);
160 1.1 mrg break;
161 1.1 mrg
162 1.1 mrg case TEMPLATE_ID_EXPR:
163 1.1 mrg pp_cxx_template_id (pp, t);
164 1.1 mrg break;
165 1.1 mrg
166 1.1 mrg case BASELINK:
167 1.1 mrg pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
168 1.1 mrg break;
169 1.1 mrg
170 1.1 mrg case RECORD_TYPE:
171 1.1 mrg case UNION_TYPE:
172 1.1 mrg case ENUMERAL_TYPE:
173 1.1 mrg case TYPENAME_TYPE:
174 1.1 mrg case UNBOUND_CLASS_TEMPLATE:
175 1.1 mrg pp_cxx_unqualified_id (pp, TYPE_NAME (t));
176 1.1 mrg if (tree ti = TYPE_TEMPLATE_INFO_MAYBE_ALIAS (t))
177 1.1 mrg if (PRIMARY_TEMPLATE_P (TI_TEMPLATE (ti)))
178 1.1 mrg {
179 1.1 mrg pp_cxx_begin_template_argument_list (pp);
180 1.1 mrg tree args = INNERMOST_TEMPLATE_ARGS (TI_ARGS (ti));
181 1.1 mrg pp_cxx_template_argument_list (pp, args);
182 1.1 mrg pp_cxx_end_template_argument_list (pp);
183 1.1 mrg }
184 1.1 mrg break;
185 1.1 mrg
186 1.1 mrg case BIT_NOT_EXPR:
187 1.1 mrg pp_cxx_complement (pp);
188 1.1 mrg pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
189 1.1 mrg break;
190 1.1 mrg
191 1.1 mrg case TEMPLATE_TYPE_PARM:
192 1.1 mrg case TEMPLATE_TEMPLATE_PARM:
193 1.1 mrg if (template_placeholder_p (t))
194 1.1 mrg {
195 1.1 mrg t = TREE_TYPE (CLASS_PLACEHOLDER_TEMPLATE (t));
196 1.1 mrg pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
197 1.1 mrg pp_string (pp, "<...auto...>");
198 1.1 mrg }
199 1.1 mrg else if (TYPE_IDENTIFIER (t))
200 1.1 mrg pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
201 1.1 mrg else
202 1.1 mrg pp_cxx_canonical_template_parameter (pp, t);
203 1.1 mrg break;
204 1.1 mrg
205 1.1 mrg case TEMPLATE_PARM_INDEX:
206 1.1 mrg pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
207 1.1 mrg break;
208 1.1 mrg
209 1.1 mrg case BOUND_TEMPLATE_TEMPLATE_PARM:
210 1.1 mrg pp_cxx_cv_qualifier_seq (pp, t);
211 1.1 mrg pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
212 1.1 mrg pp_cxx_begin_template_argument_list (pp);
213 1.1 mrg pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
214 1.1 mrg pp_cxx_end_template_argument_list (pp);
215 1.1 mrg break;
216 1.1 mrg
217 1.1 mrg default:
218 1.1 mrg pp_unsupported_tree (pp, t);
219 1.1 mrg break;
220 1.1 mrg }
221 1.1 mrg }
222 1.1 mrg
223 1.1 mrg /* Pretty-print out the token sequence ":: template" in template codes
224 1.1 mrg where it is needed to "inline declare" the (following) member as
225 1.1 mrg a template. This situation arises when SCOPE of T is dependent
226 1.1 mrg on template parameters. */
227 1.1 mrg
228 1.1 mrg static inline void
229 1.1 mrg pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
230 1.1 mrg {
231 1.1 mrg if (TREE_CODE (t) == TEMPLATE_ID_EXPR
232 1.1 mrg && TYPE_P (scope) && dependent_type_p (scope))
233 1.1 mrg pp_cxx_ws_string (pp, "template");
234 1.1 mrg }
235 1.1 mrg
236 1.1 mrg /* nested-name-specifier:
237 1.1 mrg class-or-namespace-name :: nested-name-specifier(opt)
238 1.1 mrg class-or-namespace-name :: template nested-name-specifier */
239 1.1 mrg
240 1.1 mrg static void
241 1.1 mrg pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
242 1.1 mrg {
243 1.1 mrg /* FIXME: When diagnosing references to concepts (especially as types?)
244 1.1 mrg we end up adding too many '::' to the name. This is partially due
245 1.1 mrg to the fact that pp->enclosing_namespace is null. */
246 1.1 mrg if (t == global_namespace)
247 1.1 mrg {
248 1.1 mrg pp_cxx_colon_colon (pp);
249 1.1 mrg }
250 1.1 mrg else if (!SCOPE_FILE_SCOPE_P (t) && t != pp->enclosing_scope)
251 1.1 mrg {
252 1.1 mrg tree scope = get_containing_scope (t);
253 1.1 mrg pp_cxx_nested_name_specifier (pp, scope);
254 1.1 mrg pp_cxx_template_keyword_if_needed (pp, scope, t);
255 1.1 mrg pp_cxx_unqualified_id (pp, t);
256 1.1 mrg pp_cxx_colon_colon (pp);
257 1.1 mrg }
258 1.1 mrg }
259 1.1 mrg
260 1.1 mrg /* qualified-id:
261 1.1 mrg nested-name-specifier template(opt) unqualified-id */
262 1.1 mrg
263 1.1 mrg static void
264 1.1 mrg pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
265 1.1 mrg {
266 1.1 mrg switch (TREE_CODE (t))
267 1.1 mrg {
268 1.1 mrg /* A pointer-to-member is always qualified. */
269 1.1 mrg case PTRMEM_CST:
270 1.1 mrg pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
271 1.1 mrg pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
272 1.1 mrg break;
273 1.1 mrg
274 1.1 mrg /* In Standard C++, functions cannot possibly be used as
275 1.1 mrg nested-name-specifiers. However, there are situations where
276 1.1 mrg is "makes sense" to output the surrounding function name for the
277 1.1 mrg purpose of emphasizing on the scope kind. Just printing the
278 1.1 mrg function name might not be sufficient as it may be overloaded; so,
279 1.1 mrg we decorate the function with its signature too.
280 1.1 mrg FIXME: This is probably the wrong pretty-printing for conversion
281 1.1 mrg functions and some function templates. */
282 1.1 mrg case OVERLOAD:
283 1.1 mrg t = OVL_FIRST (t);
284 1.1 mrg /* FALLTHRU */
285 1.1 mrg case FUNCTION_DECL:
286 1.1 mrg if (DECL_FUNCTION_MEMBER_P (t))
287 1.1 mrg pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
288 1.1 mrg pp_cxx_unqualified_id
289 1.1 mrg (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
290 1.1 mrg pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
291 1.1 mrg break;
292 1.1 mrg
293 1.1 mrg case OFFSET_REF:
294 1.1 mrg case SCOPE_REF:
295 1.1 mrg pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
296 1.1 mrg pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
297 1.1 mrg break;
298 1.1 mrg
299 1.1 mrg default:
300 1.1 mrg {
301 1.1 mrg tree scope = get_containing_scope (t);
302 1.1 mrg if (scope != pp->enclosing_scope)
303 1.1 mrg {
304 1.1 mrg pp_cxx_nested_name_specifier (pp, scope);
305 1.1 mrg pp_cxx_template_keyword_if_needed (pp, scope, t);
306 1.1 mrg }
307 1.1 mrg pp_cxx_unqualified_id (pp, t);
308 1.1 mrg }
309 1.1 mrg break;
310 1.1 mrg }
311 1.1 mrg }
312 1.1 mrg
313 1.1 mrg /* Given a value e of ENUMERAL_TYPE:
314 1.1 mrg Print out the first ENUMERATOR id with value e, if one is found,
315 1.1 mrg (including nested names but excluding the enum name if unscoped)
316 1.1 mrg else print out the value as a C-style cast (type-id)value. */
317 1.1 mrg
318 1.1 mrg static void
319 1.1 mrg pp_cxx_enumeration_constant (cxx_pretty_printer *pp, tree e)
320 1.1 mrg {
321 1.1 mrg tree type = TREE_TYPE (e);
322 1.1 mrg tree value = NULL_TREE;
323 1.1 mrg
324 1.1 mrg /* Find the name of this constant. */
325 1.1 mrg if ((pp->flags & pp_c_flag_gnu_v3) == 0)
326 1.1 mrg for (value = TYPE_VALUES (type); value != NULL_TREE;
327 1.1 mrg value = TREE_CHAIN (value))
328 1.1 mrg if (tree_int_cst_equal (DECL_INITIAL (TREE_VALUE (value)), e))
329 1.1 mrg break;
330 1.1 mrg
331 1.1 mrg if (value != NULL_TREE)
332 1.1 mrg {
333 1.1 mrg if (!ENUM_IS_SCOPED (type))
334 1.1 mrg type = get_containing_scope (type);
335 1.1 mrg pp_cxx_nested_name_specifier (pp, type);
336 1.1 mrg pp->id_expression (TREE_PURPOSE (value));
337 1.1 mrg }
338 1.1 mrg else
339 1.1 mrg {
340 1.1 mrg /* Value must have been cast. */
341 1.1 mrg pp_c_type_cast (pp, type);
342 1.1 mrg pp_c_integer_constant (pp, e);
343 1.1 mrg }
344 1.1 mrg }
345 1.1 mrg
346 1.1 mrg
347 1.1 mrg void
348 1.1 mrg cxx_pretty_printer::constant (tree t)
349 1.1 mrg {
350 1.1 mrg switch (TREE_CODE (t))
351 1.1 mrg {
352 1.1 mrg case STRING_CST:
353 1.1 mrg {
354 1.1 mrg const bool in_parens = PAREN_STRING_LITERAL_P (t);
355 1.1 mrg if (in_parens)
356 1.1 mrg pp_cxx_left_paren (this);
357 1.1 mrg c_pretty_printer::constant (t);
358 1.1 mrg if (in_parens)
359 1.1 mrg pp_cxx_right_paren (this);
360 1.1 mrg }
361 1.1 mrg break;
362 1.1 mrg
363 1.1 mrg case INTEGER_CST:
364 1.1 mrg if (NULLPTR_TYPE_P (TREE_TYPE (t)))
365 1.1 mrg {
366 1.1 mrg pp_string (this, "nullptr");
367 1.1 mrg break;
368 1.1 mrg }
369 1.1 mrg else if (TREE_CODE (TREE_TYPE (t)) == ENUMERAL_TYPE)
370 1.1 mrg {
371 1.1 mrg pp_cxx_enumeration_constant (this, t);
372 1.1 mrg break;
373 1.1 mrg }
374 1.1 mrg /* fall through. */
375 1.1 mrg
376 1.1 mrg default:
377 1.1 mrg c_pretty_printer::constant (t);
378 1.1 mrg break;
379 1.1 mrg }
380 1.1 mrg }
381 1.1 mrg
382 1.1 mrg /* id-expression:
383 1.1 mrg unqualified-id
384 1.1 mrg qualified-id */
385 1.1 mrg
386 1.1 mrg void
387 1.1 mrg cxx_pretty_printer::id_expression (tree t)
388 1.1 mrg {
389 1.1 mrg if (TREE_CODE (t) == OVERLOAD)
390 1.1 mrg t = OVL_FIRST (t);
391 1.1 mrg if (DECL_P (t) && DECL_CONTEXT (t))
392 1.1 mrg pp_cxx_qualified_id (this, t);
393 1.1 mrg else
394 1.1 mrg pp_cxx_unqualified_id (this, t);
395 1.1 mrg }
396 1.1 mrg
397 1.1 mrg /* user-defined literal:
398 1.1 mrg literal ud-suffix */
399 1.1 mrg
400 1.1 mrg void
401 1.1 mrg pp_cxx_userdef_literal (cxx_pretty_printer *pp, tree t)
402 1.1 mrg {
403 1.1 mrg pp->constant (USERDEF_LITERAL_VALUE (t));
404 1.1 mrg pp->id_expression (USERDEF_LITERAL_SUFFIX_ID (t));
405 1.1 mrg }
406 1.1 mrg
407 1.1 mrg
408 1.1 mrg /* primary-expression:
409 1.1 mrg literal
410 1.1 mrg this
411 1.1 mrg :: identifier
412 1.1 mrg :: operator-function-id
413 1.1 mrg :: qualifier-id
414 1.1 mrg ( expression )
415 1.1 mrg id-expression
416 1.1 mrg
417 1.1 mrg GNU Extensions:
418 1.1 mrg __builtin_va_arg ( assignment-expression , type-id )
419 1.1 mrg __builtin_offsetof ( type-id, offsetof-expression )
420 1.1 mrg __builtin_addressof ( expression )
421 1.1 mrg
422 1.1 mrg __has_nothrow_assign ( type-id )
423 1.1 mrg __has_nothrow_constructor ( type-id )
424 1.1 mrg __has_nothrow_copy ( type-id )
425 1.1 mrg __has_trivial_assign ( type-id )
426 1.1 mrg __has_trivial_constructor ( type-id )
427 1.1 mrg __has_trivial_copy ( type-id )
428 1.1 mrg __has_unique_object_representations ( type-id )
429 1.1 mrg __has_trivial_destructor ( type-id )
430 1.1 mrg __has_virtual_destructor ( type-id )
431 1.1 mrg __is_abstract ( type-id )
432 1.1 mrg __is_base_of ( type-id , type-id )
433 1.1 mrg __is_class ( type-id )
434 1.1 mrg __is_empty ( type-id )
435 1.1 mrg __is_enum ( type-id )
436 1.1 mrg __is_literal_type ( type-id )
437 1.1 mrg __is_pod ( type-id )
438 1.1 mrg __is_polymorphic ( type-id )
439 1.1 mrg __is_std_layout ( type-id )
440 1.1 mrg __is_trivial ( type-id )
441 1.1 mrg __is_union ( type-id ) */
442 1.1 mrg
443 1.1 mrg void
444 1.1 mrg cxx_pretty_printer::primary_expression (tree t)
445 1.1 mrg {
446 1.1 mrg switch (TREE_CODE (t))
447 1.1 mrg {
448 1.1 mrg case VOID_CST:
449 1.1 mrg case INTEGER_CST:
450 1.1 mrg case REAL_CST:
451 1.1 mrg case COMPLEX_CST:
452 1.1 mrg case STRING_CST:
453 1.1 mrg constant (t);
454 1.1 mrg break;
455 1.1 mrg
456 1.1 mrg case USERDEF_LITERAL:
457 1.1 mrg pp_cxx_userdef_literal (this, t);
458 1.1 mrg break;
459 1.1 mrg
460 1.1 mrg case BASELINK:
461 1.1 mrg t = BASELINK_FUNCTIONS (t);
462 1.1 mrg /* FALLTHRU */
463 1.1 mrg case VAR_DECL:
464 1.1 mrg case PARM_DECL:
465 1.1 mrg case FIELD_DECL:
466 1.1 mrg case FUNCTION_DECL:
467 1.1 mrg case OVERLOAD:
468 1.1 mrg case CONST_DECL:
469 1.1 mrg case TEMPLATE_DECL:
470 1.1 mrg id_expression (t);
471 1.1 mrg break;
472 1.1 mrg
473 1.1 mrg case RESULT_DECL:
474 1.1 mrg case TEMPLATE_TYPE_PARM:
475 1.1 mrg case TEMPLATE_TEMPLATE_PARM:
476 1.1 mrg case TEMPLATE_PARM_INDEX:
477 1.1 mrg pp_cxx_unqualified_id (this, t);
478 1.1 mrg break;
479 1.1 mrg
480 1.1 mrg case STMT_EXPR:
481 1.1 mrg pp_cxx_left_paren (this);
482 1.1 mrg statement (STMT_EXPR_STMT (t));
483 1.1 mrg pp_cxx_right_paren (this);
484 1.1 mrg break;
485 1.1 mrg
486 1.1 mrg case TRAIT_EXPR:
487 1.1 mrg pp_cxx_trait_expression (this, t);
488 1.1 mrg break;
489 1.1 mrg
490 1.1 mrg case VA_ARG_EXPR:
491 1.1 mrg pp_cxx_va_arg_expression (this, t);
492 1.1 mrg break;
493 1.1 mrg
494 1.1 mrg case OFFSETOF_EXPR:
495 1.1 mrg pp_cxx_offsetof_expression (this, t);
496 1.1 mrg break;
497 1.1 mrg
498 1.1 mrg case ADDRESSOF_EXPR:
499 1.1 mrg pp_cxx_addressof_expression (this, t);
500 1.1 mrg break;
501 1.1 mrg
502 1.1 mrg case REQUIRES_EXPR:
503 1.1 mrg pp_cxx_requires_expr (this, t);
504 1.1 mrg break;
505 1.1 mrg
506 1.1 mrg default:
507 1.1 mrg c_pretty_printer::primary_expression (t);
508 1.1 mrg break;
509 1.1 mrg }
510 1.1 mrg }
511 1.1 mrg
512 1.1 mrg /* postfix-expression:
513 1.1 mrg primary-expression
514 1.1 mrg postfix-expression [ expression ]
515 1.1 mrg postfix-expression ( expression-list(opt) )
516 1.1 mrg simple-type-specifier ( expression-list(opt) )
517 1.1 mrg typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
518 1.1 mrg typename ::(opt) nested-name-specifier template(opt)
519 1.1 mrg template-id ( expression-list(opt) )
520 1.1 mrg postfix-expression . template(opt) ::(opt) id-expression
521 1.1 mrg postfix-expression -> template(opt) ::(opt) id-expression
522 1.1 mrg postfix-expression . pseudo-destructor-name
523 1.1 mrg postfix-expression -> pseudo-destructor-name
524 1.1 mrg postfix-expression ++
525 1.1 mrg postfix-expression --
526 1.1 mrg dynamic_cast < type-id > ( expression )
527 1.1 mrg static_cast < type-id > ( expression )
528 1.1 mrg reinterpret_cast < type-id > ( expression )
529 1.1 mrg const_cast < type-id > ( expression )
530 1.1 mrg typeid ( expression )
531 1.1 mrg typeid ( type-id ) */
532 1.1 mrg
533 1.1 mrg void
534 1.1 mrg cxx_pretty_printer::postfix_expression (tree t)
535 1.1 mrg {
536 1.1 mrg enum tree_code code = TREE_CODE (t);
537 1.1 mrg
538 1.1 mrg switch (code)
539 1.1 mrg {
540 1.1 mrg case AGGR_INIT_EXPR:
541 1.1 mrg case CALL_EXPR:
542 1.1 mrg {
543 1.1 mrg tree fun = cp_get_callee (t);
544 1.1 mrg tree saved_scope = enclosing_scope;
545 1.1 mrg bool skipfirst = false;
546 1.1 mrg tree arg;
547 1.1 mrg
548 1.1 mrg if (TREE_CODE (fun) == ADDR_EXPR)
549 1.1 mrg fun = TREE_OPERAND (fun, 0);
550 1.1 mrg
551 1.1 mrg /* In templates, where there is no way to tell whether a given
552 1.1 mrg call uses an actual member function. So the parser builds
553 1.1 mrg FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
554 1.1 mrg instantiation time. */
555 1.1 mrg if (TREE_CODE (fun) != FUNCTION_DECL)
556 1.1 mrg ;
557 1.1 mrg else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
558 1.1 mrg {
559 1.1 mrg tree object = (code == AGGR_INIT_EXPR
560 1.1 mrg ? (AGGR_INIT_VIA_CTOR_P (t)
561 1.1 mrg ? AGGR_INIT_EXPR_SLOT (t)
562 1.1 mrg : AGGR_INIT_EXPR_ARG (t, 0))
563 1.1 mrg : CALL_EXPR_ARG (t, 0));
564 1.1 mrg
565 1.1 mrg while (TREE_CODE (object) == NOP_EXPR)
566 1.1 mrg object = TREE_OPERAND (object, 0);
567 1.1 mrg
568 1.1 mrg if (TREE_CODE (object) == ADDR_EXPR)
569 1.1 mrg object = TREE_OPERAND (object, 0);
570 1.1 mrg
571 1.1 mrg if (!TYPE_PTR_P (TREE_TYPE (object)))
572 1.1 mrg {
573 1.1 mrg postfix_expression (object);
574 1.1 mrg pp_cxx_dot (this);
575 1.1 mrg }
576 1.1 mrg else
577 1.1 mrg {
578 1.1 mrg postfix_expression (object);
579 1.1 mrg pp_cxx_arrow (this);
580 1.1 mrg }
581 1.1 mrg skipfirst = true;
582 1.1 mrg enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
583 1.1 mrg }
584 1.1 mrg
585 1.1 mrg postfix_expression (fun);
586 1.1 mrg enclosing_scope = saved_scope;
587 1.1 mrg pp_cxx_left_paren (this);
588 1.1 mrg if (code == AGGR_INIT_EXPR)
589 1.1 mrg {
590 1.1 mrg aggr_init_expr_arg_iterator iter;
591 1.1 mrg FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
592 1.1 mrg {
593 1.1 mrg if (skipfirst)
594 1.1 mrg skipfirst = false;
595 1.1 mrg else
596 1.1 mrg {
597 1.1 mrg expression (arg);
598 1.1 mrg if (more_aggr_init_expr_args_p (&iter))
599 1.1 mrg pp_cxx_separate_with (this, ',');
600 1.1 mrg }
601 1.1 mrg }
602 1.1 mrg }
603 1.1 mrg else
604 1.1 mrg {
605 1.1 mrg call_expr_arg_iterator iter;
606 1.1 mrg FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
607 1.1 mrg {
608 1.1 mrg if (skipfirst)
609 1.1 mrg skipfirst = false;
610 1.1 mrg else
611 1.1 mrg {
612 1.1 mrg expression (arg);
613 1.1 mrg if (more_call_expr_args_p (&iter))
614 1.1 mrg pp_cxx_separate_with (this, ',');
615 1.1 mrg }
616 1.1 mrg }
617 1.1 mrg }
618 1.1 mrg pp_cxx_right_paren (this);
619 1.1 mrg }
620 1.1 mrg if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
621 1.1 mrg {
622 1.1 mrg pp_cxx_separate_with (this, ',');
623 1.1 mrg postfix_expression (AGGR_INIT_EXPR_SLOT (t));
624 1.1 mrg }
625 1.1 mrg break;
626 1.1 mrg
627 1.1 mrg case BASELINK:
628 1.1 mrg case VAR_DECL:
629 1.1 mrg case PARM_DECL:
630 1.1 mrg case FIELD_DECL:
631 1.1 mrg case FUNCTION_DECL:
632 1.1 mrg case OVERLOAD:
633 1.1 mrg case CONST_DECL:
634 1.1 mrg case TEMPLATE_DECL:
635 1.1 mrg case RESULT_DECL:
636 1.1 mrg primary_expression (t);
637 1.1 mrg break;
638 1.1 mrg
639 1.1 mrg case DYNAMIC_CAST_EXPR:
640 1.1 mrg case STATIC_CAST_EXPR:
641 1.1 mrg case REINTERPRET_CAST_EXPR:
642 1.1 mrg case CONST_CAST_EXPR:
643 1.1 mrg if (code == DYNAMIC_CAST_EXPR)
644 1.1 mrg pp_cxx_ws_string (this, "dynamic_cast");
645 1.1 mrg else if (code == STATIC_CAST_EXPR)
646 1.1 mrg pp_cxx_ws_string (this, "static_cast");
647 1.1 mrg else if (code == REINTERPRET_CAST_EXPR)
648 1.1 mrg pp_cxx_ws_string (this, "reinterpret_cast");
649 1.1 mrg else
650 1.1 mrg pp_cxx_ws_string (this, "const_cast");
651 1.1 mrg pp_cxx_begin_template_argument_list (this);
652 1.1 mrg type_id (TREE_TYPE (t));
653 1.1 mrg pp_cxx_end_template_argument_list (this);
654 1.1 mrg pp_left_paren (this);
655 1.1 mrg expression (TREE_OPERAND (t, 0));
656 1.1 mrg pp_right_paren (this);
657 1.1 mrg break;
658 1.1 mrg
659 1.1 mrg case BIT_CAST_EXPR:
660 1.1 mrg pp_cxx_ws_string (this, "__builtin_bit_cast");
661 1.1 mrg pp_left_paren (this);
662 1.1 mrg type_id (TREE_TYPE (t));
663 1.1 mrg pp_comma (this);
664 1.1 mrg expression (TREE_OPERAND (t, 0));
665 1.1 mrg pp_right_paren (this);
666 1.1 mrg break;
667 1.1 mrg
668 1.1 mrg case EMPTY_CLASS_EXPR:
669 1.1 mrg type_id (TREE_TYPE (t));
670 1.1 mrg pp_left_paren (this);
671 1.1 mrg pp_right_paren (this);
672 1.1 mrg break;
673 1.1 mrg
674 1.1 mrg case TYPEID_EXPR:
675 1.1 mrg pp_cxx_typeid_expression (this, t);
676 1.1 mrg break;
677 1.1 mrg
678 1.1 mrg case PSEUDO_DTOR_EXPR:
679 1.1 mrg postfix_expression (TREE_OPERAND (t, 0));
680 1.1 mrg pp_cxx_dot (this);
681 1.1 mrg if (TREE_OPERAND (t, 1))
682 1.1 mrg {
683 1.1 mrg pp_cxx_qualified_id (this, TREE_OPERAND (t, 1));
684 1.1 mrg pp_cxx_colon_colon (this);
685 1.1 mrg }
686 1.1 mrg pp_complement (this);
687 1.1 mrg pp_cxx_unqualified_id (this, TREE_OPERAND (t, 2));
688 1.1 mrg break;
689 1.1 mrg
690 1.1 mrg case ARROW_EXPR:
691 1.1 mrg postfix_expression (TREE_OPERAND (t, 0));
692 1.1 mrg pp_cxx_arrow (this);
693 1.1 mrg break;
694 1.1 mrg
695 1.1 mrg default:
696 1.1 mrg c_pretty_printer::postfix_expression (t);
697 1.1 mrg break;
698 1.1 mrg }
699 1.1 mrg }
700 1.1 mrg
701 1.1 mrg /* new-expression:
702 1.1 mrg ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
703 1.1 mrg ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
704 1.1 mrg
705 1.1 mrg new-placement:
706 1.1 mrg ( expression-list )
707 1.1 mrg
708 1.1 mrg new-type-id:
709 1.1 mrg type-specifier-seq new-declarator(opt)
710 1.1 mrg
711 1.1 mrg new-declarator:
712 1.1 mrg ptr-operator new-declarator(opt)
713 1.1 mrg direct-new-declarator
714 1.1 mrg
715 1.1 mrg direct-new-declarator
716 1.1 mrg [ expression ]
717 1.1 mrg direct-new-declarator [ constant-expression ]
718 1.1 mrg
719 1.1 mrg new-initializer:
720 1.1 mrg ( expression-list(opt) ) */
721 1.1 mrg
722 1.1 mrg static void
723 1.1 mrg pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
724 1.1 mrg {
725 1.1 mrg enum tree_code code = TREE_CODE (t);
726 1.1 mrg tree type = TREE_OPERAND (t, 1);
727 1.1 mrg tree init = TREE_OPERAND (t, 2);
728 1.1 mrg switch (code)
729 1.1 mrg {
730 1.1 mrg case NEW_EXPR:
731 1.1 mrg case VEC_NEW_EXPR:
732 1.1 mrg if (NEW_EXPR_USE_GLOBAL (t))
733 1.1 mrg pp_cxx_colon_colon (pp);
734 1.1 mrg pp_cxx_ws_string (pp, "new");
735 1.1 mrg if (TREE_OPERAND (t, 0))
736 1.1 mrg {
737 1.1 mrg pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
738 1.1 mrg pp_space (pp);
739 1.1 mrg }
740 1.1 mrg if (TREE_CODE (type) == ARRAY_REF)
741 1.1 mrg type = build_cplus_array_type
742 1.1 mrg (TREE_OPERAND (type, 0),
743 1.1 mrg build_index_type (fold_build2_loc (input_location,
744 1.1 mrg MINUS_EXPR, integer_type_node,
745 1.1 mrg TREE_OPERAND (type, 1),
746 1.1 mrg integer_one_node)));
747 1.1 mrg pp->type_id (type);
748 1.1 mrg if (init)
749 1.1 mrg {
750 1.1 mrg pp_left_paren (pp);
751 1.1 mrg if (TREE_CODE (init) == TREE_LIST)
752 1.1 mrg pp_c_expression_list (pp, init);
753 1.1 mrg else if (init == void_node)
754 1.1 mrg ; /* OK, empty initializer list. */
755 1.1 mrg else
756 1.1 mrg pp->expression (init);
757 1.1 mrg pp_right_paren (pp);
758 1.1 mrg }
759 1.1 mrg break;
760 1.1 mrg
761 1.1 mrg default:
762 1.1 mrg pp_unsupported_tree (pp, t);
763 1.1 mrg }
764 1.1 mrg }
765 1.1 mrg
766 1.1 mrg /* delete-expression:
767 1.1 mrg ::(opt) delete cast-expression
768 1.1 mrg ::(opt) delete [ ] cast-expression */
769 1.1 mrg
770 1.1 mrg static void
771 1.1 mrg pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
772 1.1 mrg {
773 1.1 mrg enum tree_code code = TREE_CODE (t);
774 1.1 mrg switch (code)
775 1.1 mrg {
776 1.1 mrg case DELETE_EXPR:
777 1.1 mrg case VEC_DELETE_EXPR:
778 1.1 mrg if (DELETE_EXPR_USE_GLOBAL (t))
779 1.1 mrg pp_cxx_colon_colon (pp);
780 1.1 mrg pp_cxx_ws_string (pp, "delete");
781 1.1 mrg pp_space (pp);
782 1.1 mrg if (code == VEC_DELETE_EXPR
783 1.1 mrg || DELETE_EXPR_USE_VEC (t))
784 1.1 mrg {
785 1.1 mrg pp_left_bracket (pp);
786 1.1 mrg pp_right_bracket (pp);
787 1.1 mrg pp_space (pp);
788 1.1 mrg }
789 1.1 mrg pp_c_cast_expression (pp, TREE_OPERAND (t, 0));
790 1.1 mrg break;
791 1.1 mrg
792 1.1 mrg default:
793 1.1 mrg pp_unsupported_tree (pp, t);
794 1.1 mrg }
795 1.1 mrg }
796 1.1 mrg
797 1.1 mrg /* unary-expression:
798 1.1 mrg postfix-expression
799 1.1 mrg ++ cast-expression
800 1.1 mrg -- cast-expression
801 1.1 mrg unary-operator cast-expression
802 1.1 mrg sizeof unary-expression
803 1.1 mrg sizeof ( type-id )
804 1.1 mrg sizeof ... ( identifier )
805 1.1 mrg new-expression
806 1.1 mrg delete-expression
807 1.1 mrg
808 1.1 mrg unary-operator: one of
809 1.1 mrg * & + - !
810 1.1 mrg
811 1.1 mrg GNU extensions:
812 1.1 mrg __alignof__ unary-expression
813 1.1 mrg __alignof__ ( type-id ) */
814 1.1 mrg
815 1.1 mrg void
816 1.1 mrg cxx_pretty_printer::unary_expression (tree t)
817 1.1 mrg {
818 1.1 mrg enum tree_code code = TREE_CODE (t);
819 1.1 mrg switch (code)
820 1.1 mrg {
821 1.1 mrg case NEW_EXPR:
822 1.1 mrg case VEC_NEW_EXPR:
823 1.1 mrg pp_cxx_new_expression (this, t);
824 1.1 mrg break;
825 1.1 mrg
826 1.1 mrg case DELETE_EXPR:
827 1.1 mrg case VEC_DELETE_EXPR:
828 1.1 mrg pp_cxx_delete_expression (this, t);
829 1.1 mrg break;
830 1.1 mrg
831 1.1 mrg case SIZEOF_EXPR:
832 1.1 mrg if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
833 1.1 mrg {
834 1.1 mrg pp_cxx_ws_string (this, "sizeof");
835 1.1 mrg pp_cxx_ws_string (this, "...");
836 1.1 mrg pp_cxx_whitespace (this);
837 1.1 mrg pp_cxx_left_paren (this);
838 1.1 mrg if (TYPE_P (TREE_OPERAND (t, 0)))
839 1.1 mrg type_id (TREE_OPERAND (t, 0));
840 1.1 mrg else
841 1.1 mrg unary_expression (TREE_OPERAND (t, 0));
842 1.1 mrg pp_cxx_right_paren (this);
843 1.1 mrg break;
844 1.1 mrg }
845 1.1 mrg /* Fall through */
846 1.1 mrg
847 1.1 mrg case ALIGNOF_EXPR:
848 1.1 mrg pp_cxx_ws_string (this, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
849 1.1 mrg pp_cxx_whitespace (this);
850 1.1 mrg if (TREE_CODE (t) == SIZEOF_EXPR && SIZEOF_EXPR_TYPE_P (t))
851 1.1 mrg {
852 1.1 mrg pp_cxx_left_paren (this);
853 1.1 mrg type_id (TREE_TYPE (TREE_OPERAND (t, 0)));
854 1.1 mrg pp_cxx_right_paren (this);
855 1.1 mrg }
856 1.1 mrg else if (TYPE_P (TREE_OPERAND (t, 0)))
857 1.1 mrg {
858 1.1 mrg pp_cxx_left_paren (this);
859 1.1 mrg type_id (TREE_OPERAND (t, 0));
860 1.1 mrg pp_cxx_right_paren (this);
861 1.1 mrg }
862 1.1 mrg else
863 1.1 mrg unary_expression (TREE_OPERAND (t, 0));
864 1.1 mrg break;
865 1.1 mrg
866 1.1 mrg case AT_ENCODE_EXPR:
867 1.1 mrg pp_cxx_ws_string (this, "@encode");
868 1.1 mrg pp_cxx_whitespace (this);
869 1.1 mrg pp_cxx_left_paren (this);
870 1.1 mrg type_id (TREE_OPERAND (t, 0));
871 1.1 mrg pp_cxx_right_paren (this);
872 1.1 mrg break;
873 1.1 mrg
874 1.1 mrg case NOEXCEPT_EXPR:
875 1.1 mrg pp_cxx_ws_string (this, "noexcept");
876 1.1 mrg pp_cxx_whitespace (this);
877 1.1 mrg pp_cxx_left_paren (this);
878 1.1 mrg expression (TREE_OPERAND (t, 0));
879 1.1 mrg pp_cxx_right_paren (this);
880 1.1 mrg break;
881 1.1 mrg
882 1.1 mrg case UNARY_PLUS_EXPR:
883 1.1 mrg pp_plus (this);
884 1.1 mrg pp_cxx_cast_expression (this, TREE_OPERAND (t, 0));
885 1.1 mrg break;
886 1.1 mrg
887 1.1 mrg default:
888 1.1 mrg c_pretty_printer::unary_expression (t);
889 1.1 mrg break;
890 1.1 mrg }
891 1.1 mrg }
892 1.1 mrg
893 1.1 mrg /* cast-expression:
894 1.1 mrg unary-expression
895 1.1 mrg ( type-id ) cast-expression */
896 1.1 mrg
897 1.1 mrg static void
898 1.1 mrg pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
899 1.1 mrg {
900 1.1 mrg switch (TREE_CODE (t))
901 1.1 mrg {
902 1.1 mrg case CAST_EXPR:
903 1.1 mrg case IMPLICIT_CONV_EXPR:
904 1.1 mrg pp->type_id (TREE_TYPE (t));
905 1.1 mrg pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
906 1.1 mrg break;
907 1.1 mrg
908 1.1 mrg default:
909 1.1 mrg pp_c_cast_expression (pp, t);
910 1.1 mrg break;
911 1.1 mrg }
912 1.1 mrg }
913 1.1 mrg
914 1.1 mrg /* pm-expression:
915 1.1 mrg cast-expression
916 1.1 mrg pm-expression .* cast-expression
917 1.1 mrg pm-expression ->* cast-expression */
918 1.1 mrg
919 1.1 mrg static void
920 1.1 mrg pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
921 1.1 mrg {
922 1.1 mrg switch (TREE_CODE (t))
923 1.1 mrg {
924 1.1 mrg /* Handle unfortunate OFFSET_REF overloading here. */
925 1.1 mrg case OFFSET_REF:
926 1.1 mrg if (TYPE_P (TREE_OPERAND (t, 0)))
927 1.1 mrg {
928 1.1 mrg pp_cxx_qualified_id (pp, t);
929 1.1 mrg break;
930 1.1 mrg }
931 1.1 mrg /* Fall through. */
932 1.1 mrg case MEMBER_REF:
933 1.1 mrg case DOTSTAR_EXPR:
934 1.1 mrg pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
935 1.1 mrg if (TREE_CODE (t) == MEMBER_REF)
936 1.1 mrg pp_cxx_arrow (pp);
937 1.1 mrg else
938 1.1 mrg pp_cxx_dot (pp);
939 1.1 mrg pp_star(pp);
940 1.1 mrg pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
941 1.1 mrg break;
942 1.1 mrg
943 1.1 mrg
944 1.1 mrg default:
945 1.1 mrg pp_cxx_cast_expression (pp, t);
946 1.1 mrg break;
947 1.1 mrg }
948 1.1 mrg }
949 1.1 mrg
950 1.1 mrg /* multiplicative-expression:
951 1.1 mrg pm-expression
952 1.1 mrg multiplicative-expression * pm-expression
953 1.1 mrg multiplicative-expression / pm-expression
954 1.1 mrg multiplicative-expression % pm-expression */
955 1.1 mrg
956 1.1 mrg void
957 1.1 mrg cxx_pretty_printer::multiplicative_expression (tree e)
958 1.1 mrg {
959 1.1 mrg enum tree_code code = TREE_CODE (e);
960 1.1 mrg switch (code)
961 1.1 mrg {
962 1.1 mrg case MULT_EXPR:
963 1.1 mrg case TRUNC_DIV_EXPR:
964 1.1 mrg case TRUNC_MOD_EXPR:
965 1.1 mrg case EXACT_DIV_EXPR:
966 1.1 mrg case RDIV_EXPR:
967 1.1 mrg multiplicative_expression (TREE_OPERAND (e, 0));
968 1.1 mrg pp_space (this);
969 1.1 mrg if (code == MULT_EXPR)
970 1.1 mrg pp_star (this);
971 1.1 mrg else if (code != TRUNC_MOD_EXPR)
972 1.1 mrg pp_slash (this);
973 1.1 mrg else
974 1.1 mrg pp_modulo (this);
975 1.1 mrg pp_space (this);
976 1.1 mrg pp_cxx_pm_expression (this, TREE_OPERAND (e, 1));
977 1.1 mrg break;
978 1.1 mrg
979 1.1 mrg default:
980 1.1 mrg pp_cxx_pm_expression (this, e);
981 1.1 mrg break;
982 1.1 mrg }
983 1.1 mrg }
984 1.1 mrg
985 1.1 mrg /* conditional-expression:
986 1.1 mrg logical-or-expression
987 1.1 mrg logical-or-expression ? expression : assignment-expression */
988 1.1 mrg
989 1.1 mrg void
990 1.1 mrg cxx_pretty_printer::conditional_expression (tree e)
991 1.1 mrg {
992 1.1 mrg if (TREE_CODE (e) == COND_EXPR)
993 1.1 mrg {
994 1.1 mrg pp_c_logical_or_expression (this, TREE_OPERAND (e, 0));
995 1.1 mrg pp_space (this);
996 1.1 mrg pp_question (this);
997 1.1 mrg pp_space (this);
998 1.1 mrg expression (TREE_OPERAND (e, 1));
999 1.1 mrg pp_space (this);
1000 1.1 mrg assignment_expression (TREE_OPERAND (e, 2));
1001 1.1 mrg }
1002 1.1 mrg else
1003 1.1 mrg pp_c_logical_or_expression (this, e);
1004 1.1 mrg }
1005 1.1 mrg
1006 1.1 mrg /* Pretty-print a compound assignment operator token as indicated by T. */
1007 1.1 mrg
1008 1.1 mrg static void
1009 1.1 mrg pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
1010 1.1 mrg {
1011 1.1 mrg const char *op;
1012 1.1 mrg
1013 1.1 mrg switch (TREE_CODE (t))
1014 1.1 mrg {
1015 1.1 mrg case NOP_EXPR:
1016 1.1 mrg op = "=";
1017 1.1 mrg break;
1018 1.1 mrg
1019 1.1 mrg case PLUS_EXPR:
1020 1.1 mrg op = "+=";
1021 1.1 mrg break;
1022 1.1 mrg
1023 1.1 mrg case MINUS_EXPR:
1024 1.1 mrg op = "-=";
1025 1.1 mrg break;
1026 1.1 mrg
1027 1.1 mrg case TRUNC_DIV_EXPR:
1028 1.1 mrg op = "/=";
1029 1.1 mrg break;
1030 1.1 mrg
1031 1.1 mrg case TRUNC_MOD_EXPR:
1032 1.1 mrg op = "%=";
1033 1.1 mrg break;
1034 1.1 mrg
1035 1.1 mrg default:
1036 1.1 mrg op = get_tree_code_name (TREE_CODE (t));
1037 1.1 mrg break;
1038 1.1 mrg }
1039 1.1 mrg
1040 1.1 mrg pp_cxx_ws_string (pp, op);
1041 1.1 mrg }
1042 1.1 mrg
1043 1.1 mrg
1044 1.1 mrg /* assignment-expression:
1045 1.1 mrg conditional-expression
1046 1.1 mrg logical-or-expression assignment-operator assignment-expression
1047 1.1 mrg throw-expression
1048 1.1 mrg
1049 1.1 mrg throw-expression:
1050 1.1 mrg throw assignment-expression(opt)
1051 1.1 mrg
1052 1.1 mrg assignment-operator: one of
1053 1.1 mrg = *= /= %= += -= >>= <<= &= ^= |= */
1054 1.1 mrg
1055 1.1 mrg void
1056 1.1 mrg cxx_pretty_printer::assignment_expression (tree e)
1057 1.1 mrg {
1058 1.1 mrg switch (TREE_CODE (e))
1059 1.1 mrg {
1060 1.1 mrg case MODIFY_EXPR:
1061 1.1 mrg case INIT_EXPR:
1062 1.1 mrg pp_c_logical_or_expression (this, TREE_OPERAND (e, 0));
1063 1.1 mrg pp_space (this);
1064 1.1 mrg pp_equal (this);
1065 1.1 mrg pp_space (this);
1066 1.1 mrg assignment_expression (TREE_OPERAND (e, 1));
1067 1.1 mrg break;
1068 1.1 mrg
1069 1.1 mrg case THROW_EXPR:
1070 1.1 mrg pp_cxx_ws_string (this, "throw");
1071 1.1 mrg if (TREE_OPERAND (e, 0))
1072 1.1 mrg assignment_expression (TREE_OPERAND (e, 0));
1073 1.1 mrg break;
1074 1.1 mrg
1075 1.1 mrg case MODOP_EXPR:
1076 1.1 mrg pp_c_logical_or_expression (this, TREE_OPERAND (e, 0));
1077 1.1 mrg pp_cxx_assignment_operator (this, TREE_OPERAND (e, 1));
1078 1.1 mrg assignment_expression (TREE_OPERAND (e, 2));
1079 1.1 mrg break;
1080 1.1 mrg
1081 1.1 mrg default:
1082 1.1 mrg conditional_expression (e);
1083 1.1 mrg break;
1084 1.1 mrg }
1085 1.1 mrg }
1086 1.1 mrg
1087 1.1 mrg void
1088 1.1 mrg cxx_pretty_printer::expression (tree t)
1089 1.1 mrg {
1090 1.1 mrg switch (TREE_CODE (t))
1091 1.1 mrg {
1092 1.1 mrg case STRING_CST:
1093 1.1 mrg case VOID_CST:
1094 1.1 mrg case INTEGER_CST:
1095 1.1 mrg case REAL_CST:
1096 1.1 mrg case COMPLEX_CST:
1097 1.1 mrg constant (t);
1098 1.1 mrg break;
1099 1.1 mrg
1100 1.1 mrg case USERDEF_LITERAL:
1101 1.1 mrg pp_cxx_userdef_literal (this, t);
1102 1.1 mrg break;
1103 1.1 mrg
1104 1.1 mrg case RESULT_DECL:
1105 1.1 mrg pp_cxx_unqualified_id (this, t);
1106 1.1 mrg break;
1107 1.1 mrg
1108 1.1 mrg #if 0
1109 1.1 mrg case OFFSET_REF:
1110 1.1 mrg #endif
1111 1.1 mrg case SCOPE_REF:
1112 1.1 mrg case PTRMEM_CST:
1113 1.1 mrg pp_cxx_qualified_id (this, t);
1114 1.1 mrg break;
1115 1.1 mrg
1116 1.1 mrg case OVERLOAD:
1117 1.1 mrg t = OVL_FIRST (t);
1118 1.1 mrg /* FALLTHRU */
1119 1.1 mrg case VAR_DECL:
1120 1.1 mrg case PARM_DECL:
1121 1.1 mrg case FIELD_DECL:
1122 1.1 mrg case CONST_DECL:
1123 1.1 mrg case FUNCTION_DECL:
1124 1.1 mrg case BASELINK:
1125 1.1 mrg case TEMPLATE_DECL:
1126 1.1 mrg case TEMPLATE_TYPE_PARM:
1127 1.1 mrg case TEMPLATE_PARM_INDEX:
1128 1.1 mrg case TEMPLATE_TEMPLATE_PARM:
1129 1.1 mrg case STMT_EXPR:
1130 1.1 mrg case REQUIRES_EXPR:
1131 1.1 mrg primary_expression (t);
1132 1.1 mrg break;
1133 1.1 mrg
1134 1.1 mrg case CALL_EXPR:
1135 1.1 mrg case DYNAMIC_CAST_EXPR:
1136 1.1 mrg case STATIC_CAST_EXPR:
1137 1.1 mrg case REINTERPRET_CAST_EXPR:
1138 1.1 mrg case CONST_CAST_EXPR:
1139 1.1 mrg #if 0
1140 1.1 mrg case MEMBER_REF:
1141 1.1 mrg #endif
1142 1.1 mrg case EMPTY_CLASS_EXPR:
1143 1.1 mrg case TYPEID_EXPR:
1144 1.1 mrg case PSEUDO_DTOR_EXPR:
1145 1.1 mrg case AGGR_INIT_EXPR:
1146 1.1 mrg case ARROW_EXPR:
1147 1.1 mrg postfix_expression (t);
1148 1.1 mrg break;
1149 1.1 mrg
1150 1.1 mrg case NEW_EXPR:
1151 1.1 mrg case VEC_NEW_EXPR:
1152 1.1 mrg pp_cxx_new_expression (this, t);
1153 1.1 mrg break;
1154 1.1 mrg
1155 1.1 mrg case DELETE_EXPR:
1156 1.1 mrg case VEC_DELETE_EXPR:
1157 1.1 mrg pp_cxx_delete_expression (this, t);
1158 1.1 mrg break;
1159 1.1 mrg
1160 1.1 mrg case SIZEOF_EXPR:
1161 1.1 mrg case ALIGNOF_EXPR:
1162 1.1 mrg case NOEXCEPT_EXPR:
1163 1.1 mrg case UNARY_PLUS_EXPR:
1164 1.1 mrg unary_expression (t);
1165 1.1 mrg break;
1166 1.1 mrg
1167 1.1 mrg case CAST_EXPR:
1168 1.1 mrg case IMPLICIT_CONV_EXPR:
1169 1.1 mrg pp_cxx_cast_expression (this, t);
1170 1.1 mrg break;
1171 1.1 mrg
1172 1.1 mrg case OFFSET_REF:
1173 1.1 mrg case MEMBER_REF:
1174 1.1 mrg case DOTSTAR_EXPR:
1175 1.1 mrg pp_cxx_pm_expression (this, t);
1176 1.1 mrg break;
1177 1.1 mrg
1178 1.1 mrg case MULT_EXPR:
1179 1.1 mrg case TRUNC_DIV_EXPR:
1180 1.1 mrg case TRUNC_MOD_EXPR:
1181 1.1 mrg case EXACT_DIV_EXPR:
1182 1.1 mrg case RDIV_EXPR:
1183 1.1 mrg multiplicative_expression (t);
1184 1.1 mrg break;
1185 1.1 mrg
1186 1.1 mrg case COND_EXPR:
1187 1.1 mrg conditional_expression (t);
1188 1.1 mrg break;
1189 1.1 mrg
1190 1.1 mrg case MODIFY_EXPR:
1191 1.1 mrg case INIT_EXPR:
1192 1.1 mrg case THROW_EXPR:
1193 1.1 mrg case MODOP_EXPR:
1194 1.1 mrg assignment_expression (t);
1195 1.1 mrg break;
1196 1.1 mrg
1197 1.1 mrg case NON_DEPENDENT_EXPR:
1198 1.1 mrg case MUST_NOT_THROW_EXPR:
1199 1.1 mrg expression (TREE_OPERAND (t, 0));
1200 1.1 mrg break;
1201 1.1 mrg
1202 1.1 mrg case EXPR_PACK_EXPANSION:
1203 1.1 mrg expression (PACK_EXPANSION_PATTERN (t));
1204 1.1 mrg pp_cxx_ws_string (this, "...");
1205 1.1 mrg break;
1206 1.1 mrg
1207 1.1 mrg case UNARY_LEFT_FOLD_EXPR:
1208 1.1 mrg pp_cxx_unary_left_fold_expression (this, t);
1209 1.1 mrg break;
1210 1.1 mrg
1211 1.1 mrg case UNARY_RIGHT_FOLD_EXPR:
1212 1.1 mrg pp_cxx_unary_right_fold_expression (this, t);
1213 1.1 mrg break;
1214 1.1 mrg
1215 1.1 mrg case BINARY_LEFT_FOLD_EXPR:
1216 1.1 mrg case BINARY_RIGHT_FOLD_EXPR:
1217 1.1 mrg pp_cxx_binary_fold_expression (this, t);
1218 1.1 mrg break;
1219 1.1 mrg
1220 1.1 mrg case TEMPLATE_ID_EXPR:
1221 1.1 mrg pp_cxx_template_id (this, t);
1222 1.1 mrg break;
1223 1.1 mrg
1224 1.1 mrg case NONTYPE_ARGUMENT_PACK:
1225 1.1 mrg {
1226 1.1 mrg tree args = ARGUMENT_PACK_ARGS (t);
1227 1.1 mrg int i, len = TREE_VEC_LENGTH (args);
1228 1.1 mrg pp_cxx_left_brace (this);
1229 1.1 mrg for (i = 0; i < len; ++i)
1230 1.1 mrg {
1231 1.1 mrg if (i > 0)
1232 1.1 mrg pp_cxx_separate_with (this, ',');
1233 1.1 mrg expression (TREE_VEC_ELT (args, i));
1234 1.1 mrg }
1235 1.1 mrg pp_cxx_right_brace (this);
1236 1.1 mrg }
1237 1.1 mrg break;
1238 1.1 mrg
1239 1.1 mrg case LAMBDA_EXPR:
1240 1.1 mrg pp_cxx_ws_string (this, "<lambda>");
1241 1.1 mrg break;
1242 1.1 mrg
1243 1.1 mrg case TRAIT_EXPR:
1244 1.1 mrg pp_cxx_trait_expression (this, t);
1245 1.1 mrg break;
1246 1.1 mrg
1247 1.1 mrg case ATOMIC_CONSTR:
1248 1.1 mrg case CHECK_CONSTR:
1249 1.1 mrg case CONJ_CONSTR:
1250 1.1 mrg case DISJ_CONSTR:
1251 1.1 mrg pp_cxx_constraint (this, t);
1252 1.1 mrg break;
1253 1.1 mrg
1254 1.1 mrg case PAREN_EXPR:
1255 1.1 mrg pp_cxx_left_paren (this);
1256 1.1 mrg expression (TREE_OPERAND (t, 0));
1257 1.1 mrg pp_cxx_right_paren (this);
1258 1.1 mrg break;
1259 1.1 mrg
1260 1.1 mrg default:
1261 1.1 mrg c_pretty_printer::expression (t);
1262 1.1 mrg break;
1263 1.1 mrg }
1264 1.1 mrg }
1265 1.1 mrg
1266 1.1 mrg
1267 1.1 mrg /* Declarations. */
1268 1.1 mrg
1269 1.1 mrg /* function-specifier:
1270 1.1 mrg inline
1271 1.1 mrg virtual
1272 1.1 mrg explicit */
1273 1.1 mrg
1274 1.1 mrg void
1275 1.1 mrg cxx_pretty_printer::function_specifier (tree t)
1276 1.1 mrg {
1277 1.1 mrg switch (TREE_CODE (t))
1278 1.1 mrg {
1279 1.1 mrg case FUNCTION_DECL:
1280 1.1 mrg if (DECL_VIRTUAL_P (t))
1281 1.1 mrg pp_cxx_ws_string (this, "virtual");
1282 1.1 mrg else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1283 1.1 mrg pp_cxx_ws_string (this, "explicit");
1284 1.1 mrg else
1285 1.1 mrg c_pretty_printer::function_specifier (t);
1286 1.1 mrg
1287 1.1 mrg default:
1288 1.1 mrg break;
1289 1.1 mrg }
1290 1.1 mrg }
1291 1.1 mrg
1292 1.1 mrg /* decl-specifier-seq:
1293 1.1 mrg decl-specifier-seq(opt) decl-specifier
1294 1.1 mrg
1295 1.1 mrg decl-specifier:
1296 1.1 mrg storage-class-specifier
1297 1.1 mrg type-specifier
1298 1.1 mrg function-specifier
1299 1.1 mrg friend
1300 1.1 mrg typedef */
1301 1.1 mrg
1302 1.1 mrg void
1303 1.1 mrg cxx_pretty_printer::declaration_specifiers (tree t)
1304 1.1 mrg {
1305 1.1 mrg switch (TREE_CODE (t))
1306 1.1 mrg {
1307 1.1 mrg case VAR_DECL:
1308 1.1 mrg case PARM_DECL:
1309 1.1 mrg case CONST_DECL:
1310 1.1 mrg case FIELD_DECL:
1311 1.1 mrg storage_class_specifier (t);
1312 1.1 mrg declaration_specifiers (TREE_TYPE (t));
1313 1.1 mrg break;
1314 1.1 mrg
1315 1.1 mrg case TYPE_DECL:
1316 1.1 mrg pp_cxx_ws_string (this, "typedef");
1317 1.1 mrg declaration_specifiers (TREE_TYPE (t));
1318 1.1 mrg break;
1319 1.1 mrg
1320 1.1 mrg case FUNCTION_DECL:
1321 1.1 mrg /* Constructors don't have return types. And conversion functions
1322 1.1 mrg do not have a type-specifier in their return types. */
1323 1.1 mrg if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1324 1.1 mrg function_specifier (t);
1325 1.1 mrg else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1326 1.1 mrg declaration_specifiers (TREE_TYPE (TREE_TYPE (t)));
1327 1.1 mrg else
1328 1.1 mrg c_pretty_printer::declaration_specifiers (t);
1329 1.1 mrg break;
1330 1.1 mrg default:
1331 1.1 mrg c_pretty_printer::declaration_specifiers (t);
1332 1.1 mrg break;
1333 1.1 mrg }
1334 1.1 mrg }
1335 1.1 mrg
1336 1.1 mrg /* simple-type-specifier:
1337 1.1 mrg ::(opt) nested-name-specifier(opt) type-name
1338 1.1 mrg ::(opt) nested-name-specifier(opt) template(opt) template-id
1339 1.1 mrg decltype-specifier
1340 1.1 mrg char
1341 1.1 mrg wchar_t
1342 1.1 mrg bool
1343 1.1 mrg short
1344 1.1 mrg int
1345 1.1 mrg long
1346 1.1 mrg signed
1347 1.1 mrg unsigned
1348 1.1 mrg float
1349 1.1 mrg double
1350 1.1 mrg void */
1351 1.1 mrg
1352 1.1 mrg void
1353 1.1 mrg cxx_pretty_printer::simple_type_specifier (tree t)
1354 1.1 mrg {
1355 1.1 mrg switch (TREE_CODE (t))
1356 1.1 mrg {
1357 1.1 mrg case RECORD_TYPE:
1358 1.1 mrg case UNION_TYPE:
1359 1.1 mrg case ENUMERAL_TYPE:
1360 1.1 mrg pp_cxx_qualified_id (this, t);
1361 1.1 mrg break;
1362 1.1 mrg
1363 1.1 mrg case TEMPLATE_TYPE_PARM:
1364 1.1 mrg case TEMPLATE_TEMPLATE_PARM:
1365 1.1 mrg case TEMPLATE_PARM_INDEX:
1366 1.1 mrg case BOUND_TEMPLATE_TEMPLATE_PARM:
1367 1.1 mrg pp_cxx_unqualified_id (this, t);
1368 1.1 mrg if (tree c = PLACEHOLDER_TYPE_CONSTRAINTS (t))
1369 1.1 mrg pp_cxx_constrained_type_spec (this, c);
1370 1.1 mrg break;
1371 1.1 mrg
1372 1.1 mrg case TYPENAME_TYPE:
1373 1.1 mrg pp_cxx_ws_string (this, "typename");
1374 1.1 mrg pp_cxx_nested_name_specifier (this, TYPE_CONTEXT (t));
1375 1.1 mrg pp_cxx_unqualified_id (this, TYPENAME_TYPE_FULLNAME (t));
1376 1.1 mrg break;
1377 1.1 mrg
1378 1.1 mrg case DECLTYPE_TYPE:
1379 1.1 mrg pp_cxx_ws_string (this, "decltype");
1380 1.1 mrg pp_cxx_left_paren (this);
1381 1.1 mrg this->expression (DECLTYPE_TYPE_EXPR (t));
1382 1.1 mrg pp_cxx_right_paren (this);
1383 1.1 mrg break;
1384 1.1 mrg
1385 1.1 mrg case NULLPTR_TYPE:
1386 1.1 mrg pp_cxx_ws_string (this, "std::nullptr_t");
1387 1.1 mrg break;
1388 1.1 mrg
1389 1.1 mrg default:
1390 1.1 mrg c_pretty_printer::simple_type_specifier (t);
1391 1.1 mrg break;
1392 1.1 mrg }
1393 1.1 mrg }
1394 1.1 mrg
1395 1.1 mrg /* type-specifier-seq:
1396 1.1 mrg type-specifier type-specifier-seq(opt)
1397 1.1 mrg
1398 1.1 mrg type-specifier:
1399 1.1 mrg simple-type-specifier
1400 1.1 mrg class-specifier
1401 1.1 mrg enum-specifier
1402 1.1 mrg elaborated-type-specifier
1403 1.1 mrg cv-qualifier */
1404 1.1 mrg
1405 1.1 mrg static void
1406 1.1 mrg pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1407 1.1 mrg {
1408 1.1 mrg switch (TREE_CODE (t))
1409 1.1 mrg {
1410 1.1 mrg case TEMPLATE_DECL:
1411 1.1 mrg case TEMPLATE_TYPE_PARM:
1412 1.1 mrg case TEMPLATE_TEMPLATE_PARM:
1413 1.1 mrg case TYPE_DECL:
1414 1.1 mrg case BOUND_TEMPLATE_TEMPLATE_PARM:
1415 1.1 mrg case DECLTYPE_TYPE:
1416 1.1 mrg case NULLPTR_TYPE:
1417 1.1 mrg pp_cxx_cv_qualifier_seq (pp, t);
1418 1.1 mrg pp->simple_type_specifier (t);
1419 1.1 mrg break;
1420 1.1 mrg
1421 1.1 mrg case METHOD_TYPE:
1422 1.1 mrg pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1423 1.1 mrg pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1424 1.1 mrg pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1425 1.1 mrg break;
1426 1.1 mrg
1427 1.1 mrg case RECORD_TYPE:
1428 1.1 mrg if (TYPE_PTRMEMFUNC_P (t))
1429 1.1 mrg {
1430 1.1 mrg tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1431 1.1 mrg pp->declaration_specifiers (TREE_TYPE (TREE_TYPE (pfm)));
1432 1.1 mrg pp_cxx_whitespace (pp);
1433 1.1 mrg pp_cxx_ptr_operator (pp, t);
1434 1.1 mrg break;
1435 1.1 mrg }
1436 1.1 mrg /* fall through */
1437 1.1 mrg
1438 1.1 mrg case OFFSET_TYPE:
1439 1.1 mrg if (TYPE_PTRDATAMEM_P (t))
1440 1.1 mrg {
1441 1.1 mrg pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1442 1.1 mrg pp_cxx_whitespace (pp);
1443 1.1 mrg pp_cxx_ptr_operator (pp, t);
1444 1.1 mrg break;
1445 1.1 mrg }
1446 1.1 mrg /* fall through */
1447 1.1 mrg
1448 1.1 mrg default:
1449 1.1 mrg if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1450 1.1 mrg pp_c_specifier_qualifier_list (pp, t);
1451 1.1 mrg }
1452 1.1 mrg }
1453 1.1 mrg
1454 1.1 mrg /* ptr-operator:
1455 1.1 mrg * cv-qualifier-seq(opt)
1456 1.1 mrg &
1457 1.1 mrg ::(opt) nested-name-specifier * cv-qualifier-seq(opt) */
1458 1.1 mrg
1459 1.1 mrg static void
1460 1.1 mrg pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1461 1.1 mrg {
1462 1.1 mrg if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1463 1.1 mrg t = TREE_TYPE (t);
1464 1.1 mrg switch (TREE_CODE (t))
1465 1.1 mrg {
1466 1.1 mrg case REFERENCE_TYPE:
1467 1.1 mrg case POINTER_TYPE:
1468 1.1 mrg if (TYPE_PTR_OR_PTRMEM_P (TREE_TYPE (t)))
1469 1.1 mrg pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1470 1.1 mrg pp_c_attributes_display (pp, TYPE_ATTRIBUTES (TREE_TYPE (t)));
1471 1.1 mrg if (TYPE_PTR_P (t))
1472 1.1 mrg {
1473 1.1 mrg pp_star (pp);
1474 1.1 mrg pp_cxx_cv_qualifier_seq (pp, t);
1475 1.1 mrg }
1476 1.1 mrg else
1477 1.1 mrg pp_ampersand (pp);
1478 1.1 mrg break;
1479 1.1 mrg
1480 1.1 mrg case RECORD_TYPE:
1481 1.1 mrg if (TYPE_PTRMEMFUNC_P (t))
1482 1.1 mrg {
1483 1.1 mrg pp_cxx_left_paren (pp);
1484 1.1 mrg pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1485 1.1 mrg pp_star (pp);
1486 1.1 mrg break;
1487 1.1 mrg }
1488 1.1 mrg /* FALLTHRU */
1489 1.1 mrg case OFFSET_TYPE:
1490 1.1 mrg if (TYPE_PTRMEM_P (t))
1491 1.1 mrg {
1492 1.1 mrg if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1493 1.1 mrg pp_cxx_left_paren (pp);
1494 1.1 mrg pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1495 1.1 mrg pp_star (pp);
1496 1.1 mrg pp_cxx_cv_qualifier_seq (pp, t);
1497 1.1 mrg break;
1498 1.1 mrg }
1499 1.1 mrg /* fall through. */
1500 1.1 mrg
1501 1.1 mrg default:
1502 1.1 mrg pp_unsupported_tree (pp, t);
1503 1.1 mrg break;
1504 1.1 mrg }
1505 1.1 mrg }
1506 1.1 mrg
1507 1.1 mrg static inline tree
1508 1.1 mrg pp_cxx_implicit_parameter_type (tree mf)
1509 1.1 mrg {
1510 1.1 mrg return class_of_this_parm (TREE_TYPE (mf));
1511 1.1 mrg }
1512 1.1 mrg
1513 1.1 mrg /*
1514 1.1 mrg parameter-declaration:
1515 1.1 mrg decl-specifier-seq declarator
1516 1.1 mrg decl-specifier-seq declarator = assignment-expression
1517 1.1 mrg decl-specifier-seq abstract-declarator(opt)
1518 1.1 mrg decl-specifier-seq abstract-declarator(opt) assignment-expression */
1519 1.1 mrg
1520 1.1 mrg static inline void
1521 1.1 mrg pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1522 1.1 mrg {
1523 1.1 mrg pp->declaration_specifiers (t);
1524 1.1 mrg if (TYPE_P (t))
1525 1.1 mrg pp->abstract_declarator (t);
1526 1.1 mrg else
1527 1.1 mrg pp->declarator (t);
1528 1.1 mrg }
1529 1.1 mrg
1530 1.1 mrg /* parameter-declaration-clause:
1531 1.1 mrg parameter-declaration-list(opt) ...(opt)
1532 1.1 mrg parameter-declaration-list , ...
1533 1.1 mrg
1534 1.1 mrg parameter-declaration-list:
1535 1.1 mrg parameter-declaration
1536 1.1 mrg parameter-declaration-list , parameter-declaration */
1537 1.1 mrg
1538 1.1 mrg static void
1539 1.1 mrg pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1540 1.1 mrg {
1541 1.1 mrg gcc_assert (FUNC_OR_METHOD_TYPE_P (t) || TREE_CODE (t) == FUNCTION_DECL);
1542 1.1 mrg tree types, args;
1543 1.1 mrg if (TYPE_P (t))
1544 1.1 mrg {
1545 1.1 mrg types = TYPE_ARG_TYPES (t);
1546 1.1 mrg args = NULL_TREE;
1547 1.1 mrg }
1548 1.1 mrg else
1549 1.1 mrg {
1550 1.1 mrg types = FUNCTION_FIRST_USER_PARMTYPE (t);
1551 1.1 mrg args = FUNCTION_FIRST_USER_PARM (t);
1552 1.1 mrg }
1553 1.1 mrg bool abstract = !args || (pp->flags & pp_c_flag_abstract);
1554 1.1 mrg
1555 1.1 mrg /* Skip artificial parameter for non-static member functions. */
1556 1.1 mrg if (TREE_CODE (t) == METHOD_TYPE)
1557 1.1 mrg types = TREE_CHAIN (types);
1558 1.1 mrg
1559 1.1 mrg bool first = true;
1560 1.1 mrg pp_cxx_left_paren (pp);
1561 1.1 mrg for (; types != void_list_node; types = TREE_CHAIN (types))
1562 1.1 mrg {
1563 1.1 mrg if (!first)
1564 1.1 mrg pp_cxx_separate_with (pp, ',');
1565 1.1 mrg first = false;
1566 1.1 mrg if (!types)
1567 1.1 mrg {
1568 1.1 mrg pp_cxx_ws_string (pp, "...");
1569 1.1 mrg break;
1570 1.1 mrg }
1571 1.1 mrg pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1572 1.1 mrg if (!abstract && pp->flags & pp_cxx_flag_default_argument)
1573 1.1 mrg {
1574 1.1 mrg pp_cxx_whitespace (pp);
1575 1.1 mrg pp_equal (pp);
1576 1.1 mrg pp_cxx_whitespace (pp);
1577 1.1 mrg pp->assignment_expression (TREE_PURPOSE (types));
1578 1.1 mrg }
1579 1.1 mrg if (!abstract)
1580 1.1 mrg args = TREE_CHAIN (args);
1581 1.1 mrg }
1582 1.1 mrg pp_cxx_right_paren (pp);
1583 1.1 mrg }
1584 1.1 mrg
1585 1.1 mrg /* exception-specification:
1586 1.1 mrg throw ( type-id-list(opt) )
1587 1.1 mrg
1588 1.1 mrg type-id-list
1589 1.1 mrg type-id
1590 1.1 mrg type-id-list , type-id */
1591 1.1 mrg
1592 1.1 mrg static void
1593 1.1 mrg pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1594 1.1 mrg {
1595 1.1 mrg tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1596 1.1 mrg bool need_comma = false;
1597 1.1 mrg
1598 1.1 mrg if (ex_spec == NULL)
1599 1.1 mrg return;
1600 1.1 mrg if (TREE_PURPOSE (ex_spec))
1601 1.1 mrg {
1602 1.1 mrg pp_cxx_ws_string (pp, "noexcept");
1603 1.1 mrg pp_cxx_whitespace (pp);
1604 1.1 mrg pp_cxx_left_paren (pp);
1605 1.1 mrg if (DEFERRED_NOEXCEPT_SPEC_P (ex_spec))
1606 1.1 mrg pp_cxx_ws_string (pp, "<uninstantiated>");
1607 1.1 mrg else
1608 1.1 mrg pp->expression (TREE_PURPOSE (ex_spec));
1609 1.1 mrg pp_cxx_right_paren (pp);
1610 1.1 mrg return;
1611 1.1 mrg }
1612 1.1 mrg pp_cxx_ws_string (pp, "throw");
1613 1.1 mrg pp_cxx_left_paren (pp);
1614 1.1 mrg for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1615 1.1 mrg {
1616 1.1 mrg tree type = TREE_VALUE (ex_spec);
1617 1.1 mrg tree argpack = NULL_TREE;
1618 1.1 mrg int i, len = 1;
1619 1.1 mrg
1620 1.1 mrg if (ARGUMENT_PACK_P (type))
1621 1.1 mrg {
1622 1.1 mrg argpack = ARGUMENT_PACK_ARGS (type);
1623 1.1 mrg len = TREE_VEC_LENGTH (argpack);
1624 1.1 mrg }
1625 1.1 mrg
1626 1.1 mrg for (i = 0; i < len; ++i)
1627 1.1 mrg {
1628 1.1 mrg if (argpack)
1629 1.1 mrg type = TREE_VEC_ELT (argpack, i);
1630 1.1 mrg
1631 1.1 mrg if (need_comma)
1632 1.1 mrg pp_cxx_separate_with (pp, ',');
1633 1.1 mrg else
1634 1.1 mrg need_comma = true;
1635 1.1 mrg
1636 1.1 mrg pp->type_id (type);
1637 1.1 mrg }
1638 1.1 mrg }
1639 1.1 mrg pp_cxx_right_paren (pp);
1640 1.1 mrg }
1641 1.1 mrg
1642 1.1 mrg /* direct-declarator:
1643 1.1 mrg declarator-id
1644 1.1 mrg direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1645 1.1 mrg exception-specification(opt)
1646 1.1 mrg direct-declaration [ constant-expression(opt) ]
1647 1.1 mrg ( declarator ) */
1648 1.1 mrg
1649 1.1 mrg void
1650 1.1 mrg cxx_pretty_printer::direct_declarator (tree t)
1651 1.1 mrg {
1652 1.1 mrg switch (TREE_CODE (t))
1653 1.1 mrg {
1654 1.1 mrg case VAR_DECL:
1655 1.1 mrg case PARM_DECL:
1656 1.1 mrg case CONST_DECL:
1657 1.1 mrg case FIELD_DECL:
1658 1.1 mrg if (DECL_NAME (t))
1659 1.1 mrg {
1660 1.1 mrg pp_cxx_space_for_pointer_operator (this, TREE_TYPE (t));
1661 1.1 mrg
1662 1.1 mrg if ((TREE_CODE (t) == PARM_DECL && DECL_PACK_P (t))
1663 1.1 mrg || template_parameter_pack_p (t))
1664 1.1 mrg /* A function parameter pack or non-type template
1665 1.1 mrg parameter pack. */
1666 1.1 mrg pp_cxx_ws_string (this, "...");
1667 1.1 mrg
1668 1.1 mrg id_expression (DECL_NAME (t));
1669 1.1 mrg }
1670 1.1 mrg abstract_declarator (TREE_TYPE (t));
1671 1.1 mrg break;
1672 1.1 mrg
1673 1.1 mrg case FUNCTION_DECL:
1674 1.1 mrg pp_cxx_space_for_pointer_operator (this, TREE_TYPE (TREE_TYPE (t)));
1675 1.1 mrg expression (t);
1676 1.1 mrg pp_cxx_parameter_declaration_clause (this, t);
1677 1.1 mrg
1678 1.1 mrg if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1679 1.1 mrg {
1680 1.1 mrg padding = pp_before;
1681 1.1 mrg pp_cxx_cv_qualifier_seq (this, pp_cxx_implicit_parameter_type (t));
1682 1.1 mrg }
1683 1.1 mrg
1684 1.1 mrg pp_cxx_exception_specification (this, TREE_TYPE (t));
1685 1.1 mrg break;
1686 1.1 mrg
1687 1.1 mrg case TYPENAME_TYPE:
1688 1.1 mrg case TEMPLATE_DECL:
1689 1.1 mrg case TEMPLATE_TYPE_PARM:
1690 1.1 mrg case TEMPLATE_PARM_INDEX:
1691 1.1 mrg case TEMPLATE_TEMPLATE_PARM:
1692 1.1 mrg break;
1693 1.1 mrg
1694 1.1 mrg default:
1695 1.1 mrg c_pretty_printer::direct_declarator (t);
1696 1.1 mrg break;
1697 1.1 mrg }
1698 1.1 mrg }
1699 1.1 mrg
1700 1.1 mrg /* declarator:
1701 1.1 mrg direct-declarator
1702 1.1 mrg ptr-operator declarator */
1703 1.1 mrg
1704 1.1 mrg void
1705 1.1 mrg cxx_pretty_printer::declarator (tree t)
1706 1.1 mrg {
1707 1.1 mrg direct_declarator (t);
1708 1.1 mrg
1709 1.1 mrg // Print a requires clause.
1710 1.1 mrg if (flag_concepts)
1711 1.1 mrg if (tree ci = get_constraints (t))
1712 1.1 mrg if (tree reqs = CI_DECLARATOR_REQS (ci))
1713 1.1 mrg pp_cxx_requires_clause (this, reqs);
1714 1.1 mrg }
1715 1.1 mrg
1716 1.1 mrg /* ctor-initializer:
1717 1.1 mrg : mem-initializer-list
1718 1.1 mrg
1719 1.1 mrg mem-initializer-list:
1720 1.1 mrg mem-initializer
1721 1.1 mrg mem-initializer , mem-initializer-list
1722 1.1 mrg
1723 1.1 mrg mem-initializer:
1724 1.1 mrg mem-initializer-id ( expression-list(opt) )
1725 1.1 mrg
1726 1.1 mrg mem-initializer-id:
1727 1.1 mrg ::(opt) nested-name-specifier(opt) class-name
1728 1.1 mrg identifier */
1729 1.1 mrg
1730 1.1 mrg static void
1731 1.1 mrg pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1732 1.1 mrg {
1733 1.1 mrg t = TREE_OPERAND (t, 0);
1734 1.1 mrg pp_cxx_whitespace (pp);
1735 1.1 mrg pp_colon (pp);
1736 1.1 mrg pp_cxx_whitespace (pp);
1737 1.1 mrg for (; t; t = TREE_CHAIN (t))
1738 1.1 mrg {
1739 1.1 mrg tree purpose = TREE_PURPOSE (t);
1740 1.1 mrg bool is_pack = PACK_EXPANSION_P (purpose);
1741 1.1 mrg
1742 1.1 mrg if (is_pack)
1743 1.1 mrg pp->primary_expression (PACK_EXPANSION_PATTERN (purpose));
1744 1.1 mrg else
1745 1.1 mrg pp->primary_expression (purpose);
1746 1.1 mrg pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1747 1.1 mrg if (is_pack)
1748 1.1 mrg pp_cxx_ws_string (pp, "...");
1749 1.1 mrg if (TREE_CHAIN (t))
1750 1.1 mrg pp_cxx_separate_with (pp, ',');
1751 1.1 mrg }
1752 1.1 mrg }
1753 1.1 mrg
1754 1.1 mrg /* function-definition:
1755 1.1 mrg decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1756 1.1 mrg decl-specifier-seq(opt) declarator function-try-block */
1757 1.1 mrg
1758 1.1 mrg static void
1759 1.1 mrg pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1760 1.1 mrg {
1761 1.1 mrg tree saved_scope = pp->enclosing_scope;
1762 1.1 mrg pp->declaration_specifiers (t);
1763 1.1 mrg pp->declarator (t);
1764 1.1 mrg pp_needs_newline (pp) = true;
1765 1.1 mrg pp->enclosing_scope = DECL_CONTEXT (t);
1766 1.1 mrg if (DECL_SAVED_TREE (t))
1767 1.1 mrg pp->statement (DECL_SAVED_TREE (t));
1768 1.1 mrg else
1769 1.1 mrg pp_cxx_semicolon (pp);
1770 1.1 mrg pp_newline_and_flush (pp);
1771 1.1 mrg pp->enclosing_scope = saved_scope;
1772 1.1 mrg }
1773 1.1 mrg
1774 1.1 mrg /* abstract-declarator:
1775 1.1 mrg ptr-operator abstract-declarator(opt)
1776 1.1 mrg direct-abstract-declarator */
1777 1.1 mrg
1778 1.1 mrg void
1779 1.1 mrg cxx_pretty_printer::abstract_declarator (tree t)
1780 1.1 mrg {
1781 1.1 mrg /* pp_cxx_ptr_operator prints '(' for a pointer-to-member function,
1782 1.1 mrg or a pointer-to-data-member of array type:
1783 1.1 mrg
1784 1.1 mrg void (X::*)()
1785 1.1 mrg int (X::*)[5]
1786 1.1 mrg
1787 1.1 mrg but not for a pointer-to-data-member of non-array type:
1788 1.1 mrg
1789 1.1 mrg int X::*
1790 1.1 mrg
1791 1.1 mrg so be mindful of that. */
1792 1.1 mrg if (TYPE_PTRMEMFUNC_P (t)
1793 1.1 mrg || (TYPE_PTRDATAMEM_P (t)
1794 1.1 mrg && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE))
1795 1.1 mrg pp_cxx_right_paren (this);
1796 1.1 mrg else if (INDIRECT_TYPE_P (t))
1797 1.1 mrg {
1798 1.1 mrg if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1799 1.1 mrg || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1800 1.1 mrg pp_cxx_right_paren (this);
1801 1.1 mrg t = TREE_TYPE (t);
1802 1.1 mrg }
1803 1.1 mrg direct_abstract_declarator (t);
1804 1.1 mrg }
1805 1.1 mrg
1806 1.1 mrg /* direct-abstract-declarator:
1807 1.1 mrg direct-abstract-declarator(opt) ( parameter-declaration-clause )
1808 1.1 mrg cv-qualifier-seq(opt) exception-specification(opt)
1809 1.1 mrg direct-abstract-declarator(opt) [ constant-expression(opt) ]
1810 1.1 mrg ( abstract-declarator ) */
1811 1.1 mrg
1812 1.1 mrg void
1813 1.1 mrg cxx_pretty_printer::direct_abstract_declarator (tree t)
1814 1.1 mrg {
1815 1.1 mrg switch (TREE_CODE (t))
1816 1.1 mrg {
1817 1.1 mrg case REFERENCE_TYPE:
1818 1.1 mrg abstract_declarator (t);
1819 1.1 mrg break;
1820 1.1 mrg
1821 1.1 mrg case RECORD_TYPE:
1822 1.1 mrg if (TYPE_PTRMEMFUNC_P (t))
1823 1.1 mrg direct_abstract_declarator (TYPE_PTRMEMFUNC_FN_TYPE (t));
1824 1.1 mrg break;
1825 1.1 mrg
1826 1.1 mrg case OFFSET_TYPE:
1827 1.1 mrg if (TYPE_PTRDATAMEM_P (t))
1828 1.1 mrg direct_abstract_declarator (TREE_TYPE (t));
1829 1.1 mrg break;
1830 1.1 mrg
1831 1.1 mrg case METHOD_TYPE:
1832 1.1 mrg case FUNCTION_TYPE:
1833 1.1 mrg pp_cxx_parameter_declaration_clause (this, t);
1834 1.1 mrg direct_abstract_declarator (TREE_TYPE (t));
1835 1.1 mrg if (TREE_CODE (t) == METHOD_TYPE)
1836 1.1 mrg {
1837 1.1 mrg padding = pp_before;
1838 1.1 mrg pp_cxx_cv_qualifier_seq (this, class_of_this_parm (t));
1839 1.1 mrg }
1840 1.1 mrg pp_cxx_exception_specification (this, t);
1841 1.1 mrg break;
1842 1.1 mrg
1843 1.1 mrg case TYPENAME_TYPE:
1844 1.1 mrg case TEMPLATE_TYPE_PARM:
1845 1.1 mrg case TEMPLATE_TEMPLATE_PARM:
1846 1.1 mrg case BOUND_TEMPLATE_TEMPLATE_PARM:
1847 1.1 mrg case UNBOUND_CLASS_TEMPLATE:
1848 1.1 mrg case DECLTYPE_TYPE:
1849 1.1 mrg break;
1850 1.1 mrg
1851 1.1 mrg default:
1852 1.1 mrg c_pretty_printer::direct_abstract_declarator (t);
1853 1.1 mrg break;
1854 1.1 mrg }
1855 1.1 mrg }
1856 1.1 mrg
1857 1.1 mrg /* type-id:
1858 1.1 mrg type-specifier-seq abstract-declarator(opt) */
1859 1.1 mrg
1860 1.1 mrg void
1861 1.1 mrg cxx_pretty_printer::type_id (tree t)
1862 1.1 mrg {
1863 1.1 mrg pp_flags saved_flags = flags;
1864 1.1 mrg flags |= pp_c_flag_abstract;
1865 1.1 mrg
1866 1.1 mrg switch (TREE_CODE (t))
1867 1.1 mrg {
1868 1.1 mrg case TYPE_DECL:
1869 1.1 mrg case UNION_TYPE:
1870 1.1 mrg case RECORD_TYPE:
1871 1.1 mrg case ENUMERAL_TYPE:
1872 1.1 mrg case TYPENAME_TYPE:
1873 1.1 mrg case BOUND_TEMPLATE_TEMPLATE_PARM:
1874 1.1 mrg case UNBOUND_CLASS_TEMPLATE:
1875 1.1 mrg case TEMPLATE_TEMPLATE_PARM:
1876 1.1 mrg case TEMPLATE_TYPE_PARM:
1877 1.1 mrg case TEMPLATE_PARM_INDEX:
1878 1.1 mrg case TEMPLATE_DECL:
1879 1.1 mrg case TYPEOF_TYPE:
1880 1.1 mrg case UNDERLYING_TYPE:
1881 1.1 mrg case DECLTYPE_TYPE:
1882 1.1 mrg case NULLPTR_TYPE:
1883 1.1 mrg case TEMPLATE_ID_EXPR:
1884 1.1 mrg case OFFSET_TYPE:
1885 1.1 mrg pp_cxx_type_specifier_seq (this, t);
1886 1.1 mrg if (TYPE_PTRMEM_P (t))
1887 1.1 mrg abstract_declarator (t);
1888 1.1 mrg break;
1889 1.1 mrg
1890 1.1 mrg case TYPE_PACK_EXPANSION:
1891 1.1 mrg type_id (PACK_EXPANSION_PATTERN (t));
1892 1.1 mrg pp_cxx_ws_string (this, "...");
1893 1.1 mrg break;
1894 1.1 mrg
1895 1.1 mrg case TYPE_ARGUMENT_PACK:
1896 1.1 mrg {
1897 1.1 mrg tree args = ARGUMENT_PACK_ARGS (t);
1898 1.1 mrg int len = TREE_VEC_LENGTH (args);
1899 1.1 mrg pp_cxx_left_brace (this);
1900 1.1 mrg for (int i = 0; i < len; ++i)
1901 1.1 mrg {
1902 1.1 mrg if (i > 0)
1903 1.1 mrg pp_cxx_separate_with (this, ',');
1904 1.1 mrg type_id (TREE_VEC_ELT (args, i));
1905 1.1 mrg }
1906 1.1 mrg pp_cxx_right_brace (this);
1907 1.1 mrg }
1908 1.1 mrg break;
1909 1.1 mrg
1910 1.1 mrg default:
1911 1.1 mrg c_pretty_printer::type_id (t);
1912 1.1 mrg break;
1913 1.1 mrg }
1914 1.1 mrg
1915 1.1 mrg flags = saved_flags;
1916 1.1 mrg }
1917 1.1 mrg
1918 1.1 mrg /* template-argument-list:
1919 1.1 mrg template-argument ...(opt)
1920 1.1 mrg template-argument-list, template-argument ...(opt)
1921 1.1 mrg
1922 1.1 mrg template-argument:
1923 1.1 mrg assignment-expression
1924 1.1 mrg type-id
1925 1.1 mrg template-name */
1926 1.1 mrg
1927 1.1 mrg static void
1928 1.1 mrg pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1929 1.1 mrg {
1930 1.1 mrg int i;
1931 1.1 mrg bool need_comma = false;
1932 1.1 mrg
1933 1.1 mrg if (t == NULL)
1934 1.1 mrg return;
1935 1.1 mrg for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1936 1.1 mrg {
1937 1.1 mrg tree arg = TREE_VEC_ELT (t, i);
1938 1.1 mrg tree argpack = NULL_TREE;
1939 1.1 mrg int idx, len = 1;
1940 1.1 mrg
1941 1.1 mrg if (ARGUMENT_PACK_P (arg))
1942 1.1 mrg {
1943 1.1 mrg argpack = ARGUMENT_PACK_ARGS (arg);
1944 1.1 mrg len = TREE_VEC_LENGTH (argpack);
1945 1.1 mrg }
1946 1.1 mrg
1947 1.1 mrg for (idx = 0; idx < len; idx++)
1948 1.1 mrg {
1949 1.1 mrg if (argpack)
1950 1.1 mrg arg = TREE_VEC_ELT (argpack, idx);
1951 1.1 mrg
1952 1.1 mrg if (need_comma)
1953 1.1 mrg pp_cxx_separate_with (pp, ',');
1954 1.1 mrg else
1955 1.1 mrg need_comma = true;
1956 1.1 mrg
1957 1.1 mrg if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1958 1.1 mrg && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1959 1.1 mrg pp->type_id (arg);
1960 1.1 mrg else if (template_parm_object_p (arg))
1961 1.1 mrg pp->expression (DECL_INITIAL (arg));
1962 1.1 mrg else
1963 1.1 mrg pp->expression (arg);
1964 1.1 mrg }
1965 1.1 mrg }
1966 1.1 mrg }
1967 1.1 mrg
1968 1.1 mrg
1969 1.1 mrg static void
1970 1.1 mrg pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1971 1.1 mrg {
1972 1.1 mrg t = DECL_EXPR_DECL (t);
1973 1.1 mrg pp_cxx_type_specifier_seq (pp, t);
1974 1.1 mrg if (TYPE_P (t))
1975 1.1 mrg pp->abstract_declarator (t);
1976 1.1 mrg else
1977 1.1 mrg pp->declarator (t);
1978 1.1 mrg }
1979 1.1 mrg
1980 1.1 mrg /* Statements. */
1981 1.1 mrg
1982 1.1 mrg void
1983 1.1 mrg cxx_pretty_printer::statement (tree t)
1984 1.1 mrg {
1985 1.1 mrg switch (TREE_CODE (t))
1986 1.1 mrg {
1987 1.1 mrg case CTOR_INITIALIZER:
1988 1.1 mrg pp_cxx_ctor_initializer (this, t);
1989 1.1 mrg break;
1990 1.1 mrg
1991 1.1 mrg case USING_STMT:
1992 1.1 mrg pp_cxx_ws_string (this, "using");
1993 1.1 mrg pp_cxx_ws_string (this, "namespace");
1994 1.1 mrg if (DECL_CONTEXT (t))
1995 1.1 mrg pp_cxx_nested_name_specifier (this, DECL_CONTEXT (t));
1996 1.1 mrg pp_cxx_qualified_id (this, USING_STMT_NAMESPACE (t));
1997 1.1 mrg break;
1998 1.1 mrg
1999 1.1 mrg case USING_DECL:
2000 1.1 mrg pp_cxx_ws_string (this, "using");
2001 1.1 mrg pp_cxx_nested_name_specifier (this, USING_DECL_SCOPE (t));
2002 1.1 mrg pp_cxx_unqualified_id (this, DECL_NAME (t));
2003 1.1 mrg break;
2004 1.1 mrg
2005 1.1 mrg case EH_SPEC_BLOCK:
2006 1.1 mrg break;
2007 1.1 mrg
2008 1.1 mrg /* try-block:
2009 1.1 mrg try compound-statement handler-seq */
2010 1.1 mrg case TRY_BLOCK:
2011 1.1 mrg pp_maybe_newline_and_indent (this, 0);
2012 1.1 mrg pp_cxx_ws_string (this, "try");
2013 1.1 mrg pp_newline_and_indent (this, 3);
2014 1.1 mrg statement (TRY_STMTS (t));
2015 1.1 mrg pp_newline_and_indent (this, -3);
2016 1.1 mrg if (CLEANUP_P (t))
2017 1.1 mrg ;
2018 1.1 mrg else
2019 1.1 mrg statement (TRY_HANDLERS (t));
2020 1.1 mrg break;
2021 1.1 mrg
2022 1.1 mrg /*
2023 1.1 mrg handler-seq:
2024 1.1 mrg handler handler-seq(opt)
2025 1.1 mrg
2026 1.1 mrg handler:
2027 1.1 mrg catch ( exception-declaration ) compound-statement
2028 1.1 mrg
2029 1.1 mrg exception-declaration:
2030 1.1 mrg type-specifier-seq declarator
2031 1.1 mrg type-specifier-seq abstract-declarator
2032 1.1 mrg ... */
2033 1.1 mrg case HANDLER:
2034 1.1 mrg pp_cxx_ws_string (this, "catch");
2035 1.1 mrg pp_cxx_left_paren (this);
2036 1.1 mrg pp_cxx_exception_declaration (this, HANDLER_PARMS (t));
2037 1.1 mrg pp_cxx_right_paren (this);
2038 1.1 mrg pp_indentation (this) += 3;
2039 1.1 mrg pp_needs_newline (this) = true;
2040 1.1 mrg statement (HANDLER_BODY (t));
2041 1.1 mrg pp_indentation (this) -= 3;
2042 1.1 mrg pp_needs_newline (this) = true;
2043 1.1 mrg break;
2044 1.1 mrg
2045 1.1 mrg /* selection-statement:
2046 1.1 mrg if ( expression ) statement
2047 1.1 mrg if ( expression ) statement else statement */
2048 1.1 mrg case IF_STMT:
2049 1.1 mrg pp_cxx_ws_string (this, "if");
2050 1.1 mrg pp_cxx_whitespace (this);
2051 1.1 mrg pp_cxx_left_paren (this);
2052 1.1 mrg expression (IF_COND (t));
2053 1.1 mrg pp_cxx_right_paren (this);
2054 1.1 mrg pp_newline_and_indent (this, 2);
2055 1.1 mrg statement (THEN_CLAUSE (t));
2056 1.1 mrg pp_newline_and_indent (this, -2);
2057 1.1 mrg if (ELSE_CLAUSE (t))
2058 1.1 mrg {
2059 1.1 mrg tree else_clause = ELSE_CLAUSE (t);
2060 1.1 mrg pp_cxx_ws_string (this, "else");
2061 1.1 mrg if (TREE_CODE (else_clause) == IF_STMT)
2062 1.1 mrg pp_cxx_whitespace (this);
2063 1.1 mrg else
2064 1.1 mrg pp_newline_and_indent (this, 2);
2065 1.1 mrg statement (else_clause);
2066 1.1 mrg if (TREE_CODE (else_clause) != IF_STMT)
2067 1.1 mrg pp_newline_and_indent (this, -2);
2068 1.1 mrg }
2069 1.1 mrg break;
2070 1.1 mrg
2071 1.1 mrg case RANGE_FOR_STMT:
2072 1.1 mrg pp_cxx_ws_string (this, "for");
2073 1.1 mrg pp_space (this);
2074 1.1 mrg pp_cxx_left_paren (this);
2075 1.1 mrg if (RANGE_FOR_INIT_STMT (t))
2076 1.1 mrg {
2077 1.1 mrg statement (RANGE_FOR_INIT_STMT (t));
2078 1.1 mrg pp_needs_newline (this) = false;
2079 1.1 mrg pp_cxx_whitespace (this);
2080 1.1 mrg }
2081 1.1 mrg statement (RANGE_FOR_DECL (t));
2082 1.1 mrg pp_space (this);
2083 1.1 mrg pp_needs_newline (this) = false;
2084 1.1 mrg pp_colon (this);
2085 1.1 mrg pp_space (this);
2086 1.1 mrg statement (RANGE_FOR_EXPR (t));
2087 1.1 mrg pp_cxx_right_paren (this);
2088 1.1 mrg pp_newline_and_indent (this, 3);
2089 1.1 mrg statement (FOR_BODY (t));
2090 1.1 mrg pp_indentation (this) -= 3;
2091 1.1 mrg pp_needs_newline (this) = true;
2092 1.1 mrg break;
2093 1.1 mrg
2094 1.1 mrg /* expression-statement:
2095 1.1 mrg expression(opt) ; */
2096 1.1 mrg case EXPR_STMT:
2097 1.1 mrg expression (EXPR_STMT_EXPR (t));
2098 1.1 mrg pp_cxx_semicolon (this);
2099 1.1 mrg pp_needs_newline (this) = true;
2100 1.1 mrg break;
2101 1.1 mrg
2102 1.1 mrg case CLEANUP_STMT:
2103 1.1 mrg pp_cxx_ws_string (this, "try");
2104 1.1 mrg pp_newline_and_indent (this, 2);
2105 1.1 mrg statement (CLEANUP_BODY (t));
2106 1.1 mrg pp_newline_and_indent (this, -2);
2107 1.1 mrg pp_cxx_ws_string (this, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
2108 1.1 mrg pp_newline_and_indent (this, 2);
2109 1.1 mrg statement (CLEANUP_EXPR (t));
2110 1.1 mrg pp_newline_and_indent (this, -2);
2111 1.1 mrg break;
2112 1.1 mrg
2113 1.1 mrg case STATIC_ASSERT:
2114 1.1 mrg declaration (t);
2115 1.1 mrg break;
2116 1.1 mrg
2117 1.1 mrg case OMP_DEPOBJ:
2118 1.1 mrg pp_cxx_ws_string (this, "#pragma omp depobj");
2119 1.1 mrg pp_space (this);
2120 1.1 mrg pp_cxx_left_paren (this);
2121 1.1 mrg expression (OMP_DEPOBJ_DEPOBJ (t));
2122 1.1 mrg pp_cxx_right_paren (this);
2123 1.1 mrg if (OMP_DEPOBJ_CLAUSES (t) && OMP_DEPOBJ_CLAUSES (t) != error_mark_node)
2124 1.1 mrg {
2125 1.1 mrg if (TREE_CODE (OMP_DEPOBJ_CLAUSES (t)) == OMP_CLAUSE)
2126 1.1 mrg dump_omp_clauses (this, OMP_DEPOBJ_CLAUSES (t),
2127 1.1 mrg pp_indentation (this), TDF_NONE);
2128 1.1 mrg else
2129 1.1 mrg switch (tree_to_uhwi (OMP_DEPOBJ_CLAUSES (t)))
2130 1.1 mrg {
2131 1.1 mrg case OMP_CLAUSE_DEPEND_IN:
2132 1.1 mrg pp_cxx_ws_string (this, " update(in)");
2133 1.1 mrg break;
2134 1.1 mrg case OMP_CLAUSE_DEPEND_INOUT:
2135 1.1 mrg pp_cxx_ws_string (this, " update(inout)");
2136 1.1 mrg break;
2137 1.1 mrg case OMP_CLAUSE_DEPEND_OUT:
2138 1.1 mrg pp_cxx_ws_string (this, " update(out)");
2139 1.1 mrg break;
2140 1.1 mrg case OMP_CLAUSE_DEPEND_MUTEXINOUTSET:
2141 1.1 mrg pp_cxx_ws_string (this, " update(mutexinoutset)");
2142 1.1 mrg break;
2143 1.1 mrg case OMP_CLAUSE_DEPEND_LAST:
2144 1.1 mrg pp_cxx_ws_string (this, " destroy");
2145 1.1 mrg break;
2146 1.1 mrg default:
2147 1.1 mrg break;
2148 1.1 mrg }
2149 1.1 mrg }
2150 1.1 mrg pp_needs_newline (this) = true;
2151 1.1 mrg break;
2152 1.1 mrg
2153 1.1 mrg default:
2154 1.1 mrg c_pretty_printer::statement (t);
2155 1.1 mrg break;
2156 1.1 mrg }
2157 1.1 mrg }
2158 1.1 mrg
2159 1.1 mrg /* original-namespace-definition:
2160 1.1 mrg namespace identifier { namespace-body }
2161 1.1 mrg
2162 1.1 mrg As an edge case, we also handle unnamed namespace definition here. */
2163 1.1 mrg
2164 1.1 mrg static void
2165 1.1 mrg pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
2166 1.1 mrg {
2167 1.1 mrg pp_cxx_ws_string (pp, "namespace");
2168 1.1 mrg if (DECL_CONTEXT (t))
2169 1.1 mrg pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2170 1.1 mrg if (DECL_NAME (t))
2171 1.1 mrg pp_cxx_unqualified_id (pp, t);
2172 1.1 mrg pp_cxx_whitespace (pp);
2173 1.1 mrg pp_cxx_left_brace (pp);
2174 1.1 mrg /* We do not print the namespace-body. */
2175 1.1 mrg pp_cxx_whitespace (pp);
2176 1.1 mrg pp_cxx_right_brace (pp);
2177 1.1 mrg }
2178 1.1 mrg
2179 1.1 mrg /* namespace-alias:
2180 1.1 mrg identifier
2181 1.1 mrg
2182 1.1 mrg namespace-alias-definition:
2183 1.1 mrg namespace identifier = qualified-namespace-specifier ;
2184 1.1 mrg
2185 1.1 mrg qualified-namespace-specifier:
2186 1.1 mrg ::(opt) nested-name-specifier(opt) namespace-name */
2187 1.1 mrg
2188 1.1 mrg static void
2189 1.1 mrg pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
2190 1.1 mrg {
2191 1.1 mrg pp_cxx_ws_string (pp, "namespace");
2192 1.1 mrg if (DECL_CONTEXT (t))
2193 1.1 mrg pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
2194 1.1 mrg pp_cxx_unqualified_id (pp, t);
2195 1.1 mrg pp_cxx_whitespace (pp);
2196 1.1 mrg pp_equal (pp);
2197 1.1 mrg pp_cxx_whitespace (pp);
2198 1.1 mrg if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
2199 1.1 mrg pp_cxx_nested_name_specifier (pp,
2200 1.1 mrg DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
2201 1.1 mrg pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
2202 1.1 mrg pp_cxx_semicolon (pp);
2203 1.1 mrg }
2204 1.1 mrg
2205 1.1 mrg /* simple-declaration:
2206 1.1 mrg decl-specifier-seq(opt) init-declarator-list(opt) */
2207 1.1 mrg
2208 1.1 mrg static void
2209 1.1 mrg pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
2210 1.1 mrg {
2211 1.1 mrg pp->declaration_specifiers (t);
2212 1.1 mrg pp_cxx_init_declarator (pp, t);
2213 1.1 mrg pp_cxx_semicolon (pp);
2214 1.1 mrg pp_needs_newline (pp) = true;
2215 1.1 mrg }
2216 1.1 mrg
2217 1.1 mrg /*
2218 1.1 mrg template-parameter-list:
2219 1.1 mrg template-parameter
2220 1.1 mrg template-parameter-list , template-parameter */
2221 1.1 mrg
2222 1.1 mrg static inline void
2223 1.1 mrg pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2224 1.1 mrg {
2225 1.1 mrg const int n = TREE_VEC_LENGTH (t);
2226 1.1 mrg int i;
2227 1.1 mrg for (i = 0; i < n; ++i)
2228 1.1 mrg {
2229 1.1 mrg if (i)
2230 1.1 mrg pp_cxx_separate_with (pp, ',');
2231 1.1 mrg pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2232 1.1 mrg }
2233 1.1 mrg }
2234 1.1 mrg
2235 1.1 mrg /* template-parameter:
2236 1.1 mrg type-parameter
2237 1.1 mrg parameter-declaration
2238 1.1 mrg
2239 1.1 mrg type-parameter:
2240 1.1 mrg class ...(opt) identifier(opt)
2241 1.1 mrg class identifier(opt) = type-id
2242 1.1 mrg typename identifier(opt)
2243 1.1 mrg typename ...(opt) identifier(opt) = type-id
2244 1.1 mrg template < template-parameter-list > class ...(opt) identifier(opt)
2245 1.1 mrg template < template-parameter-list > class identifier(opt) = template-name */
2246 1.1 mrg
2247 1.1 mrg static void
2248 1.1 mrg pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2249 1.1 mrg {
2250 1.1 mrg tree parameter = TREE_VALUE (t);
2251 1.1 mrg switch (TREE_CODE (parameter))
2252 1.1 mrg {
2253 1.1 mrg case TYPE_DECL:
2254 1.1 mrg pp_cxx_ws_string (pp, "class");
2255 1.1 mrg if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2256 1.1 mrg pp_cxx_ws_string (pp, "...");
2257 1.1 mrg if (DECL_NAME (parameter))
2258 1.1 mrg pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2259 1.1 mrg /* FIXME: Check if we should print also default argument. */
2260 1.1 mrg break;
2261 1.1 mrg
2262 1.1 mrg case PARM_DECL:
2263 1.1 mrg pp_cxx_parameter_declaration (pp, parameter);
2264 1.1 mrg break;
2265 1.1 mrg
2266 1.1 mrg case TEMPLATE_DECL:
2267 1.1 mrg break;
2268 1.1 mrg
2269 1.1 mrg default:
2270 1.1 mrg pp_unsupported_tree (pp, t);
2271 1.1 mrg break;
2272 1.1 mrg }
2273 1.1 mrg }
2274 1.1 mrg
2275 1.1 mrg /* Pretty-print a template parameter in the canonical form
2276 1.1 mrg "template-parameter-<level>-<position in parameter list>". */
2277 1.1 mrg
2278 1.1 mrg void
2279 1.1 mrg pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2280 1.1 mrg {
2281 1.1 mrg const enum tree_code code = TREE_CODE (parm);
2282 1.1 mrg
2283 1.1 mrg /* Brings type template parameters to the canonical forms. */
2284 1.1 mrg if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2285 1.1 mrg || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2286 1.1 mrg parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2287 1.1 mrg
2288 1.1 mrg pp_cxx_begin_template_argument_list (pp);
2289 1.1 mrg pp->translate_string ("template-parameter-");
2290 1.1 mrg pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2291 1.1 mrg pp_minus (pp);
2292 1.1 mrg pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2293 1.1 mrg pp_cxx_end_template_argument_list (pp);
2294 1.1 mrg }
2295 1.1 mrg
2296 1.1 mrg /* Print a constrained-type-specifier. */
2297 1.1 mrg
2298 1.1 mrg void
2299 1.1 mrg pp_cxx_constrained_type_spec (cxx_pretty_printer *pp, tree c)
2300 1.1 mrg {
2301 1.1 mrg pp_cxx_whitespace (pp);
2302 1.1 mrg pp_cxx_left_bracket (pp);
2303 1.1 mrg pp->translate_string ("requires");
2304 1.1 mrg pp_cxx_whitespace (pp);
2305 1.1 mrg if (c == error_mark_node)
2306 1.1 mrg {
2307 1.1 mrg pp_cxx_ws_string(pp, "<unsatisfied-type-constraint>");
2308 1.1 mrg return;
2309 1.1 mrg }
2310 1.1 mrg tree t, a;
2311 1.1 mrg placeholder_extract_concept_and_args (c, t, a);
2312 1.1 mrg pp->id_expression (t);
2313 1.1 mrg pp_cxx_begin_template_argument_list (pp);
2314 1.1 mrg pp_cxx_ws_string (pp, "<placeholder>");
2315 1.1 mrg pp_cxx_separate_with (pp, ',');
2316 1.1 mrg tree args = make_tree_vec (TREE_VEC_LENGTH (a) - 1);
2317 1.1 mrg for (int i = 0; i < TREE_VEC_LENGTH (a) - 1; ++i)
2318 1.1 mrg TREE_VEC_ELT (args, i) = TREE_VEC_ELT (a, i + 1);
2319 1.1 mrg pp_cxx_template_argument_list (pp, args);
2320 1.1 mrg ggc_free (args);
2321 1.1 mrg pp_cxx_end_template_argument_list (pp);
2322 1.1 mrg pp_cxx_right_bracket (pp);
2323 1.1 mrg }
2324 1.1 mrg
2325 1.1 mrg /*
2326 1.1 mrg template-declaration:
2327 1.1 mrg export(opt) template < template-parameter-list > declaration
2328 1.1 mrg
2329 1.1 mrg Concept extensions:
2330 1.1 mrg
2331 1.1 mrg template-declaration:
2332 1.1 mrg export(opt) template < template-parameter-list >
2333 1.1 mrg requires-clause(opt) declaration */
2334 1.1 mrg
2335 1.1 mrg static void
2336 1.1 mrg pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2337 1.1 mrg {
2338 1.1 mrg tree tmpl = most_general_template (t);
2339 1.1 mrg tree level;
2340 1.1 mrg
2341 1.1 mrg pp_maybe_newline_and_indent (pp, 0);
2342 1.1 mrg for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2343 1.1 mrg {
2344 1.1 mrg pp_cxx_ws_string (pp, "template");
2345 1.1 mrg pp_cxx_begin_template_argument_list (pp);
2346 1.1 mrg pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2347 1.1 mrg pp_cxx_end_template_argument_list (pp);
2348 1.1 mrg pp_newline_and_indent (pp, 3);
2349 1.1 mrg }
2350 1.1 mrg
2351 1.1 mrg if (flag_concepts)
2352 1.1 mrg if (tree ci = get_constraints (t))
2353 1.1 mrg if (tree reqs = CI_TEMPLATE_REQS (ci))
2354 1.1 mrg {
2355 1.1 mrg pp_cxx_requires_clause (pp, reqs);
2356 1.1 mrg pp_newline_and_indent (pp, 6);
2357 1.1 mrg }
2358 1.1 mrg
2359 1.1 mrg if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2360 1.1 mrg pp_cxx_function_definition (pp, t);
2361 1.1 mrg else if (TREE_CODE (t) == CONCEPT_DECL)
2362 1.1 mrg pp_cxx_concept_definition (pp, t);
2363 1.1 mrg else
2364 1.1 mrg pp_cxx_simple_declaration (pp, t);
2365 1.1 mrg }
2366 1.1 mrg
2367 1.1 mrg static void
2368 1.1 mrg pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2369 1.1 mrg {
2370 1.1 mrg pp_unsupported_tree (pp, t);
2371 1.1 mrg }
2372 1.1 mrg
2373 1.1 mrg static void
2374 1.1 mrg pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2375 1.1 mrg {
2376 1.1 mrg pp_unsupported_tree (pp, t);
2377 1.1 mrg }
2378 1.1 mrg
2379 1.1 mrg static void
2380 1.1 mrg pp_cxx_concept_definition (cxx_pretty_printer *pp, tree t)
2381 1.1 mrg {
2382 1.1 mrg pp_cxx_unqualified_id (pp, DECL_NAME (t));
2383 1.1 mrg pp_cxx_whitespace (pp);
2384 1.1 mrg pp_cxx_ws_string (pp, "=");
2385 1.1 mrg pp_cxx_whitespace (pp);
2386 1.1 mrg pp->expression (DECL_INITIAL (t));
2387 1.1 mrg pp_cxx_semicolon (pp);
2388 1.1 mrg }
2389 1.1 mrg
2390 1.1 mrg /*
2391 1.1 mrg declaration:
2392 1.1 mrg block-declaration
2393 1.1 mrg function-definition
2394 1.1 mrg template-declaration
2395 1.1 mrg explicit-instantiation
2396 1.1 mrg explicit-specialization
2397 1.1 mrg linkage-specification
2398 1.1 mrg namespace-definition
2399 1.1 mrg
2400 1.1 mrg block-declaration:
2401 1.1 mrg simple-declaration
2402 1.1 mrg asm-definition
2403 1.1 mrg namespace-alias-definition
2404 1.1 mrg using-declaration
2405 1.1 mrg using-directive
2406 1.1 mrg static_assert-declaration */
2407 1.1 mrg void
2408 1.1 mrg cxx_pretty_printer::declaration (tree t)
2409 1.1 mrg {
2410 1.1 mrg if (TREE_CODE (t) == STATIC_ASSERT)
2411 1.1 mrg {
2412 1.1 mrg pp_cxx_ws_string (this, "static_assert");
2413 1.1 mrg pp_cxx_left_paren (this);
2414 1.1 mrg expression (STATIC_ASSERT_CONDITION (t));
2415 1.1 mrg pp_cxx_separate_with (this, ',');
2416 1.1 mrg expression (STATIC_ASSERT_MESSAGE (t));
2417 1.1 mrg pp_cxx_right_paren (this);
2418 1.1 mrg }
2419 1.1 mrg else if (!DECL_LANG_SPECIFIC (t))
2420 1.1 mrg pp_cxx_simple_declaration (this, t);
2421 1.1 mrg else if (DECL_USE_TEMPLATE (t))
2422 1.1 mrg switch (DECL_USE_TEMPLATE (t))
2423 1.1 mrg {
2424 1.1 mrg case 1:
2425 1.1 mrg pp_cxx_template_declaration (this, t);
2426 1.1 mrg break;
2427 1.1 mrg
2428 1.1 mrg case 2:
2429 1.1 mrg pp_cxx_explicit_specialization (this, t);
2430 1.1 mrg break;
2431 1.1 mrg
2432 1.1 mrg case 3:
2433 1.1 mrg pp_cxx_explicit_instantiation (this, t);
2434 1.1 mrg break;
2435 1.1 mrg
2436 1.1 mrg default:
2437 1.1 mrg break;
2438 1.1 mrg }
2439 1.1 mrg else switch (TREE_CODE (t))
2440 1.1 mrg {
2441 1.1 mrg case VAR_DECL:
2442 1.1 mrg case TYPE_DECL:
2443 1.1 mrg pp_cxx_simple_declaration (this, t);
2444 1.1 mrg break;
2445 1.1 mrg
2446 1.1 mrg case FUNCTION_DECL:
2447 1.1 mrg if (DECL_SAVED_TREE (t))
2448 1.1 mrg pp_cxx_function_definition (this, t);
2449 1.1 mrg else
2450 1.1 mrg pp_cxx_simple_declaration (this, t);
2451 1.1 mrg break;
2452 1.1 mrg
2453 1.1 mrg case NAMESPACE_DECL:
2454 1.1 mrg if (DECL_NAMESPACE_ALIAS (t))
2455 1.1 mrg pp_cxx_namespace_alias_definition (this, t);
2456 1.1 mrg else
2457 1.1 mrg pp_cxx_original_namespace_definition (this, t);
2458 1.1 mrg break;
2459 1.1 mrg
2460 1.1 mrg default:
2461 1.1 mrg pp_unsupported_tree (this, t);
2462 1.1 mrg break;
2463 1.1 mrg }
2464 1.1 mrg }
2465 1.1 mrg
2466 1.1 mrg static void
2467 1.1 mrg pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2468 1.1 mrg {
2469 1.1 mrg t = TREE_OPERAND (t, 0);
2470 1.1 mrg pp_cxx_ws_string (pp, "typeid");
2471 1.1 mrg pp_cxx_left_paren (pp);
2472 1.1 mrg if (TYPE_P (t))
2473 1.1 mrg pp->type_id (t);
2474 1.1 mrg else
2475 1.1 mrg pp->expression (t);
2476 1.1 mrg pp_cxx_right_paren (pp);
2477 1.1 mrg }
2478 1.1 mrg
2479 1.1 mrg void
2480 1.1 mrg pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2481 1.1 mrg {
2482 1.1 mrg pp_cxx_ws_string (pp, "va_arg");
2483 1.1 mrg pp_cxx_left_paren (pp);
2484 1.1 mrg pp->assignment_expression (TREE_OPERAND (t, 0));
2485 1.1 mrg pp_cxx_separate_with (pp, ',');
2486 1.1 mrg pp->type_id (TREE_TYPE (t));
2487 1.1 mrg pp_cxx_right_paren (pp);
2488 1.1 mrg }
2489 1.1 mrg
2490 1.1 mrg static bool
2491 1.1 mrg pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2492 1.1 mrg {
2493 1.1 mrg switch (TREE_CODE (t))
2494 1.1 mrg {
2495 1.1 mrg case ARROW_EXPR:
2496 1.1 mrg if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2497 1.1 mrg && INDIRECT_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2498 1.1 mrg {
2499 1.1 mrg pp->type_id (TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2500 1.1 mrg pp_cxx_separate_with (pp, ',');
2501 1.1 mrg return true;
2502 1.1 mrg }
2503 1.1 mrg return false;
2504 1.1 mrg case COMPONENT_REF:
2505 1.1 mrg if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2506 1.1 mrg return false;
2507 1.1 mrg if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2508 1.1 mrg pp_cxx_dot (pp);
2509 1.1 mrg pp->expression (TREE_OPERAND (t, 1));
2510 1.1 mrg return true;
2511 1.1 mrg case ARRAY_REF:
2512 1.1 mrg if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2513 1.1 mrg return false;
2514 1.1 mrg pp_left_bracket (pp);
2515 1.1 mrg pp->expression (TREE_OPERAND (t, 1));
2516 1.1 mrg pp_right_bracket (pp);
2517 1.1 mrg return true;
2518 1.1 mrg default:
2519 1.1 mrg return false;
2520 1.1 mrg }
2521 1.1 mrg }
2522 1.1 mrg
2523 1.1 mrg void
2524 1.1 mrg pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2525 1.1 mrg {
2526 1.1 mrg pp_cxx_ws_string (pp, "offsetof");
2527 1.1 mrg pp_cxx_left_paren (pp);
2528 1.1 mrg if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2529 1.1 mrg pp->expression (TREE_OPERAND (t, 0));
2530 1.1 mrg pp_cxx_right_paren (pp);
2531 1.1 mrg }
2532 1.1 mrg
2533 1.1 mrg void
2534 1.1 mrg pp_cxx_addressof_expression (cxx_pretty_printer *pp, tree t)
2535 1.1 mrg {
2536 1.1 mrg pp_cxx_ws_string (pp, "__builtin_addressof");
2537 1.1 mrg pp_cxx_left_paren (pp);
2538 1.1 mrg pp->expression (TREE_OPERAND (t, 0));
2539 1.1 mrg pp_cxx_right_paren (pp);
2540 1.1 mrg }
2541 1.1 mrg
2542 1.1 mrg static char const*
2543 1.1 mrg get_fold_operator (tree t)
2544 1.1 mrg {
2545 1.1 mrg ovl_op_info_t *info = OVL_OP_INFO (FOLD_EXPR_MODIFY_P (t),
2546 1.1 mrg FOLD_EXPR_OP (t));
2547 1.1 mrg return info->name;
2548 1.1 mrg }
2549 1.1 mrg
2550 1.1 mrg void
2551 1.1 mrg pp_cxx_unary_left_fold_expression (cxx_pretty_printer *pp, tree t)
2552 1.1 mrg {
2553 1.1 mrg char const* op = get_fold_operator (t);
2554 1.1 mrg tree expr = PACK_EXPANSION_PATTERN (FOLD_EXPR_PACK (t));
2555 1.1 mrg pp_cxx_left_paren (pp);
2556 1.1 mrg pp_cxx_ws_string (pp, "...");
2557 1.1 mrg pp_cxx_ws_string (pp, op);
2558 1.1 mrg pp->expression (expr);
2559 1.1 mrg pp_cxx_right_paren (pp);
2560 1.1 mrg }
2561 1.1 mrg
2562 1.1 mrg void
2563 1.1 mrg pp_cxx_unary_right_fold_expression (cxx_pretty_printer *pp, tree t)
2564 1.1 mrg {
2565 1.1 mrg char const* op = get_fold_operator (t);
2566 1.1 mrg tree expr = PACK_EXPANSION_PATTERN (FOLD_EXPR_PACK (t));
2567 1.1 mrg pp_cxx_left_paren (pp);
2568 1.1 mrg pp->expression (expr);
2569 1.1 mrg pp_space (pp);
2570 1.1 mrg pp_cxx_ws_string (pp, op);
2571 1.1 mrg pp_cxx_ws_string (pp, "...");
2572 1.1 mrg pp_cxx_right_paren (pp);
2573 1.1 mrg }
2574 1.1 mrg
2575 1.1 mrg void
2576 1.1 mrg pp_cxx_binary_fold_expression (cxx_pretty_printer *pp, tree t)
2577 1.1 mrg {
2578 1.1 mrg char const* op = get_fold_operator (t);
2579 1.1 mrg tree t1 = TREE_OPERAND (t, 1);
2580 1.1 mrg tree t2 = TREE_OPERAND (t, 2);
2581 1.1 mrg if (t1 == FOLD_EXPR_PACK (t))
2582 1.1 mrg t1 = PACK_EXPANSION_PATTERN (t1);
2583 1.1 mrg else
2584 1.1 mrg t2 = PACK_EXPANSION_PATTERN (t2);
2585 1.1 mrg pp_cxx_left_paren (pp);
2586 1.1 mrg pp->expression (t1);
2587 1.1 mrg pp_cxx_ws_string (pp, op);
2588 1.1 mrg pp_cxx_ws_string (pp, "...");
2589 1.1 mrg pp_cxx_ws_string (pp, op);
2590 1.1 mrg pp->expression (t2);
2591 1.1 mrg pp_cxx_right_paren (pp);
2592 1.1 mrg }
2593 1.1 mrg
2594 1.1 mrg void
2595 1.1 mrg pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2596 1.1 mrg {
2597 1.1 mrg cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2598 1.1 mrg
2599 1.1 mrg switch (kind)
2600 1.1 mrg {
2601 1.1 mrg case CPTK_HAS_NOTHROW_ASSIGN:
2602 1.1 mrg pp_cxx_ws_string (pp, "__has_nothrow_assign");
2603 1.1 mrg break;
2604 1.1 mrg case CPTK_HAS_TRIVIAL_ASSIGN:
2605 1.1 mrg pp_cxx_ws_string (pp, "__has_trivial_assign");
2606 1.1 mrg break;
2607 1.1 mrg case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2608 1.1 mrg pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2609 1.1 mrg break;
2610 1.1 mrg case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2611 1.1 mrg pp_cxx_ws_string (pp, "__has_trivial_constructor");
2612 1.1 mrg break;
2613 1.1 mrg case CPTK_HAS_NOTHROW_COPY:
2614 1.1 mrg pp_cxx_ws_string (pp, "__has_nothrow_copy");
2615 1.1 mrg break;
2616 1.1 mrg case CPTK_HAS_TRIVIAL_COPY:
2617 1.1 mrg pp_cxx_ws_string (pp, "__has_trivial_copy");
2618 1.1 mrg break;
2619 1.1 mrg case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2620 1.1 mrg pp_cxx_ws_string (pp, "__has_trivial_destructor");
2621 1.1 mrg break;
2622 1.1 mrg case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
2623 1.1 mrg pp_cxx_ws_string (pp, "__has_unique_object_representations");
2624 1.1 mrg break;
2625 1.1 mrg case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2626 1.1 mrg pp_cxx_ws_string (pp, "__has_virtual_destructor");
2627 1.1 mrg break;
2628 1.1 mrg case CPTK_IS_ABSTRACT:
2629 1.1 mrg pp_cxx_ws_string (pp, "__is_abstract");
2630 1.1 mrg break;
2631 1.1 mrg case CPTK_IS_AGGREGATE:
2632 1.1 mrg pp_cxx_ws_string (pp, "__is_aggregate");
2633 1.1 mrg break;
2634 1.1 mrg case CPTK_IS_BASE_OF:
2635 1.1 mrg pp_cxx_ws_string (pp, "__is_base_of");
2636 1.1 mrg break;
2637 1.1 mrg case CPTK_IS_CLASS:
2638 1.1 mrg pp_cxx_ws_string (pp, "__is_class");
2639 1.1 mrg break;
2640 1.1 mrg case CPTK_IS_EMPTY:
2641 1.1 mrg pp_cxx_ws_string (pp, "__is_empty");
2642 1.1 mrg break;
2643 1.1 mrg case CPTK_IS_ENUM:
2644 1.1 mrg pp_cxx_ws_string (pp, "__is_enum");
2645 1.1 mrg break;
2646 1.1 mrg case CPTK_IS_FINAL:
2647 1.1 mrg pp_cxx_ws_string (pp, "__is_final");
2648 1.1 mrg break;
2649 1.1 mrg case CPTK_IS_LAYOUT_COMPATIBLE:
2650 1.1 mrg pp_cxx_ws_string (pp, "__is_layout_compatible");
2651 1.1 mrg break;
2652 1.1 mrg case CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF:
2653 1.1 mrg pp_cxx_ws_string (pp, "__is_pointer_interconvertible_base_of");
2654 1.1 mrg break;
2655 1.1 mrg case CPTK_IS_POD:
2656 1.1 mrg pp_cxx_ws_string (pp, "__is_pod");
2657 1.1 mrg break;
2658 1.1 mrg case CPTK_IS_POLYMORPHIC:
2659 1.1 mrg pp_cxx_ws_string (pp, "__is_polymorphic");
2660 1.1 mrg break;
2661 1.1 mrg case CPTK_IS_SAME_AS:
2662 1.1 mrg pp_cxx_ws_string (pp, "__is_same");
2663 1.1 mrg break;
2664 1.1 mrg case CPTK_IS_STD_LAYOUT:
2665 1.1 mrg pp_cxx_ws_string (pp, "__is_std_layout");
2666 1.1 mrg break;
2667 1.1 mrg case CPTK_IS_TRIVIAL:
2668 1.1 mrg pp_cxx_ws_string (pp, "__is_trivial");
2669 1.1 mrg break;
2670 1.1 mrg case CPTK_IS_TRIVIALLY_ASSIGNABLE:
2671 1.1 mrg pp_cxx_ws_string (pp, "__is_trivially_assignable");
2672 1.1 mrg break;
2673 1.1 mrg case CPTK_IS_TRIVIALLY_CONSTRUCTIBLE:
2674 1.1 mrg pp_cxx_ws_string (pp, "__is_trivially_constructible");
2675 1.1 mrg break;
2676 1.1 mrg case CPTK_IS_TRIVIALLY_COPYABLE:
2677 1.1 mrg pp_cxx_ws_string (pp, "__is_trivially_copyable");
2678 1.1 mrg break;
2679 1.1 mrg case CPTK_IS_UNION:
2680 1.1 mrg pp_cxx_ws_string (pp, "__is_union");
2681 1.1 mrg break;
2682 1.1 mrg case CPTK_IS_LITERAL_TYPE:
2683 1.1 mrg pp_cxx_ws_string (pp, "__is_literal_type");
2684 1.1 mrg break;
2685 1.1 mrg case CPTK_IS_ASSIGNABLE:
2686 1.1 mrg pp_cxx_ws_string (pp, "__is_assignable");
2687 1.1 mrg break;
2688 1.1 mrg case CPTK_IS_CONSTRUCTIBLE:
2689 1.1 mrg pp_cxx_ws_string (pp, "__is_constructible");
2690 1.1 mrg break;
2691 1.1 mrg case CPTK_IS_NOTHROW_ASSIGNABLE:
2692 1.1 mrg pp_cxx_ws_string (pp, "__is_nothrow_assignable");
2693 1.1 mrg break;
2694 1.1 mrg case CPTK_IS_NOTHROW_CONSTRUCTIBLE:
2695 1.1 mrg pp_cxx_ws_string (pp, "__is_nothrow_constructible");
2696 1.1 mrg break;
2697 1.1 mrg
2698 1.1 mrg default:
2699 1.1 mrg gcc_unreachable ();
2700 1.1 mrg }
2701 1.1 mrg
2702 1.1 mrg pp_cxx_left_paren (pp);
2703 1.1 mrg pp->type_id (TRAIT_EXPR_TYPE1 (t));
2704 1.1 mrg
2705 1.1 mrg if (kind == CPTK_IS_BASE_OF
2706 1.1 mrg || kind == CPTK_IS_SAME_AS
2707 1.1 mrg || kind == CPTK_IS_LAYOUT_COMPATIBLE
2708 1.1 mrg || kind == CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF)
2709 1.1 mrg {
2710 1.1 mrg pp_cxx_separate_with (pp, ',');
2711 1.1 mrg pp->type_id (TRAIT_EXPR_TYPE2 (t));
2712 1.1 mrg }
2713 1.1 mrg
2714 1.1 mrg pp_cxx_right_paren (pp);
2715 1.1 mrg }
2716 1.1 mrg
2717 1.1 mrg // requires-clause:
2718 1.1 mrg // 'requires' logical-or-expression
2719 1.1 mrg void
2720 1.1 mrg pp_cxx_requires_clause (cxx_pretty_printer *pp, tree t)
2721 1.1 mrg {
2722 1.1 mrg if (!t)
2723 1.1 mrg return;
2724 1.1 mrg pp->padding = pp_before;
2725 1.1 mrg pp_cxx_ws_string (pp, "requires");
2726 1.1 mrg pp_space (pp);
2727 1.1 mrg pp->expression (t);
2728 1.1 mrg }
2729 1.1 mrg
2730 1.1 mrg /* requirement:
2731 1.1 mrg simple-requirement
2732 1.1 mrg compound-requirement
2733 1.1 mrg type-requirement
2734 1.1 mrg nested-requirement */
2735 1.1 mrg static void
2736 1.1 mrg pp_cxx_requirement (cxx_pretty_printer *pp, tree t)
2737 1.1 mrg {
2738 1.1 mrg switch (TREE_CODE (t))
2739 1.1 mrg {
2740 1.1 mrg case SIMPLE_REQ:
2741 1.1 mrg pp_cxx_simple_requirement (pp, t);
2742 1.1 mrg break;
2743 1.1 mrg
2744 1.1 mrg case TYPE_REQ:
2745 1.1 mrg pp_cxx_type_requirement (pp, t);
2746 1.1 mrg break;
2747 1.1 mrg
2748 1.1 mrg case COMPOUND_REQ:
2749 1.1 mrg pp_cxx_compound_requirement (pp, t);
2750 1.1 mrg break;
2751 1.1 mrg
2752 1.1 mrg case NESTED_REQ:
2753 1.1 mrg pp_cxx_nested_requirement (pp, t);
2754 1.1 mrg break;
2755 1.1 mrg
2756 1.1 mrg default:
2757 1.1 mrg gcc_unreachable ();
2758 1.1 mrg }
2759 1.1 mrg }
2760 1.1 mrg
2761 1.1 mrg // requirement-list:
2762 1.1 mrg // requirement
2763 1.1 mrg // requirement-list ';' requirement[opt]
2764 1.1 mrg //
2765 1.1 mrg static void
2766 1.1 mrg pp_cxx_requirement_list (cxx_pretty_printer *pp, tree t)
2767 1.1 mrg {
2768 1.1 mrg for (; t; t = TREE_CHAIN (t))
2769 1.1 mrg pp_cxx_requirement (pp, TREE_VALUE (t));
2770 1.1 mrg }
2771 1.1 mrg
2772 1.1 mrg // requirement-body:
2773 1.1 mrg // '{' requirement-list '}'
2774 1.1 mrg static void
2775 1.1 mrg pp_cxx_requirement_body (cxx_pretty_printer *pp, tree t)
2776 1.1 mrg {
2777 1.1 mrg pp_cxx_left_brace (pp);
2778 1.1 mrg pp_cxx_requirement_list (pp, t);
2779 1.1 mrg pp_cxx_right_brace (pp);
2780 1.1 mrg }
2781 1.1 mrg
2782 1.1 mrg // requires-expression:
2783 1.1 mrg // 'requires' requirement-parameter-list requirement-body
2784 1.1 mrg void
2785 1.1 mrg pp_cxx_requires_expr (cxx_pretty_printer *pp, tree t)
2786 1.1 mrg {
2787 1.1 mrg pp_string (pp, "requires");
2788 1.1 mrg if (tree parms = REQUIRES_EXPR_PARMS (t))
2789 1.1 mrg {
2790 1.1 mrg bool first = true;
2791 1.1 mrg pp_cxx_left_paren (pp);
2792 1.1 mrg for (; parms; parms = TREE_CHAIN (parms))
2793 1.1 mrg {
2794 1.1 mrg if (!first)
2795 1.1 mrg pp_cxx_separate_with (pp, ',' );
2796 1.1 mrg first = false;
2797 1.1 mrg pp_cxx_parameter_declaration (pp, parms);
2798 1.1 mrg }
2799 1.1 mrg pp_cxx_right_paren (pp);
2800 1.1 mrg pp_cxx_whitespace (pp);
2801 1.1 mrg }
2802 1.1 mrg pp_cxx_requirement_body (pp, TREE_OPERAND (t, 1));
2803 1.1 mrg }
2804 1.1 mrg
2805 1.1 mrg /* simple-requirement:
2806 1.1 mrg expression ';' */
2807 1.1 mrg void
2808 1.1 mrg pp_cxx_simple_requirement (cxx_pretty_printer *pp, tree t)
2809 1.1 mrg {
2810 1.1 mrg pp->expression (TREE_OPERAND (t, 0));
2811 1.1 mrg pp_cxx_semicolon (pp);
2812 1.1 mrg }
2813 1.1 mrg
2814 1.1 mrg /* type-requirement:
2815 1.1 mrg typename type-name ';' */
2816 1.1 mrg void
2817 1.1 mrg pp_cxx_type_requirement (cxx_pretty_printer *pp, tree t)
2818 1.1 mrg {
2819 1.1 mrg pp->type_id (TREE_OPERAND (t, 0));
2820 1.1 mrg pp_cxx_semicolon (pp);
2821 1.1 mrg }
2822 1.1 mrg
2823 1.1 mrg /* compound-requirement:
2824 1.1 mrg '{' expression '}' 'noexcept' [opt] trailing-return-type [opt] */
2825 1.1 mrg void
2826 1.1 mrg pp_cxx_compound_requirement (cxx_pretty_printer *pp, tree t)
2827 1.1 mrg {
2828 1.1 mrg pp_cxx_left_brace (pp);
2829 1.1 mrg pp->expression (TREE_OPERAND (t, 0));
2830 1.1 mrg pp_cxx_right_brace (pp);
2831 1.1 mrg
2832 1.1 mrg if (COMPOUND_REQ_NOEXCEPT_P (t))
2833 1.1 mrg pp_cxx_ws_string (pp, "noexcept");
2834 1.1 mrg
2835 1.1 mrg if (tree type = TREE_OPERAND (t, 1))
2836 1.1 mrg {
2837 1.1 mrg pp_cxx_whitespace (pp);
2838 1.1 mrg pp_cxx_ws_string (pp, "->");
2839 1.1 mrg pp->type_id (type);
2840 1.1 mrg }
2841 1.1 mrg pp_cxx_semicolon (pp);
2842 1.1 mrg }
2843 1.1 mrg
2844 1.1 mrg /* nested requirement:
2845 1.1 mrg 'requires' constraint-expression */
2846 1.1 mrg void
2847 1.1 mrg pp_cxx_nested_requirement (cxx_pretty_printer *pp, tree t)
2848 1.1 mrg {
2849 1.1 mrg pp_cxx_ws_string (pp, "requires");
2850 1.1 mrg pp->expression (TREE_OPERAND (t, 0));
2851 1.1 mrg pp_cxx_semicolon (pp);
2852 1.1 mrg }
2853 1.1 mrg
2854 1.1 mrg void
2855 1.1 mrg pp_cxx_check_constraint (cxx_pretty_printer *pp, tree t)
2856 1.1 mrg {
2857 1.1 mrg tree decl = CHECK_CONSTR_CONCEPT (t);
2858 1.1 mrg tree tmpl = DECL_TI_TEMPLATE (decl);
2859 1.1 mrg tree args = CHECK_CONSTR_ARGS (t);
2860 1.1 mrg tree id = build_nt (TEMPLATE_ID_EXPR, tmpl, args);
2861 1.1 mrg
2862 1.1 mrg if (TREE_CODE (decl) == CONCEPT_DECL)
2863 1.1 mrg pp->expression (id);
2864 1.1 mrg else if (VAR_P (decl))
2865 1.1 mrg pp->expression (id);
2866 1.1 mrg else if (TREE_CODE (decl) == FUNCTION_DECL)
2867 1.1 mrg {
2868 1.1 mrg tree call = build_vl_exp (CALL_EXPR, 2);
2869 1.1 mrg TREE_OPERAND (call, 0) = integer_two_node;
2870 1.1 mrg TREE_OPERAND (call, 1) = id;
2871 1.1 mrg pp->expression (call);
2872 1.1 mrg }
2873 1.1 mrg else
2874 1.1 mrg gcc_unreachable ();
2875 1.1 mrg }
2876 1.1 mrg
2877 1.1 mrg /* Output the "[with ...]" clause for a parameter mapping of an atomic
2878 1.1 mrg constraint. */
2879 1.1 mrg
2880 1.1 mrg void
2881 1.1 mrg pp_cxx_parameter_mapping (cxx_pretty_printer *pp, tree map)
2882 1.1 mrg {
2883 1.1 mrg pp_cxx_whitespace (pp);
2884 1.1 mrg pp_cxx_left_bracket (pp);
2885 1.1 mrg pp->translate_string ("with");
2886 1.1 mrg pp_cxx_whitespace (pp);
2887 1.1 mrg
2888 1.1 mrg for (tree p = map; p; p = TREE_CHAIN (p))
2889 1.1 mrg {
2890 1.1 mrg tree parm = TREE_VALUE (p);
2891 1.1 mrg tree arg = TREE_PURPOSE (p);
2892 1.1 mrg
2893 1.1 mrg if (TYPE_P (parm))
2894 1.1 mrg pp->type_id (parm);
2895 1.1 mrg else if (tree name = DECL_NAME (TEMPLATE_PARM_DECL (parm)))
2896 1.1 mrg pp_cxx_tree_identifier (pp, name);
2897 1.1 mrg else
2898 1.1 mrg pp->translate_string ("<unnamed>");
2899 1.1 mrg
2900 1.1 mrg pp_cxx_whitespace (pp);
2901 1.1 mrg pp_equal (pp);
2902 1.1 mrg pp_cxx_whitespace (pp);
2903 1.1 mrg
2904 1.1 mrg if (TYPE_P (arg) || DECL_TEMPLATE_TEMPLATE_PARM_P (arg))
2905 1.1 mrg pp->type_id (arg);
2906 1.1 mrg else
2907 1.1 mrg pp->expression (arg);
2908 1.1 mrg
2909 1.1 mrg if (TREE_CHAIN (p) != NULL_TREE)
2910 1.1 mrg pp_cxx_separate_with (pp, ';');
2911 1.1 mrg }
2912 1.1 mrg
2913 1.1 mrg pp_cxx_right_bracket (pp);
2914 1.1 mrg }
2915 1.1 mrg
2916 1.1 mrg void
2917 1.1 mrg pp_cxx_atomic_constraint (cxx_pretty_printer *pp, tree t)
2918 1.1 mrg {
2919 1.1 mrg /* Emit the expression. */
2920 1.1 mrg pp->expression (ATOMIC_CONSTR_EXPR (t));
2921 1.1 mrg
2922 1.1 mrg /* Emit the parameter mapping. */
2923 1.1 mrg tree map = ATOMIC_CONSTR_MAP (t);
2924 1.1 mrg if (map && map != error_mark_node)
2925 1.1 mrg pp_cxx_parameter_mapping (pp, map);
2926 1.1 mrg }
2927 1.1 mrg
2928 1.1 mrg void
2929 1.1 mrg pp_cxx_conjunction (cxx_pretty_printer *pp, tree t)
2930 1.1 mrg {
2931 1.1 mrg pp_cxx_constraint (pp, TREE_OPERAND (t, 0));
2932 1.1 mrg pp_string (pp, " /\\ ");
2933 1.1 mrg pp_cxx_constraint (pp, TREE_OPERAND (t, 1));
2934 1.1 mrg }
2935 1.1 mrg
2936 1.1 mrg void
2937 1.1 mrg pp_cxx_disjunction (cxx_pretty_printer *pp, tree t)
2938 1.1 mrg {
2939 1.1 mrg pp_cxx_constraint (pp, TREE_OPERAND (t, 0));
2940 1.1 mrg pp_string (pp, " \\/ ");
2941 1.1 mrg pp_cxx_constraint (pp, TREE_OPERAND (t, 1));
2942 1.1 mrg }
2943 1.1 mrg
2944 1.1 mrg void
2945 1.1 mrg pp_cxx_constraint (cxx_pretty_printer *pp, tree t)
2946 1.1 mrg {
2947 1.1 mrg if (t == error_mark_node)
2948 1.1 mrg return pp->expression (t);
2949 1.1 mrg
2950 1.1 mrg switch (TREE_CODE (t))
2951 1.1 mrg {
2952 1.1 mrg case ATOMIC_CONSTR:
2953 1.1 mrg pp_cxx_atomic_constraint (pp, t);
2954 1.1 mrg break;
2955 1.1 mrg
2956 1.1 mrg case CHECK_CONSTR:
2957 1.1 mrg pp_cxx_check_constraint (pp, t);
2958 1.1 mrg break;
2959 1.1 mrg
2960 1.1 mrg case CONJ_CONSTR:
2961 1.1 mrg pp_cxx_conjunction (pp, t);
2962 1.1 mrg break;
2963 1.1 mrg
2964 1.1 mrg case DISJ_CONSTR:
2965 1.1 mrg pp_cxx_disjunction (pp, t);
2966 1.1 mrg break;
2967 1.1 mrg
2968 1.1 mrg case EXPR_PACK_EXPANSION:
2969 1.1 mrg pp->expression (TREE_OPERAND (t, 0));
2970 1.1 mrg break;
2971 1.1 mrg
2972 1.1 mrg default:
2973 1.1 mrg gcc_unreachable ();
2974 1.1 mrg }
2975 1.1 mrg }
2976 1.1 mrg
2977 1.1 mrg
2978 1.1 mrg typedef c_pretty_print_fn pp_fun;
2980 1.1 mrg
2981 1.1 mrg /* Initialization of a C++ pretty-printer object. */
2982 1.1 mrg
2983 1.1 mrg cxx_pretty_printer::cxx_pretty_printer ()
2984 1.1 mrg : c_pretty_printer (),
2985 1.1 mrg enclosing_scope (global_namespace)
2986 1.1 mrg {
2987 1.1 mrg type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2988 1.1 mrg parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2989 1.1 mrg }
2990 1.1 mrg
2991 1.1 mrg /* cxx_pretty_printer's implementation of pretty_printer::clone vfunc. */
2992 1.1 mrg
2993 1.1 mrg pretty_printer *
2994 1.1 mrg cxx_pretty_printer::clone () const
2995 1.1 mrg {
2996 return new cxx_pretty_printer (*this);
2997 }
2998