OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [gcc/] [cp/] [cxx-pretty-print.c] - Blame information for rev 847

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 283 jeremybenn
/* Implementation of subroutines for the GNU C++ pretty-printer.
2
   Copyright (C) 2003, 2004, 2005, 2007, 2008,
3
   2009 Free Software Foundation, Inc.
4
   Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify it under
9
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
12
 
13
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14
WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
#include "config.h"
23
#include "system.h"
24
#include "coretypes.h"
25
#include "tm.h"
26
#include "real.h"
27
#include "intl.h"
28
#include "cxx-pretty-print.h"
29
#include "cp-tree.h"
30
#include "toplev.h"
31
 
32
/* Translate if being used for diagnostics, but not for dump files or
33
   __PRETTY_FUNCTION.  */
34
#define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
35
 
36
static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
37
static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
38
static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
39
static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
40
static void pp_cxx_expression (cxx_pretty_printer *, tree);
41
static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
42
static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
43
static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
44
static void pp_cxx_type_id (cxx_pretty_printer *, tree);
45
static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
46
static void pp_cxx_declarator (cxx_pretty_printer *, tree);
47
static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
48
static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
49
static void pp_cxx_statement (cxx_pretty_printer *, tree);
50
static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
51
static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
52
static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree);
53
 
54
 
55
static inline void
56
pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
57
{
58
  const char *p = pp_last_position_in_text (pp);
59
 
60
  if (p != NULL && *p == c)
61
    pp_cxx_whitespace (pp);
62
  pp_character (pp, c);
63
  pp_base (pp)->padding = pp_none;
64
}
65
 
66
#define pp_cxx_storage_class_specifier(PP, T) \
67
   pp_c_storage_class_specifier (pp_c_base (PP), T)
68
#define pp_cxx_expression_list(PP, T)    \
69
   pp_c_expression_list (pp_c_base (PP), T)
70
#define pp_cxx_space_for_pointer_operator(PP, T)  \
71
   pp_c_space_for_pointer_operator (pp_c_base (PP), T)
72
#define pp_cxx_init_declarator(PP, T)    \
73
   pp_c_init_declarator (pp_c_base (PP), T)
74
#define pp_cxx_call_argument_list(PP, T) \
75
   pp_c_call_argument_list (pp_c_base (PP), T)
76
 
77
void
78
pp_cxx_colon_colon (cxx_pretty_printer *pp)
79
{
80
  pp_colon_colon (pp);
81
  pp_base (pp)->padding = pp_none;
82
}
83
 
84
void
85
pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
86
{
87
  pp_cxx_nonconsecutive_character (pp, '<');
88
}
89
 
90
void
91
pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
92
{
93
  pp_cxx_nonconsecutive_character (pp, '>');
94
}
95
 
96
void
97
pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
98
{
99
  pp_separate_with (pp, c);
100
  pp_base (pp)->padding = pp_none;
101
}
102
 
103
/* Expressions.  */
104
 
105
static inline bool
106
is_destructor_name (tree name)
107
{
108
  return name == complete_dtor_identifier
109
    || name == base_dtor_identifier
110
    || name == deleting_dtor_identifier;
111
}
112
 
113
/* conversion-function-id:
114
      operator conversion-type-id
115
 
116
   conversion-type-id:
117
      type-specifier-seq conversion-declarator(opt)
118
 
119
   conversion-declarator:
120
      ptr-operator conversion-declarator(opt)  */
121
 
122
static inline void
123
pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
124
{
125
  pp_cxx_ws_string (pp, "operator");
126
  pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
127
}
128
 
129
static inline void
130
pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
131
{
132
  pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
133
  pp_cxx_begin_template_argument_list (pp);
134
  pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
135
  pp_cxx_end_template_argument_list (pp);
136
}
137
 
138
/* Prints the unqualified part of the id-expression T.
139
 
140
   unqualified-id:
141
     identifier
142
     operator-function-id
143
     conversion-function-id
144
     ~ class-name
145
     template-id  */
146
 
147
static void
148
pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
149
{
150
  enum tree_code code = TREE_CODE (t);
151
  switch (code)
152
    {
153
    case RESULT_DECL:
154
      pp_cxx_ws_string (pp, M_("<return-value>"));
155
      break;
156
 
157
    case OVERLOAD:
158
      t = OVL_CURRENT (t);
159
    case VAR_DECL:
160
    case PARM_DECL:
161
    case CONST_DECL:
162
    case TYPE_DECL:
163
    case FUNCTION_DECL:
164
    case NAMESPACE_DECL:
165
    case FIELD_DECL:
166
    case LABEL_DECL:
167
    case USING_DECL:
168
    case TEMPLATE_DECL:
169
      t = DECL_NAME (t);
170
 
171
    case IDENTIFIER_NODE:
172
      if (t == NULL)
173
        pp_cxx_ws_string (pp, M_("<unnamed>"));
174
      else if (IDENTIFIER_TYPENAME_P (t))
175
        pp_cxx_conversion_function_id (pp, t);
176
      else
177
        {
178
          if (is_destructor_name (t))
179
            {
180
              pp_complement (pp);
181
              /* FIXME: Why is this necessary? */
182
              if (TREE_TYPE (t))
183
                t = constructor_name (TREE_TYPE (t));
184
            }
185
          pp_cxx_tree_identifier (pp, t);
186
        }
187
      break;
188
 
189
    case TEMPLATE_ID_EXPR:
190
      pp_cxx_template_id (pp, t);
191
      break;
192
 
193
    case BASELINK:
194
      pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
195
      break;
196
 
197
    case RECORD_TYPE:
198
    case UNION_TYPE:
199
    case ENUMERAL_TYPE:
200
    case TYPENAME_TYPE:
201
    case UNBOUND_CLASS_TEMPLATE:
202
      pp_cxx_unqualified_id (pp, TYPE_NAME (t));
203
      if (CLASS_TYPE_P (t) && CLASSTYPE_USE_TEMPLATE (t))
204
        {
205
          pp_cxx_begin_template_argument_list (pp);
206
          pp_cxx_template_argument_list (pp, INNERMOST_TEMPLATE_ARGS
207
                                                 (CLASSTYPE_TI_ARGS (t)));
208
          pp_cxx_end_template_argument_list (pp);
209
        }
210
      break;
211
 
212
    case BIT_NOT_EXPR:
213
      pp_cxx_complement (pp);
214
      pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
215
      break;
216
 
217
    case TEMPLATE_TYPE_PARM:
218
    case TEMPLATE_TEMPLATE_PARM:
219
      if (TYPE_IDENTIFIER (t))
220
        pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
221
      else
222
        pp_cxx_canonical_template_parameter (pp, t);
223
      break;
224
 
225
    case TEMPLATE_PARM_INDEX:
226
      pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
227
      break;
228
 
229
    case BOUND_TEMPLATE_TEMPLATE_PARM:
230
      pp_cxx_cv_qualifier_seq (pp, t);
231
      pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
232
      pp_cxx_begin_template_argument_list (pp);
233
      pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t));
234
      pp_cxx_end_template_argument_list (pp);
235
      break;
236
 
237
    default:
238
      pp_unsupported_tree (pp, t);
239
      break;
240
    }
241
}
242
 
243
/* Pretty-print out the token sequence ":: template" in template codes
244
   where it is needed to "inline declare" the (following) member as
245
   a template.  This situation arises when SCOPE of T is dependent
246
   on template parameters.  */
247
 
248
static inline void
249
pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
250
{
251
  if (TREE_CODE (t) == TEMPLATE_ID_EXPR
252
      && TYPE_P (scope) && dependent_type_p (scope))
253
    pp_cxx_ws_string (pp, "template");
254
}
255
 
256
/* nested-name-specifier:
257
      class-or-namespace-name :: nested-name-specifier(opt)
258
      class-or-namespace-name :: template nested-name-specifier   */
259
 
260
static void
261
pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
262
{
263
  if (t != NULL && t != pp->enclosing_scope)
264
    {
265
      tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
266
      pp_cxx_nested_name_specifier (pp, scope);
267
      pp_cxx_template_keyword_if_needed (pp, scope, t);
268
      pp_cxx_unqualified_id (pp, t);
269
      pp_cxx_colon_colon (pp);
270
    }
271
}
272
 
273
/* qualified-id:
274
      nested-name-specifier template(opt) unqualified-id  */
275
 
