Require target lra in gcc.dg/pr108095.c
[official-gcc.git] / gcc / go / gofrontend / expressions.h
blobbdb7ccd010d51cddf9157a505b408543ad436d40
1 // expressions.h -- Go frontend expression handling. -*- C++ -*-
3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 #ifndef GO_EXPRESSIONS_H
8 #define GO_EXPRESSIONS_H
10 #include <mpfr.h>
11 #include <mpc.h>
13 #include "operator.h"
14 #include "runtime.h"
16 class Gogo;
17 class Translate_context;
18 class Traverse;
19 class Statement_inserter;
20 class Type;
21 class Method;
22 struct Type_context;
23 class Integer_type;
24 class Float_type;
25 class Complex_type;
26 class Function_type;
27 class Map_type;
28 class Struct_type;
29 class Struct_field;
30 class Expression_list;
31 class Const_expression;
32 class Var_expression;
33 class Enclosed_var_expression;
34 class Temporary_reference_expression;
35 class Set_and_use_temporary_expression;
36 class String_expression;
37 class Type_conversion_expression;
38 class Unsafe_type_conversion_expression;
39 class Unary_expression;
40 class Binary_expression;
41 class String_concat_expression;
42 class Call_expression;
43 class Builtin_call_expression;
44 class Call_result_expression;
45 class Func_expression;
46 class Func_descriptor_expression;
47 class Unknown_expression;
48 class Index_expression;
49 class Array_index_expression;
50 class String_index_expression;
51 class Map_index_expression;
52 class Bound_method_expression;
53 class Field_reference_expression;
54 class Interface_field_reference_expression;
55 class Allocation_expression;
56 class Composite_literal_expression;
57 class Struct_construction_expression;
58 class Array_construction_expression;
59 class Fixed_array_construction_expression;
60 class Slice_construction_expression;
61 class Map_construction_expression;
62 class Type_guard_expression;
63 class Heap_expression;
64 class Receive_expression;
65 class Slice_value_expression;
66 class Slice_info_expression;
67 class Conditional_expression;
68 class Compound_expression;
69 class Numeric_constant;
70 class Named_object;
71 class Export_function_body;
72 class Import_expression;
73 class Temporary_statement;
74 class Label;
75 class Ast_dump_context;
76 class String_dump;
78 // The precision to use for complex values represented as an mpc_t.
79 const int mpc_precision = 256;
81 // The base class for all expressions.
83 class Expression
85 public:
86 // The types of expressions.
87 enum Expression_classification
89 EXPRESSION_ERROR,
90 EXPRESSION_TYPE,
91 EXPRESSION_UNARY,
92 EXPRESSION_BINARY,
93 EXPRESSION_STRING_CONCAT,
94 EXPRESSION_CONST_REFERENCE,
95 EXPRESSION_VAR_REFERENCE,
96 EXPRESSION_ENCLOSED_VAR_REFERENCE,
97 EXPRESSION_TEMPORARY_REFERENCE,
98 EXPRESSION_SET_AND_USE_TEMPORARY,
99 EXPRESSION_SINK,
100 EXPRESSION_FUNC_REFERENCE,
101 EXPRESSION_FUNC_DESCRIPTOR,
102 EXPRESSION_FUNC_CODE_REFERENCE,
103 EXPRESSION_UNKNOWN_REFERENCE,
104 EXPRESSION_BOOLEAN,
105 EXPRESSION_STRING,
106 EXPRESSION_STRING_INFO,
107 EXPRESSION_STRING_VALUE,
108 EXPRESSION_INTEGER,
109 EXPRESSION_FLOAT,
110 EXPRESSION_COMPLEX,
111 EXPRESSION_NIL,
112 EXPRESSION_IOTA,
113 EXPRESSION_CALL,
114 EXPRESSION_CALL_RESULT,
115 EXPRESSION_BOUND_METHOD,
116 EXPRESSION_INDEX,
117 EXPRESSION_ARRAY_INDEX,
118 EXPRESSION_STRING_INDEX,
119 EXPRESSION_MAP_INDEX,
120 EXPRESSION_SELECTOR,
121 EXPRESSION_FIELD_REFERENCE,
122 EXPRESSION_INTERFACE_FIELD_REFERENCE,
123 EXPRESSION_ALLOCATION,
124 EXPRESSION_TYPE_GUARD,
125 EXPRESSION_CONVERSION,
126 EXPRESSION_UNSAFE_CONVERSION,
127 EXPRESSION_STRUCT_CONSTRUCTION,
128 EXPRESSION_FIXED_ARRAY_CONSTRUCTION,
129 EXPRESSION_SLICE_CONSTRUCTION,
130 EXPRESSION_MAP_CONSTRUCTION,
131 EXPRESSION_COMPOSITE_LITERAL,
132 EXPRESSION_COMPOSITE_LITERAL_KEY,
133 EXPRESSION_HEAP,
134 EXPRESSION_RECEIVE,
135 EXPRESSION_TYPE_DESCRIPTOR,
136 EXPRESSION_GC_SYMBOL,
137 EXPRESSION_PTRMASK_SYMBOL,
138 EXPRESSION_TYPE_INFO,
139 EXPRESSION_SLICE_INFO,
140 EXPRESSION_SLICE_VALUE,
141 EXPRESSION_INTERFACE_INFO,
142 EXPRESSION_INTERFACE_VALUE,
143 EXPRESSION_INTERFACE_MTABLE,
144 EXPRESSION_STRUCT_FIELD_OFFSET,
145 EXPRESSION_LABEL_ADDR,
146 EXPRESSION_CONDITIONAL,
147 EXPRESSION_COMPOUND,
148 EXPRESSION_BACKEND
151 Expression(Expression_classification, Location);
153 virtual ~Expression();
155 // Make an error expression. This is used when a parse error occurs
156 // to prevent cascading errors.
157 static Expression*
158 make_error(Location);
160 // Make an expression which is really a type. This is used during
161 // parsing.
162 static Expression*
163 make_type(Type*, Location);
165 // Make a unary expression.
166 static Expression*
167 make_unary(Operator, Expression*, Location);
169 // Make a binary expression.
170 static Expression*
171 make_binary(Operator, Expression*, Expression*, Location);
173 // Make a string concatenation expression.
174 static Expression*
175 make_string_concat(Expression_list*);
177 // Make a reference to a constant in an expression.
178 static Expression*
179 make_const_reference(Named_object*, Location);
181 // Make a reference to a variable in an expression.
182 static Expression*
183 make_var_reference(Named_object*, Location);
185 // Make a reference to a variable within an enclosing function.
186 static Expression*
187 make_enclosing_var_reference(Expression*, Named_object*, Location);
189 // Make a reference to a temporary variable. Temporary variables
190 // are always created by a single statement, which is what we use to
191 // refer to them.
192 static Temporary_reference_expression*
193 make_temporary_reference(Temporary_statement*, Location);
195 // Make an expressions which sets a temporary variable and then
196 // evaluates to a reference to that temporary variable. This is
197 // used to set a temporary variable while retaining the order of
198 // evaluation.
199 static Set_and_use_temporary_expression*
200 make_set_and_use_temporary(Temporary_statement*, Expression*, Location);
202 // Make a sink expression--a reference to the blank identifier _.
203 static Expression*
204 make_sink(Location);
206 // Make a reference to a function in an expression. This returns a
207 // pointer to the struct holding the address of the function
208 // followed by any closed-over variables.
209 static Expression*
210 make_func_reference(Named_object*, Expression* closure, Location);
212 // Make a function descriptor, an immutable struct with a single
213 // field that points to the function code. This may only be used
214 // with functions that do not have closures. FN is the function for
215 // which we are making the descriptor.
216 static Func_descriptor_expression*
217 make_func_descriptor(Named_object* fn);
219 // Make a reference to the code of a function. This is used to set
220 // descriptor and closure fields.
221 static Expression*
222 make_func_code_reference(Named_object*, Location);
224 // Make a reference to an unknown name. In a correct program this
225 // will always be lowered to a real const/var/func reference.
226 static Unknown_expression*
227 make_unknown_reference(Named_object*, Location);
229 // Make a constant bool expression.
230 static Expression*
231 make_boolean(bool val, Location);
233 // Make a constant string expression.
234 static Expression*
235 make_string(const std::string&, Location);
237 // Make a constant string expression with a specific string subtype.
238 static Expression*
239 make_string_typed(const std::string&, Type*, Location);
241 // Make an expression that evaluates to some characteristic of an string.
242 // For simplicity, the enum values must match the field indexes in the
243 // underlying struct. This returns an lvalue.
244 enum String_info
246 // The underlying data in the string.
247 STRING_INFO_DATA,
248 // The length of the string.
249 STRING_INFO_LENGTH
252 static Expression*
253 make_string_info(Expression* string, String_info, Location);
255 // Make an expression for a string value.
256 static Expression*
257 make_string_value(Expression* valptr, Expression* len, Location);
259 // Make a character constant expression. TYPE should be NULL for an
260 // abstract type.
261 static Expression*
262 make_character(const mpz_t*, Type*, Location);
264 // Make a constant integer expression from a multi-precision
265 // integer. TYPE should be NULL for an abstract type.
266 static Expression*
267 make_integer_z(const mpz_t*, Type*, Location);
269 // Make a constant integer expression from an unsigned long. TYPE
270 // should be NULL for an abstract type.
271 static Expression*
272 make_integer_ul(unsigned long, Type*, Location);
274 // Make a constant integer expression from a signed long. TYPE
275 // should be NULL for an abstract type.
276 static Expression*
277 make_integer_sl(long, Type*, Location);
279 // Make a constant integer expression from an int64_t. TYPE should
280 // be NULL for an abstract type.
281 static Expression*
282 make_integer_int64(int64_t, Type*, Location);
284 // Make a constant float expression. TYPE should be NULL for an
285 // abstract type.
286 static Expression*
287 make_float(const mpfr_t*, Type*, Location);
289 // Make a constant complex expression. TYPE should be NULL for an
290 // abstract type.
291 static Expression*
292 make_complex(const mpc_t*, Type*, Location);
294 // Make a nil expression.
295 static Expression*
296 make_nil(Location);
298 // Make an iota expression. This is used for the predeclared
299 // constant iota.
300 static Expression*
301 make_iota();
303 // Make a call expression.
304 static Call_expression*
305 make_call(Expression* func, Expression_list* args, bool is_varargs,
306 Location);
308 // Make a reference to a specific result of a call expression which
309 // returns a tuple.
310 static Expression*
311 make_call_result(Call_expression*, unsigned int index);
313 // Make an expression which is a method bound to its first
314 // parameter. METHOD is the method being called, FUNCTION is the
315 // function to call.
316 static Bound_method_expression*
317 make_bound_method(Expression* object, const Method* method,
318 Named_object* function, Location);
320 // Make an index or slice expression. This is a parser expression
321 // which represents LEFT[START:END:CAP]. END may be NULL, meaning an
322 // index rather than a slice. CAP may be NULL, meaning we use the default
323 // capacity of LEFT. At parse time we may not know the type of LEFT.
324 // After parsing this is lowered to an array index, a string index,
325 // or a map index.
326 static Expression*
327 make_index(Expression* left, Expression* start, Expression* end,
328 Expression* cap, Location);
330 // Make an array index expression. END may be NULL, in which case
331 // this is an lvalue. CAP may be NULL, in which case it defaults
332 // to cap(ARRAY).
333 static Expression*
334 make_array_index(Expression* array, Expression* start, Expression* end,
335 Expression* cap, Location);
337 // Make a string index expression. END may be NULL. This is never
338 // an lvalue.
339 static Expression*
340 make_string_index(Expression* string, Expression* start, Expression* end,
341 Location);
343 // Make a map index expression. This is an lvalue.
344 static Map_index_expression*
345 make_map_index(Expression* map, Expression* val, Location);
347 // Make a selector. This is a parser expression which represents
348 // LEFT.NAME. At parse time we may not know the type of the left
349 // hand side.
350 static Expression*
351 make_selector(Expression* left, const std::string& name, Location);
353 // Make a reference to a field in a struct.
354 static Field_reference_expression*
355 make_field_reference(Expression*, unsigned int field_index, Location);
357 // Make a reference to a field of an interface, with an associated
358 // object.
359 static Expression*
360 make_interface_field_reference(Expression*, const std::string&,
361 Location);
363 // Make an allocation expression.
364 static Expression*
365 make_allocation(Type*, Location);
367 // Make a type guard expression.
368 static Expression*
369 make_type_guard(Expression*, Type*, Location);
371 // Make a type cast expression.
372 static Expression*
373 make_cast(Type*, Expression*, Location);
375 // Make an unsafe type cast expression. This is only used when
376 // passing parameter to builtin functions that are part of the Go
377 // runtime.
378 static Expression*
379 make_unsafe_cast(Type*, Expression*, Location);
381 // Make a composite literal. The DEPTH parameter is how far down we
382 // are in a list of composite literals with omitted types. HAS_KEYS
383 // is true if the expression list has keys alternating with values.
384 // ALL_ARE_NAMES is true if all the keys could be struct field
385 // names.
386 static Expression*
387 make_composite_literal(Type*, int depth, bool has_keys, Expression_list*,
388 bool all_are_names, Location);
390 // Make a composite literal key.
391 static Expression*
392 make_composite_literal_key(const std::string& name, Location);
394 // Make a struct composite literal.
395 static Expression*
396 make_struct_composite_literal(Type*, Expression_list*, Location);
398 // Make an array composite literal.
399 static Expression*
400 make_array_composite_literal(Type*, Expression_list*, Location);
402 // Make a slice composite literal.
403 static Slice_construction_expression*
404 make_slice_composite_literal(Type*, Expression_list*, Location);
406 // Take an expression and allocate it on the heap.
407 static Expression*
408 make_heap_expression(Expression*, Location);
410 // Make a receive expression. VAL is NULL for a unary receive.
411 static Receive_expression*
412 make_receive(Expression* channel, Location);
414 // Make an expression which evaluates to the address of the type
415 // descriptor for TYPE.
416 static Expression*
417 make_type_descriptor(Type* type, Location);
419 // Make an expression which evaluates to the address of the gc
420 // symbol for TYPE.
421 static Expression*
422 make_gc_symbol(Type* type);
424 // Make an expression that evaluates to the address of a ptrmask
425 // symbol for TYPE. For most types this will be the same as
426 // make_gc_symbol, but for larger types make_gc_symbol will return a
427 // gcprog while this will return a ptrmask.
428 static Expression*
429 make_ptrmask_symbol(Type* type);
431 // Make an expression which evaluates to some characteristic of a
432 // type. These are only used for type descriptors, so there is no
433 // location parameter.
434 enum Type_info
436 // The size of a value of the type.
437 TYPE_INFO_SIZE,
438 // The required alignment of a value of the type.
439 TYPE_INFO_ALIGNMENT,
440 // The required alignment of a value of the type when used as a
441 // field in a struct.
442 TYPE_INFO_FIELD_ALIGNMENT,
443 // The size of the prefix of a value of the type that contains
444 // all the pointers. This is 0 for a type that contains no
445 // pointers. It is always <= TYPE_INFO_SIZE.
446 TYPE_INFO_BACKEND_PTRDATA,
447 // Like TYPE_INFO_BACKEND_PTRDATA, but the ptrdata value that we
448 // want to store in a type descriptor. They are the same for
449 // most types, but can differ for a type that uses a gcprog.
450 TYPE_INFO_DESCRIPTOR_PTRDATA
453 static Expression*
454 make_type_info(Type* type, Type_info);
456 // Make an expression that evaluates to some characteristic of a
457 // slice. For simplicity, the enum values must match the field indexes
458 // in the underlying struct. This returns an lvalue.
459 enum Slice_info
461 // The underlying data of the slice.
462 SLICE_INFO_VALUE_POINTER,
463 // The length of the slice.
464 SLICE_INFO_LENGTH,
465 // The capacity of the slice.
466 SLICE_INFO_CAPACITY
469 static Expression*
470 make_slice_info(Expression* slice, Slice_info, Location);
472 // Make an expression for a slice value.
473 static Expression*
474 make_slice_value(Type*, Expression* valptr, Expression* len, Expression* cap,
475 Location);
477 // Make an expression that evaluates to some characteristic of an
478 // interface. For simplicity, the enum values must match the field indexes
479 // in the underlying struct. This returns an lvalue.
480 enum Interface_info
482 // The type descriptor of an empty interface.
483 INTERFACE_INFO_TYPE_DESCRIPTOR = 0,
484 // The methods of an interface.
485 INTERFACE_INFO_METHODS = 0,
486 // The first argument to pass to an interface method.
487 INTERFACE_INFO_OBJECT
490 static Expression*
491 make_interface_info(Expression* iface, Interface_info, Location);
493 // Make an expression for an interface value.
494 static Expression*
495 make_interface_value(Type*, Expression*, Expression*, Location);
497 // Make an expression that builds a reference to the interface method table
498 // for TYPE that satisfies interface ITYPE. IS_POINTER is true if this is a
499 // reference to the interface method table for the pointer receiver type.
500 static Expression*
501 make_interface_mtable_ref(Interface_type* itype, Type* type,
502 bool is_pointer, Location);
504 // Make an expression which evaluates to the offset of a field in a
505 // struct. This is only used for type descriptors, so there is no
506 // location parameter.
507 static Expression*
508 make_struct_field_offset(Struct_type*, const Struct_field*);
510 // Make an expression which evaluates to the address of an unnamed
511 // label.
512 static Expression*
513 make_label_addr(Label*, Location);
515 // Make a conditional expression.
516 static Expression*
517 make_conditional(Expression*, Expression*, Expression*, Location);
519 // Make a compound expression.
520 static Expression*
521 make_compound(Expression*, Expression*, Location);
523 // Make a backend expression.
524 static Expression*
525 make_backend(Bexpression*, Type*, Location);
527 enum Nil_check_classification
529 // Use the default policy for deciding if this deref needs a check.
530 NIL_CHECK_DEFAULT,
531 // An explicit check is required for this dereference operation.
532 NIL_CHECK_NEEDED,
533 // No check needed for this dereference operation.
534 NIL_CHECK_NOT_NEEDED,
535 // A type error or error construct was encountered when determining
536 // whether this deref needs an explicit check.
537 NIL_CHECK_ERROR_ENCOUNTERED
540 // Make a dereference expression.
541 static Expression*
542 make_dereference(Expression*, Nil_check_classification, Location);
544 // Return the expression classification.
545 Expression_classification
546 classification() const
547 { return this->classification_; }
549 // Return the location of the expression.
550 Location
551 location() const
552 { return this->location_; }
554 // Set the location of an expression and all its subexpressions.
555 // This is used for const declarations where the expression is
556 // copied from an earlier declaration.
557 void
558 set_location(Location loc);
560 // For set_location. This should really be a local class in
561 // Expression, but it needs types defined in gogo.h.
562 friend class Set_location;
564 // Return whether this is a constant expression.
565 bool
566 is_constant() const
567 { return this->do_is_constant(); }
569 // Return whether this is the zero value of its type.
570 bool
571 is_zero_value() const
572 { return this->do_is_zero_value(); }
574 // Return whether this expression can be used as a static
575 // initializer. This is true for an expression that has only
576 // numbers and pointers to global variables or composite literals
577 // that do not require runtime initialization. It is false if we
578 // must generate code to compute this expression when it is used to
579 // initialize a global variable. This is not a language-level
580 // concept, but an implementation-level one. If this expression is
581 // used to initialize a global variable, this is true if we can pass
582 // an initializer to the backend, false if we must generate code to
583 // initialize the variable. It is always safe for this method to
584 // return false, but the resulting code may be less efficient.
585 bool
586 is_static_initializer() const
587 { return this->do_is_static_initializer(); }
589 // If this is not a numeric constant, return false. If it is one,
590 // return true, and set VAL to hold the value.
591 bool
592 numeric_constant_value(Numeric_constant* val) const
593 { return this->do_numeric_constant_value(val); }
595 // If this is not a constant expression with string type, return
596 // false. If it is one, return true, and set VAL to the value.
597 bool
598 string_constant_value(std::string* val) const
599 { return this->do_string_constant_value(val); }
601 // If this is not a constant expression with boolean type, return
602 // false. If it is one, return true, and set VAL to the value.
603 bool
604 boolean_constant_value(bool* val) const
605 { return this->do_boolean_constant_value(val); }
607 // If this is a const reference expression, return the named
608 // object to which the expression refers, otherwise return NULL.
609 const Named_object*
610 named_constant() const;
612 // This is called if the value of this expression is being
613 // discarded. This issues warnings about computed values being
614 // unused. This returns true if all is well, false if it issued an
615 // error message.
616 bool
617 discarding_value()
618 { return this->do_discarding_value(); }
620 // Return whether this is an error expression.
621 bool
622 is_error_expression() const
623 { return this->classification_ == EXPRESSION_ERROR; }
625 // Return whether this expression really represents a type.
626 bool
627 is_type_expression() const
628 { return this->classification_ == EXPRESSION_TYPE; }
630 // If this is a const reference, return the Const_expression
631 // structure. Otherwise, return NULL. This is a controlled dynamic
632 // cast.
633 Const_expression*
634 const_expression()
635 { return this->convert<Const_expression, EXPRESSION_CONST_REFERENCE>(); }
637 const Const_expression*
638 const_expression() const
640 return this->convert<const Const_expression,
641 EXPRESSION_CONST_REFERENCE>();
644 // If this is a variable reference, return the Var_expression
645 // structure. Otherwise, return NULL. This is a controlled dynamic
646 // cast.
647 Var_expression*
648 var_expression()
649 { return this->convert<Var_expression, EXPRESSION_VAR_REFERENCE>(); }
651 const Var_expression*
652 var_expression() const
653 { return this->convert<const Var_expression, EXPRESSION_VAR_REFERENCE>(); }
655 // If this is a enclosed_variable reference, return the
656 // Enclosed_var_expression structure. Otherwise, return NULL.
657 // This is a controlled dynamic cast.
658 Enclosed_var_expression*
659 enclosed_var_expression()
660 { return this->convert<Enclosed_var_expression,
661 EXPRESSION_ENCLOSED_VAR_REFERENCE>(); }
663 const Enclosed_var_expression*
664 enclosed_var_expression() const
665 { return this->convert<const Enclosed_var_expression,
666 EXPRESSION_ENCLOSED_VAR_REFERENCE>(); }
669 // If this is a reference to a temporary variable, return the
670 // Temporary_reference_expression. Otherwise, return NULL.
671 Temporary_reference_expression*
672 temporary_reference_expression()
674 return this->convert<Temporary_reference_expression,
675 EXPRESSION_TEMPORARY_REFERENCE>();
678 // If this is a set-and-use-temporary, return the
679 // Set_and_use_temporary_expression. Otherwise, return NULL.
680 Set_and_use_temporary_expression*
681 set_and_use_temporary_expression()
683 return this->convert<Set_and_use_temporary_expression,
684 EXPRESSION_SET_AND_USE_TEMPORARY>();
687 // Return whether this is a sink expression.
688 bool
689 is_sink_expression() const
690 { return this->classification_ == EXPRESSION_SINK; }
692 // If this is a string expression, return the String_expression
693 // structure. Otherwise, return NULL.
694 String_expression*
695 string_expression()
696 { return this->convert<String_expression, EXPRESSION_STRING>(); }
698 // If this is a conversion expression, return the Type_conversion_expression
699 // structure. Otherwise, return NULL.
700 Type_conversion_expression*
701 conversion_expression()
702 { return this->convert<Type_conversion_expression, EXPRESSION_CONVERSION>(); }
704 // If this is an unsafe conversion expression, return the
705 // Unsafe_type_conversion_expression structure. Otherwise, return NULL.
706 Unsafe_type_conversion_expression*
707 unsafe_conversion_expression()
709 return this->convert<Unsafe_type_conversion_expression,
710 EXPRESSION_UNSAFE_CONVERSION>();
713 // Return whether this is the expression nil.
714 bool
715 is_nil_expression() const
716 { return this->classification_ == EXPRESSION_NIL; }
718 // If this is an indirection through a pointer, return the
719 // expression being pointed through. Otherwise return this.
720 Expression*
721 deref();
723 // If this is a unary expression, return the Unary_expression
724 // structure. Otherwise return NULL.
725 Unary_expression*
726 unary_expression()
727 { return this->convert<Unary_expression, EXPRESSION_UNARY>(); }
729 // If this is a binary expression, return the Binary_expression
730 // structure. Otherwise return NULL.
731 Binary_expression*
732 binary_expression()
733 { return this->convert<Binary_expression, EXPRESSION_BINARY>(); }
735 // If this is a string concatenation expression, return the
736 // String_concat_expression structure. Otherwise, return NULL.
737 String_concat_expression*
738 string_concat_expression()
740 return this->convert<String_concat_expression, EXPRESSION_STRING_CONCAT>();
743 // If this is a call expression, return the Call_expression
744 // structure. Otherwise, return NULL. This is a controlled dynamic
745 // cast.
746 Call_expression*
747 call_expression()
748 { return this->convert<Call_expression, EXPRESSION_CALL>(); }
750 const Call_expression*
751 call_expression() const
752 { return this->convert<const Call_expression, EXPRESSION_CALL>(); }
754 // If this is a call_result expression, return the Call_result_expression
755 // structure. Otherwise, return NULL. This is a controlled dynamic
756 // cast.
757 Call_result_expression*
758 call_result_expression()
759 { return this->convert<Call_result_expression, EXPRESSION_CALL_RESULT>(); }
761 // If this is an expression which refers to a function, return the
762 // Func_expression structure. Otherwise, return NULL.
763 Func_expression*
764 func_expression()
765 { return this->convert<Func_expression, EXPRESSION_FUNC_REFERENCE>(); }
767 const Func_expression*
768 func_expression() const
769 { return this->convert<const Func_expression, EXPRESSION_FUNC_REFERENCE>(); }
771 // If this is an expression which refers to an unknown name, return
772 // the Unknown_expression structure. Otherwise, return NULL.
773 Unknown_expression*
774 unknown_expression()
775 { return this->convert<Unknown_expression, EXPRESSION_UNKNOWN_REFERENCE>(); }
777 const Unknown_expression*
778 unknown_expression() const
780 return this->convert<const Unknown_expression,
781 EXPRESSION_UNKNOWN_REFERENCE>();
784 // If this is an index expression, return the Index_expression
785 // structure. Otherwise, return NULL.
786 Index_expression*
787 index_expression()
788 { return this->convert<Index_expression, EXPRESSION_INDEX>(); }
790 // If this is an expression which refers to indexing in a array,
791 // return the Array_index_expression structure. Otherwise, return
792 // NULL.
793 Array_index_expression*
794 array_index_expression()
795 { return this->convert<Array_index_expression, EXPRESSION_ARRAY_INDEX>(); }
797 // If this is an expression which refers to indexing in a string,
798 // return the String_index_expression structure. Otherwise, return
799 // NULL.
800 String_index_expression*
801 string_index_expression()
802 { return this->convert<String_index_expression, EXPRESSION_STRING_INDEX>(); }
804 // If this is an expression which refers to indexing in a map,
805 // return the Map_index_expression structure. Otherwise, return
806 // NULL.
807 Map_index_expression*
808 map_index_expression()
809 { return this->convert<Map_index_expression, EXPRESSION_MAP_INDEX>(); }
811 // If this is a bound method expression, return the
812 // Bound_method_expression structure. Otherwise, return NULL.
813 Bound_method_expression*
814 bound_method_expression()
815 { return this->convert<Bound_method_expression, EXPRESSION_BOUND_METHOD>(); }
817 // If this is a reference to a field in a struct, return the
818 // Field_reference_expression structure. Otherwise, return NULL.
819 Field_reference_expression*
820 field_reference_expression()
822 return this->convert<Field_reference_expression,
823 EXPRESSION_FIELD_REFERENCE>();
826 // If this is a reference to a field in an interface, return the
827 // Interface_field_reference_expression structure. Otherwise,
828 // return NULL.
829 Interface_field_reference_expression*
830 interface_field_reference_expression()
832 return this->convert<Interface_field_reference_expression,
833 EXPRESSION_INTERFACE_FIELD_REFERENCE>();
836 // If this is an allocation expression, return the Allocation_expression
837 // structure. Otherwise, return NULL.
838 Allocation_expression*
839 allocation_expression()
840 { return this->convert<Allocation_expression, EXPRESSION_ALLOCATION>(); }
842 // If this is a general composite literal, return the
843 // Composite_literal_expression structure. Otherwise, return NULL.
844 Composite_literal_expression*
845 complit()
847 return this->convert<Composite_literal_expression,
848 EXPRESSION_COMPOSITE_LITERAL>();
851 // If this is a struct composite literal, return the
852 // Struct_construction_expression structure. Otherwise, return NULL.
853 Struct_construction_expression*
854 struct_literal()
856 return this->convert<Struct_construction_expression,
857 EXPRESSION_STRUCT_CONSTRUCTION>();
860 // If this is a array composite literal, return the
861 // Array_construction_expression structure. Otherwise, return NULL.
862 Fixed_array_construction_expression*
863 array_literal()
865 return this->convert<Fixed_array_construction_expression,
866 EXPRESSION_FIXED_ARRAY_CONSTRUCTION>();
869 // If this is a slice composite literal, return the
870 // Slice_construction_expression structure. Otherwise, return NULL.
871 Slice_construction_expression*
872 slice_literal()
874 return this->convert<Slice_construction_expression,
875 EXPRESSION_SLICE_CONSTRUCTION>();
878 // If this is a map composite literal, return the
879 // Map_construction_expression structure. Otherwise, return NULL.
880 Map_construction_expression*
881 map_literal()
883 return this->convert<Map_construction_expression,
884 EXPRESSION_MAP_CONSTRUCTION>();
887 // If this is a type guard expression, return the
888 // Type_guard_expression structure. Otherwise, return NULL.
889 Type_guard_expression*
890 type_guard_expression()
891 { return this->convert<Type_guard_expression, EXPRESSION_TYPE_GUARD>(); }
893 // If this is a heap expression, returhn the Heap_expression structure.
894 // Otherwise, return NULL.
895 Heap_expression*
896 heap_expression()
897 { return this->convert<Heap_expression, EXPRESSION_HEAP>(); }
899 // If this is a receive expression, return the Receive_expression
900 // structure. Otherwise, return NULL.
901 Receive_expression*
902 receive_expression()
903 { return this->convert<Receive_expression, EXPRESSION_RECEIVE>(); }
905 // If this is a slice value expression, return the Slice_valiue_expression
906 // structure. Otherwise, return NULL.
907 Slice_value_expression*
908 slice_value_expression()
909 { return this->convert<Slice_value_expression, EXPRESSION_SLICE_VALUE>(); }
911 // If this is a conditional expression, return the Conditional_expression
912 // structure. Otherwise, return NULL.
913 Conditional_expression*
914 conditional_expression()
915 { return this->convert<Conditional_expression, EXPRESSION_CONDITIONAL>(); }
917 // If this is a compound expression, return the Compound_expression structure.
918 // Otherwise, return NULL.
919 Compound_expression*
920 compound_expression()
921 { return this->convert<Compound_expression, EXPRESSION_COMPOUND>(); }
923 // If this is a slice info expression, return the
924 // Slice_info_expression structure. Otherwise, return NULL.
925 Slice_info_expression*
926 slice_info_expression()
928 return this->convert<Slice_info_expression, EXPRESSION_SLICE_INFO>();
931 // Return true if this is a composite literal.
932 bool
933 is_composite_literal() const;
935 // Return true if this is a composite literal which is not constant.
936 bool
937 is_nonconstant_composite_literal() const;
939 // Return true if this is a variable or temporary variable.
940 bool
941 is_variable() const;
943 // Return true if this is a reference to a local variable.
944 bool
945 is_local_variable() const;
947 // Return true if multiple evaluations of this expression are OK.
948 // This is true for simple variable references and constants.
949 bool
950 is_multi_eval_safe();
952 // Return true if two expressions refer to the same variable or
953 // struct field.
954 static bool
955 is_same_variable(Expression*, Expression*);
957 // Make the builtin function descriptor type, so that it can be
958 // converted.
959 static void
960 make_func_descriptor_type();
962 // Traverse an expression.
963 static int
964 traverse(Expression**, Traverse*);
966 // Traverse subexpressions of this expression.
968 traverse_subexpressions(Traverse*);
970 // Lower an expression. This is called immediately after parsing.
971 // FUNCTION is the function we are in; it will be NULL for an
972 // expression initializing a global variable. INSERTER may be used
973 // to insert statements before the statement or initializer
974 // containing this expression; it is normally used to create
975 // temporary variables. IOTA_VALUE is the value that we should give
976 // to any iota expressions. This function must resolve expressions
977 // which could not be fully parsed into their final form. It
978 // returns the same Expression or a new one.
979 Expression*
980 lower(Gogo* gogo, Named_object* function, Statement_inserter* inserter,
981 int iota_value)
982 { return this->do_lower(gogo, function, inserter, iota_value); }
984 // Flatten an expression. This is called after order_evaluation.
985 // FUNCTION is the function we are in; it will be NULL for an
986 // expression initializing a global variable. INSERTER may be used
987 // to insert statements before the statement or initializer
988 // containing this expression; it is normally used to create
989 // temporary variables. This function must resolve expressions
990 // which could not be fully parsed into their final form. It
991 // returns the same Expression or a new one.
992 Expression*
993 flatten(Gogo* gogo, Named_object* function, Statement_inserter* inserter)
994 { return this->do_flatten(gogo, function, inserter); }
996 // Make implicit type conversions explicit.
997 void
998 add_conversions()
999 { this->do_add_conversions(); }
1001 // Determine the real type of an expression with abstract integer,
1002 // floating point, or complex type. TYPE_CONTEXT describes the
1003 // expected type.
1004 void
1005 determine_type(const Type_context*);
1007 // Check types in an expression.
1008 void
1009 check_types(Gogo* gogo)
1010 { this->do_check_types(gogo); }
1012 // Determine the type when there is no context.
1013 void
1014 determine_type_no_context();
1016 // Return the current type of the expression. This may be changed
1017 // by determine_type. This should not be called before the lowering
1018 // pass, unless the is_type_expression method returns true (i.e.,
1019 // this is an EXPRESSION_TYPE).
1020 Type*
1021 type()
1022 { return this->do_type(); }
1024 // Return a copy of an expression.
1025 Expression*
1026 copy()
1027 { return this->do_copy(); }
1029 // Return the cost of this statement for inlining purposes.
1031 inlining_cost() const
1032 { return this->do_inlining_cost(); }
1034 // Return whether the expression is addressable--something which may
1035 // be used as the operand of the unary & operator.
1036 bool
1037 is_addressable() const
1038 { return this->do_is_addressable(); }
1040 // Note that we are taking the address of this expression. ESCAPES
1041 // is true if this address escapes the current function.
1042 void
1043 address_taken(bool escapes)
1044 { this->do_address_taken(escapes); }
1046 // Note that a nil check must be issued for this expression.
1047 void
1048 issue_nil_check()
1049 { this->do_issue_nil_check(); }
1051 // Return whether this expression must be evaluated in order
1052 // according to the order of evaluation rules. This is basically
1053 // true of all expressions with side-effects.
1054 bool
1055 must_eval_in_order() const
1056 { return this->do_must_eval_in_order(); }
1058 // Return whether subexpressions of this expression must be
1059 // evaluated in order. This is true of index expressions and
1060 // pointer indirections. This sets *SKIP to the number of
1061 // subexpressions to skip during traversing, as index expressions
1062 // only requiring moving the index, not the array.
1063 bool
1064 must_eval_subexpressions_in_order(int* skip) const
1066 *skip = 0;
1067 return this->do_must_eval_subexpressions_in_order(skip);
1070 // Return the backend representation for this expression.
1071 Bexpression*
1072 get_backend(Translate_context*);
1074 // Return an expression handling any conversions which must be done during
1075 // assignment.
1076 static Expression*
1077 convert_for_assignment(Gogo*, Type* lhs_type, Expression* rhs,
1078 Location location);
1080 // Return an expression converting a value of one interface type to another
1081 // interface type. If FOR_TYPE_GUARD is true this is for a type
1082 // assertion.
1083 static Expression*
1084 convert_interface_to_interface(Type* lhs_type,
1085 Expression* rhs, bool for_type_guard,
1086 Location);
1088 // Return an expression for a conversion from a non-interface type to an
1089 // interface type. If ON_STACK is true, it can allocate the storage on
1090 // stack.
1091 static Expression*
1092 convert_type_to_interface(Type* lhs_type, Expression* rhs,
1093 bool on_stack, Location);
1095 // Return a backend expression implementing the comparison LEFT OP RIGHT.
1096 // TYPE is the type of both sides.
1097 static Bexpression*
1098 comparison(Translate_context*, Type* result_type, Operator op,
1099 Expression* left, Expression* right, Location);
1101 // Return the backend expression for the numeric constant VAL.
1102 static Bexpression*
1103 backend_numeric_constant_expression(Translate_context*,
1104 Numeric_constant* val);
1106 // Export the expression.
1107 void
1108 export_expression(Export_function_body* efb) const
1109 { this->do_export(efb); }
1111 // Import an expression. The location should be used for the
1112 // returned expression. Errors should be reported using the
1113 // Import's location method.
1114 static Expression*
1115 import_expression(Import_expression*, Location);
1117 // Insert bounds checks for an index expression.
1118 static void
1119 check_bounds(Expression* val, Operator, Expression* bound, Runtime::Function,
1120 Runtime::Function, Runtime::Function, Runtime::Function,
1121 Statement_inserter*, Location);
1123 // Return an expression for constructing a direct interface type from a
1124 // pointer.
1125 static Expression*
1126 pack_direct_iface(Type*, Expression*, Location);
1128 // Return an expression of the underlying pointer for a direct interface
1129 // type (the opposite of pack_direct_iface).
1130 static Expression*
1131 unpack_direct_iface(Expression*, Location);
1133 // Return an expression representing the type descriptor field of an
1134 // interface.
1135 static Expression*
1136 get_interface_type_descriptor(Expression*);
1138 // Look through the expression of a Slice_value_expression's valmem to
1139 // find an call to makeslice.
1140 static std::pair<Call_expression*, Temporary_statement*>
1141 find_makeslice_call(Expression*);
1143 // Dump an expression to a dump constext.
1144 void
1145 dump_expression(Ast_dump_context*) const;
1147 protected:
1148 // May be implemented by child class: traverse the expressions.
1149 virtual int
1150 do_traverse(Traverse*);
1152 // Return a lowered expression.
1153 virtual Expression*
1154 do_lower(Gogo*, Named_object*, Statement_inserter*, int)
1155 { return this; }
1157 // Return a flattened expression.
1158 virtual Expression*
1159 do_flatten(Gogo*, Named_object*, Statement_inserter*)
1160 { return this; }
1162 // Make implicit type conversions explicit.
1163 virtual void
1164 do_add_conversions()
1167 // Return whether this is a constant expression.
1168 virtual bool
1169 do_is_constant() const
1170 { return false; }
1172 // Return whether this is the zero value of its type.
1173 virtual bool
1174 do_is_zero_value() const
1175 { return false; }
1177 // Return whether this expression can be used as a constant
1178 // initializer.
1179 virtual bool
1180 do_is_static_initializer() const
1181 { return false; }
1183 // Return whether this is a constant expression of numeric type, and
1184 // set the Numeric_constant to the value.
1185 virtual bool
1186 do_numeric_constant_value(Numeric_constant*) const
1187 { return false; }
1189 // Return whether this is a constant expression of string type, and
1190 // set VAL to the value.
1191 virtual bool
1192 do_string_constant_value(std::string*) const
1193 { return false; }
1195 // Return whether this is a constant expression of boolean type, and
1196 // set VAL to the value.
1197 virtual bool
1198 do_boolean_constant_value(bool*) const
1199 { return false; }
1201 // Called by the parser if the value is being discarded.
1202 virtual bool
1203 do_discarding_value();
1205 // Child class holds type.
1206 virtual Type*
1207 do_type() = 0;
1209 // Child class implements determining type information.
1210 virtual void
1211 do_determine_type(const Type_context*) = 0;
1213 // Child class implements type checking if needed.
1214 virtual void
1215 do_check_types(Gogo*)
1218 // Child class implements copying.
1219 virtual Expression*
1220 do_copy() = 0;
1222 // Child class implements determining the cost of this statement for
1223 // inlining. The default cost is high, so we only need to define
1224 // this method for expressions that can be inlined.
1225 virtual int
1226 do_inlining_cost() const
1227 { return 0x100000; }
1229 // Child class implements whether the expression is addressable.
1230 virtual bool
1231 do_is_addressable() const
1232 { return false; }
1234 // Child class implements taking the address of an expression.
1235 virtual void
1236 do_address_taken(bool)
1239 // Child class implements issuing a nil check if the address is taken.
1240 virtual void
1241 do_issue_nil_check()
1244 // Child class implements whether this expression must be evaluated
1245 // in order.
1246 virtual bool
1247 do_must_eval_in_order() const
1248 { return false; }
1250 // Child class implements whether this expressions requires that
1251 // subexpressions be evaluated in order. The child implementation
1252 // may set *SKIP if it should be non-zero.
1253 virtual bool
1254 do_must_eval_subexpressions_in_order(int* /* skip */) const
1255 { return false; }
1257 // Child class implements conversion to backend representation.
1258 virtual Bexpression*
1259 do_get_backend(Translate_context*) = 0;
1261 // Child class implements export.
1262 virtual void
1263 do_export(Export_function_body*) const;
1265 // For children to call to give an error for an unused value.
1266 void
1267 unused_value_error();
1269 // For children to call when they detect that they are in error.
1270 void
1271 set_is_error();
1273 // For children to call to report an error conveniently.
1274 void
1275 report_error(const char*);
1277 // Write a name to export data.
1278 static void
1279 export_name(Export_function_body* efb, const Named_object*);
1281 // Child class implements dumping to a dump context.
1282 virtual void
1283 do_dump_expression(Ast_dump_context*) const = 0;
1285 // Start exporting a type conversion for a constant, if needed.
1286 static bool
1287 export_constant_type(Export_function_body*, Type*);
1289 // Finish exporting a type conversion for a constant.
1290 static void
1291 finish_export_constant_type(Export_function_body*, bool);
1293 // Varargs lowering creates a slice object (unnamed compiler temp)
1294 // to contain the variable length collection of values. The enum
1295 // below tells the lowering routine whether it can mark that temp
1296 // as non-escaping or not. For general varargs calls it is not always
1297 // safe to stack-allocated the storage, but for specific cases (ex:
1298 // call to append()) it is legal.
1299 enum Slice_storage_escape_disp
1301 SLICE_STORAGE_MAY_ESCAPE,
1302 SLICE_STORAGE_DOES_NOT_ESCAPE
1305 private:
1306 // Convert to the desired statement classification, or return NULL.
1307 // This is a controlled dynamic cast.
1308 template<typename Expression_class,
1309 Expression_classification expr_classification>
1310 Expression_class*
1311 convert()
1313 return (this->classification_ == expr_classification
1314 ? static_cast<Expression_class*>(this)
1315 : NULL);
1318 template<typename Expression_class,
1319 Expression_classification expr_classification>
1320 const Expression_class*
1321 convert() const
1323 return (this->classification_ == expr_classification
1324 ? static_cast<const Expression_class*>(this)
1325 : NULL);
1328 static Expression*
1329 convert_interface_to_type(Gogo*, Type*, Expression*, Location);
1331 static Expression*
1332 import_identifier(Import_function_body*, Location);
1334 static Expression*
1335 import_expression_without_suffix(Import_expression*, Location);
1337 // The expression classification.
1338 Expression_classification classification_;
1339 // The location in the input file.
1340 Location location_;
1343 // A list of Expressions.
1345 class Expression_list
1347 public:
1348 Expression_list()
1349 : entries_()
1352 // Return whether the list is empty.
1353 bool
1354 empty() const
1355 { return this->entries_.empty(); }
1357 // Return the number of entries in the list.
1358 size_t
1359 size() const
1360 { return this->entries_.size(); }
1362 // Add an entry to the end of the list.
1363 void
1364 push_back(Expression* expr)
1365 { this->entries_.push_back(expr); }
1367 void
1368 append(Expression_list* add)
1369 { this->entries_.insert(this->entries_.end(), add->begin(), add->end()); }
1371 // Reserve space in the list.
1372 void
1373 reserve(size_t size)
1374 { this->entries_.reserve(size); }
1376 // Traverse the expressions in the list.
1378 traverse(Traverse*);
1380 // Copy the list.
1381 Expression_list*
1382 copy();
1384 // Return true if the list contains an error expression.
1385 bool
1386 contains_error() const;
1388 // Retrieve an element by index.
1389 Expression*&
1390 at(size_t i)
1391 { return this->entries_.at(i); }
1393 // Return the first and last elements.
1394 Expression*&
1395 front()
1396 { return this->entries_.front(); }
1398 Expression*
1399 front() const
1400 { return this->entries_.front(); }
1402 Expression*&
1403 back()
1404 { return this->entries_.back(); }
1406 Expression*
1407 back() const
1408 { return this->entries_.back(); }
1410 // Iterators.
1412 typedef std::vector<Expression*>::iterator iterator;
1413 typedef std::vector<Expression*>::const_iterator const_iterator;
1415 iterator
1416 begin()
1417 { return this->entries_.begin(); }
1419 const_iterator
1420 begin() const
1421 { return this->entries_.begin(); }
1423 iterator
1424 end()
1425 { return this->entries_.end(); }
1427 const_iterator
1428 end() const
1429 { return this->entries_.end(); }
1431 // Erase an entry.
1432 void
1433 erase(iterator p)
1434 { this->entries_.erase(p); }
1436 private:
1437 std::vector<Expression*> entries_;
1440 // An abstract base class for an expression which is only used by the
1441 // parser, and is lowered in the lowering pass.
1443 class Parser_expression : public Expression
1445 public:
1446 Parser_expression(Expression_classification classification,
1447 Location location)
1448 : Expression(classification, location)
1451 protected:
1452 virtual Expression*
1453 do_lower(Gogo*, Named_object*, Statement_inserter*, int) = 0;
1455 Type*
1456 do_type();
1458 void
1459 do_determine_type(const Type_context*)
1460 { go_unreachable(); }
1462 void
1463 do_check_types(Gogo*)
1464 { go_unreachable(); }
1466 Bexpression*
1467 do_get_backend(Translate_context*)
1468 { go_unreachable(); }
1471 // A reference to a const in an expression.
1473 class Const_expression : public Expression
1475 public:
1476 Const_expression(Named_object* constant, Location location)
1477 : Expression(EXPRESSION_CONST_REFERENCE, location),
1478 constant_(constant), type_(NULL), seen_(false)
1481 Named_object*
1482 named_object()
1483 { return this->constant_; }
1485 const Named_object*
1486 named_object() const
1487 { return this->constant_; }
1489 // Check that the initializer does not refer to the constant itself.
1490 void
1491 check_for_init_loop();
1493 protected:
1495 do_traverse(Traverse*);
1497 Expression*
1498 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
1500 bool
1501 do_is_constant() const
1502 { return true; }
1504 bool
1505 do_is_zero_value() const;
1507 bool
1508 do_is_static_initializer() const
1509 { return true; }
1511 bool
1512 do_numeric_constant_value(Numeric_constant* nc) const;
1514 bool
1515 do_string_constant_value(std::string* val) const;
1517 bool
1518 do_boolean_constant_value(bool* val) const;
1520 Type*
1521 do_type();
1523 // The type of a const is set by the declaration, not the use.
1524 void
1525 do_determine_type(const Type_context*);
1527 void
1528 do_check_types(Gogo*);
1530 Expression*
1531 do_copy()
1532 { return this; }
1534 Bexpression*
1535 do_get_backend(Translate_context* context);
1538 do_inlining_cost() const
1539 { return 1; }
1541 // When exporting a reference to a const as part of a const
1542 // expression, we export the value. We ignore the fact that it has
1543 // a name.
1544 void
1545 do_export(Export_function_body* efb) const;
1547 void
1548 do_dump_expression(Ast_dump_context*) const;
1550 private:
1551 // The constant.
1552 Named_object* constant_;
1553 // The type of this reference. This is used if the constant has an
1554 // abstract type.
1555 Type* type_;
1556 // Used to prevent infinite recursion when a constant incorrectly
1557 // refers to itself.
1558 mutable bool seen_;
1561 // An expression which is simply a variable.
1563 class Var_expression : public Expression
1565 public:
1566 Var_expression(Named_object* variable, Location location)
1567 : Expression(EXPRESSION_VAR_REFERENCE, location),
1568 variable_(variable)
1571 // Return the variable.
1572 Named_object*
1573 named_object() const
1574 { return this->variable_; }
1576 protected:
1577 Expression*
1578 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
1580 Type*
1581 do_type();
1583 void
1584 do_determine_type(const Type_context*);
1586 Expression*
1587 do_copy()
1588 { return this; }
1591 do_inlining_cost() const
1592 { return 1; }
1594 void
1595 do_export(Export_function_body*) const;
1597 bool
1598 do_is_addressable() const
1599 { return true; }
1601 void
1602 do_address_taken(bool);
1604 Bexpression*
1605 do_get_backend(Translate_context*);
1607 void
1608 do_dump_expression(Ast_dump_context*) const;
1610 private:
1611 // The variable we are referencing.
1612 Named_object* variable_;
1615 // A reference to a variable within an enclosing function.
1617 class Enclosed_var_expression : public Expression
1619 public:
1620 Enclosed_var_expression(Expression* reference, Named_object* variable,
1621 Location location)
1622 : Expression(EXPRESSION_ENCLOSED_VAR_REFERENCE, location),
1623 reference_(reference), variable_(variable)
1626 // The reference to the enclosed variable. This will be an indirection of the
1627 // the field stored within closure variable.
1628 Expression*
1629 reference() const
1630 { return this->reference_; }
1632 // The variable being enclosed and referenced.
1633 Named_object*
1634 variable() const
1635 { return this->variable_; }
1637 protected:
1639 do_traverse(Traverse*);
1641 Expression*
1642 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
1644 Expression*
1645 do_flatten(Gogo*, Named_object*, Statement_inserter*);
1647 Type*
1648 do_type()
1649 { return this->reference_->type(); }
1651 void
1652 do_determine_type(const Type_context* context)
1653 { return this->reference_->determine_type(context); }
1655 Expression*
1656 do_copy()
1657 { return this; }
1659 bool
1660 do_is_addressable() const
1661 { return this->reference_->is_addressable(); }
1663 void
1664 do_address_taken(bool escapes);
1666 Bexpression*
1667 do_get_backend(Translate_context* context)
1668 { return this->reference_->get_backend(context); }
1670 void
1671 do_dump_expression(Ast_dump_context*) const;
1673 private:
1674 // The reference to the enclosed variable.
1675 Expression* reference_;
1676 // The variable being enclosed.
1677 Named_object* variable_;
1680 // A reference to a temporary variable.
1682 class Temporary_reference_expression : public Expression
1684 public:
1685 Temporary_reference_expression(Temporary_statement* statement,
1686 Location location)
1687 : Expression(EXPRESSION_TEMPORARY_REFERENCE, location),
1688 statement_(statement), is_lvalue_(false)
1691 // The temporary that this expression refers to.
1692 Temporary_statement*
1693 statement() const
1694 { return this->statement_; }
1696 // Indicate that this reference appears on the left hand side of an
1697 // assignment statement.
1698 void
1699 set_is_lvalue()
1700 { this->is_lvalue_ = true; }
1702 static Expression*
1703 do_import(Import_function_body*, Location);
1705 protected:
1706 Type*
1707 do_type();
1709 void
1710 do_determine_type(const Type_context*)
1713 Expression*
1714 do_copy()
1715 { return make_temporary_reference(this->statement_, this->location()); }
1718 do_inlining_cost() const
1719 { return 1; }
1721 void
1722 do_export(Export_function_body*) const;
1724 bool
1725 do_is_addressable() const
1726 { return true; }
1728 void
1729 do_address_taken(bool);
1731 Bexpression*
1732 do_get_backend(Translate_context*);
1734 void
1735 do_dump_expression(Ast_dump_context*) const;
1737 private:
1738 // The statement where the temporary variable is defined.
1739 Temporary_statement* statement_;
1740 // Whether this reference appears on the left hand side of an
1741 // assignment statement.
1742 bool is_lvalue_;
1745 // Set and use a temporary variable.
1747 class Set_and_use_temporary_expression : public Expression
1749 public:
1750 Set_and_use_temporary_expression(Temporary_statement* statement,
1751 Expression* expr, Location location)
1752 : Expression(EXPRESSION_SET_AND_USE_TEMPORARY, location),
1753 statement_(statement), expr_(expr)
1756 // Return the temporary.
1757 Temporary_statement*
1758 temporary() const
1759 { return this->statement_; }
1761 // Return the expression.
1762 Expression*
1763 expression() const
1764 { return this->expr_; }
1766 protected:
1768 do_traverse(Traverse* traverse)
1769 { return Expression::traverse(&this->expr_, traverse); }
1771 Type*
1772 do_type();
1774 void
1775 do_determine_type(const Type_context*);
1777 Expression*
1778 do_copy()
1780 return make_set_and_use_temporary(this->statement_, this->expr_,
1781 this->location());
1784 bool
1785 do_must_eval_in_order() const
1786 { return true; }
1788 bool
1789 do_is_addressable() const
1790 { return true; }
1792 void
1793 do_address_taken(bool);
1795 Bexpression*
1796 do_get_backend(Translate_context*);
1798 void
1799 do_dump_expression(Ast_dump_context*) const;
1801 private:
1802 // The statement where the temporary variable is defined.
1803 Temporary_statement* statement_;
1804 // The expression to assign to the temporary.
1805 Expression* expr_;
1808 // A string expression.
1810 class String_expression : public Expression
1812 public:
1813 String_expression(const std::string& val, Type* type, Location location)
1814 : Expression(EXPRESSION_STRING, location),
1815 val_(val), type_(type)
1818 const std::string&
1819 val() const
1820 { return this->val_; }
1822 static Expression*
1823 do_import(Import_expression*, Location);
1825 protected:
1827 do_traverse(Traverse*);
1829 bool
1830 do_is_constant() const
1831 { return true; }
1833 bool
1834 do_is_zero_value() const
1835 { return this->val_ == ""; }
1837 bool
1838 do_is_static_initializer() const
1839 { return true; }
1841 bool
1842 do_string_constant_value(std::string* val) const
1844 *val = this->val_;
1845 return true;
1848 Type*
1849 do_type();
1851 void
1852 do_determine_type(const Type_context*);
1854 Expression*
1855 do_copy()
1856 { return this; }
1858 Bexpression*
1859 do_get_backend(Translate_context*);
1861 // Write string literal to a string dump.
1862 static void
1863 export_string(String_dump* exp, const String_expression* str);
1865 // Set the inlining cost a bit high since inlining may cause
1866 // duplicated string literals.
1868 do_inlining_cost() const
1869 { return 5; }
1871 void
1872 do_export(Export_function_body*) const;
1874 void
1875 do_dump_expression(Ast_dump_context*) const;
1877 private:
1878 // The string value. This is immutable.
1879 const std::string val_;
1880 // The type as determined by context.
1881 Type* type_;
1884 // A type conversion expression.
1886 class Type_conversion_expression : public Expression
1888 public:
1889 Type_conversion_expression(Type* type, Expression* expr,
1890 Location location)
1891 : Expression(EXPRESSION_CONVERSION, location),
1892 type_(type), expr_(expr), may_convert_function_types_(false),
1893 no_copy_(false), no_escape_(false)
1896 // Return the type to which we are converting.
1897 Type*
1898 type() const
1899 { return this->type_; }
1901 // Return the expression which we are converting.
1902 Expression*
1903 expr() const
1904 { return this->expr_; }
1906 // Permit converting from one function type to another. This is
1907 // used internally for method expressions.
1908 void
1909 set_may_convert_function_types()
1911 this->may_convert_function_types_ = true;
1914 // Mark string([]byte) conversion to reuse the backing store
1915 // without copying.
1916 void
1917 set_no_copy(bool b)
1918 { this->no_copy_ = b; };
1920 // Import a type conversion expression.
1921 static Expression*
1922 do_import(Import_expression*, Location);
1924 protected:
1926 do_traverse(Traverse* traverse);
1928 Expression*
1929 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
1931 Expression*
1932 do_flatten(Gogo*, Named_object*, Statement_inserter*);
1934 bool
1935 do_is_constant() const;
1937 bool
1938 do_is_zero_value() const;
1940 bool
1941 do_is_static_initializer() const;
1943 bool
1944 do_numeric_constant_value(Numeric_constant*) const;
1946 bool
1947 do_string_constant_value(std::string*) const;
1949 bool
1950 do_boolean_constant_value(bool*) const;
1952 Type*
1953 do_type()
1954 { return this->type_; }
1956 void
1957 do_determine_type(const Type_context*);
1959 void
1960 do_check_types(Gogo*);
1962 Expression*
1963 do_copy();
1965 Bexpression*
1966 do_get_backend(Translate_context* context);
1969 do_inlining_cost() const;
1971 void
1972 do_export(Export_function_body*) const;
1974 void
1975 do_dump_expression(Ast_dump_context*) const;
1977 private:
1978 // The type to convert to.
1979 Type* type_;
1980 // The expression to convert.
1981 Expression* expr_;
1982 // True if this is permitted to convert function types. This is
1983 // used internally for method expressions.
1984 bool may_convert_function_types_;
1985 // True if a string([]byte) conversion can reuse the backing store
1986 // without copying. Only used in string([]byte) conversion.
1987 bool no_copy_;
1988 // True if a conversion does not escape. Used in type-to-interface
1989 // conversions and slice-to/from-string conversions.
1990 bool no_escape_;
1993 // An unsafe type conversion, used to pass values to builtin functions.
1995 class Unsafe_type_conversion_expression : public Expression
1997 public:
1998 Unsafe_type_conversion_expression(Type* type, Expression* expr,
1999 Location location)
2000 : Expression(EXPRESSION_UNSAFE_CONVERSION, location),
2001 type_(type), expr_(expr)
2004 Expression*
2005 expr() const
2006 { return this->expr_; }
2008 protected:
2010 do_traverse(Traverse* traverse);
2012 bool
2013 do_is_zero_value() const
2014 { return this->expr_->is_zero_value(); }
2016 bool
2017 do_is_static_initializer() const;
2019 Type*
2020 do_type()
2021 { return this->type_; }
2023 void
2024 do_determine_type(const Type_context*)
2025 { this->expr_->determine_type_no_context(); }
2027 Expression*
2028 do_copy();
2030 Bexpression*
2031 do_get_backend(Translate_context*);
2033 void
2034 do_dump_expression(Ast_dump_context*) const;
2036 private:
2037 // The type to convert to.
2038 Type* type_;
2039 // The expression to convert.
2040 Expression* expr_;
2043 // A Unary expression.
2045 class Unary_expression : public Expression
2047 public:
2048 Unary_expression(Operator op, Expression* expr, Location location)
2049 : Expression(EXPRESSION_UNARY, location),
2050 op_(op), escapes_(true), create_temp_(false), is_gc_root_(false),
2051 is_slice_init_(false), expr_(expr),
2052 issue_nil_check_(NIL_CHECK_DEFAULT)
2055 // Return the operator.
2056 Operator
2057 op() const
2058 { return this->op_; }
2060 // Return the operand.
2061 Expression*
2062 operand() const
2063 { return this->expr_; }
2065 // Record that an address expression does not escape.
2066 void
2067 set_does_not_escape()
2069 go_assert(this->op_ == OPERATOR_AND);
2070 this->escapes_ = false;
2073 // Record that this is an address expression which should create a
2074 // temporary variable if necessary. This is used for method calls.
2075 void
2076 set_create_temp()
2078 go_assert(this->op_ == OPERATOR_AND);
2079 this->create_temp_ = true;
2082 // Record that this is an address expression of a GC root, which is a
2083 // mutable composite literal. This used for registering GC variables.
2084 void
2085 set_is_gc_root()
2087 go_assert(this->op_ == OPERATOR_AND);
2088 this->is_gc_root_ = true;
2091 // Record that this is an address expression of a slice value initializer,
2092 // which is mutable if the values are not copied to the heap.
2093 void
2094 set_is_slice_init()
2096 go_assert(this->op_ == OPERATOR_AND);
2097 this->is_slice_init_ = true;
2100 // Call the address_taken method on the operand if necessary.
2101 void
2102 check_operand_address_taken(Gogo*);
2104 // Apply unary opcode OP to UNC, setting NC. Return true if this
2105 // could be done, false if not. On overflow, issues an error and
2106 // sets *ISSUED_ERROR.
2107 static bool
2108 eval_constant(Operator op, const Numeric_constant* unc,
2109 Location, Numeric_constant* nc, bool *issued_error);
2111 static Expression*
2112 do_import(Import_expression*, Location);
2114 // Declare that this deref does or does not require an explicit nil check.
2115 void
2116 set_requires_nil_check(bool needed)
2118 go_assert(this->op_ == OPERATOR_MULT);
2119 if (needed)
2120 this->issue_nil_check_ = NIL_CHECK_NEEDED;
2121 else
2122 this->issue_nil_check_ = NIL_CHECK_NOT_NEEDED;
2125 protected:
2127 do_traverse(Traverse* traverse)
2128 { return Expression::traverse(&this->expr_, traverse); }
2130 Expression*
2131 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
2133 Expression*
2134 do_flatten(Gogo*, Named_object*, Statement_inserter*);
2136 bool
2137 do_is_constant() const;
2139 bool
2140 do_is_static_initializer() const;
2142 bool
2143 do_numeric_constant_value(Numeric_constant*) const;
2145 bool
2146 do_boolean_constant_value(bool*) const;
2148 Type*
2149 do_type();
2151 void
2152 do_determine_type(const Type_context*);
2154 void
2155 do_check_types(Gogo*);
2157 Expression*
2158 do_copy()
2160 return Expression::make_unary(this->op_, this->expr_->copy(),
2161 this->location());
2164 bool
2165 do_must_eval_subexpressions_in_order(int*) const
2166 { return this->op_ == OPERATOR_MULT; }
2168 bool
2169 do_is_addressable() const
2170 { return this->op_ == OPERATOR_MULT; }
2172 Bexpression*
2173 do_get_backend(Translate_context*);
2176 do_inlining_cost() const
2177 { return 1; }
2179 void
2180 do_export(Export_function_body*) const;
2182 void
2183 do_dump_expression(Ast_dump_context*) const;
2185 void
2186 do_issue_nil_check()
2188 if (this->op_ == OPERATOR_MULT)
2189 this->set_requires_nil_check(true);
2192 private:
2193 static bool
2194 base_is_static_initializer(Expression*);
2196 // Return a determination as to whether this dereference expression
2197 // requires a nil check.
2198 Nil_check_classification
2199 requires_nil_check(Gogo*);
2201 // The unary operator to apply.
2202 Operator op_;
2203 // Normally true. False if this is an address expression which does
2204 // not escape the current function.
2205 bool escapes_;
2206 // True if this is an address expression which should create a
2207 // temporary variable if necessary.
2208 bool create_temp_;
2209 // True if this is an address expression for a GC root. A GC root is a
2210 // special struct composite literal that is mutable when addressed, meaning
2211 // it cannot be represented as an immutable_struct in the backend.
2212 bool is_gc_root_;
2213 // True if this is an address expression for a slice value with an immutable
2214 // initializer. The initializer for a slice's value pointer has an array
2215 // type, meaning it cannot be represented as an immutable_struct in the
2216 // backend.
2217 bool is_slice_init_;
2218 // The operand.
2219 Expression* expr_;
2220 // Whether or not to issue a nil check for this expression if its address
2221 // is being taken.
2222 Nil_check_classification issue_nil_check_;
2225 // A binary expression.
2227 class Binary_expression : public Expression
2229 public:
2230 Binary_expression(Operator op, Expression* left, Expression* right,
2231 Location location)
2232 : Expression(EXPRESSION_BINARY, location),
2233 op_(op), left_(left), right_(right), type_(NULL)
2236 // Return the operator.
2237 Operator
2238 op()
2239 { return this->op_; }
2241 // Return the left hand expression.
2242 Expression*
2243 left()
2244 { return this->left_; }
2246 // Return the right hand expression.
2247 Expression*
2248 right()
2249 { return this->right_; }
2251 // Apply binary opcode OP to LEFT_NC and RIGHT_NC, setting NC.
2252 // Return true if this could be done, false if not. Issue errors at
2253 // LOCATION as appropriate, and sets *ISSUED_ERROR if it did.
2254 static bool
2255 eval_constant(Operator op, Numeric_constant* left_nc,
2256 Numeric_constant* right_nc, Location location,
2257 Numeric_constant* nc, bool* issued_error);
2259 // Compare constants LEFT_NC and RIGHT_NC according to OP, setting
2260 // *RESULT. Return true if this could be done, false if not. Issue
2261 // errors at LOCATION as appropriate.
2262 static bool
2263 compare_constant(Operator op, Numeric_constant* left_nc,
2264 Numeric_constant* right_nc, Location location,
2265 bool* result);
2267 static Expression*
2268 do_import(Import_expression*, Location);
2270 // Report an error if OP can not be applied to TYPE. Return whether
2271 // it can. OTYPE is the type of the other operand.
2272 static bool
2273 check_operator_type(Operator op, Type* type, Type* otype, Location);
2275 // Set *RESULT_TYPE to the resulting type when OP is applied to
2276 // operands of type LEFT_TYPE and RIGHT_TYPE. Return true on
2277 // success, false on failure.
2278 static bool
2279 operation_type(Operator op, Type* left_type, Type* right_type,
2280 Type** result_type);
2282 protected:
2284 do_traverse(Traverse* traverse);
2286 Expression*
2287 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
2289 Expression*
2290 do_flatten(Gogo*, Named_object*, Statement_inserter*);
2292 bool
2293 do_is_constant() const
2294 { return this->left_->is_constant() && this->right_->is_constant(); }
2296 bool
2297 do_is_static_initializer() const;
2299 bool
2300 do_numeric_constant_value(Numeric_constant*) const;
2302 bool
2303 do_boolean_constant_value(bool*) const;
2305 bool
2306 do_discarding_value();
2308 Type*
2309 do_type();
2311 void
2312 do_determine_type(const Type_context*);
2314 void
2315 do_check_types(Gogo*);
2317 Expression*
2318 do_copy()
2320 return Expression::make_binary(this->op_, this->left_->copy(),
2321 this->right_->copy(), this->location());
2324 Bexpression*
2325 do_get_backend(Translate_context*);
2328 do_inlining_cost() const
2329 { return 1; }
2331 void
2332 do_export(Export_function_body*) const;
2334 void
2335 do_dump_expression(Ast_dump_context*) const;
2337 private:
2338 static bool
2339 cmp_to_bool(Operator op, int cmp);
2341 static bool
2342 eval_integer(Operator op, const Numeric_constant*, const Numeric_constant*,
2343 Location, Numeric_constant*);
2345 static bool
2346 eval_float(Operator op, const Numeric_constant*, const Numeric_constant*,
2347 Location, Numeric_constant*);
2349 static bool
2350 eval_complex(Operator op, const Numeric_constant*, const Numeric_constant*,
2351 Location, Numeric_constant*);
2353 static bool
2354 compare_integer(const Numeric_constant*, const Numeric_constant*, int*);
2356 static bool
2357 compare_float(const Numeric_constant*, const Numeric_constant *, int*);
2359 static bool
2360 compare_complex(const Numeric_constant*, const Numeric_constant*, int*);
2362 Expression*
2363 lower_struct_comparison(Gogo*, Statement_inserter*);
2365 Expression*
2366 lower_array_comparison(Gogo*, Statement_inserter*);
2368 Expression*
2369 lower_interface_value_comparison(Gogo*, Statement_inserter*);
2371 Expression*
2372 lower_compare_to_memcmp(Gogo*, Statement_inserter*);
2374 Expression*
2375 operand_address(Statement_inserter*, Expression*);
2377 // The binary operator to apply.
2378 Operator op_;
2379 // The left hand side operand.
2380 Expression* left_;
2381 // The right hand side operand.
2382 Expression* right_;
2383 // The type of a comparison operation.
2384 Type* type_;
2387 // A string concatenation expression. This is a sequence of strings
2388 // added together. It is created when lowering Binary_expression.
2390 class String_concat_expression : public Expression
2392 public:
2393 String_concat_expression(Expression_list* exprs)
2394 : Expression(EXPRESSION_STRING_CONCAT, exprs->front()->location()),
2395 exprs_(exprs)
2398 // Return the list of string expressions to be concatenated.
2399 Expression_list*
2400 exprs()
2401 { return this->exprs_; }
2403 protected:
2405 do_traverse(Traverse* traverse)
2406 { return this->exprs_->traverse(traverse); }
2408 Expression*
2409 do_lower(Gogo*, Named_object*, Statement_inserter*, int)
2410 { return this; }
2412 Expression*
2413 do_flatten(Gogo*, Named_object*, Statement_inserter*);
2415 bool
2416 do_is_constant() const;
2418 bool
2419 do_is_zero_value() const;
2421 bool
2422 do_is_static_initializer() const;
2424 Type*
2425 do_type();
2427 void
2428 do_determine_type(const Type_context*);
2430 void
2431 do_check_types(Gogo*);
2433 Expression*
2434 do_copy()
2435 { return Expression::make_string_concat(this->exprs_->copy()); }
2437 Bexpression*
2438 do_get_backend(Translate_context*)
2439 { go_unreachable(); }
2441 void
2442 do_export(Export_function_body*) const
2443 { go_unreachable(); }
2445 void
2446 do_dump_expression(Ast_dump_context*) const;
2448 private:
2449 // The string expressions to concatenate.
2450 Expression_list* exprs_;
2453 // A call expression. The go statement needs to dig inside this.
2455 class Call_expression : public Expression
2457 public:
2458 Call_expression(Expression* fn, Expression_list* args, bool is_varargs,
2459 Location location)
2460 : Expression(EXPRESSION_CALL, location),
2461 fn_(fn), args_(args), type_(NULL), call_(NULL), call_temp_(NULL)
2462 , expected_result_count_(0), is_varargs_(is_varargs),
2463 varargs_are_lowered_(false), types_are_determined_(false),
2464 is_deferred_(false), is_concurrent_(false), is_equal_function_(false),
2465 issued_error_(false), is_multi_value_arg_(false), is_flattened_(false)
2468 // The function to call.
2469 Expression*
2470 fn() const
2471 { return this->fn_; }
2473 // The arguments.
2474 Expression_list*
2475 args()
2476 { return this->args_; }
2478 const Expression_list*
2479 args() const
2480 { return this->args_; }
2482 // Get the function type.
2483 Function_type*
2484 get_function_type() const;
2486 // Return the number of values this call will return.
2487 size_t
2488 result_count() const;
2490 // Return the temporary variable that holds the results. This is
2491 // only valid after the expression has been lowered, and is only
2492 // valid for calls which return multiple results.
2493 Temporary_statement*
2494 results() const;
2496 // Set the number of results expected from this call. This is used
2497 // when the call appears in a context that expects multiple results,
2498 // such as a, b = f().
2499 void
2500 set_expected_result_count(size_t);
2502 // Return whether this is a call to the predeclared function
2503 // recover.
2504 bool
2505 is_recover_call() const;
2507 // Set the argument for a call to recover.
2508 void
2509 set_recover_arg(Expression*);
2511 // Whether the last argument is a varargs argument (f(a...)).
2512 bool
2513 is_varargs() const
2514 { return this->is_varargs_; }
2516 // Return whether varargs have already been lowered.
2517 bool
2518 varargs_are_lowered() const
2519 { return this->varargs_are_lowered_; }
2521 // Note that varargs have already been lowered.
2522 void
2523 set_varargs_are_lowered()
2524 { this->varargs_are_lowered_ = true; }
2526 // Whether this call is being deferred.
2527 bool
2528 is_deferred() const
2529 { return this->is_deferred_; }
2531 // Note that the call is being deferred.
2532 void
2533 set_is_deferred()
2534 { this->is_deferred_ = true; }
2536 // Whether this call is concurrently executed.
2537 bool
2538 is_concurrent() const
2539 { return this->is_concurrent_; }
2541 // Note that the call is concurrently executed.
2542 void
2543 set_is_concurrent()
2544 { this->is_concurrent_ = true; }
2546 // Note that this is a call to a generated equality function.
2547 void
2548 set_is_equal_function()
2549 { this->is_equal_function_ = true; }
2551 // We have found an error with this call expression; return true if
2552 // we should report it.
2553 bool
2554 issue_error();
2556 // Whether or not this call contains errors, either in the call or the
2557 // arguments to the call.
2558 bool
2559 is_erroneous_call();
2561 // Whether this call returns multiple results that are used as an
2562 // multi-valued argument.
2563 bool
2564 is_multi_value_arg() const
2565 { return this->is_multi_value_arg_; }
2567 // Note this call is used as a multi-valued argument.
2568 void
2569 set_is_multi_value_arg()
2570 { this->is_multi_value_arg_ = true; }
2572 // Whether this is a call to builtin function.
2573 virtual bool
2574 is_builtin() const
2575 { return false; }
2577 // Convert to a Builtin_call_expression, or return NULL.
2578 inline Builtin_call_expression*
2579 builtin_call_expression();
2581 inline const Builtin_call_expression*
2582 builtin_call_expression() const;
2584 protected:
2586 do_traverse(Traverse*);
2588 virtual Expression*
2589 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
2591 virtual Expression*
2592 do_flatten(Gogo*, Named_object*, Statement_inserter*);
2594 bool
2595 do_discarding_value()
2596 { return true; }
2598 virtual Type*
2599 do_type();
2601 virtual void
2602 do_determine_type(const Type_context*);
2604 virtual void
2605 do_check_types(Gogo*);
2607 Expression*
2608 do_copy();
2610 bool
2611 do_must_eval_in_order() const;
2613 virtual Bexpression*
2614 do_get_backend(Translate_context*);
2617 do_inlining_cost() const;
2619 void
2620 do_export(Export_function_body*) const;
2622 virtual bool
2623 do_is_recover_call() const;
2625 virtual void
2626 do_set_recover_arg(Expression*);
2628 // Let a builtin expression change the argument list.
2629 void
2630 set_args(Expression_list* args)
2631 { this->args_ = args; }
2633 // Let a builtin expression lower varargs.
2634 void
2635 lower_varargs(Gogo*, Named_object* function, Statement_inserter* inserter,
2636 Type* varargs_type, size_t param_count,
2637 Slice_storage_escape_disp escape_disp);
2639 // Let a builtin expression check whether types have been
2640 // determined.
2641 bool
2642 determining_types();
2644 void
2645 export_arguments(Export_function_body*) const;
2647 void
2648 do_dump_expression(Ast_dump_context*) const;
2650 void
2651 do_add_conversions();
2653 private:
2654 bool
2655 check_argument_type(int, const Type*, const Type*, Location, bool);
2657 Expression*
2658 intrinsify(Gogo*, Statement_inserter*);
2660 Expression*
2661 interface_method_function(Interface_field_reference_expression*,
2662 Expression**, Location);
2664 Bexpression*
2665 set_results(Translate_context*);
2667 // The function to call.
2668 Expression* fn_;
2669 // The arguments to pass. This may be NULL if there are no
2670 // arguments.
2671 Expression_list* args_;
2672 // The type of the expression, to avoid recomputing it.
2673 Type* type_;
2674 // The backend expression for the call, used for a call which returns a tuple.
2675 Bexpression* call_;
2676 // A temporary variable to store this call if the function returns a tuple.
2677 Temporary_statement* call_temp_;
2678 // If not 0, the number of results expected from this call, when
2679 // used in a context that expects multiple values.
2680 size_t expected_result_count_;
2681 // True if the last argument is a varargs argument (f(a...)).
2682 bool is_varargs_;
2683 // True if varargs have already been lowered.
2684 bool varargs_are_lowered_;
2685 // True if types have been determined.
2686 bool types_are_determined_;
2687 // True if the call is an argument to a defer statement.
2688 bool is_deferred_;
2689 // True if the call is an argument to a go statement.
2690 bool is_concurrent_;
2691 // True if this is a call to a generated equality function.
2692 bool is_equal_function_;
2693 // True if we reported an error about a mismatch between call
2694 // results and uses. This is to avoid producing multiple errors
2695 // when there are multiple Call_result_expressions.
2696 bool issued_error_;
2697 // True if this call is used as an argument that returns multiple results.
2698 bool is_multi_value_arg_;
2699 // True if this expression has already been flattened.
2700 bool is_flattened_;
2703 // A call expression to a builtin function.
2705 class Builtin_call_expression : public Call_expression
2707 public:
2708 Builtin_call_expression(Gogo* gogo, Expression* fn, Expression_list* args,
2709 bool is_varargs, Location location);
2711 // The builtin functions.
2712 enum Builtin_function_code
2714 BUILTIN_INVALID,
2716 // Predeclared builtin functions.
2717 BUILTIN_APPEND,
2718 BUILTIN_CAP,
2719 BUILTIN_CLOSE,
2720 BUILTIN_COMPLEX,
2721 BUILTIN_COPY,
2722 BUILTIN_DELETE,
2723 BUILTIN_IMAG,
2724 BUILTIN_LEN,
2725 BUILTIN_MAKE,
2726 BUILTIN_NEW,
2727 BUILTIN_PANIC,
2728 BUILTIN_PRINT,
2729 BUILTIN_PRINTLN,
2730 BUILTIN_REAL,
2731 BUILTIN_RECOVER,
2733 // Builtin functions from the unsafe package.
2734 BUILTIN_ADD,
2735 BUILTIN_ALIGNOF,
2736 BUILTIN_OFFSETOF,
2737 BUILTIN_SIZEOF,
2738 BUILTIN_SLICE
2741 Builtin_function_code
2742 code() const
2743 { return this->code_; }
2745 // This overrides Call_expression::is_builtin.
2746 bool
2747 is_builtin() const
2748 { return true; }
2750 // Return whether EXPR, of array type, is a constant if passed to
2751 // len or cap.
2752 static bool
2753 array_len_is_constant(Expression* expr);
2755 Expression*
2756 flatten_append(Gogo*, Named_object*, Statement_inserter*, Expression*,
2757 Block*);
2759 protected:
2760 // This overrides Call_expression::do_lower.
2761 Expression*
2762 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
2764 Expression*
2765 do_flatten(Gogo*, Named_object*, Statement_inserter*);
2767 bool
2768 do_is_constant() const;
2770 bool
2771 do_numeric_constant_value(Numeric_constant*) const;
2773 bool
2774 do_discarding_value();
2776 Type*
2777 do_type();
2779 void
2780 do_determine_type(const Type_context*);
2782 void
2783 do_check_types(Gogo*);
2785 Expression*
2786 do_copy();
2788 Bexpression*
2789 do_get_backend(Translate_context*);
2792 do_inlining_cost() const
2793 { return 1; }
2795 void
2796 do_export(Export_function_body*) const;
2798 virtual bool
2799 do_is_recover_call() const;
2801 virtual void
2802 do_set_recover_arg(Expression*);
2804 private:
2805 Expression*
2806 one_arg() const;
2808 bool
2809 check_one_arg();
2811 static Type*
2812 real_imag_type(Type*);
2814 static Type*
2815 complex_type(Type*);
2817 Expression*
2818 lower_make(Statement_inserter*);
2820 bool
2821 check_int_value(Expression*, bool is_length, bool* small);
2823 // A pointer back to the general IR structure. This avoids a global
2824 // variable, or passing it around everywhere.
2825 Gogo* gogo_;
2826 // The builtin function being called.
2827 Builtin_function_code code_;
2828 // Used to stop endless loops when the length of an array uses len
2829 // or cap of the array itself.
2830 mutable bool seen_;
2831 // Whether the argument is set for calls to BUILTIN_RECOVER.
2832 bool recover_arg_is_set_;
2835 inline Builtin_call_expression*
2836 Call_expression::builtin_call_expression()
2838 return (this->is_builtin()
2839 ? static_cast<Builtin_call_expression*>(this)
2840 : NULL);
2843 inline const Builtin_call_expression*
2844 Call_expression::builtin_call_expression() const
2846 return (this->is_builtin()
2847 ? static_cast<const Builtin_call_expression*>(this)
2848 : NULL);
2851 // A single result from a call which returns multiple results.
2853 class Call_result_expression : public Expression
2855 public:
2856 Call_result_expression(Call_expression* call, unsigned int index)
2857 : Expression(EXPRESSION_CALL_RESULT, call->location()),
2858 call_(call), index_(index)
2861 Expression*
2862 call() const
2863 { return this->call_; }
2865 unsigned int
2866 index() const
2867 { return this->index_; }
2869 protected:
2871 do_traverse(Traverse*);
2873 Type*
2874 do_type();
2876 void
2877 do_determine_type(const Type_context*);
2879 void
2880 do_check_types(Gogo*);
2882 Expression*
2883 do_copy()
2885 return new Call_result_expression(this->call_->call_expression(),
2886 this->index_);
2889 bool
2890 do_must_eval_in_order() const
2891 { return true; }
2893 Bexpression*
2894 do_get_backend(Translate_context*);
2896 void
2897 do_dump_expression(Ast_dump_context*) const;
2899 private:
2900 // The underlying call expression.
2901 Expression* call_;
2902 // Which result we want.
2903 unsigned int index_;
2906 // An expression which represents a pointer to a function.
2908 class Func_expression : public Expression
2910 public:
2911 Func_expression(Named_object* function, Expression* closure,
2912 Location location)
2913 : Expression(EXPRESSION_FUNC_REFERENCE, location),
2914 function_(function), closure_(closure),
2915 runtime_code_(Runtime::NUMBER_OF_FUNCTIONS)
2918 // Return the object associated with the function.
2919 Named_object*
2920 named_object() const
2921 { return this->function_; }
2923 // Return the closure for this function. This will return NULL if
2924 // the function has no closure, which is the normal case.
2925 Expression*
2926 closure()
2927 { return this->closure_; }
2929 // Return whether this is a reference to a runtime function.
2930 bool
2931 is_runtime_function() const
2932 { return this->runtime_code_ != Runtime::NUMBER_OF_FUNCTIONS; }
2934 // Return the runtime code for this function expression.
2935 // Returns Runtime::NUMBER_OF_FUNCTIONS if this is not a reference to a
2936 // runtime function.
2937 Runtime::Function
2938 runtime_code() const
2939 { return this->runtime_code_; }
2941 // Set the runtime code for this function expression.
2942 void
2943 set_runtime_code(Runtime::Function code)
2944 { this->runtime_code_ = code; }
2946 // Return a backend expression for the code of a function.
2947 static Bexpression*
2948 get_code_pointer(Gogo*, Named_object* function, Location loc);
2950 protected:
2952 do_traverse(Traverse*);
2954 Type*
2955 do_type();
2957 void
2958 do_determine_type(const Type_context*)
2960 if (this->closure_ != NULL)
2961 this->closure_->determine_type_no_context();
2964 Expression*
2965 do_copy()
2967 return Expression::make_func_reference(this->function_,
2968 (this->closure_ == NULL
2969 ? NULL
2970 : this->closure_->copy()),
2971 this->location());
2974 Bexpression*
2975 do_get_backend(Translate_context*);
2978 do_inlining_cost() const;
2980 void
2981 do_export(Export_function_body*) const;
2983 void
2984 do_dump_expression(Ast_dump_context*) const;
2986 private:
2987 // The function itself.
2988 Named_object* function_;
2989 // A closure. This is normally NULL. For a nested function, it may
2990 // be a struct holding pointers to all the variables referenced by
2991 // this function and defined in enclosing functions.
2992 Expression* closure_;
2993 // The runtime code for the referenced function.
2994 Runtime::Function runtime_code_;
2997 // A function descriptor. A function descriptor is a struct with a
2998 // single field pointing to the function code. This is used for
2999 // functions without closures.
3001 class Func_descriptor_expression : public Expression
3003 public:
3004 Func_descriptor_expression(Named_object* fn);
3006 // Make the function descriptor type, so that it can be converted.
3007 static void
3008 make_func_descriptor_type();
3010 protected:
3012 do_traverse(Traverse*);
3014 Type*
3015 do_type();
3017 void
3018 do_determine_type(const Type_context*)
3021 Expression*
3022 do_copy()
3023 { return Expression::make_func_descriptor(this->fn_); }
3025 bool
3026 do_is_addressable() const
3027 { return true; }
3029 Bexpression*
3030 do_get_backend(Translate_context*);
3032 void
3033 do_dump_expression(Ast_dump_context* context) const;
3035 private:
3036 // The type of all function descriptors.
3037 static Type* descriptor_type;
3039 // The function for which this is the descriptor.
3040 Named_object* fn_;
3041 // The descriptor variable.
3042 Bvariable* dvar_;
3045 // A reference to an unknown name.
3047 class Unknown_expression : public Parser_expression
3049 public:
3050 Unknown_expression(Named_object* named_object, Location location)
3051 : Parser_expression(EXPRESSION_UNKNOWN_REFERENCE, location),
3052 named_object_(named_object), no_error_message_(false)
3055 // The associated named object.
3056 Named_object*
3057 named_object() const
3058 { return this->named_object_; }
3060 // The name of the identifier which was unknown.
3061 const std::string&
3062 name() const;
3064 // Call this to indicate that we should not give an error if this
3065 // name is never defined. This is used to avoid knock-on errors
3066 // during an erroneous parse.
3067 void
3068 set_no_error_message()
3069 { this->no_error_message_ = true; }
3071 protected:
3072 Expression*
3073 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
3075 Expression*
3076 do_copy()
3077 { return new Unknown_expression(this->named_object_, this->location()); }
3079 void
3080 do_dump_expression(Ast_dump_context*) const;
3082 private:
3083 // The unknown name.
3084 Named_object* named_object_;
3085 // True if we should not give errors if this is undefined. This is
3086 // used if there was a parse failure.
3087 bool no_error_message_;
3090 // An index expression. This is lowered to an array index, a string
3091 // index, or a map index.
3093 class Index_expression : public Parser_expression
3095 public:
3096 Index_expression(Expression* left, Expression* start, Expression* end,
3097 Expression* cap, Location location)
3098 : Parser_expression(EXPRESSION_INDEX, location),
3099 left_(left), start_(start), end_(end), cap_(cap)
3102 // Dump an index expression, i.e. an expression of the form
3103 // expr[expr], expr[expr:expr], or expr[expr:expr:expr] to a dump context.
3104 static void
3105 dump_index_expression(Ast_dump_context*, const Expression* expr,
3106 const Expression* start, const Expression* end,
3107 const Expression* cap);
3109 protected:
3111 do_traverse(Traverse*);
3113 Expression*
3114 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
3116 Expression*
3117 do_copy()
3119 return new Index_expression(this->left_->copy(), this->start_->copy(),
3120 (this->end_ == NULL
3121 ? NULL
3122 : this->end_->copy()),
3123 (this->cap_ == NULL
3124 ? NULL
3125 : this->cap_->copy()),
3126 this->location());
3129 // This shouldn't be called--we don't know yet.
3130 bool
3131 do_must_eval_subexpressions_in_order(int*) const
3132 { go_unreachable(); }
3134 void
3135 do_dump_expression(Ast_dump_context*) const;
3137 void
3138 do_issue_nil_check()
3139 { this->left_->issue_nil_check(); }
3140 private:
3141 // The expression being indexed.
3142 Expression* left_;
3143 // The first index.
3144 Expression* start_;
3145 // The second index. This is NULL for an index, non-NULL for a
3146 // slice.
3147 Expression* end_;
3148 // The capacity argument. This is NULL for indices and slices that use the
3149 // default capacity, non-NULL for indices and slices that specify the
3150 // capacity.
3151 Expression* cap_;
3154 // An array index. This is used for both indexing and slicing.
3156 class Array_index_expression : public Expression
3158 public:
3159 Array_index_expression(Expression* array, Expression* start,
3160 Expression* end, Expression* cap, Location location)
3161 : Expression(EXPRESSION_ARRAY_INDEX, location),
3162 array_(array), start_(start), end_(end), cap_(cap), type_(NULL),
3163 needs_bounds_check_(true), is_flattened_(false)
3166 // Return the array.
3167 Expression*
3168 array()
3169 { return this->array_; }
3171 const Expression*
3172 array() const
3173 { return this->array_; }
3175 // Return the index of a simple index expression, or the start index
3176 // of a slice expression.
3177 Expression*
3178 start()
3179 { return this->start_; }
3181 const Expression*
3182 start() const
3183 { return this->start_; }
3185 // Return the end index of a slice expression. This is NULL for a
3186 // simple index expression.
3187 Expression*
3188 end()
3189 { return this->end_; }
3191 const Expression*
3192 end() const
3193 { return this->end_; }
3195 void
3196 set_needs_bounds_check(bool b)
3197 { this->needs_bounds_check_ = b; }
3199 protected:
3201 do_traverse(Traverse*);
3203 Expression*
3204 do_flatten(Gogo*, Named_object*, Statement_inserter*);
3206 Type*
3207 do_type();
3209 void
3210 do_determine_type(const Type_context*);
3212 void
3213 do_check_types(Gogo*);
3215 Expression*
3216 do_copy()
3218 Expression* ret = Expression::make_array_index(this->array_->copy(),
3219 this->start_->copy(),
3220 (this->end_ == NULL
3221 ? NULL
3222 : this->end_->copy()),
3223 (this->cap_ == NULL
3224 ? NULL
3225 : this->cap_->copy()),
3226 this->location());
3227 ret->array_index_expression()->set_needs_bounds_check(this->needs_bounds_check_);
3228 return ret;
3231 bool
3232 do_must_eval_subexpressions_in_order(int* skip) const;
3234 bool
3235 do_is_addressable() const;
3237 void
3238 do_address_taken(bool escapes);
3240 void
3241 do_issue_nil_check()
3242 { this->array_->issue_nil_check(); }
3244 Bexpression*
3245 do_get_backend(Translate_context*);
3248 do_inlining_cost() const
3249 { return this->end_ != NULL ? 2 : 1; }
3251 void
3252 do_export(Export_function_body*) const;
3254 void
3255 do_dump_expression(Ast_dump_context*) const;
3257 private:
3258 // The array we are getting a value from.
3259 Expression* array_;
3260 // The start or only index.
3261 Expression* start_;
3262 // The end index of a slice. This may be NULL for a simple array
3263 // index, or it may be a nil expression for the length of the array.
3264 Expression* end_;
3265 // The capacity argument of a slice. This may be NULL for an array index or
3266 // slice.
3267 Expression* cap_;
3268 // The type of the expression.
3269 Type* type_;
3270 // Whether bounds check is needed.
3271 bool needs_bounds_check_;
3272 // Whether this has already been flattened.
3273 bool is_flattened_;
3276 // A string index. This is used for both indexing and slicing.
3278 class String_index_expression : public Expression
3280 public:
3281 String_index_expression(Expression* string, Expression* start,
3282 Expression* end, Location location)
3283 : Expression(EXPRESSION_STRING_INDEX, location),
3284 string_(string), start_(start), end_(end), is_flattened_(false)
3287 // Return the string being indexed.
3288 Expression*
3289 string() const
3290 { return this->string_; }
3292 // Return the index of a simple index expression, or the start index
3293 // of a slice expression.
3294 Expression*
3295 start() const
3296 { return this->start_; }
3298 // Return the end index of a slice expression. This is NULL for a
3299 // simple index expression.
3300 Expression*
3301 end() const
3302 { return this->end_; }
3304 protected:
3306 do_traverse(Traverse*);
3308 Expression*
3309 do_flatten(Gogo*, Named_object*, Statement_inserter*);
3311 Type*
3312 do_type();
3314 void
3315 do_determine_type(const Type_context*);
3317 void
3318 do_check_types(Gogo*);
3320 Expression*
3321 do_copy()
3323 return Expression::make_string_index(this->string_->copy(),
3324 this->start_->copy(),
3325 (this->end_ == NULL
3326 ? NULL
3327 : this->end_->copy()),
3328 this->location());
3331 bool
3332 do_must_eval_subexpressions_in_order(int*) const
3333 { return true; }
3335 Bexpression*
3336 do_get_backend(Translate_context*);
3339 do_inlining_cost() const
3340 { return this->end_ != NULL ? 2 : 1; }
3342 void
3343 do_export(Export_function_body*) const;
3345 void
3346 do_dump_expression(Ast_dump_context*) const;
3348 private:
3349 // The string we are getting a value from.
3350 Expression* string_;
3351 // The start or only index.
3352 Expression* start_;
3353 // The end index of a slice. This may be NULL for a single index,
3354 // or it may be a nil expression for the length of the string.
3355 Expression* end_;
3356 // Whether this has already been flattened.
3357 bool is_flattened_;
3360 // An index into a map.
3362 class Map_index_expression : public Expression
3364 public:
3365 Map_index_expression(Expression* map, Expression* index,
3366 Location location)
3367 : Expression(EXPRESSION_MAP_INDEX, location),
3368 map_(map), index_(index), value_pointer_(NULL)
3371 // Return the map.
3372 Expression*
3373 map()
3374 { return this->map_; }
3376 const Expression*
3377 map() const
3378 { return this->map_; }
3380 // Return the index.
3381 Expression*
3382 index()
3383 { return this->index_; }
3385 const Expression*
3386 index() const
3387 { return this->index_; }
3389 // Get the type of the map being indexed.
3390 Map_type*
3391 get_map_type() const;
3393 // Return an expression for the map index. This returns an
3394 // expression that evaluates to a pointer to a value in the map. If
3395 // the key is not present in the map, this will return a pointer to
3396 // the zero value.
3397 Expression*
3398 get_value_pointer(Gogo*);
3400 protected:
3402 do_traverse(Traverse*);
3404 Expression*
3405 do_flatten(Gogo*, Named_object*, Statement_inserter*);
3407 Type*
3408 do_type();
3410 void
3411 do_determine_type(const Type_context*);
3413 void
3414 do_check_types(Gogo*);
3416 Expression*
3417 do_copy()
3419 return Expression::make_map_index(this->map_->copy(),
3420 this->index_->copy(),
3421 this->location());
3424 bool
3425 do_must_eval_subexpressions_in_order(int*) const
3426 { return true; }
3428 // A map index expression is an lvalue but it is not addressable.
3430 Bexpression*
3431 do_get_backend(Translate_context*);
3434 do_inlining_cost() const
3435 { return 5; }
3437 void
3438 do_export(Export_function_body*) const;
3440 void
3441 do_dump_expression(Ast_dump_context*) const;
3443 void
3444 do_add_conversions();
3446 private:
3447 // The map we are looking into.
3448 Expression* map_;
3449 // The index.
3450 Expression* index_;
3451 // A pointer to the value at this index.
3452 Expression* value_pointer_;
3455 // An expression which represents a method bound to its first
3456 // argument.
3458 class Bound_method_expression : public Expression
3460 public:
3461 Bound_method_expression(Expression* expr, const Method *method,
3462 Named_object* function, Location location)
3463 : Expression(EXPRESSION_BOUND_METHOD, location),
3464 expr_(expr), expr_type_(NULL), method_(method), function_(function)
3467 // Return the object which is the first argument.
3468 Expression*
3469 first_argument()
3470 { return this->expr_; }
3472 // Return the implicit type of the first argument. This will be
3473 // non-NULL when using a method from an anonymous field without
3474 // using an explicit stub.
3475 Type*
3476 first_argument_type() const
3477 { return this->expr_type_; }
3479 // Return the method.
3480 const Method*
3481 method() const
3482 { return this->method_; }
3484 // Return the function to call.
3485 Named_object*
3486 function() const
3487 { return this->function_; }
3489 // Set the implicit type of the expression.
3490 void
3491 set_first_argument_type(Type* type)
3492 { this->expr_type_ = type; }
3494 // Create a thunk to call FUNCTION, for METHOD, when it is used as
3495 // part of a method value.
3496 static Named_object*
3497 create_thunk(Gogo*, const Method* method, Named_object* function);
3499 // Look up a thunk.
3500 static Named_object*
3501 lookup_thunk(Named_object* function);
3503 protected:
3505 do_traverse(Traverse*);
3507 Expression*
3508 do_flatten(Gogo*, Named_object*, Statement_inserter*);
3510 Type*
3511 do_type();
3513 void
3514 do_determine_type(const Type_context*);
3516 void
3517 do_check_types(Gogo*);
3519 Expression*
3520 do_copy()
3522 return new Bound_method_expression(this->expr_->copy(), this->method_,
3523 this->function_, this->location());
3526 Bexpression*
3527 do_get_backend(Translate_context*)
3528 { go_unreachable(); }
3530 void
3531 do_dump_expression(Ast_dump_context*) const;
3533 private:
3534 // A mapping from method functions to the thunks we have created for
3535 // them.
3536 typedef Unordered_map(Named_object*, Named_object*) Method_value_thunks;
3537 static Method_value_thunks method_value_thunks;
3539 // The object used to find the method. This is passed to the method
3540 // as the first argument.
3541 Expression* expr_;
3542 // The implicit type of the object to pass to the method. This is
3543 // NULL in the normal case, non-NULL when using a method from an
3544 // anonymous field which does not require a stub.
3545 Type* expr_type_;
3546 // The method.
3547 const Method* method_;
3548 // The function to call. This is not the same as
3549 // method_->named_object() when the method has a stub. This will be
3550 // the real function rather than the stub.
3551 Named_object* function_;
3554 // A reference to a field in a struct.
3556 class Field_reference_expression : public Expression
3558 public:
3559 Field_reference_expression(Expression* expr, unsigned int field_index,
3560 Location location)
3561 : Expression(EXPRESSION_FIELD_REFERENCE, location),
3562 expr_(expr), field_index_(field_index), implicit_(false), called_fieldtrack_(false)
3565 // Return the struct expression.
3566 Expression*
3567 expr() const
3568 { return this->expr_; }
3570 // Return the field index.
3571 unsigned int
3572 field_index() const
3573 { return this->field_index_; }
3575 // Return whether this node was implied by an anonymous field.
3576 bool
3577 implicit() const
3578 { return this->implicit_; }
3580 void
3581 set_implicit(bool implicit)
3582 { this->implicit_ = implicit; }
3584 // Set the struct expression. This is used when parsing.
3585 void
3586 set_struct_expression(Expression* expr)
3588 go_assert(this->expr_ == NULL);
3589 this->expr_ = expr;
3592 protected:
3594 do_traverse(Traverse* traverse)
3595 { return Expression::traverse(&this->expr_, traverse); }
3597 Expression*
3598 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
3600 Type*
3601 do_type();
3603 void
3604 do_determine_type(const Type_context*)
3605 { this->expr_->determine_type_no_context(); }
3607 void
3608 do_check_types(Gogo*);
3610 Expression*
3611 do_copy()
3613 return Expression::make_field_reference(this->expr_->copy(),
3614 this->field_index_,
3615 this->location());
3618 bool
3619 do_is_addressable() const
3620 { return this->expr_->is_addressable(); }
3622 void
3623 do_address_taken(bool escapes)
3624 { this->expr_->address_taken(escapes); }
3626 void
3627 do_issue_nil_check()
3628 { this->expr_->issue_nil_check(); }
3630 Bexpression*
3631 do_get_backend(Translate_context*);
3633 void
3634 do_dump_expression(Ast_dump_context*) const;
3636 private:
3637 // The expression we are looking into. This should have a type of
3638 // struct.
3639 Expression* expr_;
3640 // The zero-based index of the field we are retrieving.
3641 unsigned int field_index_;
3642 // Whether this node was emitted implicitly for an embedded field,
3643 // that is, expr_ is not the expr_ of the original user node.
3644 bool implicit_;
3645 // Whether we have already emitted a fieldtrack call.
3646 bool called_fieldtrack_;
3649 // A reference to a field of an interface.
3651 class Interface_field_reference_expression : public Expression
3653 public:
3654 Interface_field_reference_expression(Expression* expr,
3655 const std::string& name,
3656 Location location)
3657 : Expression(EXPRESSION_INTERFACE_FIELD_REFERENCE, location),
3658 expr_(expr), name_(name)
3661 // Return the expression for the interface object.
3662 Expression*
3663 expr()
3664 { return this->expr_; }
3666 // Return the name of the method to call.
3667 const std::string&
3668 name() const
3669 { return this->name_; }
3671 // Create a thunk to call the method NAME in TYPE when it is used as
3672 // part of a method value.
3673 static Named_object*
3674 create_thunk(Gogo*, Interface_type* type, const std::string& name);
3676 // Look up a thunk.
3677 static Named_object*
3678 lookup_thunk(Interface_type* type, const std::string& name);
3680 // Return an expression for the pointer to the function to call.
3681 Expression*
3682 get_function();
3684 // Return an expression for the first argument to pass to the interface
3685 // function. This is the real object associated with the interface object.
3686 Expression*
3687 get_underlying_object();
3689 protected:
3691 do_traverse(Traverse* traverse);
3693 Expression*
3694 do_flatten(Gogo*, Named_object*, Statement_inserter*);
3696 Type*
3697 do_type();
3699 void
3700 do_determine_type(const Type_context*);
3702 void
3703 do_check_types(Gogo*);
3705 Expression*
3706 do_copy()
3708 return Expression::make_interface_field_reference(this->expr_->copy(),
3709 this->name_,
3710 this->location());
3713 Bexpression*
3714 do_get_backend(Translate_context*);
3716 void
3717 do_dump_expression(Ast_dump_context*) const;
3719 private:
3720 // A mapping from interface types to a list of thunks we have
3721 // created for methods.
3722 typedef std::vector<std::pair<std::string, Named_object*> > Method_thunks;
3723 typedef Unordered_map(Interface_type*, Method_thunks*)
3724 Interface_method_thunks;
3725 static Interface_method_thunks interface_method_thunks;
3727 // The expression for the interface object. This should have a type
3728 // of interface or pointer to interface.
3729 Expression* expr_;
3730 // The field we are retrieving--the name of the method.
3731 std::string name_;
3734 // Implement the builtin function new.
3736 class Allocation_expression : public Expression
3738 public:
3739 Allocation_expression(Type* type, Location location)
3740 : Expression(EXPRESSION_ALLOCATION, location),
3741 type_(type), allocate_on_stack_(false),
3742 no_zero_(false)
3745 void
3746 set_allocate_on_stack()
3747 { this->allocate_on_stack_ = true; }
3749 // Mark that the allocated memory doesn't need zeroing.
3750 void
3751 set_no_zero()
3752 { this->no_zero_ = true; }
3754 protected:
3756 do_traverse(Traverse*);
3758 Type*
3759 do_type();
3761 void
3762 do_determine_type(const Type_context*)
3765 void
3766 do_check_types(Gogo*);
3768 Expression*
3769 do_copy();
3771 Bexpression*
3772 do_get_backend(Translate_context*);
3774 void
3775 do_dump_expression(Ast_dump_context*) const;
3777 private:
3778 // The type we are allocating.
3779 Type* type_;
3780 // Whether or not this is a stack allocation.
3781 bool allocate_on_stack_;
3782 // Whether we don't need to zero the allocated memory.
3783 bool no_zero_;
3786 // A general composite literal. This is lowered to a type specific
3787 // version.
3789 class Composite_literal_expression : public Parser_expression
3791 public:
3792 Composite_literal_expression(Type* type, int depth, bool has_keys,
3793 Expression_list* vals, bool all_are_names,
3794 Location location)
3795 : Parser_expression(EXPRESSION_COMPOSITE_LITERAL, location),
3796 type_(type), depth_(depth), vals_(vals), has_keys_(has_keys),
3797 all_are_names_(all_are_names), key_path_(std::vector<bool>(depth))
3801 // Mark the DEPTH entry of KEY_PATH as containing a key.
3802 void
3803 update_key_path(size_t depth)
3805 go_assert(depth < this->key_path_.size());
3806 this->key_path_[depth] = true;
3809 protected:
3811 do_traverse(Traverse* traverse);
3813 Expression*
3814 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
3816 Expression*
3817 do_copy();
3819 void
3820 do_dump_expression(Ast_dump_context*) const;
3822 private:
3823 Expression*
3824 lower_struct(Gogo*, Type*);
3826 Expression*
3827 lower_array(Type*);
3829 Expression*
3830 make_array(Type*, const std::vector<unsigned long>*, Expression_list*);
3832 Expression*
3833 lower_map(Gogo*, Named_object*, Statement_inserter*, Type*);
3835 // The type of the composite literal.
3836 Type* type_;
3837 // The depth within a list of composite literals within a composite
3838 // literal, when the type is omitted.
3839 int depth_;
3840 // The values to put in the composite literal.
3841 Expression_list* vals_;
3842 // If this is true, then VALS_ is a list of pairs: a key and a
3843 // value. In an array initializer, a missing key will be NULL.
3844 bool has_keys_;
3845 // If this is true, then HAS_KEYS_ is true, and every key is a
3846 // simple identifier.
3847 bool all_are_names_;
3848 // A complement to DEPTH that indicates for each level starting from 0 to
3849 // DEPTH-1 whether or not this composite literal is nested inside of key or
3850 // a value. This is used to decide which type to use when given a map literal
3851 // with omitted key types.
3852 std::vector<bool> key_path_;
3855 // Helper/mixin class for struct and array construction expressions;
3856 // encapsulates a list of values plus an optional traversal order
3857 // recording the order in which the values should be visited.
3859 class Ordered_value_list
3861 public:
3862 Ordered_value_list(Expression_list* vals)
3863 : vals_(vals), traverse_order_(NULL)
3866 Expression_list*
3867 vals() const
3868 { return this->vals_; }
3871 traverse_vals(Traverse* traverse);
3873 // Get the traversal order (may be NULL)
3874 std::vector<unsigned long>*
3875 traverse_order()
3876 { return traverse_order_; }
3878 // Set the traversal order, used to ensure that we implement the
3879 // order of evaluation rules. Takes ownership of the argument.
3880 void
3881 set_traverse_order(std::vector<unsigned long>* traverse_order)
3882 { this->traverse_order_ = traverse_order; }
3884 private:
3885 // The list of values, in order of the fields in the struct or in
3886 // order of indices in an array. A NULL value of vals_ means that
3887 // all fields/slots should be zero-initialized; a single NULL entry
3888 // in the list means that the corresponding field or array slot
3889 // should be zero-initialized.
3890 Expression_list* vals_;
3891 // If not NULL, the order in which to traverse vals_. This is used
3892 // so that we implement the order of evaluation rules correctly.
3893 std::vector<unsigned long>* traverse_order_;
3896 // Construct a struct.
3898 class Struct_construction_expression : public Expression,
3899 public Ordered_value_list
3901 public:
3902 Struct_construction_expression(Type* type, Expression_list* vals,
3903 Location location)
3904 : Expression(EXPRESSION_STRUCT_CONSTRUCTION, location),
3905 Ordered_value_list(vals),
3906 type_(type)
3909 // Return whether this is a constant initializer.
3910 bool
3911 is_constant_struct() const;
3913 protected:
3915 do_traverse(Traverse* traverse);
3917 bool
3918 do_is_zero_value() const;
3920 bool
3921 do_is_static_initializer() const;
3923 Type*
3924 do_type()
3925 { return this->type_; }
3927 void
3928 do_determine_type(const Type_context*);
3930 void
3931 do_check_types(Gogo*);
3933 Expression*
3934 do_copy();
3936 Bexpression*
3937 do_get_backend(Translate_context*);
3939 void
3940 do_export(Export_function_body*) const;
3942 void
3943 do_dump_expression(Ast_dump_context*) const;
3945 void
3946 do_add_conversions();
3948 private:
3949 // The type of the struct to construct.
3950 Type* type_;
3953 // Construct an array. This class is not used directly; instead we
3954 // use the child classes, Fixed_array_construction_expression and
3955 // Slice_construction_expression.
3957 class Array_construction_expression : public Expression,
3958 public Ordered_value_list
3960 protected:
3961 Array_construction_expression(Expression_classification classification,
3962 Type* type,
3963 const std::vector<unsigned long>* indexes,
3964 Expression_list* vals, Location location)
3965 : Expression(classification, location),
3966 Ordered_value_list(vals),
3967 type_(type), indexes_(indexes)
3968 { go_assert(indexes == NULL || indexes->size() == vals->size()); }
3970 public:
3971 // Return whether this is a constant initializer.
3972 bool
3973 is_constant_array() const;
3975 // Return the number of elements.
3976 size_t
3977 element_count() const
3978 { return this->vals() == NULL ? 0 : this->vals()->size(); }
3980 protected:
3981 virtual int
3982 do_traverse(Traverse* traverse);
3984 bool
3985 do_is_zero_value() const;
3987 bool
3988 do_is_static_initializer() const;
3990 Type*
3991 do_type()
3992 { return this->type_; }
3994 void
3995 do_determine_type(const Type_context*);
3997 void
3998 do_check_types(Gogo*);
4000 void
4001 do_export(Export_function_body*) const;
4003 // The indexes.
4004 const std::vector<unsigned long>*
4005 indexes()
4006 { return this->indexes_; }
4008 // Get the backend constructor for the array values.
4009 Bexpression*
4010 get_constructor(Translate_context* context, Btype* btype);
4012 void
4013 do_dump_expression(Ast_dump_context*) const;
4015 virtual void
4016 dump_slice_storage_expression(Ast_dump_context*) const { }
4018 void
4019 do_add_conversions();
4021 private:
4022 // The type of the array to construct.
4023 Type* type_;
4024 // The list of indexes into the array, one for each value. This may
4025 // be NULL, in which case the indexes start at zero and increment.
4026 const std::vector<unsigned long>* indexes_;
4029 // Construct a fixed array.
4031 class Fixed_array_construction_expression :
4032 public Array_construction_expression
4034 public:
4035 Fixed_array_construction_expression(Type* type,
4036 const std::vector<unsigned long>* indexes,
4037 Expression_list* vals, Location location);
4039 protected:
4040 Expression*
4041 do_copy();
4043 Bexpression*
4044 do_get_backend(Translate_context*);
4047 // Construct a slice.
4049 class Slice_construction_expression : public Array_construction_expression
4051 public:
4052 Slice_construction_expression(Type* type,
4053 const std::vector<unsigned long>* indexes,
4054 Expression_list* vals, Location location);
4056 Expression*
4057 do_flatten(Gogo*, Named_object*, Statement_inserter*);
4059 // Record that the storage for this slice (e.g. vals) cannot escape,
4060 // hence it can be stack-allocated.
4061 void
4062 set_storage_does_not_escape()
4064 this->storage_escapes_ = false;
4067 protected:
4068 // Note that taking the address of a slice literal is invalid.
4071 do_traverse(Traverse* traverse);
4073 Expression*
4074 do_copy();
4076 Bexpression*
4077 do_get_backend(Translate_context*);
4079 void
4080 dump_slice_storage_expression(Ast_dump_context* ast_dump_context) const;
4082 // Create an array value for the constructed slice. Invoked during
4083 // flattening if slice storage does not escape, otherwise invoked
4084 // later on during do_get_backend().
4085 Expression*
4086 create_array_val();
4088 private:
4089 // The type of the values in this slice.
4090 Type* valtype_;
4091 // Array value expression, optionally filled in during flattening.
4092 Expression* array_val_;
4093 // Slice storage expression, optionally filled in during flattening.
4094 Expression* slice_storage_;
4095 // Normally true. Can be set to false if we know that the resulting
4096 // storage for the slice cannot escape.
4097 bool storage_escapes_;
4100 // Construct a map.
4102 class Map_construction_expression : public Expression
4104 public:
4105 Map_construction_expression(Type* type, Expression_list* vals,
4106 Location location)
4107 : Expression(EXPRESSION_MAP_CONSTRUCTION, location),
4108 type_(type), vals_(vals), element_type_(NULL), constructor_temp_(NULL)
4109 { go_assert(vals == NULL || vals->size() % 2 == 0); }
4111 Expression_list*
4112 vals() const
4113 { return this->vals_; }
4115 protected:
4117 do_traverse(Traverse* traverse);
4119 Expression*
4120 do_flatten(Gogo*, Named_object*, Statement_inserter*);
4122 Type*
4123 do_type()
4124 { return this->type_; }
4126 void
4127 do_determine_type(const Type_context*);
4129 void
4130 do_check_types(Gogo*);
4132 Expression*
4133 do_copy();
4135 Bexpression*
4136 do_get_backend(Translate_context*);
4138 void
4139 do_export(Export_function_body*) const;
4141 void
4142 do_dump_expression(Ast_dump_context*) const;
4144 void
4145 do_add_conversions();
4147 private:
4148 // The type of the map to construct.
4149 Type* type_;
4150 // The list of values.
4151 Expression_list* vals_;
4152 // The type of the key-value pair struct for each map element.
4153 Struct_type* element_type_;
4154 // A temporary reference to the variable storing the constructor initializer.
4155 Temporary_statement* constructor_temp_;
4158 // A type guard expression.
4160 class Type_guard_expression : public Expression
4162 public:
4163 Type_guard_expression(Expression* expr, Type* type, Location location)
4164 : Expression(EXPRESSION_TYPE_GUARD, location),
4165 expr_(expr), type_(type)
4168 // Return the expression to convert.
4169 Expression*
4170 expr()
4171 { return this->expr_; }
4173 // Return the type to which to convert.
4174 Type*
4175 type()
4176 { return this->type_; }
4178 protected:
4180 do_traverse(Traverse* traverse);
4182 Expression*
4183 do_flatten(Gogo*, Named_object*, Statement_inserter*);
4185 Type*
4186 do_type()
4187 { return this->type_; }
4189 void
4190 do_determine_type(const Type_context*)
4191 { this->expr_->determine_type_no_context(); }
4193 void
4194 do_check_types(Gogo*);
4196 Expression*
4197 do_copy();
4199 Bexpression*
4200 do_get_backend(Translate_context*);
4202 void
4203 do_dump_expression(Ast_dump_context*) const;
4205 private:
4206 // The expression to convert.
4207 Expression* expr_;
4208 // The type to which to convert.
4209 Type* type_;
4212 // Class Heap_expression.
4214 // When you take the address of an escaping expression, it is allocated
4215 // on the heap. This class implements that.
4217 class Heap_expression : public Expression
4219 public:
4220 Heap_expression(Expression* expr, Location location)
4221 : Expression(EXPRESSION_HEAP, location),
4222 expr_(expr), allocate_on_stack_(false)
4225 Expression*
4226 expr() const
4227 { return this->expr_; }
4229 void
4230 set_allocate_on_stack()
4231 { this->allocate_on_stack_ = true; }
4233 protected:
4235 do_traverse(Traverse* traverse)
4236 { return Expression::traverse(&this->expr_, traverse); }
4238 Type*
4239 do_type();
4240 void
4241 do_determine_type(const Type_context*)
4242 { this->expr_->determine_type_no_context(); }
4244 Expression*
4245 do_copy()
4247 return Expression::make_heap_expression(this->expr_->copy(),
4248 this->location());
4251 Bexpression*
4252 do_get_backend(Translate_context*);
4254 // We only export global objects, and the parser does not generate
4255 // this in global scope.
4256 void
4257 do_export(Export_function_body*) const
4258 { go_unreachable(); }
4260 void
4261 do_dump_expression(Ast_dump_context*) const;
4263 private:
4264 // The expression which is being put on the heap.
4265 Expression* expr_;
4266 // Whether or not this is a stack allocation.
4267 bool allocate_on_stack_;
4270 // A receive expression.
4272 class Receive_expression : public Expression
4274 public:
4275 Receive_expression(Expression* channel, Location location)
4276 : Expression(EXPRESSION_RECEIVE, location),
4277 channel_(channel), temp_receiver_(NULL)
4280 // Return the channel.
4281 Expression*
4282 channel()
4283 { return this->channel_; }
4285 static Expression*
4286 do_import(Import_expression*, Location);
4288 protected:
4290 do_traverse(Traverse* traverse)
4291 { return Expression::traverse(&this->channel_, traverse); }
4293 bool
4294 do_discarding_value()
4295 { return true; }
4297 Type*
4298 do_type();
4300 Expression*
4301 do_flatten(Gogo*, Named_object*, Statement_inserter*);
4303 void
4304 do_determine_type(const Type_context*)
4305 { this->channel_->determine_type_no_context(); }
4307 void
4308 do_check_types(Gogo*);
4310 Expression*
4311 do_copy()
4313 return Expression::make_receive(this->channel_->copy(), this->location());
4317 do_inlining_cost() const
4318 { return 1; }
4320 bool
4321 do_must_eval_in_order() const
4322 { return true; }
4324 Bexpression*
4325 do_get_backend(Translate_context*);
4327 void
4328 do_export(Export_function_body*) const;
4330 void
4331 do_dump_expression(Ast_dump_context*) const;
4333 private:
4334 // The channel from which we are receiving.
4335 Expression* channel_;
4336 // A temporary reference to the variable storing the received data.
4337 Temporary_statement* temp_receiver_;
4340 // An expression that represents a slice value: a struct with value pointer,
4341 // length, and capacity fields.
4343 class Slice_value_expression : public Expression
4345 public:
4346 Slice_value_expression(Type* type, Expression* valmem, Expression* len,
4347 Expression* cap, Location location)
4348 : Expression(EXPRESSION_SLICE_VALUE, location),
4349 type_(type), valmem_(valmem), len_(len), cap_(cap)
4352 // The memory holding the values in the slice. The type should be a
4353 // pointer to the element value of the slice.
4354 Expression*
4355 valmem() const
4356 { return this->valmem_; }
4358 protected:
4360 do_traverse(Traverse*);
4362 Type*
4363 do_type()
4364 { return this->type_; }
4366 void
4367 do_determine_type(const Type_context*);
4369 Expression*
4370 do_copy();
4372 Bexpression*
4373 do_get_backend(Translate_context* context);
4375 void
4376 do_dump_expression(Ast_dump_context*) const;
4378 private:
4379 // The type of the slice value.
4380 Type* type_;
4381 // The memory holding the values in the slice.
4382 Expression* valmem_;
4383 // The length of the slice.
4384 Expression* len_;
4385 // The capacity of the slice.
4386 Expression* cap_;
4389 // An expression that evaluates to some characteristic of a slice.
4390 // This is used when indexing, bound-checking, or nil checking a slice.
4392 class Slice_info_expression : public Expression
4394 public:
4395 Slice_info_expression(Expression* slice, Slice_info slice_info,
4396 Location location)
4397 : Expression(EXPRESSION_SLICE_INFO, location),
4398 slice_(slice), slice_info_(slice_info)
4401 // The slice operand of this slice info expression.
4402 Expression*
4403 slice() const
4404 { return this->slice_; }
4406 // The info this expression is about.
4407 Slice_info
4408 info() const
4409 { return this->slice_info_; }
4411 protected:
4413 do_traverse(Traverse* traverse)
4414 { return Expression::traverse(&this->slice_, traverse); }
4416 Type*
4417 do_type();
4419 void
4420 do_determine_type(const Type_context*)
4421 { this->slice_->determine_type_no_context(); }
4423 Expression*
4424 do_copy()
4426 return new Slice_info_expression(this->slice_->copy(), this->slice_info_,
4427 this->location());
4430 Bexpression*
4431 do_get_backend(Translate_context* context);
4433 void
4434 do_dump_expression(Ast_dump_context*) const;
4436 void
4437 do_issue_nil_check()
4438 { this->slice_->issue_nil_check(); }
4440 private:
4441 // The slice for which we are getting information.
4442 Expression* slice_;
4443 // What information we want.
4444 Slice_info slice_info_;
4447 // Conditional expressions.
4449 class Conditional_expression : public Expression
4451 public:
4452 Conditional_expression(Expression* cond, Expression* then_expr,
4453 Expression* else_expr, Location location)
4454 : Expression(EXPRESSION_CONDITIONAL, location),
4455 cond_(cond), then_(then_expr), else_(else_expr)
4458 Expression*
4459 condition() const
4460 { return this->cond_; }
4462 Expression*
4463 then_expr() const
4464 { return this->then_; }
4466 Expression*
4467 else_expr() const
4468 { return this->else_; }
4470 protected:
4472 do_traverse(Traverse*);
4474 Type*
4475 do_type();
4477 void
4478 do_determine_type(const Type_context*);
4480 Expression*
4481 do_copy()
4483 return new Conditional_expression(this->cond_->copy(), this->then_->copy(),
4484 this->else_->copy(), this->location());
4487 Bexpression*
4488 do_get_backend(Translate_context* context);
4490 void
4491 do_dump_expression(Ast_dump_context*) const;
4493 private:
4494 // The condition to be checked.
4495 Expression* cond_;
4496 // The expression to execute if the condition is true.
4497 Expression* then_;
4498 // The expression to execute if the condition is false.
4499 Expression* else_;
4502 // Compound expressions.
4504 class Compound_expression : public Expression
4506 public:
4507 Compound_expression(Expression* init, Expression* expr, Location location)
4508 : Expression(EXPRESSION_COMPOUND, location), init_(init), expr_(expr)
4511 Expression*
4512 init() const
4513 { return this->init_; }
4515 Expression*
4516 expr() const
4517 { return this->expr_; }
4519 protected:
4521 do_traverse(Traverse*);
4523 Type*
4524 do_type();
4526 void
4527 do_determine_type(const Type_context*);
4529 Expression*
4530 do_copy()
4532 return new Compound_expression(this->init_->copy(), this->expr_->copy(),
4533 this->location());
4536 Bexpression*
4537 do_get_backend(Translate_context* context);
4539 void
4540 do_dump_expression(Ast_dump_context*) const;
4542 private:
4543 // The expression that is evaluated first and discarded.
4544 Expression* init_;
4545 // The expression that is evaluated and returned.
4546 Expression* expr_;
4549 // A backend expression. This is a backend expression wrapped in an
4550 // Expression, for convenience during backend generation.
4552 class Backend_expression : public Expression
4554 public:
4555 Backend_expression(Bexpression* bexpr, Type* type, Location location)
4556 : Expression(EXPRESSION_BACKEND, location), bexpr_(bexpr), type_(type)
4559 protected:
4561 do_traverse(Traverse*);
4563 // For now these are always valid static initializers. If that
4564 // changes we can change this.
4565 bool
4566 do_is_static_initializer() const
4567 { return true; }
4569 Type*
4570 do_type()
4571 { return this->type_; }
4573 void
4574 do_determine_type(const Type_context*)
4577 Expression*
4578 do_copy();
4580 Bexpression*
4581 do_get_backend(Translate_context*)
4582 { return this->bexpr_; }
4584 void
4585 do_dump_expression(Ast_dump_context*) const;
4587 private:
4588 // The backend expression we are wrapping.
4589 Bexpression* bexpr_;
4590 // The type of the expression;
4591 Type* type_;
4594 // A numeric constant. This is used both for untyped constants and
4595 // for constants that have a type.
4597 class Numeric_constant
4599 public:
4600 Numeric_constant()
4601 : classification_(NC_INVALID), type_(NULL)
4604 ~Numeric_constant();
4606 Numeric_constant(const Numeric_constant&);
4608 Numeric_constant& operator=(const Numeric_constant&);
4610 // Check equality with another numeric constant.
4611 bool
4612 equals(const Numeric_constant&) const;
4614 // Set to an unsigned long value.
4615 void
4616 set_unsigned_long(Type*, unsigned long);
4618 // Set to an integer value.
4619 void
4620 set_int(Type*, const mpz_t);
4622 // Set to a rune value.
4623 void
4624 set_rune(Type*, const mpz_t);
4626 // Set to a floating point value.
4627 void
4628 set_float(Type*, const mpfr_t);
4630 // Set to a complex value.
4631 void
4632 set_complex(Type*, const mpc_t);
4634 // Mark numeric constant as invalid.
4635 void
4636 set_invalid()
4637 { this->classification_ = NC_INVALID; }
4639 // Classifiers.
4640 bool
4641 is_int() const
4642 { return this->classification_ == Numeric_constant::NC_INT; }
4644 bool
4645 is_rune() const
4646 { return this->classification_ == Numeric_constant::NC_RUNE; }
4648 bool
4649 is_float() const
4650 { return this->classification_ == Numeric_constant::NC_FLOAT; }
4652 bool
4653 is_complex() const
4654 { return this->classification_ == Numeric_constant::NC_COMPLEX; }
4656 bool
4657 is_invalid() const
4658 { return this->classification_ == Numeric_constant::NC_INVALID; }
4660 // Value retrievers. These will initialize the values as well as
4661 // set them. GET_INT is only valid if IS_INT returns true, and
4662 // likewise respectively.
4663 void
4664 get_int(mpz_t*) const;
4666 void
4667 get_rune(mpz_t*) const;
4669 void
4670 get_float(mpfr_t*) const;
4672 void
4673 get_complex(mpc_t*) const;
4675 // Codes returned by to_unsigned_long.
4676 enum To_unsigned_long
4678 // Value is integer and fits in unsigned long.
4679 NC_UL_VALID,
4680 // Value is not integer.
4681 NC_UL_NOTINT,
4682 // Value is integer but is negative.
4683 NC_UL_NEGATIVE,
4684 // Value is non-negative integer but does not fit in unsigned
4685 // long.
4686 NC_UL_BIG
4689 // If the value can be expressed as an integer that fits in an
4690 // unsigned long, set *VAL and return NC_UL_VALID. Otherwise return
4691 // one of the other To_unsigned_long codes.
4692 To_unsigned_long
4693 to_unsigned_long(unsigned long* val) const;
4695 // If the value can be expressed as an integer that describes the
4696 // size of an object in memory, set *VAL and return true.
4697 // Otherwise, return false. Currently we use int64_t to represent a
4698 // memory size, as in Type::backend_type_size.
4699 bool
4700 to_memory_size(int64_t* val) const;
4702 // If the value can be expressed as an int, return true and
4703 // initialize and set VAL. This will return false for a value with
4704 // an explicit float or complex type, even if the value is integral.
4705 bool
4706 to_int(mpz_t* val) const;
4708 // If the value can be expressed as a float, return true and
4709 // initialize and set VAL.
4710 bool
4711 to_float(mpfr_t* val) const;
4713 // If the value can be expressed as a complex, return true and
4714 // initialize and set VR and VI.
4715 bool
4716 to_complex(mpc_t* val) const;
4718 // Get the type.
4719 Type*
4720 type() const;
4722 // If the constant can be expressed in TYPE, then set the type of
4723 // the constant to TYPE and return true. Otherwise return false,
4724 // and, if ISSUE_ERROR is true, issue an error message. LOCATION is
4725 // the location to use for the error.
4726 bool
4727 set_type(Type* type, bool issue_error, Location location);
4729 // Return an Expression for this value.
4730 Expression*
4731 expression(Location) const;
4733 // Calculate a hash code with a given seed.
4734 unsigned int
4735 hash(unsigned int seed) const;
4737 private:
4738 void
4739 clear();
4741 To_unsigned_long
4742 mpz_to_unsigned_long(const mpz_t ival, unsigned long *val) const;
4744 To_unsigned_long
4745 mpfr_to_unsigned_long(const mpfr_t fval, unsigned long *val) const;
4747 bool
4748 mpz_to_memory_size(const mpz_t ival, int64_t* val) const;
4750 bool
4751 mpfr_to_memory_size(const mpfr_t fval, int64_t* val) const;
4753 bool
4754 check_int_type(Integer_type*, bool, Location);
4756 bool
4757 check_float_type(Float_type*, bool, Location);
4759 bool
4760 check_complex_type(Complex_type*, bool, Location);
4762 static bool
4763 is_float_neg_zero(const mpfr_t, int bits);
4765 // The kinds of constants.
4766 enum Classification
4768 NC_INVALID,
4769 NC_RUNE,
4770 NC_INT,
4771 NC_FLOAT,
4772 NC_COMPLEX
4775 // The kind of constant.
4776 Classification classification_;
4777 // The value.
4778 union
4780 // If NC_INT or NC_RUNE.
4781 mpz_t int_val;
4782 // If NC_FLOAT.
4783 mpfr_t float_val;
4784 // If NC_COMPLEX.
4785 mpc_t complex_val;
4786 } u_;
4787 // The type if there is one. This will be NULL for an untyped
4788 // constant.
4789 Type* type_;
4792 // Temporary buffer size for string conversions.
4793 // Also known to the runtime as tmpStringBufSize in runtime/string.go.
4794 static const int tmp_string_buf_size = 32;
4796 #endif // !defined(GO_EXPRESSIONS_H)