]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/dump.c
decl.c (cp_finish_decl): Use resolve_nondeduced_context for auto.
[gcc.git] / gcc / cp / dump.c
CommitLineData
f71f87f9 1/* Tree-dumping functionality for intermediate representation.
9e1e64ec 2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
fbc315db 3 Free Software Foundation, Inc.
f71f87f9
MM
4 Written by Mark Mitchell <mark@codesourcery.com>
5
f5adbb8d 6This file is part of GCC.
f71f87f9 7
f5adbb8d 8GCC is free software; you can redistribute it and/or modify
f71f87f9 9it under the terms of the GNU General Public License as published by
e77f031d 10the Free Software Foundation; either version 3, or (at your option)
f71f87f9
MM
11any later version.
12
f5adbb8d 13GCC is distributed in the hope that it will be useful,
f71f87f9
MM
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
e77f031d
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
f71f87f9 21
f71f87f9
MM
22#include "config.h"
23#include "system.h"
4977bab6
ZW
24#include "coretypes.h"
25#include "tm.h"
f71f87f9
MM
26#include "tree.h"
27#include "cp-tree.h"
89d684bb 28#include "tree-dump.h"
f71f87f9 29
ee42dd9d 30static void dump_access (dump_info_p, tree);
005a5cb0 31
ee42dd9d 32static void dump_op (dump_info_p, tree);
78a40378 33
005a5cb0
MY
34/* Dump a representation of the accessibility information associated
35 with T. */
36
37static void
ee42dd9d 38dump_access (dump_info_p di, tree t)
005a5cb0
MY
39{
40 if (TREE_PROTECTED(t))
1966af04 41 dump_string_field (di, "accs", "prot");
005a5cb0 42 else if (TREE_PRIVATE(t))
1966af04 43 dump_string_field (di, "accs", "priv");
005a5cb0 44 else
1966af04 45 dump_string_field (di, "accs", "pub");
005a5cb0
MY
46}
47
78a40378 48/* Dump a representation of the specific operator for an overloaded
558ee214 49 operator associated with node t. */
78a40378
MM
50
51static void
ee42dd9d 52dump_op (dump_info_p di, tree t)
78a40378
MM
53{
54 switch (DECL_OVERLOADED_OPERATOR_P (t)) {
55 case NEW_EXPR:
56 dump_string (di, "new");
57 break;
58 case VEC_NEW_EXPR:
59 dump_string (di, "vecnew");
60 break;
61 case DELETE_EXPR:
62 dump_string (di, "delete");
63 break;
64 case VEC_DELETE_EXPR:
65 dump_string (di, "vecdelete");
66 break;
392e3d51 67 case UNARY_PLUS_EXPR:
78a40378
MM
68 dump_string (di, "pos");
69 break;
70 case NEGATE_EXPR:
71 dump_string (di, "neg");
72 break;
73 case ADDR_EXPR:
74 dump_string (di, "addr");
75 break;
76 case INDIRECT_REF:
77 dump_string(di, "deref");
78 break;
79 case BIT_NOT_EXPR:
80 dump_string(di, "not");
81 break;
82 case TRUTH_NOT_EXPR:
83 dump_string(di, "lnot");
84 break;
85 case PREINCREMENT_EXPR:
86 dump_string(di, "preinc");
87 break;
88 case PREDECREMENT_EXPR:
89 dump_string(di, "predec");
90 break;
91 case PLUS_EXPR:
92 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 93 dump_string (di, "plusassign");
78a40378 94 else
0cbd7506 95 dump_string(di, "plus");
78a40378
MM
96 break;
97 case MINUS_EXPR:
98 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 99 dump_string (di, "minusassign");
78a40378 100 else
0cbd7506 101 dump_string(di, "minus");
78a40378
MM
102 break;
103 case MULT_EXPR:
104 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 105 dump_string (di, "multassign");
78a40378 106 else
0cbd7506 107 dump_string (di, "mult");
78a40378
MM
108 break;
109 case TRUNC_DIV_EXPR:
110 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 111 dump_string (di, "divassign");
78a40378 112 else
0cbd7506 113 dump_string (di, "div");
78a40378
MM
114 break;
115 case TRUNC_MOD_EXPR:
116 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 117 dump_string (di, "modassign");
78a40378 118 else
0cbd7506 119 dump_string (di, "mod");
78a40378
MM
120 break;
121 case BIT_AND_EXPR:
122 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 123 dump_string (di, "andassign");
78a40378 124 else
0cbd7506 125 dump_string (di, "and");
78a40378
MM
126 break;
127 case BIT_IOR_EXPR:
128 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 129 dump_string (di, "orassign");
78a40378 130 else
0cbd7506 131 dump_string (di, "or");
78a40378
MM
132 break;
133 case BIT_XOR_EXPR:
134 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 135 dump_string (di, "xorassign");
78a40378 136 else
0cbd7506 137 dump_string (di, "xor");
78a40378
MM
138 break;
139 case LSHIFT_EXPR:
140 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 141 dump_string (di, "lshiftassign");
78a40378 142 else
0cbd7506 143 dump_string (di, "lshift");
78a40378
MM
144 break;
145 case RSHIFT_EXPR:
146 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 147 dump_string (di, "rshiftassign");
78a40378 148 else
0cbd7506 149 dump_string (di, "rshift");
78a40378
MM
150 break;
151 case EQ_EXPR:
152 dump_string (di, "eq");
153 break;
154 case NE_EXPR:
155 dump_string (di, "ne");
156 break;
157 case LT_EXPR:
158 dump_string (di, "lt");
159 break;
160 case GT_EXPR:
161 dump_string (di, "gt");
162 break;
163 case LE_EXPR:
164 dump_string (di, "le");
165 break;
166 case GE_EXPR:
167 dump_string (di, "ge");
168 break;
169 case TRUTH_ANDIF_EXPR:
170 dump_string (di, "land");
171 break;
172 case TRUTH_ORIF_EXPR:
173 dump_string (di, "lor");
174 break;
175 case COMPOUND_EXPR:
176 dump_string (di, "compound");
177 break;
178 case MEMBER_REF:
179 dump_string (di, "memref");
180 break;
181 case COMPONENT_REF:
182 dump_string (di, "ref");
183 break;
184 case ARRAY_REF:
185 dump_string (di, "subs");
186 break;
187 case POSTINCREMENT_EXPR:
c8094d83 188 dump_string (di, "postinc");
78a40378
MM
189 break;
190 case POSTDECREMENT_EXPR:
191 dump_string (di, "postdec");
192 break;
193 case CALL_EXPR:
194 dump_string (di, "call");
195 break;
196 case NOP_EXPR:
197 if (DECL_ASSIGNMENT_OPERATOR_P (t))
0cbd7506 198 dump_string (di, "assign");
78a40378
MM
199 break;
200 default:
201 break;
202 }
203}
204
2bd3ecad 205bool
ee42dd9d 206cp_dump_tree (void* dump_info, tree t)
f71f87f9 207{
f71f87f9 208 enum tree_code code;
89d684bb 209 dump_info_p di = (dump_info_p) dump_info;
f71f87f9
MM
210
211 /* Figure out what kind of node this is. */
212 code = TREE_CODE (t);
f71f87f9 213
0a7394bc 214 if (DECL_P (t))
f71f87f9 215 {
421844e7 216 if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus)
1966af04 217 dump_string_field (di, "lang", language_to_string (DECL_LANGUAGE (t)));
f71f87f9 218 }
f71f87f9 219
f71f87f9
MM
220 switch (code)
221 {
f71f87f9
MM
222 case IDENTIFIER_NODE:
223 if (IDENTIFIER_OPNAME_P (t))
0a7394bc 224 {
1966af04 225 dump_string_field (di, "note", "operator");
2bd3ecad 226 return true;
0a7394bc 227 }
f71f87f9 228 else if (IDENTIFIER_TYPENAME_P (t))
f71f87f9 229 {
0a7394bc 230 dump_child ("tynm", TREE_TYPE (t));
2bd3ecad 231 return true;
f71f87f9 232 }
f71f87f9
MM
233 break;
234
a5ac359a 235 case OFFSET_TYPE:
1966af04 236 dump_string_field (di, "note", "ptrmem");
a5ac359a
MM
237 dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
238 dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
239 return true;
f71f87f9
MM
240
241 case RECORD_TYPE:
f71f87f9
MM
242 if (TYPE_PTRMEMFUNC_P (t))
243 {
1966af04 244 dump_string_field (di, "note", "ptrmem");
8badec73
MM
245 dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
246 dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
2bd3ecad 247 return true;
f71f87f9 248 }
a5ac359a 249 /* Fall through. */
f71f87f9 250
a5ac359a 251 case UNION_TYPE:
5a5cccaa
NS
252 /* Is it a type used as a base? */
253 if (TYPE_CONTEXT (t) && TREE_CODE (TYPE_CONTEXT (t)) == TREE_CODE (t)
254 && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t)
255 {
256 dump_child ("bfld", TYPE_CONTEXT (t));
2bd3ecad 257 return true;
5a5cccaa 258 }
c8094d83 259
9e1e64ec 260 if (! MAYBE_CLASS_TYPE_P (t))
4e8dca1c
JM
261 break;
262
0a7394bc 263 dump_child ("vfld", TYPE_VFIELD (t));
78a40378 264 if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t))
0cbd7506 265 dump_string(di, "spec");
b7442fb5 266
3758425f 267 if (!dump_flag (di, TDF_SLIM, t) && TYPE_BINFO (t))
b7442fb5
NS
268 {
269 int i;
fa743e8c
NS
270 tree binfo;
271 tree base_binfo;
c8094d83 272
fa743e8c
NS
273 for (binfo = TYPE_BINFO (t), i = 0;
274 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
b7442fb5 275 {
b7442fb5 276 dump_child ("base", BINFO_TYPE (base_binfo));
c8094d83 277 if (BINFO_VIRTUAL_P (base_binfo))
1966af04 278 dump_string_field (di, "spec", "virt");
b7442fb5
NS
279 dump_access (di, base_binfo);
280 }
281 }
005a5cb0
MY
282 break;
283
284 case FIELD_DECL:
285 dump_access (di, t);
78a40378 286 if (DECL_MUTABLE_P (t))
1966af04 287 dump_string_field (di, "spec", "mutable");
f71f87f9
MM
288 break;
289
78a40378
MM
290 case VAR_DECL:
291 if (TREE_CODE (CP_DECL_CONTEXT (t)) == RECORD_TYPE)
0cbd7506 292 dump_access (di, t);
78a40378 293 if (TREE_STATIC (t) && !TREE_PUBLIC (t))
1966af04 294 dump_string_field (di, "link", "static");
c8094d83 295 break;
78a40378 296
f71f87f9 297 case FUNCTION_DECL:
31f8e4f3 298 if (!DECL_THUNK_P (t))
e9e7f181 299 {
0cbd7506 300 if (DECL_OVERLOADED_OPERATOR_P (t)) {
1966af04 301 dump_string_field (di, "note", "operator");
0cbd7506
MS
302 dump_op (di, t);
303 }
c8094d83 304 if (DECL_FUNCTION_MEMBER_P (t))
005a5cb0 305 {
1966af04 306 dump_string_field (di, "note", "member");
005a5cb0
MY
307 dump_access (di, t);
308 }
0cbd7506 309 if (DECL_PURE_VIRTUAL_P (t))
1966af04 310 dump_string_field (di, "spec", "pure");
0cbd7506 311 if (DECL_VIRTUAL_P (t))
1966af04 312 dump_string_field (di, "spec", "virt");
e9e7f181 313 if (DECL_CONSTRUCTOR_P (t))
1966af04 314 dump_string_field (di, "note", "constructor");
e9e7f181 315 if (DECL_DESTRUCTOR_P (t))
1966af04 316 dump_string_field (di, "note", "destructor");
e9e7f181 317 if (DECL_CONV_FN_P (t))
1966af04 318 dump_string_field (di, "note", "conversion");
4977bab6 319 if (DECL_GLOBAL_CTOR_P (t))
1966af04 320 dump_string_field (di, "note", "global init");
4977bab6 321 if (DECL_GLOBAL_DTOR_P (t))
1966af04 322 dump_string_field (di, "note", "global fini");
1c227897 323 if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t))
1966af04 324 dump_string_field (di, "note", "pseudo tmpl");
e9e7f181
MM
325 }
326 else
327 {
07fa4878 328 tree virt = THUNK_VIRTUAL_OFFSET (t);
c8094d83 329
1966af04 330 dump_string_field (di, "note", "thunk");
4977bab6 331 if (DECL_THIS_THUNK_P (t))
1966af04 332 dump_string_field (di, "note", "this adjusting");
4977bab6 333 else
07fa4878 334 {
1966af04 335 dump_string_field (di, "note", "result adjusting");
07fa4878
NS
336 if (virt)
337 virt = BINFO_VPTR_FIELD (virt);
338 }
4977bab6 339 dump_int (di, "fixd", THUNK_FIXED_OFFSET (t));
07fa4878
NS
340 if (virt)
341 dump_int (di, "virt", tree_low_cst (virt, 0));
31f8e4f3 342 dump_child ("fn", DECL_INITIAL (t));
e9e7f181 343 }
f71f87f9
MM
344 break;
345
346 case NAMESPACE_DECL:
89c6e7ac
MM
347 if (DECL_NAMESPACE_ALIAS (t))
348 dump_child ("alis", DECL_NAMESPACE_ALIAS (t));
b7442fb5 349 else if (!dump_flag (di, TDF_SLIM, t))
89c6e7ac 350 dump_child ("dcls", cp_namespace_decls (t));
f71f87f9
MM
351 break;
352
cfe507be 353 case TEMPLATE_DECL:
da8a7456 354 dump_child ("rslt", DECL_TEMPLATE_RESULT (t));
2269eec3 355 dump_child ("inst", DECL_TEMPLATE_INSTANTIATIONS (t));
3454335f 356 dump_child ("spcs", DECL_TEMPLATE_SPECIALIZATIONS (t));
005a5cb0 357 dump_child ("prms", DECL_TEMPLATE_PARMS (t));
cfe507be
MM
358 break;
359
f71f87f9 360 case OVERLOAD:
3454335f
MM
361 dump_child ("crnt", OVL_CURRENT (t));
362 dump_child ("chan", OVL_CHAIN (t));
f71f87f9
MM
363 break;
364
0a7394bc 365 case TRY_BLOCK:
f71f87f9 366 dump_stmt (di, t);
0a7394bc 367 if (CLEANUP_P (t))
1966af04 368 dump_string_field (di, "note", "cleanup");
0a7394bc
MM
369 dump_child ("body", TRY_STMTS (t));
370 dump_child ("hdlr", TRY_HANDLERS (t));
f71f87f9
MM
371 break;
372
52a11cbf
RH
373 case EH_SPEC_BLOCK:
374 dump_stmt (di, t);
375 dump_child ("body", EH_SPEC_STMTS (t));
376 dump_child ("raises", EH_SPEC_RAISES (t));
52a11cbf
RH
377 break;
378
0a7394bc
MM
379 case PTRMEM_CST:
380 dump_child ("clas", PTRMEM_CST_CLASS (t));
381 dump_child ("mbr", PTRMEM_CST_MEMBER (t));
f71f87f9
MM
382 break;
383
0a7394bc
MM
384 case THROW_EXPR:
385 /* These nodes are unary, but do not have code class `1'. */
386 dump_child ("op 0", TREE_OPERAND (t, 0));
f71f87f9
MM
387 break;
388
0a7394bc 389 case AGGR_INIT_EXPR:
5039610b
SL
390 {
391 int i = 0;
392 tree arg;
393 aggr_init_expr_arg_iterator iter;
394 dump_int (di, "ctor", AGGR_INIT_VIA_CTOR_P (t));
395 dump_child ("fn", AGGR_INIT_EXPR_FN (t));
396 FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t)
397 {
398 char buffer[32];
399 sprintf (buffer, "%u", i);
400 dump_child (buffer, arg);
401 i++;
402 }
403 dump_child ("decl", AGGR_INIT_EXPR_SLOT (t));
404 }
0a7394bc 405 break;
c8094d83 406
a2edce31
MM
407 case HANDLER:
408 dump_stmt (di, t);
1a6025b4 409 dump_child ("parm", HANDLER_PARMS (t));
a2edce31 410 dump_child ("body", HANDLER_BODY (t));
a2edce31
MM
411 break;
412
52a11cbf
RH
413 case MUST_NOT_THROW_EXPR:
414 dump_stmt (di, t);
415 dump_child ("body", TREE_OPERAND (t, 0));
52a11cbf
RH
416 break;
417
5158d7ee
NS
418 case USING_STMT:
419 dump_stmt (di, t);
420 dump_child ("nmsp", USING_STMT_NAMESPACE (t));
5158d7ee 421 break;
5a508662
RH
422
423 case CLEANUP_STMT:
424 dump_stmt (di, t);
425 dump_child ("decl", CLEANUP_DECL (t));
426 dump_child ("expr", CLEANUP_EXPR (t));
427 dump_child ("body", CLEANUP_BODY (t));
5a508662
RH
428 break;
429
430 case IF_STMT:
431 dump_stmt (di, t);
432 dump_child ("cond", IF_COND (t));
433 dump_child ("then", THEN_CLAUSE (t));
434 dump_child ("else", ELSE_CLAUSE (t));
5a508662
RH
435 break;
436
fbc315db
ILT
437 case BREAK_STMT:
438 case CONTINUE_STMT:
439 dump_stmt (di, t);
440 break;
441
442 case DO_STMT:
443 dump_stmt (di, t);
444 dump_child ("body", DO_BODY (t));
445 dump_child ("cond", DO_COND (t));
446 break;
447
448 case FOR_STMT:
449 dump_stmt (di, t);
450 dump_child ("init", FOR_INIT_STMT (t));
451 dump_child ("cond", FOR_COND (t));
452 dump_child ("expr", FOR_EXPR (t));
453 dump_child ("body", FOR_BODY (t));
454 break;
455
f9132eb7
RRC
456 case RANGE_FOR_STMT:
457 dump_stmt (di, t);
458 dump_child ("decl", RANGE_FOR_DECL (t));
459 dump_child ("expr", RANGE_FOR_EXPR (t));
460 dump_child ("body", RANGE_FOR_BODY (t));
461 break;
462
fbc315db
ILT
463 case SWITCH_STMT:
464 dump_stmt (di, t);
465 dump_child ("cond", SWITCH_STMT_COND (t));
466 dump_child ("body", SWITCH_STMT_BODY (t));
467 break;
468
469 case WHILE_STMT:
470 dump_stmt (di, t);
471 dump_child ("cond", WHILE_COND (t));
472 dump_child ("body", WHILE_BODY (t));
473 break;
474
c3e5898b
ILT
475 case STMT_EXPR:
476 dump_child ("stmt", STMT_EXPR_STMT (t));
477 break;
478
934790cc
ILT
479 case EXPR_STMT:
480 dump_stmt (di, t);
481 dump_child ("expr", EXPR_STMT_EXPR (t));
482 break;
483
f71f87f9 484 default:
f71f87f9
MM
485 break;
486 }
487
558ee214 488 return c_dump_tree (di, t);
f71f87f9 489}
This page took 2.528689 seconds and 5 git commands to generate.