276
static void
277
pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
278
{
279
  switch (TREE_CODE (t))
280
    {
281
      /* A pointer-to-member is always qualified.  */
282
    case PTRMEM_CST:
283
      pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
284
      pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
285
      break;
286
 
287
      /* In Standard C++, functions cannot possibly be used as
288
         nested-name-specifiers.  However, there are situations where
289
         is "makes sense" to output the surrounding function name for the
290
         purpose of emphasizing on the scope kind.  Just printing the
291
         function name might not be sufficient as it may be overloaded; so,
292
         we decorate the function with its signature too.
293
         FIXME:  This is probably the wrong pretty-printing for conversion
294
         functions and some function templates.  */
295
    case OVERLOAD:
296
      t = OVL_CURRENT (t);
297
    case FUNCTION_DECL:
298
      if (DECL_FUNCTION_MEMBER_P (t))
299
        pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
300
      pp_cxx_unqualified_id
301
        (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
302
      pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
303
      break;
304
 
305
    case OFFSET_REF:
306
    case SCOPE_REF:
307
      pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
308
      pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
309
      break;
310
 
311
    default:
312
      {
313
        tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
314
        if (scope != pp->enclosing_scope)
315
          {
316
            pp_cxx_nested_name_specifier (pp, scope);
317
            pp_cxx_template_keyword_if_needed (pp, scope, t);
318
          }
319
        pp_cxx_unqualified_id (pp, t);
320
      }
321
      break;
322
    }
323
}
324
 
325
 
326
static void
327
pp_cxx_constant (cxx_pretty_printer *pp, tree t)
328
{
329
  switch (TREE_CODE (t))
330
    {
331
    case STRING_CST:
332
      {
333
        const bool in_parens = PAREN_STRING_LITERAL_P (t);
334
        if (in_parens)
335
          pp_cxx_left_paren (pp);
336
        pp_c_constant (pp_c_base (pp), t);
337
        if (in_parens)
338
          pp_cxx_right_paren (pp);
339
      }
340
      break;
341
 
342
    default:
343
      pp_c_constant (pp_c_base (pp), t);
344
      break;
345
    }
346
}
347
 
348
/* id-expression:
349
      unqualified-id
350
      qualified-id   */
351
 
352
static inline void
353
pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
354
{
355
  if (TREE_CODE (t) == OVERLOAD)
356
    t = OVL_CURRENT (t);
357
  if (DECL_P (t) && DECL_CONTEXT (t))
358
    pp_cxx_qualified_id (pp, t);
359
  else
360
    pp_cxx_unqualified_id (pp, t);
361
}
362
 
363
/* primary-expression:
364
     literal
365
     this
366
     :: identifier
367
     :: operator-function-id
368
     :: qualifier-id
369
     ( expression )
370
     id-expression
371
 
372
   GNU Extensions:
373
     __builtin_va_arg ( assignment-expression , type-id )
374
     __builtin_offsetof ( type-id, offsetof-expression )
375
 
376
     __has_nothrow_assign ( type-id )
377
     __has_nothrow_constructor ( type-id )
378
     __has_nothrow_copy ( type-id )
379
     __has_trivial_assign ( type-id )
380
     __has_trivial_constructor ( type-id )
381
     __has_trivial_copy ( type-id )
382
     __has_trivial_destructor ( type-id )
383
     __has_virtual_destructor ( type-id )
384
     __is_abstract ( type-id )
385
     __is_base_of ( type-id , type-id )
386
     __is_class ( type-id )
387
     __is_convertible_to ( type-id , type-id )
388
     __is_empty ( type-id )
389
     __is_enum ( type-id )
390
     __is_pod ( type-id )
391
     __is_polymorphic ( type-id )
392
     __is_union ( type-id )  */
393
 
394
static void
395
pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
396
{
397
  switch (TREE_CODE (t))
398
    {
399
    case INTEGER_CST:
400
    case REAL_CST:
401
    case COMPLEX_CST:
402
    case STRING_CST:
403
      pp_cxx_constant (pp, t);
404
      break;
405
 
406
    case BASELINK:
407
      t = BASELINK_FUNCTIONS (t);
408
    case VAR_DECL:
409
    case PARM_DECL:
410
    case FIELD_DECL:
411
    case FUNCTION_DECL:
412
    case OVERLOAD:
413
    case CONST_DECL:
414
    case TEMPLATE_DECL:
415
      pp_cxx_id_expression (pp, t);
416
      break;
417
 
418
    case RESULT_DECL:
419
    case TEMPLATE_TYPE_PARM:
420
    case TEMPLATE_TEMPLATE_PARM:
421
    case TEMPLATE_PARM_INDEX:
422
      pp_cxx_unqualified_id (pp, t);
423
      break;
424
 
425
    case STMT_EXPR:
426
      pp_cxx_left_paren (pp);
427
      pp_cxx_statement (pp, STMT_EXPR_STMT (t));
428
      pp_cxx_right_paren (pp);
429
      break;
430
 
431
    case TRAIT_EXPR:
432
      pp_cxx_trait_expression (pp, t);
433
      break;
434
 
435
    case VA_ARG_EXPR:
436
      pp_cxx_va_arg_expression (pp, t);
437
      break;
438
 
439
    case OFFSETOF_EXPR:
440
      pp_cxx_offsetof_expression (pp, t);
441
      break;
442
 
443
    default:
444
      pp_c_primary_expression (pp_c_base (pp), t);
445
      break;
446
    }
447
}
448
 
449
/* postfix-expression:
450
     primary-expression
451
     postfix-expression [ expression ]
452
     postfix-expression ( expression-list(opt) )
453
     simple-type-specifier ( expression-list(opt) )
454
     typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
455
     typename ::(opt) nested-name-specifier template(opt)
456
                                       template-id ( expression-list(opt) )
457
     postfix-expression . template(opt) ::(opt) id-expression
458
     postfix-expression -> template(opt) ::(opt) id-expression
459
     postfix-expression . pseudo-destructor-name
460
     postfix-expression -> pseudo-destructor-name
461
     postfix-expression ++
462
     postfix-expression --
463
     dynamic_cast < type-id > ( expression )
464
     static_cast < type-id > ( expression )
465
     reinterpret_cast < type-id > ( expression )
466
     const_cast < type-id > ( expression )
467
     typeid ( expression )
468
     typeid ( type-id )  */
469
 
470
static void
471
pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
472
{
473
  enum tree_code code = TREE_CODE (t);
474
 
475
  switch (code)
476
    {
477
    case AGGR_INIT_EXPR:
478
    case CALL_EXPR:
479
      {
480
        tree fun = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t)
481
                                           : CALL_EXPR_FN (t));
482
        tree saved_scope = pp->enclosing_scope;
483
        bool skipfirst = false;
484
        tree arg;
485
 
486
        if (TREE_CODE (fun) == ADDR_EXPR)
487
          fun = TREE_OPERAND (fun, 0);
488
 
489
        /* In templates, where there is no way to tell whether a given
490
           call uses an actual member function.  So the parser builds
491
           FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
492
           instantiation time.  */
493
        if (TREE_CODE (fun) != FUNCTION_DECL)
494
          ;
495
        else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
496
          {
497
            tree object = (code == AGGR_INIT_EXPR
498
                           ? (AGGR_INIT_VIA_CTOR_P (t)
499
                              ? AGGR_INIT_EXPR_SLOT (t)
500
                              : AGGR_INIT_EXPR_ARG (t, 0))
501
                           : CALL_EXPR_ARG (t, 0));
502
 
503
            while (TREE_CODE (object) == NOP_EXPR)
504
              object = TREE_OPERAND (object, 0);
505
 
506
            if (TREE_CODE (object) == ADDR_EXPR)
507
              object = TREE_OPERAND (object, 0);
508
 
509
            if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
510
              {
511
                pp_cxx_postfix_expression (pp, object);
512
                pp_cxx_dot (pp);
513
              }
514
            else
515
              {
516
                pp_cxx_postfix_expression (pp, object);
517
                pp_cxx_arrow (pp);
518
              }
519
            skipfirst = true;
520
            pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
521
          }
522
 
523
        pp_cxx_postfix_expression (pp, fun);
524
        pp->enclosing_scope = saved_scope;
525
        pp_cxx_left_paren (pp);
526
        if (code == AGGR_INIT_EXPR)
527
          {
528
            aggr_init_expr_arg_iterator iter;
529
            FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
530
              {
531
                if (skipfirst)
532
                  skipfirst = false;
533
                else
534
                  {
535
                    pp_cxx_expression (pp, arg);
536
                    if (more_aggr_init_expr_args_p (&iter))
537
                      pp_cxx_separate_with (pp, ',');
538
                  }
539
              }
540
          }
541
        else
542
          {
543
            call_expr_arg_iterator iter;
544
            FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
545
              {
546
                if (skipfirst)
547
                  skipfirst = false;
548
                else
549
                  {
550
                    pp_cxx_expression (pp, arg);
551
                    if (more_call_expr_args_p (&iter))
552
                      pp_cxx_separate_with (pp, ',');
553
                  }
554
              }
555
          }
556
        pp_cxx_right_paren (pp);
557
      }
558
      if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
559
        {
560
          pp_cxx_separate_with (pp, ',');
561
          pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t));
562
        }
563
      break;
564
 
565
    case BASELINK:
566
    case VAR_DECL:
567
    case PARM_DECL:
568
    case FIELD_DECL:
569
    case FUNCTION_DECL:
570
    case OVERLOAD:
571
    case CONST_DECL:
572
    case TEMPLATE_DECL:
573
    case RESULT_DECL:
574
      pp_cxx_primary_expression (pp, t);
575
      break;
576
 
577
    case DYNAMIC_CAST_EXPR:
578
    case STATIC_CAST_EXPR:
579
    case REINTERPRET_CAST_EXPR:
580
    case CONST_CAST_EXPR:
581
      if (code == DYNAMIC_CAST_EXPR)
582
        pp_cxx_ws_string (pp, "dynamic_cast");
583
      else if (code == STATIC_CAST_EXPR)
584
        pp_cxx_ws_string (pp, "static_cast");
585
      else if (code == REINTERPRET_CAST_EXPR)
586
        pp_cxx_ws_string (pp, "reinterpret_cast");
587
      else
588
        pp_cxx_ws_string (pp, "const_cast");
589
      pp_cxx_begin_template_argument_list (pp);
590
      pp_cxx_type_id (pp, TREE_TYPE (t));
591
      pp_cxx_end_template_argument_list (pp);
592
      pp_left_paren (pp);
593
      pp_cxx_expression (pp, TREE_OPERAND (t, 0));
594
      pp_right_paren (pp);
595
      break;
596
 
597
    case EMPTY_CLASS_EXPR:
598
      pp_cxx_type_id (pp, TREE_TYPE (t));
599
      pp_left_paren (pp);
600
      pp_right_paren (pp);
601
      break;
