00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "coretypes.h"
00025 #include "tm.h"
00026 #include "real.h"
00027 #include "cxx-pretty-print.h"
00028 #include "cp-tree.h"
00029 #include "toplev.h"
00030
00031 static void pp_cxx_unqualified_id (cxx_pretty_printer *, tree);
00032 static void pp_cxx_nested_name_specifier (cxx_pretty_printer *, tree);
00033 static void pp_cxx_qualified_id (cxx_pretty_printer *, tree);
00034 static void pp_cxx_assignment_expression (cxx_pretty_printer *, tree);
00035 static void pp_cxx_expression (cxx_pretty_printer *, tree);
00036 static void pp_cxx_template_argument_list (cxx_pretty_printer *, tree);
00037 static void pp_cxx_type_specifier_seq (cxx_pretty_printer *, tree);
00038 static void pp_cxx_ptr_operator (cxx_pretty_printer *, tree);
00039 static void pp_cxx_type_id (cxx_pretty_printer *, tree);
00040 static void pp_cxx_direct_abstract_declarator (cxx_pretty_printer *, tree);
00041 static void pp_cxx_declarator (cxx_pretty_printer *, tree);
00042 static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
00043 static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
00044 static void pp_cxx_statement (cxx_pretty_printer *, tree);
00045 static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
00046
00047
00048 static inline void
00049 pp_cxx_nonconsecutive_character (cxx_pretty_printer *pp, int c)
00050 {
00051 const char *p = pp_last_position_in_text (pp);
00052
00053 if (p != NULL && *p == c)
00054 pp_cxx_whitespace (pp);
00055 pp_character (pp, c);
00056 pp_base (pp)->padding = pp_none;
00057 }
00058
00059 #define pp_cxx_storage_class_specifier(PP, T) \
00060 pp_c_storage_class_specifier (pp_c_base (PP), T)
00061 #define pp_cxx_expression_list(PP, T) \
00062 pp_c_expression_list (pp_c_base (PP), T)
00063 #define pp_cxx_space_for_pointer_operator(PP, T) \
00064 pp_c_space_for_pointer_operator (pp_c_base (PP), T)
00065 #define pp_cxx_init_declarator(PP, T) \
00066 pp_c_init_declarator (pp_c_base (PP), T)
00067 #define pp_cxx_call_argument_list(PP, T) \
00068 pp_c_call_argument_list (pp_c_base (PP), T)
00069
00070 void
00071 pp_cxx_colon_colon (cxx_pretty_printer *pp)
00072 {
00073 pp_colon_colon (pp);
00074 pp_base (pp)->padding = pp_none;
00075 }
00076
00077 void
00078 pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp)
00079 {
00080 pp_cxx_nonconsecutive_character (pp, '<');
00081 }
00082
00083 void
00084 pp_cxx_end_template_argument_list (cxx_pretty_printer *pp)
00085 {
00086 pp_cxx_nonconsecutive_character (pp, '>');
00087 }
00088
00089 void
00090 pp_cxx_separate_with (cxx_pretty_printer *pp, int c)
00091 {
00092 pp_separate_with (pp, c);
00093 pp_base (pp)->padding = pp_none;
00094 }
00095
00096
00097
00098 static inline bool
00099 is_destructor_name (tree name)
00100 {
00101 return name == complete_dtor_identifier
00102 || name == base_dtor_identifier
00103 || name == deleting_dtor_identifier;
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 static inline void
00116 pp_cxx_conversion_function_id (cxx_pretty_printer *pp, tree t)
00117 {
00118 pp_cxx_identifier (pp, "operator");
00119 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
00120 }
00121
00122 static inline void
00123 pp_cxx_template_id (cxx_pretty_printer *pp, tree t)
00124 {
00125 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0));
00126 pp_cxx_begin_template_argument_list (pp);
00127 pp_cxx_template_argument_list (pp, TREE_OPERAND (t, 1));
00128 pp_cxx_end_template_argument_list (pp);
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138 static void
00139 pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
00140 {
00141 enum tree_code code = TREE_CODE (t);
00142 switch (code)
00143 {
00144 case RESULT_DECL:
00145 pp_cxx_identifier (pp, "<return-value>");
00146 break;
00147
00148 case OVERLOAD:
00149 t = OVL_CURRENT (t);
00150 case VAR_DECL:
00151 case PARM_DECL:
00152 case CONST_DECL:
00153 case TYPE_DECL:
00154 case FUNCTION_DECL:
00155 case NAMESPACE_DECL:
00156 case FIELD_DECL:
00157 case LABEL_DECL:
00158 case USING_DECL:
00159 case TEMPLATE_DECL:
00160 t = DECL_NAME (t);
00161
00162 case IDENTIFIER_NODE:
00163 if (t == NULL)
00164 pp_cxx_identifier (pp, "<unnamed>");
00165 else if (IDENTIFIER_TYPENAME_P (t))
00166 pp_cxx_conversion_function_id (pp, t);
00167 else
00168 {
00169 if (is_destructor_name (t))
00170 {
00171 pp_complement (pp);
00172
00173 if (TREE_TYPE (t))
00174 t = constructor_name (TREE_TYPE (t));
00175 }
00176 pp_cxx_tree_identifier (pp, t);
00177 }
00178 break;
00179
00180 case TEMPLATE_ID_EXPR:
00181 pp_cxx_template_id (pp, t);
00182 break;
00183
00184 case BASELINK:
00185 pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
00186 break;
00187
00188 case RECORD_TYPE:
00189 case UNION_TYPE:
00190 case ENUMERAL_TYPE:
00191 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
00192 break;
00193
00194 case TEMPLATE_TYPE_PARM:
00195 case TEMPLATE_TEMPLATE_PARM:
00196 if (TYPE_IDENTIFIER (t))
00197 pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
00198 else
00199 pp_cxx_canonical_template_parameter (pp, t);
00200 break;
00201
00202 case TEMPLATE_PARM_INDEX:
00203 pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t));
00204 break;
00205
00206 default:
00207 pp_unsupported_tree (pp, t);
00208 break;
00209 }
00210 }
00211
00212
00213
00214
00215
00216
00217 static inline void
00218 pp_cxx_template_keyword_if_needed (cxx_pretty_printer *pp, tree scope, tree t)
00219 {
00220 if (TREE_CODE (t) == TEMPLATE_ID_EXPR
00221 && TYPE_P (scope) && dependent_type_p (scope))
00222 pp_cxx_identifier (pp, "template");
00223 }
00224
00225
00226
00227
00228
00229 static void
00230 pp_cxx_nested_name_specifier (cxx_pretty_printer *pp, tree t)
00231 {
00232 if (t != NULL && t != pp->enclosing_scope)
00233 {
00234 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
00235 pp_cxx_nested_name_specifier (pp, scope);
00236 pp_cxx_template_keyword_if_needed (pp, scope, t);
00237 pp_cxx_unqualified_id (pp, t);
00238 pp_cxx_colon_colon (pp);
00239 }
00240 }
00241
00242
00243
00244
00245 static void
00246 pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
00247 {
00248 switch (TREE_CODE (t))
00249 {
00250
00251 case PTRMEM_CST:
00252 pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t));
00253 pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t));
00254 break;
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 case OVERLOAD:
00265 t = OVL_CURRENT (t);
00266 case FUNCTION_DECL:
00267 if (DECL_FUNCTION_MEMBER_P (t))
00268 pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
00269 pp_cxx_unqualified_id
00270 (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
00271 pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
00272 break;
00273
00274 case OFFSET_REF:
00275 case SCOPE_REF:
00276 pp_cxx_nested_name_specifier (pp, TREE_OPERAND (t, 0));
00277 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 1));
00278 break;
00279
00280 default:
00281 {
00282 tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
00283 if (scope != pp->enclosing_scope)
00284 {
00285 pp_cxx_nested_name_specifier (pp, scope);
00286 pp_cxx_template_keyword_if_needed (pp, scope, t);
00287 }
00288 pp_cxx_unqualified_id (pp, t);
00289 }
00290 break;
00291 }
00292 }
00293
00294
00295
00296
00297
00298 static inline void
00299 pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
00300 {
00301 if (TREE_CODE (t) == OVERLOAD)
00302 t = OVL_CURRENT (t);
00303 if (DECL_P (t) && DECL_CONTEXT (t))
00304 pp_cxx_qualified_id (pp, t);
00305 else
00306 pp_cxx_unqualified_id (pp, t);
00307 }
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318 static void
00319 pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
00320 {
00321 switch (TREE_CODE (t))
00322 {
00323 case STRING_CST:
00324 case INTEGER_CST:
00325 case REAL_CST:
00326 pp_c_constant (pp_c_base (pp), t);
00327 break;
00328
00329 case BASELINK:
00330 t = BASELINK_FUNCTIONS (t);
00331 case VAR_DECL:
00332 case PARM_DECL:
00333 case FIELD_DECL:
00334 case FUNCTION_DECL:
00335 case OVERLOAD:
00336 case CONST_DECL:
00337 case TEMPLATE_DECL:
00338 pp_cxx_id_expression (pp, t);
00339 break;
00340
00341 case RESULT_DECL:
00342 case TEMPLATE_TYPE_PARM:
00343 case TEMPLATE_TEMPLATE_PARM:
00344 case TEMPLATE_PARM_INDEX:
00345 pp_cxx_unqualified_id (pp, t);
00346 break;
00347
00348 default:
00349 pp_c_primary_expression (pp_c_base (pp), t);
00350 break;
00351 }
00352 }
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 static void
00376 pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
00377 {
00378 enum tree_code code = TREE_CODE (t);
00379
00380 switch (code)
00381 {
00382 case AGGR_INIT_EXPR:
00383 case CALL_EXPR:
00384 {
00385 tree fun = TREE_OPERAND (t, 0);
00386 tree args = TREE_OPERAND (t, 1);
00387 tree saved_scope = pp->enclosing_scope;
00388
00389 if (TREE_CODE (fun) == ADDR_EXPR)
00390 fun = TREE_OPERAND (fun, 0);
00391
00392
00393
00394
00395
00396 if (TREE_CODE (fun) != FUNCTION_DECL)
00397 ;
00398 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
00399 {
00400 tree object = code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t)
00401 ? TREE_OPERAND (t, 2)
00402 : TREE_VALUE (args);
00403
00404 while (TREE_CODE (object) == NOP_EXPR)
00405 object = TREE_OPERAND (object, 0);
00406
00407 if (TREE_CODE (object) == ADDR_EXPR)
00408 object = TREE_OPERAND (object, 0);
00409
00410 if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
00411 {
00412 pp_cxx_postfix_expression (pp, object);
00413 pp_cxx_dot (pp);
00414 }
00415 else
00416 {
00417 pp_cxx_postfix_expression (pp, object);
00418 pp_cxx_arrow (pp);
00419 }
00420 args = TREE_CHAIN (args);
00421 pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
00422 }
00423
00424 pp_cxx_postfix_expression (pp, fun);
00425 pp->enclosing_scope = saved_scope;
00426 pp_cxx_call_argument_list (pp, args);
00427 }
00428 if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
00429 {
00430 pp_cxx_separate_with (pp, ',');
00431 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 2));
00432 }
00433 break;
00434
00435 case BASELINK:
00436 case VAR_DECL:
00437 case PARM_DECL:
00438 case FIELD_DECL:
00439 case FUNCTION_DECL:
00440 case OVERLOAD:
00441 case CONST_DECL:
00442 case TEMPLATE_DECL:
00443 case RESULT_DECL:
00444 pp_cxx_primary_expression (pp, t);
00445 break;
00446
00447 case DYNAMIC_CAST_EXPR:
00448 case STATIC_CAST_EXPR:
00449 case REINTERPRET_CAST_EXPR:
00450 case CONST_CAST_EXPR:
00451 if (code == DYNAMIC_CAST_EXPR)
00452 pp_cxx_identifier (pp, "dynamic_cast");
00453 else if (code == STATIC_CAST_EXPR)
00454 pp_cxx_identifier (pp, "static_cast");
00455 else if (code == REINTERPRET_CAST_EXPR)
00456 pp_cxx_identifier (pp, "reinterpret_cast");
00457 else
00458 pp_cxx_identifier (pp, "const_cast");
00459 pp_cxx_begin_template_argument_list (pp);
00460 pp_cxx_type_id (pp, TREE_TYPE (t));
00461 pp_cxx_end_template_argument_list (pp);
00462 pp_left_paren (pp);
00463 pp_cxx_expression (pp, TREE_OPERAND (t, 0));
00464 pp_right_paren (pp);
00465 break;
00466
00467 case EMPTY_CLASS_EXPR:
00468 pp_cxx_type_id (pp, TREE_TYPE (t));
00469 pp_left_paren (pp);
00470 pp_right_paren (pp);
00471 break;
00472
00473 case TYPEID_EXPR:
00474 t = TREE_OPERAND (t, 0);
00475 pp_cxx_identifier (pp, "typeid");
00476 pp_left_paren (pp);
00477 if (TYPE_P (t))
00478 pp_cxx_type_id (pp, t);
00479 else
00480 pp_cxx_expression (pp, t);
00481 pp_right_paren (pp);
00482 break;
00483
00484 case PSEUDO_DTOR_EXPR:
00485 pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0));
00486 pp_cxx_dot (pp);
00487 pp_cxx_qualified_id (pp, TREE_OPERAND (t, 1));
00488 pp_cxx_colon_colon (pp);
00489 pp_complement (pp);
00490 pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 2));
00491 break;
00492
00493 default:
00494 pp_c_postfix_expression (pp_c_base (pp), t);
00495 break;
00496 }
00497 }
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520 static void
00521 pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
00522 {
00523 enum tree_code code = TREE_CODE (t);
00524 switch (code)
00525 {
00526 case NEW_EXPR:
00527 case VEC_NEW_EXPR:
00528 if (NEW_EXPR_USE_GLOBAL (t))
00529 pp_cxx_colon_colon (pp);
00530 pp_cxx_identifier (pp, "new");
00531 if (TREE_OPERAND (t, 0))
00532 {
00533 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
00534 pp_space (pp);
00535 }
00536
00537 pp_cxx_type_id (pp, TREE_OPERAND (t, 1));
00538 if (TREE_OPERAND (t, 2))
00539 {
00540 pp_left_paren (pp);
00541 t = TREE_OPERAND (t, 2);
00542 if (TREE_CODE (t) == TREE_LIST)
00543 pp_c_expression_list (pp_c_base (pp), t);
00544 else if (t == void_zero_node)
00545 ;
00546 else
00547 pp_cxx_expression (pp, t);
00548 pp_right_paren (pp);
00549 }
00550 break;
00551
00552 default:
00553 pp_unsupported_tree (pp, t);
00554 }
00555 }
00556
00557
00558
00559
00560
00561 static void
00562 pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
00563 {
00564 enum tree_code code = TREE_CODE (t);
00565 switch (code)
00566 {
00567 case DELETE_EXPR:
00568 case VEC_DELETE_EXPR:
00569 if (DELETE_EXPR_USE_GLOBAL (t))
00570 pp_cxx_colon_colon (pp);
00571 pp_cxx_identifier (pp, "delete");
00572 if (code == VEC_DELETE_EXPR)
00573 {
00574 pp_left_bracket (pp);
00575 pp_right_bracket (pp);
00576 }
00577 pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
00578 break;
00579
00580 default:
00581 pp_unsupported_tree (pp, t);
00582 }
00583 }
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602 static void
00603 pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
00604 {
00605 enum tree_code code = TREE_CODE (t);
00606 switch (code)
00607 {
00608 case NEW_EXPR:
00609 case VEC_NEW_EXPR:
00610 pp_cxx_new_expression (pp, t);
00611 break;
00612
00613 case DELETE_EXPR:
00614 case VEC_DELETE_EXPR:
00615 pp_cxx_delete_expression (pp, t);
00616 break;
00617
00618 default:
00619 pp_c_unary_expression (pp_c_base (pp), t);
00620 break;
00621 }
00622 }
00623
00624
00625
00626
00627
00628 static void
00629 pp_cxx_cast_expression (cxx_pretty_printer *pp, tree t)
00630 {
00631 switch (TREE_CODE (t))
00632 {
00633 case CAST_EXPR:
00634 pp_cxx_type_id (pp, TREE_TYPE (t));
00635 pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
00636 break;
00637
00638 default:
00639 pp_c_cast_expression (pp_c_base (pp), t);
00640 break;
00641 }
00642 }
00643
00644
00645
00646
00647
00648
00649 static void
00650 pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
00651 {
00652 switch (TREE_CODE (t))
00653 {
00654
00655 case OFFSET_REF:
00656 if (TYPE_P (TREE_OPERAND (t, 0)))
00657 {
00658 pp_cxx_qualified_id (pp, t);
00659 break;
00660 }
00661
00662 case MEMBER_REF:
00663 case DOTSTAR_EXPR:
00664 pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
00665 pp_cxx_dot (pp);
00666 pp_star(pp);
00667 pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
00668 break;
00669
00670
00671 default:
00672 pp_cxx_cast_expression (pp, t);
00673 break;
00674 }
00675 }
00676
00677
00678
00679
00680
00681
00682
00683 static void
00684 pp_cxx_multiplicative_expression (cxx_pretty_printer *pp, tree e)
00685 {
00686 enum tree_code code = TREE_CODE (e);
00687 switch (code)
00688 {
00689 case MULT_EXPR:
00690 case TRUNC_DIV_EXPR:
00691 case TRUNC_MOD_EXPR:
00692 pp_cxx_multiplicative_expression (pp, TREE_OPERAND (e, 0));
00693 pp_space (pp);
00694 if (code == MULT_EXPR)
00695 pp_star (pp);
00696 else if (code == TRUNC_DIV_EXPR)
00697 pp_slash (pp);
00698 else
00699 pp_modulo (pp);
00700 pp_space (pp);
00701 pp_cxx_pm_expression (pp, TREE_OPERAND (e, 1));
00702 break;
00703
00704 default:
00705 pp_cxx_pm_expression (pp, e);
00706 break;
00707 }
00708 }
00709
00710
00711
00712
00713
00714 static void
00715 pp_cxx_conditional_expression (cxx_pretty_printer *pp, tree e)
00716 {
00717 if (TREE_CODE (e) == COND_EXPR)
00718 {
00719 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
00720 pp_space (pp);
00721 pp_question (pp);
00722 pp_space (pp);
00723 pp_cxx_expression (pp, TREE_OPERAND (e, 1));
00724 pp_space (pp);
00725 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
00726 }
00727 else
00728 pp_c_logical_or_expression (pp_c_base (pp), e);
00729 }
00730
00731
00732
00733 static void
00734 pp_cxx_assignment_operator (cxx_pretty_printer *pp, tree t)
00735 {
00736 const char *op;
00737
00738 switch (TREE_CODE (t))
00739 {
00740 case NOP_EXPR:
00741 op = "=";
00742 break;
00743
00744 case PLUS_EXPR:
00745 op = "+=";
00746 break;
00747
00748 case MINUS_EXPR:
00749 op = "-=";
00750 break;
00751
00752 case TRUNC_DIV_EXPR:
00753 op = "/=";
00754 break;
00755
00756 case TRUNC_MOD_EXPR:
00757 op = "%=";
00758 break;
00759
00760 default:
00761 op = tree_code_name[TREE_CODE (t)];
00762 break;
00763 }
00764
00765 pp_cxx_identifier (pp, op);
00766 }
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780 static void
00781 pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
00782 {
00783 switch (TREE_CODE (e))
00784 {
00785 case MODIFY_EXPR:
00786 case INIT_EXPR:
00787 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
00788 pp_space (pp);
00789 pp_equal (pp);
00790 pp_space (pp);
00791 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 1));
00792 break;
00793
00794 case THROW_EXPR:
00795 pp_cxx_identifier (pp, "throw");
00796 if (TREE_OPERAND (e, 0))
00797 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
00798 break;
00799
00800 case MODOP_EXPR:
00801 pp_c_logical_or_expression (pp_c_base (pp), TREE_OPERAND (e, 0));
00802 pp_cxx_assignment_operator (pp, TREE_OPERAND (e, 1));
00803 pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 2));
00804 break;
00805
00806 default:
00807 pp_cxx_conditional_expression (pp, e);
00808 break;
00809 }
00810 }
00811
00812 static void
00813 pp_cxx_expression (cxx_pretty_printer *pp, tree t)
00814 {
00815 switch (TREE_CODE (t))
00816 {
00817 case STRING_CST:
00818 case INTEGER_CST:
00819 case REAL_CST:
00820 pp_c_constant (pp_c_base (pp), t);
00821 break;
00822
00823 case RESULT_DECL:
00824 pp_cxx_unqualified_id (pp, t);
00825 break;
00826
00827 #if 0
00828 case OFFSET_REF:
00829 #endif
00830 case SCOPE_REF:
00831 case PTRMEM_CST:
00832 pp_cxx_qualified_id (pp, t);
00833 break;
00834
00835 case OVERLOAD:
00836 t = OVL_CURRENT (t);
00837 case VAR_DECL:
00838 case PARM_DECL:
00839 case FIELD_DECL:
00840 case CONST_DECL:
00841 case FUNCTION_DECL:
00842 case BASELINK:
00843 case TEMPLATE_DECL:
00844 case TEMPLATE_TYPE_PARM:
00845 case TEMPLATE_PARM_INDEX:
00846 case TEMPLATE_TEMPLATE_PARM:
00847 pp_cxx_primary_expression (pp, t);
00848 break;
00849
00850 case CALL_EXPR:
00851 case DYNAMIC_CAST_EXPR:
00852 case STATIC_CAST_EXPR:
00853 case REINTERPRET_CAST_EXPR:
00854 case CONST_CAST_EXPR:
00855 #if 0
00856 case MEMBER_REF:
00857 #endif
00858 case EMPTY_CLASS_EXPR:
00859 case TYPEID_EXPR:
00860 case PSEUDO_DTOR_EXPR:
00861 case AGGR_INIT_EXPR:
00862 pp_cxx_postfix_expression (pp, t);
00863 break;
00864
00865 case NEW_EXPR:
00866 case VEC_NEW_EXPR:
00867 pp_cxx_new_expression (pp, t);
00868 break;
00869
00870 case DELETE_EXPR:
00871 case VEC_DELETE_EXPR:
00872 pp_cxx_delete_expression (pp, t);
00873 break;
00874
00875 case CAST_EXPR:
00876 pp_cxx_cast_expression (pp, t);
00877 break;
00878
00879 case OFFSET_REF:
00880 case MEMBER_REF:
00881 case DOTSTAR_EXPR:
00882 pp_cxx_pm_expression (pp, t);
00883 break;
00884
00885 case MULT_EXPR:
00886 case TRUNC_DIV_EXPR:
00887 case TRUNC_MOD_EXPR:
00888 pp_cxx_multiplicative_expression (pp, t);
00889 break;
00890
00891 case COND_EXPR:
00892 pp_cxx_conditional_expression (pp, t);
00893 break;
00894
00895 case MODIFY_EXPR:
00896 case INIT_EXPR:
00897 case THROW_EXPR:
00898 case MODOP_EXPR:
00899 pp_cxx_assignment_expression (pp, t);
00900 break;
00901
00902 case NON_DEPENDENT_EXPR:
00903 case MUST_NOT_THROW_EXPR:
00904 pp_cxx_expression (pp, t);
00905 break;
00906
00907 default:
00908 pp_c_expression (pp_c_base (pp), t);
00909 break;
00910 }
00911 }
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921 static void
00922 pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
00923 {
00924 switch (TREE_CODE (t))
00925 {
00926 case FUNCTION_DECL:
00927 if (DECL_VIRTUAL_P (t))
00928 pp_cxx_identifier (pp, "virtual");
00929 else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
00930 pp_cxx_identifier (pp, "explicit");
00931 else
00932 pp_c_function_specifier (pp_c_base (pp), t);
00933
00934 default:
00935 break;
00936 }
00937 }
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949 static void
00950 pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
00951 {
00952 switch (TREE_CODE (t))
00953 {
00954 case VAR_DECL:
00955 case PARM_DECL:
00956 case CONST_DECL:
00957 case FIELD_DECL:
00958 pp_cxx_storage_class_specifier (pp, t);
00959 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
00960 break;
00961
00962 case TYPE_DECL:
00963 pp_cxx_identifier (pp, "typedef");
00964 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
00965 break;
00966
00967 case RECORD_TYPE:
00968 if (TYPE_PTRMEMFUNC_P (t))
00969 {
00970 tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
00971 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
00972 pp_cxx_whitespace (pp);
00973 pp_cxx_ptr_operator (pp, t);
00974 }
00975 break;
00976
00977 case FUNCTION_DECL:
00978
00979
00980 if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
00981 pp_cxx_function_specifier (pp, t);
00982 else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
00983 pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
00984 else
00985 default:
00986 pp_c_declaration_specifiers (pp_c_base (pp), t);
00987 break;
00988 }
00989 }
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006 static void
01007 pp_cxx_simple_type_specifier (cxx_pretty_printer *pp, tree t)
01008 {
01009 switch (TREE_CODE (t))
01010 {
01011 case RECORD_TYPE:
01012 case UNION_TYPE:
01013 case ENUMERAL_TYPE:
01014 pp_cxx_qualified_id (pp, t);
01015 break;
01016
01017 case TEMPLATE_TYPE_PARM:
01018 case TEMPLATE_TEMPLATE_PARM:
01019 case TEMPLATE_PARM_INDEX:
01020 pp_cxx_unqualified_id (pp, t);
01021 break;
01022
01023 case TYPENAME_TYPE:
01024 pp_cxx_identifier (pp, "typename");
01025 pp_cxx_nested_name_specifier (pp, TYPE_CONTEXT (t));
01026 pp_cxx_unqualified_id (pp, TYPE_NAME (t));
01027 break;
01028
01029 default:
01030 pp_c_type_specifier (pp_c_base (pp), t);
01031 break;
01032 }
01033 }
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045 static void
01046 pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
01047 {
01048 switch (TREE_CODE (t))
01049 {
01050 case TEMPLATE_DECL:
01051 case TEMPLATE_TYPE_PARM:
01052 case TEMPLATE_TEMPLATE_PARM:
01053 case TYPE_DECL:
01054 case BOUND_TEMPLATE_TEMPLATE_PARM:
01055 pp_cxx_cv_qualifier_seq (pp, t);
01056 pp_cxx_simple_type_specifier (pp, t);
01057 break;
01058
01059 case METHOD_TYPE:
01060 pp_cxx_type_specifier_seq (pp, TREE_TYPE (t));
01061 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
01062 pp_cxx_nested_name_specifier (pp, TYPE_METHOD_BASETYPE (t));
01063 break;
01064
01065 default:
01066 if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
01067 pp_c_specifier_qualifier_list (pp_c_base (pp), t);
01068 }
01069 }
01070
01071
01072
01073
01074
01075
01076 static void
01077 pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
01078 {
01079 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
01080 t = TREE_TYPE (t);
01081 switch (TREE_CODE (t))
01082 {
01083 case REFERENCE_TYPE:
01084 case POINTER_TYPE:
01085 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
01086 || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
01087 pp_cxx_ptr_operator (pp, TREE_TYPE (t));
01088 if (TREE_CODE (t) == POINTER_TYPE)
01089 {
01090 pp_star (pp);
01091 pp_cxx_cv_qualifier_seq (pp, t);
01092 }
01093 else
01094 pp_ampersand (pp);
01095 break;
01096
01097 case RECORD_TYPE:
01098 if (TYPE_PTRMEMFUNC_P (t))
01099 {
01100 pp_cxx_left_paren (pp);
01101 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
01102 pp_star (pp);
01103 break;
01104 }
01105 case OFFSET_TYPE:
01106 if (TYPE_PTR_TO_MEMBER_P (t))
01107 {
01108 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
01109 pp_cxx_left_paren (pp);
01110 pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
01111 pp_star (pp);
01112 pp_cxx_cv_qualifier_seq (pp, t);
01113 break;
01114 }
01115
01116
01117 default:
01118 pp_unsupported_tree (pp, t);
01119 break;
01120 }
01121 }
01122
01123 static inline tree
01124 pp_cxx_implicit_parameter_type (tree mf)
01125 {
01126 return TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (mf))));
01127 }
01128
01129
01130
01131
01132
01133
01134
01135
01136 static inline void
01137 pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t)
01138 {
01139 pp_cxx_decl_specifier_seq (pp, t);
01140 if (TYPE_P (t))
01141 pp_cxx_abstract_declarator (pp, t);
01142 else
01143 pp_cxx_declarator (pp, t);
01144 }
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154 static void
01155 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
01156 {
01157 tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
01158 tree types =
01159 TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
01160 const bool abstract = args == NULL
01161 || pp_c_base (pp)->flags & pp_c_flag_abstract;
01162 bool first = true;
01163
01164
01165 if (TREE_CODE (t) == METHOD_TYPE)
01166 types = TREE_CHAIN (types);
01167
01168 pp_cxx_left_paren (pp);
01169 for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
01170 {
01171 if (!first)
01172 pp_cxx_separate_with (pp, ',');
01173 first = false;
01174 pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
01175 if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
01176 {
01177 pp_cxx_whitespace (pp);
01178 pp_equal (pp);
01179 pp_cxx_whitespace (pp);
01180 pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
01181 }
01182 }
01183 pp_cxx_right_paren (pp);
01184 }
01185
01186
01187
01188
01189
01190
01191
01192
01193 static void
01194 pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
01195 {
01196 tree ex_spec = TYPE_RAISES_EXCEPTIONS (t);
01197
01198 if (!TYPE_NOTHROW_P (t) && ex_spec == NULL)
01199 return;
01200 pp_cxx_identifier (pp, "throw");
01201 pp_cxx_left_paren (pp);
01202 for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec))
01203 {
01204 pp_cxx_type_id (pp, TREE_VALUE (ex_spec));
01205 if (TREE_CHAIN (ex_spec))
01206 pp_cxx_separate_with (pp, ',');
01207 }
01208 pp_cxx_right_paren (pp);
01209 }
01210
01211
01212
01213
01214
01215
01216
01217
01218 static void
01219 pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
01220 {
01221 switch (TREE_CODE (t))
01222 {
01223 case VAR_DECL:
01224 case PARM_DECL:
01225 case CONST_DECL:
01226 case FIELD_DECL:
01227 if (DECL_NAME (t))
01228 {
01229 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
01230 pp_cxx_id_expression (pp, DECL_NAME (t));
01231 }
01232 pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
01233 break;
01234
01235 case FUNCTION_DECL:
01236 pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
01237 pp_cxx_id_expression (pp, t);
01238 pp_cxx_parameter_declaration_clause (pp, t);
01239
01240 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
01241 {
01242 pp_base (pp)->padding = pp_before;
01243 pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
01244 }
01245
01246 pp_cxx_exception_specification (pp, TREE_TYPE (t));
01247 break;
01248
01249 case TYPENAME_TYPE:
01250 case TEMPLATE_DECL:
01251 case TEMPLATE_TYPE_PARM:
01252 case TEMPLATE_PARM_INDEX:
01253 case TEMPLATE_TEMPLATE_PARM:
01254 break;
01255
01256 default:
01257 pp_c_direct_declarator (pp_c_base (pp), t);
01258 break;
01259 }
01260 }
01261
01262
01263
01264
01265
01266 static void
01267 pp_cxx_declarator (cxx_pretty_printer *pp, tree t)
01268 {
01269 pp_cxx_direct_declarator (pp, t);
01270 }
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286 static void
01287 pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
01288 {
01289 t = TREE_OPERAND (t, 0);
01290 pp_cxx_whitespace (pp);
01291 pp_colon (pp);
01292 pp_cxx_whitespace (pp);
01293 for (; t; t = TREE_CHAIN (t))
01294 {
01295 pp_cxx_primary_expression (pp, TREE_PURPOSE (t));
01296 pp_cxx_call_argument_list (pp, TREE_VALUE (t));
01297 if (TREE_CHAIN (t))
01298 pp_cxx_separate_with (pp, ',');
01299 }
01300 }
01301
01302
01303
01304
01305
01306 static void
01307 pp_cxx_function_definition (cxx_pretty_printer *pp, tree t)
01308 {
01309 tree saved_scope = pp->enclosing_scope;
01310 pp_cxx_decl_specifier_seq (pp, t);
01311 pp_cxx_declarator (pp, t);
01312 pp_needs_newline (pp) = true;
01313 pp->enclosing_scope = DECL_CONTEXT (t);
01314 if (DECL_SAVED_TREE (t))
01315 pp_cxx_statement (pp, DECL_SAVED_TREE (t));
01316 else
01317 {
01318 pp_cxx_semicolon (pp);
01319 pp_needs_newline (pp) = true;
01320 }
01321 pp_flush (pp);
01322 pp->enclosing_scope = saved_scope;
01323 }
01324
01325
01326
01327
01328
01329 static void
01330 pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
01331 {
01332 if (TYPE_PTRMEM_P (t) || TYPE_PTRMEMFUNC_P (t))
01333 pp_cxx_right_paren (pp);
01334 else if (POINTER_TYPE_P (t))
01335 {
01336 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
01337 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
01338 pp_cxx_right_paren (pp);
01339 t = TREE_TYPE (t);
01340 }
01341 pp_cxx_direct_abstract_declarator (pp, t);
01342 }
01343
01344
01345
01346
01347
01348
01349
01350 static void
01351 pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
01352 {
01353 switch (TREE_CODE (t))
01354 {
01355 case REFERENCE_TYPE:
01356 pp_cxx_abstract_declarator (pp, t);
01357 break;
01358
01359 case RECORD_TYPE:
01360 if (TYPE_PTRMEMFUNC_P (t))
01361 pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
01362 break;
01363
01364 case METHOD_TYPE:
01365 case FUNCTION_TYPE:
01366 pp_cxx_parameter_declaration_clause (pp, t);
01367 pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
01368 if (TREE_CODE (t) == METHOD_TYPE)
01369 {
01370 pp_base (pp)->padding = pp_before;
01371 pp_cxx_cv_qualifier_seq
01372 (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
01373 }
01374 pp_cxx_exception_specification (pp, t);
01375 break;
01376
01377 case TYPENAME_TYPE:
01378 case TEMPLATE_TYPE_PARM:
01379 case TEMPLATE_TEMPLATE_PARM:
01380 case BOUND_TEMPLATE_TEMPLATE_PARM:
01381 case UNBOUND_CLASS_TEMPLATE:
01382 break;
01383
01384 default:
01385 pp_c_direct_abstract_declarator (pp_c_base (pp), t);
01386 break;
01387 }
01388 }
01389
01390
01391
01392
01393 static void
01394 pp_cxx_type_id (cxx_pretty_printer *pp, tree t)
01395 {
01396 pp_flags saved_flags = pp_c_base (pp)->flags;
01397 pp_c_base (pp)->flags |= pp_c_flag_abstract;
01398
01399 switch (TREE_CODE (t))
01400 {
01401 case TYPE_DECL:
01402 case UNION_TYPE:
01403 case RECORD_TYPE:
01404 case ENUMERAL_TYPE:
01405 case TYPENAME_TYPE:
01406 case BOUND_TEMPLATE_TEMPLATE_PARM:
01407 case UNBOUND_CLASS_TEMPLATE:
01408 case TEMPLATE_TEMPLATE_PARM:
01409 case TEMPLATE_TYPE_PARM:
01410 case TEMPLATE_PARM_INDEX:
01411 case TEMPLATE_DECL:
01412 case TYPEOF_TYPE:
01413 case TEMPLATE_ID_EXPR:
01414 pp_cxx_type_specifier_seq (pp, t);
01415 break;
01416
01417 default:
01418 pp_c_type_id (pp_c_base (pp), t);
01419 break;
01420 }
01421
01422 pp_c_base (pp)->flags = saved_flags;
01423 }
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434 static void
01435 pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
01436 {
01437 int i;
01438 if (t == NULL)
01439 return;
01440 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
01441 {
01442 tree arg = TREE_VEC_ELT (t, i);
01443 if (i != 0)
01444 pp_cxx_separate_with (pp, ',');
01445 if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
01446 && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
01447 pp_cxx_type_id (pp, arg);
01448 else
01449 pp_cxx_expression (pp, arg);
01450 }
01451 }
01452
01453
01454 static void
01455 pp_cxx_exception_declaration (cxx_pretty_printer *pp, tree t)
01456 {
01457 t = DECL_EXPR_DECL (t);
01458 pp_cxx_type_specifier_seq (pp, t);
01459 if (TYPE_P (t))
01460 pp_cxx_abstract_declarator (pp, t);
01461 else
01462 pp_cxx_declarator (pp, t);
01463 }
01464
01465
01466
01467 static void
01468 pp_cxx_statement (cxx_pretty_printer *pp, tree t)
01469 {
01470 switch (TREE_CODE (t))
01471 {
01472 case CTOR_INITIALIZER:
01473 pp_cxx_ctor_initializer (pp, t);
01474 break;
01475
01476 case USING_STMT:
01477 pp_cxx_identifier (pp, "using");
01478 pp_cxx_identifier (pp, "namespace");
01479 pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t));
01480 break;
01481
01482 case USING_DECL:
01483 pp_cxx_identifier (pp, "using");
01484 pp_cxx_nested_name_specifier (pp, DECL_INITIAL (t));
01485 pp_cxx_unqualified_id (pp, DECL_NAME (t));
01486 break;
01487
01488 case EH_SPEC_BLOCK:
01489 break;
01490
01491
01492
01493 case TRY_BLOCK:
01494 pp_maybe_newline_and_indent (pp, 0);
01495 pp_cxx_identifier (pp, "try");
01496 pp_newline_and_indent (pp, 3);
01497 pp_cxx_statement (pp, TRY_STMTS (t));
01498 pp_newline_and_indent (pp, -3);
01499 if (CLEANUP_P (t))
01500 ;
01501 else
01502 pp_cxx_statement (pp, TRY_HANDLERS (t));
01503 break;
01504
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516 case HANDLER:
01517 pp_cxx_identifier (pp, "catch");
01518 pp_cxx_left_paren (pp);
01519 pp_cxx_exception_declaration (pp, HANDLER_PARMS (t));
01520 pp_cxx_right_paren (pp);
01521 pp_indentation (pp) += 3;
01522 pp_needs_newline (pp) = true;
01523 pp_cxx_statement (pp, HANDLER_BODY (t));
01524 pp_indentation (pp) -= 3;
01525 pp_needs_newline (pp) = true;
01526 break;
01527
01528
01529
01530
01531 case IF_STMT:
01532 pp_cxx_identifier (pp, "if");
01533 pp_cxx_whitespace (pp);
01534 pp_cxx_left_paren (pp);
01535 pp_cxx_expression (pp, IF_COND (t));
01536 pp_cxx_right_paren (pp);
01537 pp_newline_and_indent (pp, 2);
01538 pp_cxx_statement (pp, THEN_CLAUSE (t));
01539 pp_newline_and_indent (pp, -2);
01540 if (ELSE_CLAUSE (t))
01541 {
01542 tree else_clause = ELSE_CLAUSE (t);
01543 pp_cxx_identifier (pp, "else");
01544 if (TREE_CODE (else_clause) == IF_STMT)
01545 pp_cxx_whitespace (pp);
01546 else
01547 pp_newline_and_indent (pp, 2);
01548 pp_cxx_statement (pp, else_clause);
01549 if (TREE_CODE (else_clause) != IF_STMT)
01550 pp_newline_and_indent (pp, -2);
01551 }
01552 break;
01553
01554 case CLEANUP_STMT:
01555 pp_cxx_identifier (pp, "try");
01556 pp_newline_and_indent (pp, 2);
01557 pp_cxx_statement (pp, CLEANUP_BODY (t));
01558 pp_newline_and_indent (pp, -2);
01559 pp_cxx_identifier (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally");
01560 pp_newline_and_indent (pp, 2);
01561 pp_cxx_statement (pp, CLEANUP_EXPR (t));
01562 pp_newline_and_indent (pp, -2);
01563 break;
01564
01565 default:
01566 pp_c_statement (pp_c_base (pp), t);
01567 break;
01568 }
01569 }
01570
01571
01572
01573
01574
01575
01576 static void
01577 pp_cxx_original_namespace_definition (cxx_pretty_printer *pp, tree t)
01578 {
01579 pp_cxx_identifier (pp, "namespace");
01580 if (DECL_NAME (t))
01581 pp_cxx_unqualified_id (pp, t);
01582 pp_cxx_whitespace (pp);
01583 pp_cxx_left_brace (pp);
01584
01585 pp_cxx_whitespace (pp);
01586 pp_cxx_right_brace (pp);
01587 }
01588
01589
01590
01591
01592
01593
01594
01595
01596
01597
01598 static void
01599 pp_cxx_namespace_alias_definition (cxx_pretty_printer *pp, tree t)
01600 {
01601 pp_cxx_identifier (pp, "namespace");
01602 pp_cxx_unqualified_id (pp, t);
01603 pp_cxx_whitespace (pp);
01604 pp_equal (pp);
01605 pp_cxx_whitespace (pp);
01606 pp_cxx_qualified_id (pp, DECL_NAMESPACE_ALIAS (t));
01607 pp_cxx_semicolon (pp);
01608 }
01609
01610
01611
01612
01613 static void
01614 pp_cxx_simple_declaration (cxx_pretty_printer *pp, tree t)
01615 {
01616 pp_cxx_decl_specifier_seq (pp, t);
01617 pp_cxx_init_declarator (pp, t);
01618 pp_cxx_semicolon (pp);
01619 pp_needs_newline (pp) = true;
01620 }
01621
01622
01623
01624
01625
01626
01627 static inline void
01628 pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
01629 {
01630 const int n = TREE_VEC_LENGTH (t);
01631 int i;
01632 for (i = 0; i < n; ++i)
01633 {
01634 if (i)
01635 pp_cxx_separate_with (pp, ',');
01636 pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
01637 }
01638 }
01639
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653 static void
01654 pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
01655 {
01656 tree parameter = TREE_VALUE (t);
01657 switch (TREE_CODE (parameter))
01658 {
01659 case TYPE_DECL:
01660 pp_cxx_identifier (pp, "class");
01661 if (DECL_NAME (parameter))
01662 pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
01663
01664 break;
01665
01666 case PARM_DECL:
01667 pp_cxx_parameter_declaration (pp, parameter);
01668 break;
01669
01670 case TEMPLATE_DECL:
01671 break;
01672
01673 default:
01674 pp_unsupported_tree (pp, t);
01675 break;
01676 }
01677 }
01678
01679
01680
01681
01682 void
01683 pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
01684 {
01685 const enum tree_code code = TREE_CODE (parm);
01686
01687
01688 if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
01689 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
01690 parm = TEMPLATE_TYPE_PARM_INDEX (parm);
01691
01692 pp_cxx_begin_template_argument_list (pp);
01693 pp_cxx_identifier (pp, "template-parameter-");
01694 pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
01695 pp_minus (pp);
01696 pp_wide_integer (pp, TEMPLATE_PARM_IDX (parm) + 1);
01697 pp_cxx_end_template_argument_list (pp);
01698 }
01699
01700
01701
01702
01703
01704 static void
01705 pp_cxx_template_declaration (cxx_pretty_printer *pp, tree t)
01706 {
01707 tree tmpl = most_general_template (t);
01708 tree level;
01709 int i = 0;
01710
01711 pp_maybe_newline_and_indent (pp, 0);
01712 for (level = DECL_TEMPLATE_PARMS (tmpl); level; level = TREE_CHAIN (level))
01713 {
01714 pp_cxx_identifier (pp, "template");
01715 pp_cxx_begin_template_argument_list (pp);
01716 pp_cxx_template_parameter_list (pp, TREE_VALUE (level));
01717 pp_cxx_end_template_argument_list (pp);
01718 pp_newline_and_indent (pp, 3);
01719 i += 3;
01720 }
01721 if (TREE_CODE (t) == FUNCTION_DECL && DECL_SAVED_TREE (t))
01722 pp_cxx_function_definition (pp, t);
01723 else
01724 pp_cxx_simple_declaration (pp, t);
01725 }
01726
01727 static void
01728 pp_cxx_explicit_specialization (cxx_pretty_printer *pp, tree t)
01729 {
01730 pp_unsupported_tree (pp, t);
01731 }
01732
01733 static void
01734 pp_cxx_explicit_instantiation (cxx_pretty_printer *pp, tree t)
01735 {
01736 pp_unsupported_tree (pp, t);
01737 }
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755 void
01756 pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
01757 {
01758 if (!DECL_LANG_SPECIFIC (t))
01759 pp_cxx_simple_declaration (pp, t);
01760 else if (DECL_USE_TEMPLATE (t))
01761 switch (DECL_USE_TEMPLATE (t))
01762 {
01763 case 1:
01764 pp_cxx_template_declaration (pp, t);
01765 break;
01766
01767 case 2:
01768 pp_cxx_explicit_specialization (pp, t);
01769 break;
01770
01771 case 3:
01772 pp_cxx_explicit_instantiation (pp, t);
01773 break;
01774
01775 default:
01776 break;
01777 }
01778 else switch (TREE_CODE (t))
01779 {
01780 case VAR_DECL:
01781 case TYPE_DECL:
01782 pp_cxx_simple_declaration (pp, t);
01783 break;
01784
01785 case FUNCTION_DECL:
01786 if (DECL_SAVED_TREE (t))
01787 pp_cxx_function_definition (pp, t);
01788 else
01789 pp_cxx_simple_declaration (pp, t);
01790 break;
01791
01792 case NAMESPACE_DECL:
01793 if (DECL_NAMESPACE_ALIAS (t))
01794 pp_cxx_namespace_alias_definition (pp, t);
01795 else
01796 pp_cxx_original_namespace_definition (pp, t);
01797 break;
01798
01799 default:
01800 pp_unsupported_tree (pp, t);
01801 break;
01802 }
01803 }
01804
01805
01806 typedef c_pretty_print_fn pp_fun;
01807
01808
01809
01810 void
01811 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
01812 {
01813 pp_c_pretty_printer_init (pp_c_base (pp));
01814 pp_set_line_maximum_length (pp, 0);
01815
01816 pp->c_base.declaration = (pp_fun) pp_cxx_declaration;
01817 pp->c_base.declaration_specifiers = (pp_fun) pp_cxx_decl_specifier_seq;
01818 pp->c_base.function_specifier = (pp_fun) pp_cxx_function_specifier;
01819 pp->c_base.type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
01820 pp->c_base.declarator = (pp_fun) pp_cxx_declarator;
01821 pp->c_base.direct_declarator = (pp_fun) pp_cxx_direct_declarator;
01822 pp->c_base.parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
01823 pp->c_base.type_id = (pp_fun) pp_cxx_type_id;
01824 pp->c_base.abstract_declarator = (pp_fun) pp_cxx_abstract_declarator;
01825 pp->c_base.direct_abstract_declarator =
01826 (pp_fun) pp_cxx_direct_abstract_declarator;
01827 pp->c_base.simple_type_specifier = (pp_fun)pp_cxx_simple_type_specifier;
01828
01829
01830
01831 pp->c_base.id_expression = (pp_fun) pp_cxx_id_expression;
01832 pp->c_base.primary_expression = (pp_fun) pp_cxx_primary_expression;
01833 pp->c_base.postfix_expression = (pp_fun) pp_cxx_postfix_expression;
01834 pp->c_base.unary_expression = (pp_fun) pp_cxx_unary_expression;
01835 pp->c_base.multiplicative_expression = (pp_fun) pp_cxx_multiplicative_expression;
01836 pp->c_base.conditional_expression = (pp_fun) pp_cxx_conditional_expression;
01837 pp->c_base.assignment_expression = (pp_fun) pp_cxx_assignment_expression;
01838 pp->c_base.expression = (pp_fun) pp_cxx_expression;
01839 pp->enclosing_scope = global_namespace;
01840 }