[D] Move building of typeof(null) values to a common function.
[platform/upstream/gcc.git] / gcc / d / d-tree.h
1 /* d-tree.h -- Definitions and declarations for code generation.
2    Copyright (C) 2006-2019 Free Software Foundation, Inc.
3
4 GCC is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3, or (at your option)
7 any later version.
8
9 GCC is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with GCC; see the file COPYING3.  If not see
16 <http://www.gnu.org/licenses/>.  */
17
18 #ifndef GCC_D_TREE_H
19 #define GCC_D_TREE_H
20
21 /* Forward type declarations to avoid including unnecessary headers.  */
22
23 class Dsymbol;
24 class Declaration;
25 class AggregateDeclaration;
26 class ClassDeclaration;
27 class EnumDeclaration;
28 class FuncDeclaration;
29 class StructDeclaration;
30 class TypeInfoDeclaration;
31 class VarDeclaration;
32 class UserAttributeDeclaration;
33 class Expression;
34 class ClassReferenceExp;
35 class Module;
36 class Statement;
37 class Type;
38 class TypeFunction;
39 class Parameter;
40 struct BaseClass;
41 struct Scope;
42 struct Loc;
43
44 template <typename TYPE> struct Array;
45 typedef Array<Expression *> Expressions;
46
47 /* Usage of TREE_LANG_FLAG_?:
48    0: METHOD_CALL_EXPR
49    1: CALL_EXPR_ARGS_ORDERED (in CALL_EXPR).
50
51    Usage of TYPE_LANG_FLAG_?:
52    0: TYPE_SHARED
53    1: TYPE_IMAGINARY_FLOAT (in REAL_TYPE).
54       ANON_AGGR_TYPE_P (in RECORD_TYPE, UNION_TYPE).
55    2: CLASS_TYPE_P (in RECORD_TYPE).
56    3: TYPE_DYNAMIC_ARRAY (in RECORD_TYPE).
57    4: TYPE_DELEGATE (in RECORD_TYPE).
58    5: TYPE_ASSOCIATIVE_ARRAY (in RECORD_TYPE).
59
60    Usage of DECL_LANG_FLAG_?:
61    0: LABEL_VARIABLE_CASE (in LABEL_DECL).
62       DECL_BUILT_IN_CTFE (in FUNCTION_DECL).  */
63
64 /* The kinds of scopes we recognize.  */
65
66 enum level_kind
67 {
68   level_block,          /* An ordinary block scope.  */
69   level_try,            /* A try-block.  */
70   level_catch,          /* A catch-block.  */
71   level_finally,        /* A finally-block.  */
72   level_cond,           /* The scope for an if condition.  */
73   level_switch,         /* The scope for a switch statement.  */
74   level_loop,           /* A for, do-while, or unrolled-loop block.  */
75   level_with,           /* The scope for a with statement.  */
76   level_function        /* The block representing an entire function.  */
77 };
78
79 /* List of codes for internally recognised compiler intrinsics.  */
80
81 enum intrinsic_code
82 {
83 #define DEF_D_INTRINSIC(CODE, A, N, M, D, C) INTRINSIC_ ## CODE,
84
85 #include "intrinsics.def"
86
87 #undef DEF_D_INTRINSIC
88   INTRINSIC_LAST
89 };
90
91 /* For use with break and continue statements.  */
92
93 enum bc_kind
94 {
95   bc_break    = 0,
96   bc_continue = 1
97 };
98
99 /* The datatype used to implement D scope.  It is needed primarily to support
100    the back-end, but also helps debugging information for local variables.  */
101
102 struct GTY((chain_next ("%h.level_chain"))) binding_level
103 {
104   /* A chain of declarations for all variables, constants and functions.
105      These are in the reverse of the order supplied.  */
106   tree names;
107
108   /* For each level (except the global one), a chain of BLOCK nodes for
109      all the levels that were entered and exited one level down.  */
110   tree blocks;
111
112   /* The binding level this one is contained in.  */
113   binding_level *level_chain;
114
115   /* The kind of scope this object represents.  */
116   ENUM_BITFIELD (level_kind) kind : 4;
117 };
118
119 /* The binding level currently in effect.  */
120 extern GTY(()) binding_level *current_binding_level;
121 extern GTY(()) binding_level *global_binding_level;
122
123 /* Used only for jumps to as-yet undefined labels, since jumps to
124    defined labels can have their validity checked immediately.  */
125
126 struct GTY((chain_next ("%h.next"))) d_label_use_entry
127 {
128   d_label_use_entry *next;
129
130   /* The frontend Statement associated with the jump.  */
131   Statement * GTY((skip)) statement;
132
133   /* The binding level to which this entry is *currently* attached.
134      This is initially the binding level in which the goto appeared,
135      but is modified as scopes are closed.  */
136   binding_level *level;
137 };
138
139 /* A list of all LABEL_DECLs in the function that have names.  Here so
140    we can clear out their names' definitions at the end of the
141    function, and so we can check the validity of jumps to these labels.  */
142
143 struct GTY(()) d_label_entry
144 {
145   /* The label decl itself.  */
146   tree label;
147
148   /* The frontend Statement associated with the label.  */
149   Statement * GTY((skip)) statement;
150
151   /* The binding level to which the label is *currently* attached.
152      This is initially set to the binding level in which the label
153      is defined, but is modified as scopes are closed.  */
154   binding_level *level;
155
156   /* A list of forward references of the label.  */
157   d_label_use_entry *fwdrefs;
158
159   /* The following bits are set after the label is defined, and are
160      updated as scopes are popped.  They indicate that a backward jump
161      to the label will illegally enter a scope of the given flavor.  */
162   bool in_try_scope;
163   bool in_catch_scope;
164
165   /* If set, the label we reference represents a break/continue pair.  */
166   bool bc_label;
167 };
168
169 /* Frame information for a function declaration.  */
170
171 struct GTY(()) tree_frame_info
172 {
173   struct tree_common common;
174   tree frame_type;
175 };
176
177 /* True if the function creates a nested frame.  */
178 #define FRAMEINFO_CREATES_FRAME(NODE) \
179   (TREE_LANG_FLAG_0 (FUNCFRAME_INFO_CHECK (NODE)))
180
181 /* True if the function has a static chain passed in its DECL_ARGUMENTS.  */
182 #define FRAMEINFO_STATIC_CHAIN(NODE) \
183   (TREE_LANG_FLAG_1 (FUNCFRAME_INFO_CHECK (NODE)))
184
185 /* True if the function frame is a closure (initialized on the heap).  */
186 #define FRAMEINFO_IS_CLOSURE(NODE) \
187   (TREE_LANG_FLAG_2 (FUNCFRAME_INFO_CHECK (NODE)))
188
189 #define FRAMEINFO_TYPE(NODE) \
190   (((tree_frame_info *) FUNCFRAME_INFO_CHECK (NODE))->frame_type)
191
192 /* Language-dependent contents of an identifier.  */
193
194 struct GTY(()) lang_identifier
195 {
196   struct tree_identifier common;
197
198   /* The identifier as the user sees it.  */
199   tree pretty_ident;
200
201   /* The back-end tree associated with this identifier.  */
202   tree decl_tree;
203
204   /* The frontend Declaration associated with this identifier.  */
205   Declaration * GTY((skip)) dsymbol;
206 };
207
208 #define IDENTIFIER_LANG_SPECIFIC(NODE) \
209   ((struct lang_identifier *) IDENTIFIER_NODE_CHECK (NODE))
210
211 #define IDENTIFIER_PRETTY_NAME(NODE) \
212   (IDENTIFIER_LANG_SPECIFIC (NODE)->pretty_ident)
213
214 #define IDENTIFIER_DECL_TREE(NODE) \
215   (IDENTIFIER_LANG_SPECIFIC (NODE)->decl_tree)
216
217 #define IDENTIFIER_DSYMBOL(NODE) \
218   (IDENTIFIER_LANG_SPECIFIC (NODE)->dsymbol)
219
220 /* Global state pertinent to the current function.  */
221
222 struct GTY(()) language_function
223 {
224   /* Our function and enclosing module.  */
225   FuncDeclaration * GTY((skip)) function;
226   Module * GTY((skip)) module;
227
228   /* Static chain of function, for D2, this is a closure.  */
229   tree static_chain;
230
231   /* Stack of statement lists being collected while we are
232      compiling the function.  */
233   vec<tree, va_gc> *stmt_list;
234
235   /* Variables that are in scope that will need destruction later.  */
236   vec<tree, va_gc> *vars_in_scope;
237
238   /* Table of all used or defined labels in the function.  */
239   hash_map<Statement *, d_label_entry> *labels;
240 };
241
242 /* The D front end types have not been integrated into the GCC garbage
243    collection system.  Handle this by using the "skip" attribute.  */
244
245 struct GTY(()) lang_decl
246 {
247   Declaration * GTY((skip)) decl;
248
249   /* FIELD_DECL in frame struct that this variable is allocated in.  */
250   tree frame_field;
251
252   /* RESULT_DECL in a function that returns by nrvo.  */
253   tree named_result;
254
255   /* Chain of DECL_LANG_THUNKS in a function.  */
256   tree thunks;
257
258   /* In a FUNCTION_DECL, this is the THUNK_LANG_OFFSET.  */
259   int offset;
260
261   /* In a FUNCTION_DECL, if this is an intrinsic, the code for it.  */
262   enum intrinsic_code intrinsic;
263
264   /* FUNCFRAME_INFO in a function that has non-local references.  */
265   tree frame_info;
266 };
267
268 /* The current D per-function global variables.  */
269
270 #define d_function_chain (cfun ? cfun->language : NULL)
271
272 /* The D frontend Declaration AST for GCC decl NODE.  */
273 #define DECL_LANG_FRONTEND(NODE) \
274   (DECL_LANG_SPECIFIC (NODE) \
275    ? DECL_LANG_SPECIFIC (NODE)->decl : NULL)
276
277 #define SET_DECL_LANG_FRAME_FIELD(NODE, VAL) \
278   DECL_LANG_SPECIFIC (NODE)->frame_field = VAL
279
280 #define DECL_LANG_FRAME_FIELD(NODE) \
281   (DECL_P (NODE) \
282    ? DECL_LANG_SPECIFIC (NODE)->frame_field : NULL)
283
284 #define SET_DECL_LANG_NRVO(NODE, VAL) \
285   DECL_LANG_SPECIFIC (NODE)->named_result = VAL
286
287 #define DECL_LANG_NRVO(NODE) \
288   (DECL_P (NODE) \
289    ? DECL_LANG_SPECIFIC (NODE)->named_result : NULL)
290
291 #define DECL_LANG_THUNKS(NODE) \
292   DECL_LANG_SPECIFIC (NODE)->thunks
293
294 #define THUNK_LANG_OFFSET(NODE) \
295   DECL_LANG_SPECIFIC (NODE)->offset
296
297 #define DECL_INTRINSIC_CODE(NODE) \
298   DECL_LANG_SPECIFIC (NODE)->intrinsic
299
300 #define DECL_LANG_FRAMEINFO(NODE) \
301   DECL_LANG_SPECIFIC (NODE)->frame_info
302
303 /* The lang_type field is not set for every GCC type.  */
304
305 struct GTY(()) lang_type
306 {
307   Type * GTY((skip)) type;
308 };
309
310 /* The D frontend Type AST for GCC type NODE.  */
311 #define TYPE_LANG_FRONTEND(NODE) \
312   (TYPE_LANG_SPECIFIC (NODE) \
313    ? TYPE_LANG_SPECIFIC (NODE)->type : NULL)
314
315
316 enum d_tree_node_structure_enum
317 {
318   TS_D_GENERIC,
319   TS_D_IDENTIFIER,
320   TS_D_FRAMEINFO,
321   LAST_TS_D_ENUM
322 };
323
324 /* The resulting tree type.  */
325
326 union GTY((desc ("d_tree_node_structure (&%h)"),
327            chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON)"
328                        " ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")))
329 lang_tree_node
330 {
331   union tree_node GTY ((tag ("TS_D_GENERIC"),
332                         desc ("tree_node_structure (&%h)"))) generic;
333   lang_identifier GTY ((tag ("TS_D_IDENTIFIER"))) identifier;
334   tree_frame_info GTY ((tag ("TS_D_FRAMEINFO"))) frameinfo;
335 };
336
337 /* True if the Tdelegate typed expression is not really a variable,
338    but a literal function / method reference.  */
339 #define METHOD_CALL_EXPR(NODE) \
340   (TREE_LANG_FLAG_0 (NODE))
341
342 /* True if all arguments in a call expression should be evaluated in the
343    order they are given (left to right).  */
344 #define CALL_EXPR_ARGS_ORDERED(NODE) \
345   (TREE_LANG_FLAG_1 (CALL_EXPR_CHECK (NODE)))
346
347 /* True if the type was declared 'shared'.  */
348 #define TYPE_SHARED(NODE) \
349   (TYPE_LANG_FLAG_0 (NODE))
350
351 /* True if the type is an imaginary float type.  */
352 #define TYPE_IMAGINARY_FLOAT(NODE) \
353   (TYPE_LANG_FLAG_1 (REAL_TYPE_CHECK (NODE)))
354
355 /* True if the type is an anonymous record or union.  */
356 #define ANON_AGGR_TYPE_P(NODE) \
357   (TYPE_LANG_FLAG_1 (RECORD_OR_UNION_CHECK (NODE)))
358
359 /* True if the type is the underlying record for a class.  */
360 #define CLASS_TYPE_P(NODE) \
361   (TYPE_LANG_FLAG_2 (RECORD_TYPE_CHECK (NODE)))
362
363 /* True if the type is a D dynamic array.  */
364 #define TYPE_DYNAMIC_ARRAY(NODE) \
365   (TYPE_LANG_FLAG_3 (RECORD_TYPE_CHECK (NODE)))
366
367 /* True if the type is a D delegate.  */
368 #define TYPE_DELEGATE(NODE) \
369   (TYPE_LANG_FLAG_4 (RECORD_TYPE_CHECK (NODE)))
370
371 /* True if the type is a D associative array.  */
372 #define TYPE_ASSOCIATIVE_ARRAY(NODE) \
373   (TYPE_LANG_FLAG_5 (RECORD_TYPE_CHECK (NODE)))
374
375 /* True if the decl is a variable case label decl.  */
376 #define LABEL_VARIABLE_CASE(NODE) \
377   (DECL_LANG_FLAG_0 (LABEL_DECL_CHECK (NODE)))
378
379 /* True if the decl is a CTFE built-in.  */
380 #define DECL_BUILT_IN_CTFE(NODE) \
381   (DECL_LANG_FLAG_0 (FUNCTION_DECL_CHECK (NODE)))
382
383 enum d_tree_index
384 {
385   DTI_VTABLE_ENTRY_TYPE,
386   DTI_VTBL_PTR_TYPE,
387   DTI_VTBL_INTERFACE_TYPE,
388
389   DTI_BOOL_TYPE,
390   DTI_CHAR_TYPE,
391   DTI_WCHAR_TYPE,
392   DTI_DCHAR_TYPE,
393
394   DTI_BYTE_TYPE,
395   DTI_UBYTE_TYPE,
396   DTI_SHORT_TYPE,
397   DTI_USHORT_TYPE,
398   DTI_INT_TYPE,
399   DTI_UINT_TYPE,
400   DTI_LONG_TYPE,
401   DTI_ULONG_TYPE,
402   DTI_CENT_TYPE,
403   DTI_UCENT_TYPE,
404
405   DTI_IFLOAT_TYPE,
406   DTI_IDOUBLE_TYPE,
407   DTI_IREAL_TYPE,
408
409   DTI_UNKNOWN_TYPE,
410
411   DTI_ARRAY_TYPE,
412   DTI_NULL_ARRAY,
413
414   DTI_MAX
415 };
416
417 extern GTY(()) tree d_global_trees[DTI_MAX];
418
419 #define vtable_entry_type               d_global_trees[DTI_VTABLE_ENTRY_TYPE]
420 #define vtbl_ptr_type_node              d_global_trees[DTI_VTBL_PTR_TYPE]
421 #define vtbl_interface_type_node        d_global_trees[DTI_VTBL_INTERFACE_TYPE]
422 /* D built-in language types.  */
423 #define d_bool_type                     d_global_trees[DTI_BOOL_TYPE]
424 #define d_byte_type                     d_global_trees[DTI_BYTE_TYPE]
425 #define d_ubyte_type                    d_global_trees[DTI_UBYTE_TYPE]
426 #define d_short_type                    d_global_trees[DTI_SHORT_TYPE]
427 #define d_ushort_type                   d_global_trees[DTI_USHORT_TYPE]
428 #define d_int_type                      d_global_trees[DTI_INT_TYPE]
429 #define d_uint_type                     d_global_trees[DTI_UINT_TYPE]
430 #define d_long_type                     d_global_trees[DTI_LONG_TYPE]
431 #define d_ulong_type                    d_global_trees[DTI_ULONG_TYPE]
432 #define d_cent_type                     d_global_trees[DTI_CENT_TYPE]
433 #define d_ucent_type                    d_global_trees[DTI_UCENT_TYPE]
434 /* Imaginary floating-point types.  */
435 #define ifloat_type_node                d_global_trees[DTI_IFLOAT_TYPE]
436 #define idouble_type_node               d_global_trees[DTI_IDOUBLE_TYPE]
437 #define ireal_type_node                 d_global_trees[DTI_IREAL_TYPE]
438 /* UTF-8, 16 and 32 types.  */
439 #define char8_type_node                 d_global_trees[DTI_CHAR_TYPE]
440 #define char16_type_node                d_global_trees[DTI_DCHAR_TYPE]
441 #define char32_type_node                d_global_trees[DTI_WCHAR_TYPE]
442 /* Empty record type used as placeholder when real type is unknown.  */
443 #define unknown_type_node               d_global_trees[DTI_UNKNOWN_TYPE]
444 /* Generic dynamic array type void[].  */
445 #define array_type_node                 d_global_trees[DTI_ARRAY_TYPE]
446 /* Null initializer for dynamic arrays.  */
447 #define null_array_node                 d_global_trees[DTI_NULL_ARRAY]
448
449 /* A prefix for internal variables, which are not user-visible.  */
450 #if !defined (NO_DOT_IN_LABEL)
451 # define GDC_PREFIX(x) "gdc." x
452 #elif !defined (NO_DOLLAR_IN_LABEL)
453 # define GDC_PREFIX(x) "gdc$" x
454 #else
455 # define GDC_PREFIX(x) "gdc_" x
456 #endif
457
458 /* Internally recognised D runtime library functions.  */
459
460 enum libcall_fn
461 {
462 #define DEF_D_RUNTIME(CODE, N, T, P, F) LIBCALL_ ## CODE,
463
464 #include "runtime.def"
465
466 #undef DEF_D_RUNTIME
467   LIBCALL_LAST
468 };
469
470 /* Gate for when the D frontend makes an early call into the codegen pass, such
471    as when it requires target information or CTFE evaluation.  As full semantic
472    may not be completed, we only want to build the superficial tree structure
473    without finishing any decls or types.  */
474 extern bool doing_semantic_analysis_p;
475
476 /* In d-attribs.c.  */
477 extern tree insert_type_attribute (tree, const char *, tree = NULL_TREE);
478 extern tree insert_decl_attribute (tree, const char *, tree = NULL_TREE);
479 extern tree build_attributes (Expressions *);
480
481 /* In d-builtins.cc.  */
482 extern const attribute_spec d_langhook_attribute_table[];
483 extern const attribute_spec d_langhook_common_attribute_table[];
484
485 extern tree d_builtin_function (tree);
486 extern void d_init_builtins (void);
487 extern void d_register_builtin_type (tree, const char *);
488 extern void d_build_builtins_module (Module *);
489 extern void d_maybe_set_builtin (Module *);
490 extern Expression *d_eval_constant_expression (tree);
491 extern void d_init_versions (void);
492
493 /* In d-codegen.cc.  */
494 extern location_t make_location_t (const Loc &);
495 extern tree d_decl_context (Dsymbol *);
496 extern tree copy_aggregate_type (tree);
497 extern bool declaration_reference_p (Declaration *);
498 extern tree declaration_type (Declaration *);
499 extern bool argument_reference_p (Parameter *);
500 extern tree type_passed_as (Parameter *);
501 extern tree build_integer_cst (dinteger_t, tree = d_int_type);
502 extern tree build_float_cst (const real_t &, Type *);
503 extern tree d_array_length (tree);
504 extern tree d_array_ptr (tree);
505 extern tree d_array_value (tree, tree, tree);
506 extern tree get_array_length (tree, Type *);
507 extern tree build_class_binfo (tree, ClassDeclaration *);
508 extern tree build_interface_binfo (tree, ClassDeclaration *, unsigned &);
509 extern tree delegate_method (tree);
510 extern tree delegate_object (tree);
511 extern tree build_delegate_cst (tree, tree, Type *);
512 extern tree build_method_call (tree, tree, Type *);
513 extern void extract_from_method_call (tree, tree &, tree &);
514 extern tree build_typeof_null_value (Type *);
515 extern tree build_vindex_ref (tree, tree, size_t);
516 extern tree d_save_expr (tree);
517 extern tree stabilize_expr (tree *);
518 extern tree build_target_expr (tree, tree);
519 extern tree force_target_expr (tree);
520 extern tree build_address (tree);
521 extern tree d_mark_addressable (tree);
522 extern tree d_mark_used (tree);
523 extern tree d_mark_read (tree);
524 extern bool identity_compare_p (StructDeclaration *);
525 extern tree build_struct_comparison (tree_code, StructDeclaration *,
526                                      tree, tree);
527 extern tree build_array_struct_comparison (tree_code, StructDeclaration *,
528                                            tree, tree, tree);
529 extern tree build_struct_literal (tree, vec<constructor_elt, va_gc> *);
530 extern tree component_ref (tree, tree);
531 extern tree build_assign (tree_code, tree, tree);
532 extern tree modify_expr (tree, tree);
533 extern tree build_nop (tree, tree);
534 extern tree build_vconvert (tree, tree);
535 extern tree build_boolop (tree_code, tree, tree);
536 extern tree build_condition (tree, tree, tree, tree);
537 extern tree build_vcondition (tree, tree, tree);
538 extern tree compound_expr (tree, tree);
539 extern tree return_expr (tree);
540 extern tree size_mult_expr (tree, tree);
541 extern tree real_part (tree);
542 extern tree imaginary_part (tree);
543 extern tree complex_expr (tree, tree, tree);
544 extern tree indirect_ref (tree, tree);
545 extern tree build_deref (tree);
546 extern tree build_array_index (tree, tree);
547 extern tree build_offset_op (tree_code, tree, tree);
548 extern tree build_offset (tree, tree);
549 extern tree build_memref (tree, tree, tree);
550 extern tree build_array_set (tree, tree, tree);
551 extern tree build_array_from_val (Type *, tree);
552 extern tree void_okay_p (tree);
553 extern tree build_bounds_condition (const Loc &, tree, tree, bool);
554 extern bool array_bounds_check (void);
555 extern tree create_temporary_var (tree);
556 extern tree maybe_temporary_var (tree, tree *);
557 extern tree bind_expr (tree, tree);
558 extern TypeFunction *get_function_type (Type *);
559 extern bool call_by_alias_p (FuncDeclaration *, FuncDeclaration *);
560 extern tree d_build_call_expr (FuncDeclaration *, tree, Expressions *);
561 extern tree d_build_call (TypeFunction *, tree, tree, Expressions *);
562 extern tree d_assert_call (const Loc &, libcall_fn, tree = NULL_TREE);
563 extern tree build_float_modulus (tree, tree, tree);
564 extern tree build_vthis_function (tree, tree);
565 extern tree get_frame_for_symbol (Dsymbol *);
566 extern tree build_vthis (AggregateDeclaration *);
567 extern void build_closure (FuncDeclaration *);
568 extern tree get_frameinfo (FuncDeclaration *);
569 extern tree get_framedecl (FuncDeclaration *, FuncDeclaration *);
570
571 /* In d-convert.cc.  */
572 extern bool decl_with_nonnull_addr_p (const_tree);
573 extern tree d_truthvalue_conversion (tree);
574 extern tree d_convert (tree, tree);
575 extern tree convert_expr (tree, Type *, Type *);
576 extern tree convert_for_assignment (tree, Type *, Type *);
577 extern tree convert_for_argument (tree, Parameter *);
578 extern tree convert_for_condition (tree, Type *);
579 extern tree d_array_convert (Expression *);
580 extern tree d_array_convert (Type *, Expression *, vec<tree, va_gc> **);
581
582 /* In d-incpath.cc.  */
583 extern void add_import_paths (const char *, const char *, bool);
584
585 /* In d-lang.cc.  */
586 extern void d_add_builtin_module (Module *);
587 extern void d_add_entrypoint_module (Module *, Module *);
588 extern d_tree_node_structure_enum d_tree_node_structure (lang_tree_node *);
589 extern struct lang_type *build_lang_type (Type *);
590 extern struct lang_decl *build_lang_decl (Declaration *);
591 extern tree d_pushdecl (tree);
592 extern tree d_unsigned_type (tree);
593 extern tree d_signed_type (tree);
594 extern void d_keep (tree);
595
596 /* In decl.cc.  */
597 extern tree mangle_internal_decl (Dsymbol *, const char *, const char *);
598 extern void build_decl_tree (Dsymbol *);
599 extern tree get_symbol_decl (Declaration *);
600 extern tree declare_extern_var (tree, tree);
601 extern void declare_local_var (VarDeclaration *);
602 extern tree build_local_temp (tree);
603 extern tree get_decl_tree (Declaration *);
604 extern void d_finish_decl (tree);
605 extern tree make_thunk (FuncDeclaration *, int);
606 extern tree start_function (FuncDeclaration *);
607 extern void finish_function (tree);
608 extern void mark_needed (tree);
609 extern unsigned base_vtable_offset (ClassDeclaration *, BaseClass *);
610 extern tree get_vtable_decl (ClassDeclaration *);
611 extern tree build_new_class_expr (ClassReferenceExp *);
612 extern tree aggregate_initializer_decl (AggregateDeclaration *);
613 extern tree layout_struct_initializer (StructDeclaration *);
614 extern tree layout_class_initializer (ClassDeclaration *);
615 extern tree enum_initializer_decl (EnumDeclaration *);
616 extern tree build_artificial_decl (tree, tree, const char * = NULL);
617 extern tree create_field_decl (tree, const char *, int, int);
618 extern void build_type_decl (tree, Dsymbol *);
619 extern void d_comdat_linkage (tree);
620 extern void d_linkonce_linkage (tree);
621
622 /* In expr.cc.  */
623 extern tree build_expr (Expression *, bool = false);
624 extern tree build_expr_dtor (Expression *);
625 extern tree build_return_dtor (Expression *, Type *, TypeFunction *);
626
627 /* In imports.cc.  */
628 extern tree build_import_decl (Dsymbol *);
629
630 /* In intrinsics.cc.  */
631 extern void maybe_set_intrinsic (FuncDeclaration *);
632 extern tree maybe_expand_intrinsic (tree);
633
634 /* In modules.cc.  */
635 extern void build_module_tree (Module *);
636 extern tree d_module_context (void);
637 extern void register_module_decl (Declaration *);
638 extern void d_finish_compilation (tree *, int);
639
640 /* In runtime.cc.  */
641 extern tree build_libcall (libcall_fn, Type *, int ...);
642
643 /* In typeinfo.cc.  */
644 extern tree layout_typeinfo (TypeInfoDeclaration *);
645 extern tree layout_classinfo (ClassDeclaration *);
646 extern tree get_typeinfo_decl (TypeInfoDeclaration *);
647 extern tree get_classinfo_decl (ClassDeclaration *);
648 extern tree build_typeinfo (Type *);
649 extern void create_typeinfo (Type *, Module *);
650 extern void create_tinfo_types (Module *);
651 extern void layout_cpp_typeinfo (ClassDeclaration *);
652 extern tree get_cpp_typeinfo_decl (ClassDeclaration *);
653 extern bool speculative_type_p (Type *);
654
655 /* In toir.cc.  */
656 extern void push_binding_level (level_kind);
657 extern tree pop_binding_level (void);
658 extern void push_stmt_list (void);
659 extern tree pop_stmt_list (void);
660 extern void add_stmt (tree);
661 extern void build_function_body (FuncDeclaration *);
662
663 /* In types.cc.  */
664 extern bool valist_array_p (Type *);
665 extern bool empty_aggregate_p (tree);
666 extern bool same_type_p (Type *, Type *);
667 extern Type *get_object_type (void);
668 extern tree make_array_type (Type *, unsigned HOST_WIDE_INT);
669 extern tree make_struct_type (const char *, int n, ...);
670 extern tree insert_type_modifiers (tree, unsigned);
671 extern void insert_aggregate_field (tree, tree, size_t);
672 extern void finish_aggregate_type (unsigned, unsigned, tree,
673                                    UserAttributeDeclaration *);
674 extern tree build_ctype (Type *);
675
676 #endif  /* GCC_D_TREE_H  */