602
 
603
    case TYPEID_EXPR:
604
      pp_cxx_typeid_expression (pp, t);
605
      break;
606
 
607
    case PSEUDO_DTOR_EXPR:
608
      pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
609
      pp_cxx_dot (pp);
610
      pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
611
      pp_cxx_colon_colon (pp);
612
      pp_complement (pp);
613
      pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
614
      break;
615
 
616
    case ARROW_EXPR:
617
      pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
618
      pp_cxx_arrow (pp);
619
      break;
620
 
621
    default:
622
      pp_c_postfix_expression (pp_c_base (pp), t);
623
      break;
624
    }
625
}
626
 
627
/* new-expression:
628
      ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
629
      ::(opt) new new-placement(opt) ( type-id ) new-initializer(opt)
630
 
631
   new-placement:
632
      ( expression-list )
633
 
634
   new-type-id:
635
      type-specifier-seq new-declarator(opt)
636
 
637
   new-declarator:
638
      ptr-operator new-declarator(opt)
639
      direct-new-declarator
640
 
641
   direct-new-declarator
642
      [ expression ]
643
      direct-new-declarator [ constant-expression ]
644
 
645
   new-initializer:
646
      ( expression-list(opt) )  */
647
 
648
static void
649
pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
650
{
651
  enum tree_code code = TREE_CODE (t);
652
  tree type = TREE_OPERAND (t, 1);
653
  tree init = TREE_OPERAND (t, 2);
654
  switch (code)
655
    {
656
    case NEW_EXPR:
657
    case VEC_NEW_EXPR:
658
      if (NEW_EXPR_USE_GLOBAL (t))
659
        pp_cxx_colon_colon (pp);
660
      pp_cxx_ws_string (pp, "new");
661
      if (TREE_OPERAND (t, 0))
662
        {
663
          pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
664
          pp_space (pp);
665
        }
666
      if (TREE_CODE (type) == ARRAY_REF)
667
        type = build_cplus_array_type
668
          (TREE_OPERAND (type, 0),
669
           build_index_type (fold_build2_loc (input_location,
670
                                          MINUS_EXPR, integer_type_node,
671
                                          TREE_OPERAND (type, 1),
672
                                          integer_one_node)));
673
      pp_cxx_type_id (pp, type);
674
      if (init)
675
        {
676
          pp_left_paren (pp);
677
          if (TREE_CODE (init) == TREE_LIST)
678
            pp_c_expression_list (pp_c_base (pp), init);
679
          else if (init == void_zero_node)
680
            ;                   /* OK, empty initializer list.  */
681
          else
682
            pp_cxx_expression (pp, init);
683
          pp_right_paren (pp);
684
        }
685
      break;
686
 
687
    default:
688
      pp_unsupported_tree (pp, t);
689
    }
690
}
691
 
692
/* delete-expression:
693
      ::(opt) delete cast-expression
694
      ::(opt) delete [ ] cast-expression   */
695
 
696
static void
697
pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
698
{
699
  enum tree_code code = TREE_CODE (t);
700
  switch (code)
701
    {
702
    case DELETE_EXPR:
703
    case VEC_DELETE_EXPR:
704
      if (DELETE_EXPR_USE_GLOBAL (t))
705
        pp_cxx_colon_colon (pp);
706
      pp_cxx_ws_string (pp, "delete");
707
      pp_space (pp);
708
      if (code == VEC_DELETE_EXPR
709
          || DELETE_EXPR_USE_VEC (t))
710
        {
711
          pp_left_bracket (pp);
712
          pp_right_bracket (pp);
713
          pp_space (pp);
714
        }
715
      pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
716
      break;
717
 
718
    default:
719
      pp_unsupported_tree (pp, t);
720
    }
721
}
722
 
723
/* unary-expression:
724
      postfix-expression
725
      ++ cast-expression
726
      -- cast-expression
727
      unary-operator cast-expression
728
      sizeof unary-expression
729
      sizeof ( type-id )
730
      sizeof ... ( identifier )
731
      new-expression
732
      delete-expression
733
 
734
   unary-operator: one of
735
      *   &   +   -  !
736
 
737
   GNU extensions:
738
      __alignof__ unary-expression
739
      __alignof__ ( type-id )  */
740
 
741
static void
742
pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
743
{
744
  enum tree_code code = TREE_CODE (t);
745
  switch (code)
746
    {
747
    case NEW_EXPR:
748
    case VEC_NEW_EXPR:
749
      pp_cxx_new_expression (pp, t);
750
      break;
751
 
752
    case DELETE_EXPR:
753
    case VEC_DELETE_EXPR:
754
      pp_cxx_delete_expression (pp, t);
755
      break;
756
 
757
    case SIZEOF_EXPR:
758
      if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
759
        {
760
          pp_cxx_ws_string (pp, "sizeof");
761
          pp_cxx_ws_string (pp, "...");
762
          pp_cxx_whitespace (pp);
763
          pp_cxx_left_paren (pp);
764
          if (TYPE_P (TREE_OPERAND (t, 0)))
765
            pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
766
          else
767
            pp_unary_expression (pp, TREE_OPERAND (t, 0));
768
          pp_cxx_right_paren (pp);
769
          break;
770
        }
771
      /* Fall through  */
772
 
773
    case ALIGNOF_EXPR:
774
      pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
775
      pp_cxx_whitespace (pp);
776
      if (TYPE_P (TREE_OPERAND (t, 0)))
777
        {
778
          pp_cxx_left_paren (pp);
779
          pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
780
          pp_cxx_right_paren (pp);
781
        }
782
      else
783
        pp_unary_expression (pp, TREE_OPERAND (t, 0));
784
      break;
785
 
786
    case UNARY_PLUS_EXPR:
787
      pp_plus (pp);
788
      pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
789
      break;
790
 
791
    default:
792
      pp_c_unary_expression (pp_c_base (pp), t);
793
      break;
794
    }
795
}
796
 
797
/* cast-expression:
798
      unary-expression
799
      ( type-id ) cast-expression  */
800
 
801
static void
802
pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
803
{
804
  switch (TREE_CODE (t))
805
    {
806
    case CAST_EXPR:
807
      pp_cxx_type_id (pp, TREE_TYPE (t));
808
      pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
809
      break;
810
 
811
    default:
812
      pp_c_cast_expression (pp_c_base (pp), t);
813
      break;
814
    }
815
}
816
 
817
/* pm-expression:
818
      cast-expression
819
      pm-expression .* cast-expression
820
      pm-expression ->* cast-expression  */
821
 
822
static void
823
pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
824
{
825
  switch (TREE_CODE (t))
826
    {
827
      /* Handle unfortunate OFFSET_REF overloading here.  */
828
    case OFFSET_REF:
829
      if (TYPE_P (TREE_OPERAND (t, 0)))
830
        {
831
          pp_cxx_qualified_id (pp, t);
832
          break;
833
        }
834
      /* Else fall through.  */
835
    case MEMBER_REF:
836
    case DOTSTAR_EXPR:
837
      pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
838
      if (TREE_CODE (t) == MEMBER_REF)
839
        pp_cxx_arrow (pp);
840
      else
841
        pp_cxx_dot (pp);
842
      pp_star(pp);
843
      pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
844
      break;
845
 
846
 
847
    default:
848
      pp_cxx_cast_expression (pp, t);
849
      break;
850
    }
851
}
852
 
853
/* multiplicative-expression:
854
      pm-expression
855
      multiplicative-expression * pm-expression
856
      multiplicative-expression / pm-expression
857
      multiplicative-expression % pm-expression  */
858
 
859
static void
860
pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
861
{
862
  enum tree_code code = TREE_CODE (e);
863
  switch (code)
864
    {
865
    case MULT_EXPR:
866
    case TRUNC_DIV_EXPR:
867
    case TRUNC_MOD_EXPR:
868
      pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
869
      pp_space (pp);
870
      if (code == MULT_EXPR)
871
        pp_star (pp);
872
      else if (code == TRUNC_DIV_EXPR)
873
        pp_slash (pp);
874
      else
875
        pp_modulo (pp);
876
      pp_space (pp);
877
      pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
878
      break;
879
 
880
    default:
881
      pp_cxx_pm_expression (pp, e);
882
      break;
883
    }
884
}
885
 
886
/* conditional-expression:
887
      logical-or-expression
888
      logical-or-expression ?  expression  : assignment-expression  */
889
 
890
static void
891
pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
892
{
893
  if (TREE_CODE (e) == COND_EXPR)
894
    {
895
      pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
896
      pp_space (pp);
897
      pp_question (pp);
898
      pp_space (pp);
899
      pp_cxx_expression (pp, TREE_OPERAND (e, 1));
900
      pp_space (pp);
901
      pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
902
    }
903
  else
904
    pp_c_logical_or_expression (pp_c_base (pp), e);
905
}
906
 
907
/* Pretty-print a compound assignment operator token as indicated by T.  */
908
 
909
static void
910
pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
911
{
912
  const char *op;
913
 
914
  switch (TREE_CODE (t))
915
    {
916
    case NOP_EXPR:
917
      op = "=";
918
      break;
919
 
920
    case PLUS_EXPR:
921
      op = "+=";
922
      break;
923
 
924
    case MINUS_EXPR:
925
      op = "-=";
926
      break;
927
 
928
    case TRUNC_DIV_EXPR:
929
      op = "/=";
930
      break;
931
 
932
    case TRUNC_MOD_EXPR:
933
      op = "%=";
934
      break;
935
 
936
    default:
937
      op = tree_code_name[TREE_CODE (t)];
938
      break;
939
    }
940
 
941
  pp_cxx_ws_string (pp, op);
942
}
943
 
944
 
945
/* assignment-expression:
946
      conditional-expression
947
      logical-or-expression assignment-operator assignment-expression
948
      throw-expression
949
 
950
   throw-expression:
951
       throw assignment-expression(opt)
952
 
953
   assignment-operator: one of
954
      =    *=    /=    %=    +=    -=    >>=    <<=    &=    ^=    |=  */
955
 
956
static void
957
pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
958
{
959
  switch (TREE_CODE (e))
960
    {
961
    case MODIFY_EXPR:
962
    case INIT_EXPR:
963
      pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
964
      pp_space (pp);
965
      pp_equal (pp);
966
      pp_space (pp);
967
      pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
968
      break;
969
 
970
    case THROW_EXPR:
971
      pp_cxx_ws_string (pp, "throw");
972
      if (TREE_OPERAND (e, 0))
973
        pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
974
      break;
975
 
976
    case MODOP_EXPR:
977
      pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
978
      pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
979
      pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
980
      break;
981
 
982
    default:
983
      pp_cxx_conditional_expression (pp, e);
984
      break;
985
    }
986
}
987
 
988
static void
989
pp_cxx_expression (cxx_pretty_printer *pp, tree t)
990
{
991
  switch (TREE_CODE (t))
992
    {
993
    case STRING_CST:
994
    case INTEGER_CST:
995
    case REAL_CST:
996
    case COMPLEX_CST:
997
      pp_cxx_constant (pp, t);
998
      break;
999
 
1000
    case RESULT_DECL:
1001
      pp_cxx_unqualified_id (pp, t);
1002
      break;
1003
 
1004
#if 0
1005
    case OFFSET_REF:
1006
#endif
1007
    case SCOPE_REF:
1008
    case PTRMEM_CST:
1009
      pp_cxx_qualified_id (pp, t);
1010
      break;
1011
 
1012
    case OVERLOAD:
1013
      t = OVL_CURRENT (t);
1014
    case VAR_DECL:
1015
    case PARM_DECL:
1016
    case FIELD_DECL:
1017
    case CONST_DECL:
1018
    case FUNCTION_DECL:
1019
    case BASELINK:
1020
    case TEMPLATE_DECL:
1021
    case TEMPLATE_TYPE_PARM:
1022
    case TEMPLATE_PARM_INDEX:
1023
    case TEMPLATE_TEMPLATE_PARM:
1024
    case STMT_EXPR:
1025
      pp_cxx_primary_expression (pp, t);
1026
      break;
1027
 
1028
    case CALL_EXPR:
1029
    case DYNAMIC_CAST_EXPR:
1030
    case STATIC_CAST_EXPR:
1031
    case REINTERPRET_CAST_EXPR:
1032
    case CONST_CAST_EXPR:
1033
#if 0
1034
    case MEMBER_REF:
1035
#endif
1036
    case EMPTY_CLASS_EXPR:
1037
    case TYPEID_EXPR:
1038
    case PSEUDO_DTOR_EXPR:
1039
    case AGGR_INIT_EXPR:
1040
    case ARROW_EXPR:
1041
      pp_cxx_postfix_expression (pp, t);
1042
      break;
1043
 
1044
    case NEW_EXPR:
1045
    case VEC_NEW_EXPR:
1046
      pp_cxx_new_expression (pp, t);
1047
      break;
1048
 
1049
    case DELETE_EXPR:
1050
    case VEC_DELETE_EXPR:
1051
      pp_cxx_delete_expression (pp, t);
1052
      break;
1053
 
1054
    case SIZEOF_EXPR:
1055
    case ALIGNOF_EXPR:
1056
      pp_cxx_unary_expression (pp, t);
1057
      break;
1058
 
1059
    case CAST_EXPR:
1060
      pp_cxx_cast_expression (pp, t);
1061
      break;
1062
 
1063
    case OFFSET_REF:
1064
    case MEMBER_REF:
1065
    case DOTSTAR_EXPR:
1066
      pp_cxx_pm_expression (pp, t);
1067
      break;
1068
 
1069
    case MULT_EXPR:
1070
    case TRUNC_DIV_EXPR:
1071
    case TRUNC_MOD_EXPR:
1072
      pp_cxx_multiplicative_expression (pp, t);
1073
      break;
1074
 
1075
    case COND_EXPR:
1076
      pp_cxx_conditional_expression (pp, t);
1077
      break;
1078
 
1079
    case MODIFY_EXPR:
1080
    case INIT_EXPR:
1081
    case THROW_EXPR:
1082
    case MODOP_EXPR:
1083
      pp_cxx_assignment_expression (pp, t);
1084
      break;
1085
 
1086
    case NON_DEPENDENT_EXPR:
1087
    case MUST_NOT_THROW_EXPR:
1088
      pp_cxx_expression (pp, TREE_OPERAND (t, 0));
1089
      break;
1090
 
1091
    case EXPR_PACK_EXPANSION:
1092
      pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t));
1093
      pp_cxx_ws_string (pp, "...");
1094
      break;
1095
 
1096
    case TEMPLATE_ID_EXPR:
1097
      pp_cxx_template_id (pp, t);
1098
      break;
1099
 
1100
    case NONTYPE_ARGUMENT_PACK:
1101
      {
1102
        tree args = ARGUMENT_PACK_ARGS (t);
1103
        int i, len = TREE_VEC_LENGTH (args);
1104
        for (i = 0; i < len; ++i)
1105
          {
1106
            if (i > 0)
1107
              pp_cxx_separate_with (pp, ',');
1108
            pp_cxx_expression (pp, TREE_VEC_ELT (args, i));
1109
          }
1110
      }
1111
      break;
1112
 
1113
    default:
1114
      pp_c_expression (pp_c_base (pp), t);
1115
      break;
1116
    }
1117
}
1118
 
1119
 
1120
/* Declarations.  */
1121
 
1122
/* function-specifier:
1123
      inline
1124
      virtual
1125
      explicit   */
1126
 
1127
static void
1128
pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
1129
{
1130
  switch (TREE_CODE (t))
1131
    {
1132
    case FUNCTION_DECL:
1133
      if (DECL_VIRTUAL_P (t))
1134
        pp_cxx_ws_string (pp, "virtual");
1135
      else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
1136
        pp_cxx_ws_string (pp, "explicit");
1137
      else
1138
        pp_c_function_specifier (pp_c_base (pp), t);
1139
 
1140
    default:
1141
      break;
1142
    }
1143
}
1144
 
1145
/* decl-specifier-seq:
1146
      decl-specifier-seq(opt) decl-specifier
1147
 
1148
   decl-specifier:
1149
      storage-class-specifier
1150
      type-specifier
1151
      function-specifier
1152
      friend
1153
      typedef  */
1154
 
1155
static void
1156
pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
1157
{
1158
  switch (TREE_CODE (t))
1159
    {
1160
    case VAR_DECL:
1161
    case PARM_DECL:
1162
    case CONST_DECL:
1163
    case FIELD_DECL:
1164
      pp_cxx_storage_class_specifier (pp, t);
1165
      pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1166
      break;
1167
 
1168
    case TYPE_DECL:
1169
      pp_cxx_ws_string (pp, "typedef");
1170
      pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
1171
      break;
1172
 
1173
    case RECORD_TYPE:
1174
      if (TYPE_PTRMEMFUNC_P (t))
1175
        {
1176
          tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1177
          pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1178
          pp_cxx_whitespace (pp);
1179
          pp_cxx_ptr_operator (pp, t);
1180
        }
1181
      break;
1182
 
1183
    case FUNCTION_DECL:
1184
      /* Constructors don't have return types.  And conversion functions
1185
         do not have a type-specifier in their return types.  */
1186
      if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
1187
        pp_cxx_function_specifier (pp, t);
1188
      else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1189
        pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
1190
      else
1191
        default:
1192
      pp_c_declaration_specifiers (pp_c_base (pp), t);
1193
      break;
1194
    }
1195
}
1196
 
1197
/* simple-type-specifier:
1198
      ::(opt) nested-name-specifier(opt) type-name
1199
      ::(opt) nested-name-specifier(opt) template(opt) template-id
1200
      char
1201
      wchar_t
1202
      bool
1203
      short
1204
      int
1205
      long
1206
      signed
1207
      unsigned
1208
      float
1209
      double
1210
      void  */
1211
 
1212
static void
1213
pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
1214
{
1215
  switch (TREE_CODE (t))
1216
    {
1217
    case RECORD_TYPE:
1218
    case UNION_TYPE:
1219
    case ENUMERAL_TYPE:
1220
      pp_cxx_qualified_id (pp, t);
1221
      break;
1222
 
1223
    case TEMPLATE_TYPE_PARM:
1224
    case TEMPLATE_TEMPLATE_PARM:
1225
    case TEMPLATE_PARM_INDEX:
1226
      pp_cxx_unqualified_id (pp, t);
1227
      break;
1228
 
1229
    case TYPENAME_TYPE:
1230
      pp_cxx_ws_string (pp, "typename");
1231
      pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
1232
      pp_cxx_unqualified_id (pp, TYPE_NAME (t));
1233
      break;
1234
 
1235
    default:
1236
      pp_c_type_specifier (pp_c_base (pp), t);
1237
      break;
1238
    }
1239
}
1240
 
1241
/* type-specifier-seq:
1242
      type-specifier type-specifier-seq(opt)
1243
 
1244
   type-specifier:
1245
      simple-type-specifier
1246
      class-specifier
1247
      enum-specifier
1248
      elaborated-type-specifier
1249
      cv-qualifier   */
1250
 
1251
static void
1252
pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
1253
{
1254
  switch (TREE_CODE (t))
1255
    {
1256
    case TEMPLATE_DECL:
1257
    case TEMPLATE_TYPE_PARM:
1258
    case TEMPLATE_TEMPLATE_PARM:
1259
    case TYPE_DECL:
1260
    case BOUND_TEMPLATE_TEMPLATE_PARM:
1261
      pp_cxx_cv_qualifier_seq (pp, t);
1262
      pp_cxx_simple_type_specifier (pp, t);
1263
      break;
1264
 
1265
    case METHOD_TYPE:
1266
      pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
1267
      pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1268
      pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
1269
      break;
1270
 
1271
    case DECLTYPE_TYPE:
1272
      pp_cxx_ws_string (pp, "decltype");
1273
      pp_cxx_left_paren (pp);
1274
      pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t));
1275
      pp_cxx_right_paren (pp);
1276
      break;
1277
 
1278
    case RECORD_TYPE:
1279
      if (TYPE_PTRMEMFUNC_P (t))
1280
        {
1281
          tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
1282
          pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
1283
          pp_cxx_whitespace (pp);
1284
          pp_cxx_ptr_operator (pp, t);
1285
          break;
1286
        }
1287
      /* else fall through */
1288
 
1289
    default:
1290
      if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
1291
        pp_c_specifier_qualifier_list (pp_c_base (pp), t);
1292
    }
1293
}
1294
 
1295
/* ptr-operator:
1296
      * cv-qualifier-seq(opt)
1297
      &
1298
      ::(opt) nested-name-specifier * cv-qualifier-seq(opt)  */
1299
 
1300
static void
1301
pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
1302
{
1303
  if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
1304
    t = TREE_TYPE (t);
1305
  switch (TREE_CODE (t))
1306
    {
1307
    case REFERENCE_TYPE:
1308
    case POINTER_TYPE:
1309
      if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
1310
          || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
1311
        pp_cxx_ptr_operator (pp, TREE_TYPE (t));
1312
      if (TREE_CODE (t) == POINTER_TYPE)
1313
        {
1314
          pp_star (pp);
1315
          pp_cxx_cv_qualifier_seq (pp, t);
1316
        }
1317
      else
1318
        pp_ampersand (pp);
1319
      break;
1320
 
1321
    case RECORD_TYPE:
1322
      if (TYPE_PTRMEMFUNC_P (t))
1323
        {
1324
          pp_cxx_left_paren (pp);
1325
          pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
1326
          pp_star (pp);
1327
          break;
1328
        }
1329
    case OFFSET_TYPE:
1330
      if (TYPE_PTR_TO_MEMBER_P (t))
1331
        {
1332
          if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1333
            pp_cxx_left_paren (pp);
1334
          pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
1335
          pp_star (pp);
1336
          pp_cxx_cv_qualifier_seq (pp, t);
1337
          break;
1338
        }
1339
      /* else fall through.  */
1340
 
1341
    default:
1342
      pp_unsupported_tree (pp, t);
1343
      break;
1344
    }
1345
}
1346
 
1347
static inline tree
1348
pp_cxx_implicit_parameter_type (tree mf)
1349
{
1350
  return TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (mf))));
1351
}
1352
 
1353
/*
1354
   parameter-declaration:
1355
      decl-specifier-seq declarator
1356
      decl-specifier-seq declarator = assignment-expression
1357
      decl-specifier-seq abstract-declarator(opt)
1358
      decl-specifier-seq abstract-declarator(opt) assignment-expression  */
1359
 
1360
static inline void
1361
pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
1362
{
1363
  pp_cxx_decl_specifier_seq (pp, t);
1364
  if (TYPE_P (t))
1365
    pp_cxx_abstract_declarator (pp, t);
1366
  else
1367
    pp_cxx_declarator (pp, t);
1368
}
1369
 
1370
/* parameter-declaration-clause:
1371
      parameter-declaration-list(opt) ...(opt)
1372
      parameter-declaration-list , ...
1373
 
1374
   parameter-declaration-list:
1375
      parameter-declaration
1376
      parameter-declaration-list , parameter-declaration  */
1377
 
1378
static void
1379
pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
1380
{
1381
  tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
1382
  tree types =
1383
    TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
1384
  const bool abstract = args == NULL
1385
    || pp_c_base (pp)->flags & pp_c_flag_abstract;
1386
  bool first = true;
1387
 
1388
  /* Skip artificial parameter for nonstatic member functions.  */
1389
  if (TREE_CODE (t) == METHOD_TYPE)
1390
    types = TREE_CHAIN (types);
1391
 
1392
  pp_cxx_left_paren (pp);
1393
  for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
1394
    {
1395
      if (!first)
1396
        pp_cxx_separate_with (pp, ',');
1397
      first = false;
1398
      pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
1399
      if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
1400
        {
1401
          pp_cxx_whitespace (pp);
1402
          pp_equal (pp);
1403
          pp_cxx_whitespace (pp);
1404
          pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
1405
        }
1406
    }
1407
  pp_cxx_right_paren (pp);
1408
}
1409
 
1410
/* exception-specification:
1411
      throw ( type-id-list(opt) )
1412
 
1413
   type-id-list
1414
      type-id
1415
      type-id-list , type-id   */
1416
 
1417
static void
1418
pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
1419
{
1420
  tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
1421
  bool need_comma = false;
1422
 
1423
  if (!TYPE_NOTHROW_P (t) && ex_spec == NULL)
1424
    return;
1425
  pp_cxx_ws_string (pp, "throw");
1426
  pp_cxx_left_paren (pp);
1427
  for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
1428
    {
1429
      tree type = TREE_VALUE (ex_spec);
1430
      tree argpack = NULL_TREE;
1431
      int i, len = 1;
1432
 
1433
      if (ARGUMENT_PACK_P (type))
1434
        {
1435
          argpack = ARGUMENT_PACK_ARGS (type);
1436
          len = TREE_VEC_LENGTH (argpack);
1437
        }
1438
 
1439
      for (i = 0; i < len; ++i)
1440
        {
1441
          if (argpack)
1442
            type = TREE_VEC_ELT (argpack, i);
1443
 
1444
          if (need_comma)
1445
            pp_cxx_separate_with (pp, ',');
1446
          else
1447
            need_comma = true;
1448
 
1449
          pp_cxx_type_id (pp, type);
1450
        }
1451
    }
1452
  pp_cxx_right_paren (pp);
1453
}
1454
 
1455
/* direct-declarator:
1456
      declarator-id
1457
      direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
1458
                                            exception-specification(opt)
1459
      direct-declaration [ constant-expression(opt) ]
1460
      ( declarator )  */
1461
 
1462
static void
1463
pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
1464
{
1465
  switch (TREE_CODE (t))
1466
    {
1467
    case VAR_DECL:
1468
    case PARM_DECL:
1469
    case CONST_DECL:
1470
    case FIELD_DECL:
1471
      if (DECL_NAME (t))
1472
        {
1473
          pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
1474
 
1475
          if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t))
1476
              || template_parameter_pack_p (t))
1477
            /* A function parameter pack or non-type template
1478
               parameter pack.  */
1479
            pp_cxx_ws_string (pp, "...");
1480
 
1481
          pp_cxx_id_expression (pp, DECL_NAME (t));
1482
        }
1483
      pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
1484
      break;
1485
 
1486
    case FUNCTION_DECL:
1487
      pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
1488
      pp_cxx_id_expression (pp, t);
1489
      pp_cxx_parameter_declaration_clause (pp, t);
1490
 
1491
      if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
1492
        {
1493
          pp_base (pp)->padding = pp_before;
1494
          pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
1495
        }
1496
 
1497
      pp_cxx_exception_specification (pp, TREE_TYPE (t));
1498
      break;
1499
 
1500
    case TYPENAME_TYPE:
1501
    case TEMPLATE_DECL:
1502
    case TEMPLATE_TYPE_PARM:
1503
    case TEMPLATE_PARM_INDEX:
1504
    case TEMPLATE_TEMPLATE_PARM:
1505
      break;
1506
 
1507
    default:
1508
      pp_c_direct_declarator (pp_c_base (pp), t);
1509
      break;
1510
    }
1511
}
1512
 
1513
/* declarator:
1514
   direct-declarator
1515
   ptr-operator declarator  */
1516
 
1517
static void
1518
pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
1519
{
1520
  pp_cxx_direct_declarator (pp, t);
1521
}
1522
 
1523
/* ctor-initializer:
1524
      : mem-initializer-list
1525
 
1526
   mem-initializer-list:
1527
      mem-initializer
1528
      mem-initializer , mem-initializer-list
1529
 
1530
   mem-initializer:
1531
      mem-initializer-id ( expression-list(opt) )
1532
 
1533
   mem-initializer-id:
1534
      ::(opt) nested-name-specifier(opt) class-name
1535
      identifier   */
1536
 
1537
static void
1538
pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
1539
{
1540
  t = TREE_OPERAND (t, 0);
1541
  pp_cxx_whitespace (pp);
1542
  pp_colon (pp);
1543
  pp_cxx_whitespace (pp);
1544
  for (; t; t = TREE_CHAIN (t))
1545
    {
1546
      tree purpose = TREE_PURPOSE (t);
1547
      bool is_pack = PACK_EXPANSION_P (purpose);
1548
 
1549
      if (is_pack)
1550
        pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose));
1551
      else
1552
        pp_cxx_primary_expression (pp, purpose);
1553
      pp_cxx_call_argument_list (pp, TREE_VALUE (t));
1554
      if (is_pack)
1555
        pp_cxx_ws_string (pp, "...");
1556
      if (TREE_CHAIN (t))
1557
        pp_cxx_separate_with (pp, ',');
1558
    }
1559
}
1560
 
1561
/* function-definition:
1562
      decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body
1563
      decl-specifier-seq(opt) declarator function-try-block  */
1564
 
1565
static void
1566
pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
1567
{
1568
  tree saved_scope = pp->enclosing_scope;
1569
  pp_cxx_decl_specifier_seq (pp, t);
1570
  pp_cxx_declarator (pp, t);
1571
  pp_needs_newline (pp) = true;
1572
  pp->enclosing_scope = DECL_CONTEXT (t);
1573
  if (DECL_SAVED_TREE (t))
1574
    pp_cxx_statement (pp, DECL_SAVED_TREE (t));
1575
  else
1576
    {
1577
      pp_cxx_semicolon (pp);
1578
      pp_needs_newline (pp) = true;
1579
    }
1580
  pp_flush (pp);
1581
  pp->enclosing_scope = saved_scope;
1582
}
1583
 
1584
/* abstract-declarator:
1585
      ptr-operator abstract-declarator(opt)
1586
      direct-abstract-declarator  */
1587
 
1588
static void
1589
pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
1590
{
1591
  if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t))
1592
    pp_cxx_right_paren (pp);
1593
  else if (POINTER_TYPE_P (t))
1594
    {
1595
      if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
1596
          || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1597
        pp_cxx_right_paren (pp);
1598
      t = TREE_TYPE (t);
1599
    }
1600
  pp_cxx_direct_abstract_declarator (pp, t);
1601
}
1602
 
1603
/* direct-abstract-declarator:
1604
      direct-abstract-declarator(opt) ( parameter-declaration-clause )
1605
                           cv-qualifier-seq(opt) exception-specification(opt)
1606
      direct-abstract-declarator(opt) [ constant-expression(opt) ]
1607
      ( abstract-declarator )  */
1608
 
1609
static void
1610
pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
1611
{
1612
  switch (TREE_CODE (t))
1613
    {
1614
    case REFERENCE_TYPE:
1615
      pp_cxx_abstract_declarator (pp, t);
1616
      break;
1617
 
1618
    case RECORD_TYPE:
1619
      if (TYPE_PTRMEMFUNC_P (t))
1620
        pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
1621
      break;
1622
 
1623
    case METHOD_TYPE:
1624
    case FUNCTION_TYPE:
1625
      pp_cxx_parameter_declaration_clause (pp, t);
1626
      pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
1627
      if (TREE_CODE (t) == METHOD_TYPE)
1628
        {
1629
          pp_base (pp)->padding = pp_before;
1630
          pp_cxx_cv_qualifier_seq
1631
            (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
1632
        }
1633
      pp_cxx_exception_specification (pp, t);
1634
      break;
1635
 
1636
    case TYPENAME_TYPE:
1637
    case TEMPLATE_TYPE_PARM:
1638
    case TEMPLATE_TEMPLATE_PARM:
1639
    case BOUND_TEMPLATE_TEMPLATE_PARM:
1640
    case UNBOUND_CLASS_TEMPLATE:
1641
      break;
1642
 
1643
    default:
1644
      pp_c_direct_abstract_declarator (pp_c_base (pp), t);
1645
      break;
1646
    }
1647
}
1648
 
1649
/* type-id:
1650
     type-specifier-seq abstract-declarator(opt) */
1651
 
1652
static void
1653
pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
1654
{
1655
  pp_flags saved_flags = pp_c_base (pp)->flags;
1656
  pp_c_base (pp)->flags |= pp_c_flag_abstract;
1657
 
1658
  switch (TREE_CODE (t))
1659
    {
1660
    case TYPE_DECL:
1661
    case UNION_TYPE:
1662
    case RECORD_TYPE:
1663
    case ENUMERAL_TYPE:
1664
    case TYPENAME_TYPE:
1665
    case BOUND_TEMPLATE_TEMPLATE_PARM:
1666
    case UNBOUND_CLASS_TEMPLATE:
1667
    case TEMPLATE_TEMPLATE_PARM:
1668
    case TEMPLATE_TYPE_PARM:
1669
    case TEMPLATE_PARM_INDEX:
1670
    case TEMPLATE_DECL:
1671
    case TYPEOF_TYPE:
1672
    case DECLTYPE_TYPE:
1673
    case TEMPLATE_ID_EXPR:
1674
      pp_cxx_type_specifier_seq (pp, t);
1675
      break;
1676
 
1677
    case TYPE_PACK_EXPANSION:
1678
      pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t));
1679
      pp_cxx_ws_string (pp, "...");
1680
      break;
1681
 
1682
    default:
1683
      pp_c_type_id (pp_c_base (pp), t);
1684
      break;
1685
    }
1686
 
1687
  pp_c_base (pp)->flags = saved_flags;
1688
}
1689
 
1690
/* template-argument-list:
1691
      template-argument ...(opt)
1692
      template-argument-list, template-argument ...(opt)
1693
 
1694
   template-argument:
1695
      assignment-expression
1696
      type-id
1697
      template-name  */
1698
 
1699
static void
1700
pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
1701
{
1702
  int i;
1703
  bool need_comma = false;
1704
 
1705
  if (t == NULL)
1706
    return;
1707
  for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
1708
    {
1709
      tree arg = TREE_VEC_ELT (t, i);
1710
      tree argpack = NULL_TREE;
1711
      int idx, len = 1;
1712
 
1713
      if (ARGUMENT_PACK_P (arg))
1714
        {
1715
          argpack = ARGUMENT_PACK_ARGS (arg);
1716
          len = TREE_VEC_LENGTH (argpack);
1717
        }
1718
 
1719
      for (idx = 0; idx < len; idx++)
1720
        {
1721
          if (argpack)
1722
            arg = TREE_VEC_ELT (argpack, idx);
1723
 
1724
          if (need_comma)
1725
            pp_cxx_separate_with (pp, ',');
1726
          else
1727
            need_comma = true;
1728
 
1729
          if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
1730
                               && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
1731
            pp_cxx_type_id (pp, arg);
1732
          else
1733
            pp_cxx_expression (pp, arg);
1734
        }
1735
    }
1736
}
1737
 
1738
 
1739
static void
1740
pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
1741
{
1742
  t = DECL_EXPR_DECL (t);
1743
  pp_cxx_type_specifier_seq (pp, t);
1744
  if (TYPE_P (t))
1745
    pp_cxx_abstract_declarator (pp, t);
1746
  else
1747
    pp_cxx_declarator (pp, t);
1748
}
1749
 
1750
/* Statements.  */
1751
 
1752
static void
1753
pp_cxx_statement (cxx_pretty_printer *pp, tree t)
1754
{
1755
  switch (TREE_CODE (t))
1756
    {
1757
    case CTOR_INITIALIZER:
1758
      pp_cxx_ctor_initializer (pp, t);
1759
      break;
1760
 
1761
    case USING_STMT:
1762
      pp_cxx_ws_string (pp, "using");
1763
      pp_cxx_ws_string (pp, "namespace");
1764
      if (DECL_CONTEXT (t))
1765
        pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1766
      pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
1767
      break;
1768
 
1769
    case USING_DECL:
1770
      pp_cxx_ws_string (pp, "using");
1771
      pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
1772
      pp_cxx_unqualified_id (pp, DECL_NAME (t));
1773
      break;
1774
 
1775
    case EH_SPEC_BLOCK:
1776
      break;
1777
 
1778
      /* try-block:
1779
            try compound-statement handler-seq  */
1780
    case TRY_BLOCK:
1781
      pp_maybe_newline_and_indent (pp, 0);
1782
      pp_cxx_ws_string (pp, "try");
1783
      pp_newline_and_indent (pp, 3);
1784
      pp_cxx_statement (pp, TRY_STMTS (t));
1785
      pp_newline_and_indent (pp, -3);
1786
      if (CLEANUP_P (t))
1787
        ;
1788
      else
1789
        pp_cxx_statement (pp, TRY_HANDLERS (t));
1790
      break;
1791
 
1792
      /*
1793
         handler-seq:
1794
            handler handler-seq(opt)
1795
 
1796
         handler:
1797
         catch ( exception-declaration ) compound-statement
1798
 
1799
         exception-declaration:
1800
            type-specifier-seq declarator
1801
            type-specifier-seq abstract-declarator
1802
            ...   */
1803
    case HANDLER:
1804
      pp_cxx_ws_string (pp, "catch");
1805
      pp_cxx_left_paren (pp);
1806
      pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
1807
      pp_cxx_right_paren (pp);
1808
      pp_indentation (pp) += 3;
1809
      pp_needs_newline (pp) = true;
1810
      pp_cxx_statement (pp, HANDLER_BODY (t));
1811
      pp_indentation (pp) -= 3;
1812
      pp_needs_newline (pp) = true;
1813
      break;
1814
 
1815
      /* selection-statement:
1816
            if ( expression ) statement
1817
            if ( expression ) statement else statement  */
1818
    case IF_STMT:
1819
      pp_cxx_ws_string (pp, "if");
1820
      pp_cxx_whitespace (pp);
1821
      pp_cxx_left_paren (pp);
1822
      pp_cxx_expression (pp, IF_COND (t));
1823
      pp_cxx_right_paren (pp);
1824
      pp_newline_and_indent (pp, 2);
1825
      pp_cxx_statement (pp, THEN_CLAUSE (t));
1826
      pp_newline_and_indent (pp, -2);
1827
      if (ELSE_CLAUSE (t))
1828
        {
1829
          tree else_clause = ELSE_CLAUSE (t);
1830
          pp_cxx_ws_string (pp, "else");
1831
          if (TREE_CODE (else_clause) == IF_STMT)
1832
            pp_cxx_whitespace (pp);
1833
          else
1834
            pp_newline_and_indent (pp, 2);
1835
          pp_cxx_statement (pp, else_clause);
1836
          if (TREE_CODE (else_clause) != IF_STMT)
1837
            pp_newline_and_indent (pp, -2);
1838
        }
1839
      break;
1840
 
1841
    case SWITCH_STMT:
1842
      pp_cxx_ws_string (pp, "switch");
1843
      pp_space (pp);
1844
      pp_cxx_left_paren (pp);
1845
      pp_cxx_expression (pp, SWITCH_STMT_COND (t));
1846
      pp_cxx_right_paren (pp);
1847
      pp_indentation (pp) += 3;
1848
      pp_needs_newline (pp) = true;
1849
      pp_cxx_statement (pp, SWITCH_STMT_BODY (t));
1850
      pp_newline_and_indent (pp, -3);
1851
      break;
1852
 
1853
      /* iteration-statement:
1854
            while ( expression ) statement
1855
            do statement while ( expression ) ;
1856
            for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
1857
            for ( declaration expression(opt) ; expression(opt) ) statement  */
1858
    case WHILE_STMT:
1859
      pp_cxx_ws_string (pp, "while");
1860
      pp_space (pp);
1861
      pp_cxx_left_paren (pp);
1862
      pp_cxx_expression (pp, WHILE_COND (t));
1863
      pp_cxx_right_paren (pp);
1864
      pp_newline_and_indent (pp, 3);
1865
      pp_cxx_statement (pp, WHILE_BODY (t));
1866
      pp_indentation (pp) -= 3;
1867
      pp_needs_newline (pp) = true;
1868
      break;
1869
 
1870
    case DO_STMT:
1871
      pp_cxx_ws_string (pp, "do");
1872
      pp_newline_and_indent (pp, 3);
1873
      pp_cxx_statement (pp, DO_BODY (t));
1874
      pp_newline_and_indent (pp, -3);
1875
      pp_cxx_ws_string (pp, "while");
1876
      pp_space (pp);
1877
      pp_cxx_left_paren (pp);
1878
      pp_cxx_expression (pp, DO_COND (t));
1879
      pp_cxx_right_paren (pp);
1880
      pp_cxx_semicolon (pp);
1881
      pp_needs_newline (pp) = true;
1882
      break;
1883
 
1884
    case FOR_STMT:
1885
      pp_cxx_ws_string (pp, "for");
1886
      pp_space (pp);
1887
      pp_cxx_left_paren (pp);
1888
      if (FOR_INIT_STMT (t))
1889
        pp_cxx_statement (pp, FOR_INIT_STMT (t));
1890
      else
1891
        pp_cxx_semicolon (pp);
1892
      pp_needs_newline (pp) = false;
1893
      pp_cxx_whitespace (pp);
1894
      if (FOR_COND (t))
1895
        pp_cxx_expression (pp, FOR_COND (t));
1896
      pp_cxx_semicolon (pp);
1897
      pp_needs_newline (pp) = false;
1898
      pp_cxx_whitespace (pp);
1899
      if (FOR_EXPR (t))
1900
        pp_cxx_expression (pp, FOR_EXPR (t));
1901
      pp_cxx_right_paren (pp);
1902
      pp_newline_and_indent (pp, 3);
1903
      pp_cxx_statement (pp, FOR_BODY (t));
1904
      pp_indentation (pp) -= 3;
1905
      pp_needs_newline (pp) = true;
1906
      break;
1907
 
1908
      /* jump-statement:
1909
            goto identifier;
1910
            continue ;
1911
            return expression(opt) ;  */
1912
    case BREAK_STMT:
1913
    case CONTINUE_STMT:
1914
      pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
1915
      pp_cxx_semicolon (pp);
1916
      pp_needs_newline (pp) = true;
1917
      break;
1918
 
1919
      /* expression-statement:
1920
            expression(opt) ;  */
1921
    case EXPR_STMT:
1922
      pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
1923
      pp_cxx_semicolon (pp);
1924
      pp_needs_newline (pp) = true;
1925
      break;
1926
 
1927
    case CLEANUP_STMT:
1928
      pp_cxx_ws_string (pp, "try");
1929
      pp_newline_and_indent (pp, 2);
1930
      pp_cxx_statement (pp, CLEANUP_BODY (t));
1931
      pp_newline_and_indent (pp, -2);
1932
      pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
1933
      pp_newline_and_indent (pp, 2);
1934
      pp_cxx_statement (pp, CLEANUP_EXPR (t));
1935
      pp_newline_and_indent (pp, -2);
1936
      break;
1937
 
1938
    case STATIC_ASSERT:
1939
      pp_cxx_declaration (pp, t);
1940
      break;
1941
 
1942
    default:
1943
      pp_c_statement (pp_c_base (pp), t);
1944
      break;
1945
    }
1946
}
1947
 
1948
/* original-namespace-definition:
1949
      namespace identifier { namespace-body }
1950
 
1951
  As an edge case, we also handle unnamed namespace definition here.  */
1952
 
1953
static void
1954
pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
1955
{
1956
  pp_cxx_ws_string (pp, "namespace");
1957
  if (DECL_CONTEXT (t))
1958
    pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1959
  if (DECL_NAME (t))
1960
    pp_cxx_unqualified_id (pp, t);
1961
  pp_cxx_whitespace (pp);
1962
  pp_cxx_left_brace (pp);
1963
  /* We do not print the namespace-body.  */
1964
  pp_cxx_whitespace (pp);
1965
  pp_cxx_right_brace (pp);
1966
}
1967
 
1968
/* namespace-alias:
1969
      identifier
1970
 
1971
   namespace-alias-definition:
1972
      namespace identifier = qualified-namespace-specifier ;
1973
 
1974
   qualified-namespace-specifier:
1975
      ::(opt) nested-name-specifier(opt) namespace-name   */
1976
 
1977
static void
1978
pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
1979
{
1980
  pp_cxx_ws_string (pp, "namespace");
1981
  if (DECL_CONTEXT (t))
1982
    pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
1983
  pp_cxx_unqualified_id (pp, t);
1984
  pp_cxx_whitespace (pp);
1985
  pp_equal (pp);
1986
  pp_cxx_whitespace (pp);
1987
  if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)))
1988
    pp_cxx_nested_name_specifier (pp,
1989
                                  DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t)));
1990
  pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
1991
  pp_cxx_semicolon (pp);
1992
}
1993
 
1994
/* simple-declaration:
1995
      decl-specifier-seq(opt) init-declarator-list(opt)  */
1996
 
1997
static void
1998
pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
1999
{
2000
  pp_cxx_decl_specifier_seq (pp, t);
2001
  pp_cxx_init_declarator (pp, t);
2002
  pp_cxx_semicolon (pp);
2003
  pp_needs_newline (pp) = true;
2004
}
2005
 
2006
/*
2007
  template-parameter-list:
2008
     template-parameter
2009
     template-parameter-list , template-parameter  */
2010
 
2011
static inline void
2012
pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
2013
{
2014
  const int n = TREE_VEC_LENGTH (t);
2015
  int i;
2016
  for (i = 0; i < n; ++i)
2017
    {
2018
      if (i)
2019
        pp_cxx_separate_with (pp, ',');
2020
      pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
2021
    }
2022
}
2023
 
2024
/* template-parameter:
2025
      type-parameter
2026
      parameter-declaration
2027
 
2028
   type-parameter:
2029
     class ...(opt) identifier(opt)
2030
     class identifier(opt) = type-id
2031
     typename identifier(opt)
2032
     typename ...(opt) identifier(opt) = type-id
2033
     template < template-parameter-list > class ...(opt) identifier(opt)
2034
     template < template-parameter-list > class identifier(opt) = template-name  */
2035
 
2036
static void
2037
pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
2038
{
2039
  tree parameter =  TREE_VALUE (t);
2040
  switch (TREE_CODE (parameter))
2041
    {
2042
    case TYPE_DECL:
2043
      pp_cxx_ws_string (pp, "class");
2044
      if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t)))
2045
        pp_cxx_ws_string (pp, "...");
2046
      if (DECL_NAME (parameter))
2047
        pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
2048
      /* FIXME: Check if we should print also default argument.  */
2049
      break;
2050
 
2051
    case PARM_DECL:
2052
      pp_cxx_parameter_declaration (pp, parameter);
2053
      break;
2054
 
2055
    case TEMPLATE_DECL:
2056
      break;
2057
 
2058
    default:
2059
      pp_unsupported_tree (pp, t);
2060
      break;
2061
    }
2062
}
2063
 
2064
/* Pretty-print a template parameter in the canonical form
2065
   "template-parameter-<level>-<position in parameter list>".  */
2066
 
2067
void
2068
pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
2069
{
2070
  const enum tree_code code = TREE_CODE (parm);
2071
 
2072
  /* Brings type template parameters to the canonical forms.  */
2073
  if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
2074
      || code == BOUND_TEMPLATE_TEMPLATE_PARM)
2075
    parm = TEMPLATE_TYPE_PARM_INDEX (parm);
2076
 
2077
  pp_cxx_begin_template_argument_list (pp);
2078
  pp_cxx_ws_string (pp, M_("template-parameter-"));
2079
  pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
2080
  pp_minus (pp);
2081
  pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
2082
  pp_cxx_end_template_argument_list (pp);
2083
}
2084
 
2085
/*
2086
  template-declaration:
2087
     export(opt) template < template-parameter-list > declaration   */
2088
 
2089
static void
2090
pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
2091
{
2092
  tree tmpl = most_general_template (t);
2093
  tree level;
2094
  int i = 0;
2095
 
2096
  pp_maybe_newline_and_indent (pp, 0);
2097
  for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
2098
    {
2099
      pp_cxx_ws_string (pp, "template");
2100
      pp_cxx_begin_template_argument_list (pp);
2101
      pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
2102
      pp_cxx_end_template_argument_list (pp);
2103
      pp_newline_and_indent (pp, 3);
2104
      i += 3;
2105
    }
2106
  if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
2107
    pp_cxx_function_definition (pp, t);
2108
  else
2109
    pp_cxx_simple_declaration (pp, t);
2110
}
2111
 
2112
static void
2113
pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
2114
{
2115
  pp_unsupported_tree (pp, t);
2116
}
2117
 
2118
static void
2119
pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
2120
{
2121
  pp_unsupported_tree (pp, t);
2122
}
2123
 
2124
/*
2125
    declaration:
2126
       block-declaration
2127
       function-definition
2128
       template-declaration
2129
       explicit-instantiation
2130
       explicit-specialization
2131
       linkage-specification
2132
       namespace-definition
2133
 
2134
    block-declaration:
2135
       simple-declaration
2136
       asm-definition
2137
       namespace-alias-definition
2138
       using-declaration
2139
       using-directive
2140
       static_assert-declaration */
2141
void
2142
pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
2143
{
2144
  if (TREE_CODE (t) == STATIC_ASSERT)
2145
    {
2146
      pp_cxx_ws_string (pp, "static_assert");
2147
      pp_cxx_left_paren (pp);
2148
      pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t));
2149
      pp_cxx_separate_with (pp, ',');
2150
      pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t));
2151
      pp_cxx_right_paren (pp);
2152
    }
2153
  else if (!DECL_LANG_SPECIFIC (t))
2154
    pp_cxx_simple_declaration (pp, t);
2155
  else if (DECL_USE_TEMPLATE (t))
2156
    switch (DECL_USE_TEMPLATE (t))
2157
      {
2158
      case 1:
2159
        pp_cxx_template_declaration (pp, t);
2160
        break;
2161
 
2162
      case 2:
2163
        pp_cxx_explicit_specialization (pp, t);
2164
        break;
2165
 
2166
      case 3:
2167
        pp_cxx_explicit_instantiation (pp, t);
2168
        break;
2169
 
2170
      default:
2171
        break;
2172
      }
2173
  else switch (TREE_CODE (t))
2174
    {
2175
    case VAR_DECL:
2176
    case TYPE_DECL:
2177
      pp_cxx_simple_declaration (pp, t);
2178
      break;
2179
 
2180
    case FUNCTION_DECL:
2181
      if (DECL_SAVED_TREE (t))
2182
        pp_cxx_function_definition (pp, t);
2183
      else
2184
        pp_cxx_simple_declaration (pp, t);
2185
      break;
2186
 
2187
    case NAMESPACE_DECL:
2188
      if (DECL_NAMESPACE_ALIAS (t))
2189
        pp_cxx_namespace_alias_definition (pp, t);
2190
      else
2191
        pp_cxx_original_namespace_definition (pp, t);
2192
      break;
2193
 
2194
    default:
2195
      pp_unsupported_tree (pp, t);
2196
      break;
2197
    }
2198
}
2199
 
2200
static void
2201
pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t)
2202
{
2203
  t = TREE_OPERAND (t, 0);
2204
  pp_cxx_ws_string (pp, "typeid");
2205
  pp_cxx_left_paren (pp);
2206
  if (TYPE_P (t))
2207
    pp_cxx_type_id (pp, t);
2208
  else
2209
    pp_cxx_expression (pp, t);
2210
  pp_cxx_right_paren (pp);
2211
}
2212
 
2213
void
2214
pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t)
2215
{
2216
  pp_cxx_ws_string (pp, "va_arg");
2217
  pp_cxx_left_paren (pp);
2218
  pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0));
2219
  pp_cxx_separate_with (pp, ',');
2220
  pp_cxx_type_id (pp, TREE_TYPE (t));
2221
  pp_cxx_right_paren (pp);
2222
}
2223
 
2224
static bool
2225
pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
2226
{
2227
  switch (TREE_CODE (t))
2228
    {
2229
    case ARROW_EXPR:
2230
      if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
2231
          && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2232
        {
2233
          pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
2234
          pp_cxx_separate_with (pp, ',');
2235
          return true;
2236
        }
2237
      return false;
2238
    case COMPONENT_REF:
2239
      if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2240
        return false;
2241
      if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
2242
        pp_cxx_dot (pp);
2243
      pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2244
      return true;
2245
    case ARRAY_REF:
2246
      if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2247
        return false;
2248
      pp_left_bracket (pp);
2249
      pp_cxx_expression (pp, TREE_OPERAND (t, 1));
2250
      pp_right_bracket (pp);
2251
      return true;
2252
    default:
2253
      return false;
2254
    }
2255
}
2256
 
2257
void
2258
pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
2259
{
2260
  pp_cxx_ws_string (pp, "offsetof");
2261
  pp_cxx_left_paren (pp);
2262
  if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
2263
    pp_cxx_expression (pp, TREE_OPERAND (t, 0));
2264
  pp_cxx_right_paren (pp);
2265
}
2266
 
2267
void
2268
pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t)
2269
{
2270
  cp_trait_kind kind = TRAIT_EXPR_KIND (t);
2271
 
2272
  switch (kind)
2273
    {
2274
    case CPTK_HAS_NOTHROW_ASSIGN:
2275
      pp_cxx_ws_string (pp, "__has_nothrow_assign");
2276
      break;
2277
    case CPTK_HAS_TRIVIAL_ASSIGN:
2278
      pp_cxx_ws_string (pp, "__has_trivial_assign");
2279
      break;
2280
    case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2281
      pp_cxx_ws_string (pp, "__has_nothrow_constructor");
2282
      break;
2283
    case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2284
      pp_cxx_ws_string (pp, "__has_trivial_constructor");
2285
      break;
2286
    case CPTK_HAS_NOTHROW_COPY:
2287
      pp_cxx_ws_string (pp, "__has_nothrow_copy");
2288
      break;
2289
    case CPTK_HAS_TRIVIAL_COPY:
2290
      pp_cxx_ws_string (pp, "__has_trivial_copy");
2291
      break;
2292
    case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2293
      pp_cxx_ws_string (pp, "__has_trivial_destructor");
2294
      break;
2295
    case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2296
      pp_cxx_ws_string (pp, "__has_virtual_destructor");
2297
      break;
2298
    case CPTK_IS_ABSTRACT:
2299
      pp_cxx_ws_string (pp, "__is_abstract");
2300
      break;
2301
    case CPTK_IS_BASE_OF:
2302
      pp_cxx_ws_string (pp, "__is_base_of");
2303
      break;
2304
    case CPTK_IS_CLASS:
2305
      pp_cxx_ws_string (pp, "__is_class");
2306
      break;
2307
    case CPTK_IS_CONVERTIBLE_TO:
2308
      pp_cxx_ws_string (pp, "__is_convertible_to");
2309
      break;
2310
    case CPTK_IS_EMPTY:
2311
      pp_cxx_ws_string (pp, "__is_empty");
2312
      break;
2313
    case CPTK_IS_ENUM:
2314
      pp_cxx_ws_string (pp, "__is_enum");
2315
      break;
2316
    case CPTK_IS_POD:
2317
      pp_cxx_ws_string (pp, "__is_pod");
2318
      break;
2319
    case CPTK_IS_POLYMORPHIC:
2320
      pp_cxx_ws_string (pp, "__is_polymorphic");
2321
      break;
2322
    case CPTK_IS_STD_LAYOUT:
2323
      pp_cxx_ws_string (pp, "__is_std_layout");
2324
      break;
2325
    case CPTK_IS_TRIVIAL:
2326
      pp_cxx_ws_string (pp, "__is_trivial");
2327
      break;
2328
    case CPTK_IS_UNION:
2329
      pp_cxx_ws_string (pp, "__is_union");
2330
      break;
2331
 
2332
    default:
2333
      gcc_unreachable ();
2334
    }
2335
 
2336
  pp_cxx_left_paren (pp);
2337
  pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t));
2338
 
2339
  if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
2340
    {
2341
      pp_cxx_separate_with (pp, ',');
2342
      pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t));
2343
    }
2344
 
2345
  pp_cxx_right_paren (pp);
2346
}
2347
 
2348
typedef c_pretty_print_fn pp_fun;
2349
 
2350
/* Initialization of a C++ pretty-printer object.  */
2351
 
2352
void
2353
pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
2354
{
2355
  pp_c_pretty_printer_init (pp_c_base (pp));
2356
  pp_set_line_maximum_length (pp, 0);
2357
 
2358
  pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
2359
  pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
2360
  pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
2361
  pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
2362
  pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
2363
  pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
2364
  pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
2365
  pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
2366
  pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
2367
  pp->c_base.direct_abstract_declarator =
2368
    (pp_fun) pp_cxx_direct_abstract_declarator;
2369
  pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
2370
 
2371
  /* pp->c_base.statement = (pp_fun) pp_cxx_statement;  */
2372
 
2373
  pp->c_base.constant = (pp_fun) pp_cxx_constant;
2374
  pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
2375
  pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
2376
  pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
2377
  pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
2378
  pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
2379
  pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
2380
  pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
2381
  pp->c_base.expression = (pp_fun) pp_cxx_expression;
2382
  pp->enclosing_scope = global_namespace;
2383
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.