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
16 class Translate_context
;
18 class Statement_inserter
;
25 class Expression_list
;
27 class Temporary_reference_expression
;
28 class String_expression
;
29 class Binary_expression
;
30 class Call_expression
;
31 class Func_expression
;
32 class Unknown_expression
;
33 class Index_expression
;
34 class Map_index_expression
;
35 class Bound_method_expression
;
36 class Field_reference_expression
;
37 class Interface_field_reference_expression
;
38 class Type_guard_expression
;
39 class Receive_expression
;
43 class Temporary_statement
;
45 class Ast_dump_context
;
48 // The base class for all expressions.
53 // The types of expressions.
54 enum Expression_classification
60 EXPRESSION_CONST_REFERENCE
,
61 EXPRESSION_VAR_REFERENCE
,
62 EXPRESSION_TEMPORARY_REFERENCE
,
64 EXPRESSION_FUNC_REFERENCE
,
65 EXPRESSION_UNKNOWN_REFERENCE
,
74 EXPRESSION_CALL_RESULT
,
75 EXPRESSION_BOUND_METHOD
,
77 EXPRESSION_ARRAY_INDEX
,
78 EXPRESSION_STRING_INDEX
,
81 EXPRESSION_FIELD_REFERENCE
,
82 EXPRESSION_INTERFACE_FIELD_REFERENCE
,
83 EXPRESSION_ALLOCATION
,
84 EXPRESSION_TYPE_GUARD
,
85 EXPRESSION_CONVERSION
,
86 EXPRESSION_UNSAFE_CONVERSION
,
87 EXPRESSION_STRUCT_CONSTRUCTION
,
88 EXPRESSION_FIXED_ARRAY_CONSTRUCTION
,
89 EXPRESSION_OPEN_ARRAY_CONSTRUCTION
,
90 EXPRESSION_MAP_CONSTRUCTION
,
91 EXPRESSION_COMPOSITE_LITERAL
,
92 EXPRESSION_HEAP_COMPOSITE
,
94 EXPRESSION_TYPE_DESCRIPTOR
,
96 EXPRESSION_STRUCT_FIELD_OFFSET
,
97 EXPRESSION_MAP_DESCRIPTOR
,
101 Expression(Expression_classification
, source_location
);
103 virtual ~Expression();
105 // Make an error expression. This is used when a parse error occurs
106 // to prevent cascading errors.
108 make_error(source_location
);
110 // Make an expression which is really a type. This is used during
113 make_type(Type
*, source_location
);
115 // Make a unary expression.
117 make_unary(Operator
, Expression
*, source_location
);
119 // Make a binary expression.
121 make_binary(Operator
, Expression
*, Expression
*, source_location
);
123 // Make a reference to a constant in an expression.
125 make_const_reference(Named_object
*, source_location
);
127 // Make a reference to a variable in an expression.
129 make_var_reference(Named_object
*, source_location
);
131 // Make a reference to a temporary variable. Temporary variables
132 // are always created by a single statement, which is what we use to
134 static Temporary_reference_expression
*
135 make_temporary_reference(Temporary_statement
*, source_location
);
137 // Make a sink expression--a reference to the blank identifier _.
139 make_sink(source_location
);
141 // Make a reference to a function in an expression.
143 make_func_reference(Named_object
*, Expression
* closure
, source_location
);
145 // Make a reference to an unknown name. In a correct program this
146 // will always be lowered to a real const/var/func reference.
148 make_unknown_reference(Named_object
*, source_location
);
150 // Make a constant bool expression.
152 make_boolean(bool val
, source_location
);
154 // Make a constant string expression.
156 make_string(const std::string
&, source_location
);
158 // Make a constant integer expression. TYPE should be NULL for an
161 make_integer(const mpz_t
*, Type
*, source_location
);
163 // Make a constant float expression. TYPE should be NULL for an
166 make_float(const mpfr_t
*, Type
*, source_location
);
168 // Make a constant complex expression. TYPE should be NULL for an
171 make_complex(const mpfr_t
* real
, const mpfr_t
* imag
, Type
*, source_location
);
173 // Make a nil expression.
175 make_nil(source_location
);
177 // Make an iota expression. This is used for the predeclared
182 // Make a call expression.
183 static Call_expression
*
184 make_call(Expression
* func
, Expression_list
* args
, bool is_varargs
,
187 // Make a reference to a specific result of a call expression which
190 make_call_result(Call_expression
*, unsigned int index
);
192 // Make an expression which is a method bound to its first
194 static Bound_method_expression
*
195 make_bound_method(Expression
* object
, Named_object
* method
, source_location
);
197 // Make an index or slice expression. This is a parser expression
198 // which represents LEFT[START:END]. END may be NULL, meaning an
199 // index rather than a slice. At parse time we may not know the
200 // type of LEFT. After parsing this is lowered to an array index, a
201 // string index, or a map index.
203 make_index(Expression
* left
, Expression
* start
, Expression
* end
,
206 // Make an array index expression. END may be NULL, in which case
207 // this is an lvalue.
209 make_array_index(Expression
* array
, Expression
* start
, Expression
* end
,
212 // Make a string index expression. END may be NULL. This is never
215 make_string_index(Expression
* string
, Expression
* start
, Expression
* end
,
218 // Make a map index expression. This is an lvalue.
219 static Map_index_expression
*
220 make_map_index(Expression
* map
, Expression
* val
, source_location
);
222 // Make a selector. This is a parser expression which represents
223 // LEFT.NAME. At parse time we may not know the type of the left
226 make_selector(Expression
* left
, const std::string
& name
, source_location
);
228 // Make a reference to a field in a struct.
229 static Field_reference_expression
*
230 make_field_reference(Expression
*, unsigned int field_index
, source_location
);
232 // Make a reference to a field of an interface, with an associated
235 make_interface_field_reference(Expression
*, const std::string
&,
238 // Make an allocation expression.
240 make_allocation(Type
*, source_location
);
242 // Make a type guard expression.
244 make_type_guard(Expression
*, Type
*, source_location
);
246 // Make a type cast expression.
248 make_cast(Type
*, Expression
*, source_location
);
250 // Make an unsafe type cast expression. This is only used when
251 // passing parameter to builtin functions that are part of the Go
254 make_unsafe_cast(Type
*, Expression
*, source_location
);
256 // Make a composite literal. The DEPTH parameter is how far down we
257 // are in a list of composite literals with omitted types.
259 make_composite_literal(Type
*, int depth
, bool has_keys
, Expression_list
*,
262 // Make a struct composite literal.
264 make_struct_composite_literal(Type
*, Expression_list
*, source_location
);
266 // Make a slice composite literal.
268 make_slice_composite_literal(Type
*, Expression_list
*, source_location
);
270 // Take a composite literal and allocate it on the heap.
272 make_heap_composite(Expression
*, source_location
);
274 // Make a receive expression. VAL is NULL for a unary receive.
275 static Receive_expression
*
276 make_receive(Expression
* channel
, source_location
);
278 // Make an expression which evaluates to the address of the type
279 // descriptor for TYPE.
281 make_type_descriptor(Type
* type
, source_location
);
283 // Make an expression which evaluates to some characteristic of a
284 // type. These are only used for type descriptors, so there is no
285 // location parameter.
288 // The size of a value of the type.
290 // The required alignment of a value of the type.
292 // The required alignment of a value of the type when used as a
293 // field in a struct.
294 TYPE_INFO_FIELD_ALIGNMENT
298 make_type_info(Type
* type
, Type_info
);
300 // Make an expression which evaluates to the offset of a field in a
301 // struct. This is only used for type descriptors, so there is no
302 // location parameter.
304 make_struct_field_offset(Struct_type
*, const Struct_field
*);
306 // Make an expression which evaluates to the address of the map
307 // descriptor for TYPE.
309 make_map_descriptor(Map_type
* type
, source_location
);
311 // Make an expression which evaluates to the address of an unnamed
314 make_label_addr(Label
*, source_location
);
316 // Return the expression classification.
317 Expression_classification
318 classification() const
319 { return this->classification_
; }
321 // Return the location of the expression.
324 { return this->location_
; }
326 // Return whether this is a constant expression.
329 { return this->do_is_constant(); }
331 // If this is not a constant expression with integral type, return
332 // false. If it is one, return true, and set VAL to the value. VAL
333 // should already be initialized. If this returns true, it sets
334 // *PTYPE to the type of the value, or NULL for an abstract type.
335 // If IOTA_IS_CONSTANT is true, then an iota expression is assumed
336 // to have its final value.
338 integer_constant_value(bool iota_is_constant
, mpz_t val
, Type
** ptype
) const;
340 // If this is not a constant expression with floating point type,
341 // return false. If it is one, return true, and set VAL to the
342 // value. VAL should already be initialized. If this returns true,
343 // it sets *PTYPE to the type of the value, or NULL for an abstract
346 float_constant_value(mpfr_t val
, Type
** ptype
) const;
348 // If this is not a constant expression with complex type, return
349 // false. If it is one, return true, and set REAL and IMAG to the
350 // value. REAL and IMAG should already be initialized. If this
351 // return strue, it sets *PTYPE to the type of the value, or NULL
352 // for an abstract type.
354 complex_constant_value(mpfr_t real
, mpfr_t imag
, Type
** ptype
) const;
356 // If this is not a constant expression with string type, return
357 // false. If it is one, return true, and set VAL to the value.
359 string_constant_value(std::string
* val
) const
360 { return this->do_string_constant_value(val
); }
362 // This is called by the parser if the value of this expression is
363 // being discarded. This issues warnings about computed values
367 { this->do_discarding_value(); }
369 // Return whether this is an error expression.
371 is_error_expression() const
372 { return this->classification_
== EXPRESSION_ERROR
; }
374 // Return whether this expression really represents a type.
376 is_type_expression() const
377 { return this->classification_
== EXPRESSION_TYPE
; }
379 // If this is a variable reference, return the Var_expression
380 // structure. Otherwise, return NULL. This is a controlled dynamic
384 { return this->convert
<Var_expression
, EXPRESSION_VAR_REFERENCE
>(); }
386 const Var_expression
*
387 var_expression() const
388 { return this->convert
<const Var_expression
, EXPRESSION_VAR_REFERENCE
>(); }
390 // If this is a reference to a temporary variable, return the
391 // Temporary_reference_expression. Otherwise, return NULL.
392 Temporary_reference_expression
*
393 temporary_reference_expression()
395 return this->convert
<Temporary_reference_expression
,
396 EXPRESSION_TEMPORARY_REFERENCE
>();
399 // Return whether this is a sink expression.
401 is_sink_expression() const
402 { return this->classification_
== EXPRESSION_SINK
; }
404 // If this is a string expression, return the String_expression
405 // structure. Otherwise, return NULL.
408 { return this->convert
<String_expression
, EXPRESSION_STRING
>(); }
410 // Return whether this is the expression nil.
412 is_nil_expression() const
413 { return this->classification_
== EXPRESSION_NIL
; }
415 // If this is an indirection through a pointer, return the
416 // expression being pointed through. Otherwise return this.
420 // If this is a binary expression, return the Binary_expression
421 // structure. Otherwise return NULL.
424 { return this->convert
<Binary_expression
, EXPRESSION_BINARY
>(); }
426 // If this is a call expression, return the Call_expression
427 // structure. Otherwise, return NULL. This is a controlled dynamic
431 { return this->convert
<Call_expression
, EXPRESSION_CALL
>(); }
433 // If this is an expression which refers to a function, return the
434 // Func_expression structure. Otherwise, return NULL.
437 { return this->convert
<Func_expression
, EXPRESSION_FUNC_REFERENCE
>(); }
439 const Func_expression
*
440 func_expression() const
441 { return this->convert
<const Func_expression
, EXPRESSION_FUNC_REFERENCE
>(); }
443 // If this is an expression which refers to an unknown name, return
444 // the Unknown_expression structure. Otherwise, return NULL.
447 { return this->convert
<Unknown_expression
, EXPRESSION_UNKNOWN_REFERENCE
>(); }
449 const Unknown_expression
*
450 unknown_expression() const
452 return this->convert
<const Unknown_expression
,
453 EXPRESSION_UNKNOWN_REFERENCE
>();
456 // If this is an index expression, return the Index_expression
457 // structure. Otherwise, return NULL.
460 { return this->convert
<Index_expression
, EXPRESSION_INDEX
>(); }
462 // If this is an expression which refers to indexing in a map,
463 // return the Map_index_expression structure. Otherwise, return
465 Map_index_expression
*
466 map_index_expression()
467 { return this->convert
<Map_index_expression
, EXPRESSION_MAP_INDEX
>(); }
469 // If this is a bound method expression, return the
470 // Bound_method_expression structure. Otherwise, return NULL.
471 Bound_method_expression
*
472 bound_method_expression()
473 { return this->convert
<Bound_method_expression
, EXPRESSION_BOUND_METHOD
>(); }
475 // If this is a reference to a field in a struct, return the
476 // Field_reference_expression structure. Otherwise, return NULL.
477 Field_reference_expression
*
478 field_reference_expression()
480 return this->convert
<Field_reference_expression
,
481 EXPRESSION_FIELD_REFERENCE
>();
484 // If this is a reference to a field in an interface, return the
485 // Interface_field_reference_expression structure. Otherwise,
487 Interface_field_reference_expression
*
488 interface_field_reference_expression()
490 return this->convert
<Interface_field_reference_expression
,
491 EXPRESSION_INTERFACE_FIELD_REFERENCE
>();
494 // If this is a type guard expression, return the
495 // Type_guard_expression structure. Otherwise, return NULL.
496 Type_guard_expression
*
497 type_guard_expression()
498 { return this->convert
<Type_guard_expression
, EXPRESSION_TYPE_GUARD
>(); }
500 // If this is a receive expression, return the Receive_expression
501 // structure. Otherwise, return NULL.
504 { return this->convert
<Receive_expression
, EXPRESSION_RECEIVE
>(); }
506 // Return true if this is a composite literal.
508 is_composite_literal() const;
510 // Return true if this is a composite literal which is not constant.
512 is_nonconstant_composite_literal() const;
514 // Return true if this is a reference to a local variable.
516 is_local_variable() const;
518 // Traverse an expression.
520 traverse(Expression
**, Traverse
*);
522 // Traverse subexpressions of this expression.
524 traverse_subexpressions(Traverse
*);
526 // Lower an expression. This is called immediately after parsing.
527 // FUNCTION is the function we are in; it will be NULL for an
528 // expression initializing a global variable. INSERTER may be used
529 // to insert statements before the statement or initializer
530 // containing this expression; it is normally used to create
531 // temporary variables. IOTA_VALUE is the value that we should give
532 // to any iota expressions. This function must resolve expressions
533 // which could not be fully parsed into their final form. It
534 // returns the same Expression or a new one.
536 lower(Gogo
* gogo
, Named_object
* function
, Statement_inserter
* inserter
,
538 { return this->do_lower(gogo
, function
, inserter
, iota_value
); }
540 // Determine the real type of an expression with abstract integer,
541 // floating point, or complex type. TYPE_CONTEXT describes the
544 determine_type(const Type_context
*);
546 // Check types in an expression.
548 check_types(Gogo
* gogo
)
549 { this->do_check_types(gogo
); }
551 // Determine the type when there is no context.
553 determine_type_no_context();
555 // Return the current type of the expression. This may be changed
556 // by determine_type.
559 { return this->do_type(); }
561 // Return a copy of an expression.
564 { return this->do_copy(); }
566 // Return whether the expression is addressable--something which may
567 // be used as the operand of the unary & operator.
569 is_addressable() const
570 { return this->do_is_addressable(); }
572 // Note that we are taking the address of this expression. ESCAPES
573 // is true if this address escapes the current function.
575 address_taken(bool escapes
)
576 { this->do_address_taken(escapes
); }
578 // Return whether this expression must be evaluated in order
579 // according to the order of evaluation rules. This is basically
580 // true of all expressions with side-effects.
582 must_eval_in_order() const
583 { return this->do_must_eval_in_order(); }
585 // Return the tree for this expression.
587 get_tree(Translate_context
*);
589 // Return a tree handling any conversions which must be done during
592 convert_for_assignment(Translate_context
*, Type
* lhs_type
, Type
* rhs_type
,
593 tree rhs_tree
, source_location location
);
595 // Return a tree converting a value of one interface type to another
596 // interface type. If FOR_TYPE_GUARD is true this is for a type
599 convert_interface_to_interface(Translate_context
*, Type
* lhs_type
,
600 Type
* rhs_type
, tree rhs_tree
,
601 bool for_type_guard
, source_location
);
603 // Return a tree implementing the comparison LHS_TREE OP RHS_TREE.
604 // TYPE is the type of both sides.
606 comparison_tree(Translate_context
*, Operator op
, Type
* left_type
,
607 tree left_tree
, Type
* right_type
, tree right_tree
,
610 // Return a tree for the multi-precision integer VAL in TYPE.
612 integer_constant_tree(mpz_t val
, tree type
);
614 // Return a tree for the floating point value VAL in TYPE.
616 float_constant_tree(mpfr_t val
, tree type
);
618 // Return a tree for the complex value REAL/IMAG in TYPE.
620 complex_constant_tree(mpfr_t real
, mpfr_t imag
, tree type
);
622 // Export the expression. This is only used for constants. It will
623 // be used for things like values of named constants and sizes of
626 export_expression(Export
* exp
) const
627 { this->do_export(exp
); }
629 // Import an expression.
631 import_expression(Import
*);
633 // Return a tree which checks that VAL, of arbitrary integer type,
634 // is non-negative and is not more than the maximum value of
635 // BOUND_TYPE. If SOFAR is not NULL, it is or'red into the result.
636 // The return value may be NULL if SOFAR is NULL.
638 check_bounds(tree val
, tree bound_type
, tree sofar
, source_location
);
640 // Dump an expression to a dump constext.
642 dump_expression(Ast_dump_context
*) const;
645 // May be implemented by child class: traverse the expressions.
647 do_traverse(Traverse
*);
649 // Return a lowered expression.
651 do_lower(Gogo
*, Named_object
*, Statement_inserter
*, int)
654 // Return whether this is a constant expression.
656 do_is_constant() const
659 // Return whether this is a constant expression of integral type,
660 // and set VAL to the value.
662 do_integer_constant_value(bool, mpz_t
, Type
**) const
665 // Return whether this is a constant expression of floating point
666 // type, and set VAL to the value.
668 do_float_constant_value(mpfr_t
, Type
**) const
671 // Return whether this is a constant expression of complex type, and
672 // set REAL and IMAGE to the value.
674 do_complex_constant_value(mpfr_t
, mpfr_t
, Type
**) const
677 // Return whether this is a constant expression of string type, and
678 // set VAL to the value.
680 do_string_constant_value(std::string
*) const
683 // Called by the parser if the value is being discarded.
685 do_discarding_value();
687 // Child class holds type.
691 // Child class implements determining type information.
693 do_determine_type(const Type_context
*) = 0;
695 // Child class implements type checking if needed.
697 do_check_types(Gogo
*)
700 // Child class implements copying.
704 // Child class implements whether the expression is addressable.
706 do_is_addressable() const
709 // Child class implements taking the address of an expression.
711 do_address_taken(bool)
714 // Child class implements whether this expression must be evaluated
717 do_must_eval_in_order() const
720 // Child class implements conversion to tree.
722 do_get_tree(Translate_context
*) = 0;
724 // Child class implements export.
726 do_export(Export
*) const;
728 // For children to call to warn about an unused value.
730 warn_about_unused_value();
732 // For children to call when they detect that they are in error.
736 // For children to call to report an error conveniently.
738 report_error(const char*);
740 // Child class implements dumping to a dump context.
742 do_dump_expression(Ast_dump_context
*) const = 0;
745 // Convert to the desired statement classification, or return NULL.
746 // This is a controlled dynamic cast.
747 template<typename Expression_class
,
748 Expression_classification expr_classification
>
752 return (this->classification_
== expr_classification
753 ? static_cast<Expression_class
*>(this)
757 template<typename Expression_class
,
758 Expression_classification expr_classification
>
759 const Expression_class
*
762 return (this->classification_
== expr_classification
763 ? static_cast<const Expression_class
*>(this)
768 convert_type_to_interface(Translate_context
*, Type
*, Type
*, tree
,
772 get_interface_type_descriptor(Translate_context
*, Type
*, tree
,
776 convert_interface_to_type(Translate_context
*, Type
*, Type
*, tree
,
779 // The expression classification.
780 Expression_classification classification_
;
781 // The location in the input file.
782 source_location location_
;
785 // A list of Expressions.
787 class Expression_list
794 // Return whether the list is empty.
797 { return this->entries_
.empty(); }
799 // Return the number of entries in the list.
802 { return this->entries_
.size(); }
804 // Add an entry to the end of the list.
806 push_back(Expression
* expr
)
807 { this->entries_
.push_back(expr
); }
810 append(Expression_list
* add
)
811 { this->entries_
.insert(this->entries_
.end(), add
->begin(), add
->end()); }
813 // Reserve space in the list.
816 { this->entries_
.reserve(size
); }
818 // Traverse the expressions in the list.
826 // Return true if the list contains an error expression.
828 contains_error() const;
830 // Return the first and last elements.
833 { return this->entries_
.front(); }
837 { return this->entries_
.front(); }
841 { return this->entries_
.back(); }
845 { return this->entries_
.back(); }
849 typedef std::vector
<Expression
*>::iterator iterator
;
850 typedef std::vector
<Expression
*>::const_iterator const_iterator
;
854 { return this->entries_
.begin(); }
858 { return this->entries_
.begin(); }
862 { return this->entries_
.end(); }
866 { return this->entries_
.end(); }
871 { this->entries_
.erase(p
); }
874 std::vector
<Expression
*> entries_
;
877 // An abstract base class for an expression which is only used by the
878 // parser, and is lowered in the lowering pass.
880 class Parser_expression
: public Expression
883 Parser_expression(Expression_classification classification
,
884 source_location location
)
885 : Expression(classification
, location
)
890 do_lower(Gogo
*, Named_object
*, Statement_inserter
*, int) = 0;
896 do_determine_type(const Type_context
*)
897 { go_unreachable(); }
900 do_check_types(Gogo
*)
901 { go_unreachable(); }
904 do_get_tree(Translate_context
*)
905 { go_unreachable(); }
908 // An expression which is simply a variable.
910 class Var_expression
: public Expression
913 Var_expression(Named_object
* variable
, source_location location
)
914 : Expression(EXPRESSION_VAR_REFERENCE
, location
),
918 // Return the variable.
921 { return this->variable_
; }
925 do_lower(Gogo
*, Named_object
*, Statement_inserter
*, int);
931 do_determine_type(const Type_context
*);
938 do_is_addressable() const
942 do_address_taken(bool);
945 do_get_tree(Translate_context
*);
948 do_dump_expression(Ast_dump_context
*) const;
951 // The variable we are referencing.
952 Named_object
* variable_
;
955 // A reference to a temporary variable.
957 class Temporary_reference_expression
: public Expression
960 Temporary_reference_expression(Temporary_statement
* statement
,
961 source_location location
)
962 : Expression(EXPRESSION_TEMPORARY_REFERENCE
, location
),
963 statement_(statement
), is_lvalue_(false)
966 // Indicate that this reference appears on the left hand side of an
967 // assignment statement.
970 { this->is_lvalue_
= true; }
977 do_determine_type(const Type_context
*)
982 { return make_temporary_reference(this->statement_
, this->location()); }
985 do_is_addressable() const
989 do_address_taken(bool);
992 do_get_tree(Translate_context
*);
995 do_dump_expression(Ast_dump_context
*) const;
998 // The statement where the temporary variable is defined.
999 Temporary_statement
* statement_
;
1000 // Whether this reference appears on the left hand side of an
1001 // assignment statement.
1005 // A string expression.
1007 class String_expression
: public Expression
1010 String_expression(const std::string
& val
, source_location location
)
1011 : Expression(EXPRESSION_STRING
, location
),
1012 val_(val
), type_(NULL
)
1017 { return this->val_
; }
1024 do_is_constant() const
1028 do_string_constant_value(std::string
* val
) const
1038 do_determine_type(const Type_context
*);
1045 do_get_tree(Translate_context
*);
1047 // Write string literal to a string dump.
1049 export_string(String_dump
* exp
, const String_expression
* str
);
1052 do_export(Export
*) const;
1055 do_dump_expression(Ast_dump_context
*) const;
1058 // The string value. This is immutable.
1059 const std::string val_
;
1060 // The type as determined by context.
1064 // A binary expression.
1066 class Binary_expression
: public Expression
1069 Binary_expression(Operator op
, Expression
* left
, Expression
* right
,
1070 source_location location
)
1071 : Expression(EXPRESSION_BINARY
, location
),
1072 op_(op
), left_(left
), right_(right
)
1075 // Return the operator.
1078 { return this->op_
; }
1080 // Return the left hand expression.
1083 { return this->left_
; }
1085 // Return the right hand expression.
1088 { return this->right_
; }
1090 // Apply binary opcode OP to LEFT_VAL and RIGHT_VAL, setting VAL.
1091 // LEFT_TYPE is the type of LEFT_VAL, RIGHT_TYPE is the type of
1092 // RIGHT_VAL; LEFT_TYPE and/or RIGHT_TYPE may be NULL. Return true
1093 // if this could be done, false if not.
1095 eval_integer(Operator op
, Type
* left_type
, mpz_t left_val
,
1096 Type
* right_type
, mpz_t right_val
, source_location
,
1099 // Apply binary opcode OP to LEFT_VAL and RIGHT_VAL, setting VAL.
1100 // Return true if this could be done, false if not.
1102 eval_float(Operator op
, Type
* left_type
, mpfr_t left_val
,
1103 Type
* right_type
, mpfr_t right_val
, mpfr_t val
,
1106 // Apply binary opcode OP to LEFT_REAL/LEFT_IMAG and
1107 // RIGHT_REAL/RIGHT_IMAG, setting REAL/IMAG. Return true if this
1108 // could be done, false if not.
1110 eval_complex(Operator op
, Type
* left_type
, mpfr_t left_real
,
1111 mpfr_t left_imag
, Type
* right_type
, mpfr_t right_real
,
1112 mpfr_t right_imag
, mpfr_t real
, mpfr_t imag
, source_location
);
1114 // Compare integer constants according to OP.
1116 compare_integer(Operator op
, mpz_t left_val
, mpz_t right_val
);
1118 // Compare floating point constants according to OP.
1120 compare_float(Operator op
, Type
* type
, mpfr_t left_val
, mpfr_t right_val
);
1122 // Compare complex constants according to OP.
1124 compare_complex(Operator op
, Type
* type
, mpfr_t left_real
, mpfr_t left_imag
,
1125 mpfr_t right_val
, mpfr_t right_imag
);
1130 // Report an error if OP can not be applied to TYPE. Return whether
1133 check_operator_type(Operator op
, Type
* type
, source_location
);
1137 do_traverse(Traverse
* traverse
);
1140 do_lower(Gogo
*, Named_object
*, Statement_inserter
*, int);
1143 do_is_constant() const
1144 { return this->left_
->is_constant() && this->right_
->is_constant(); }
1147 do_integer_constant_value(bool, mpz_t val
, Type
**) const;
1150 do_float_constant_value(mpfr_t val
, Type
**) const;
1153 do_complex_constant_value(mpfr_t real
, mpfr_t imag
, Type
**) const;
1156 do_discarding_value();
1162 do_determine_type(const Type_context
*);
1165 do_check_types(Gogo
*);
1170 return Expression::make_binary(this->op_
, this->left_
->copy(),
1171 this->right_
->copy(), this->location());
1175 do_get_tree(Translate_context
*);
1178 do_export(Export
*) const;
1181 do_dump_expression(Ast_dump_context
*) const;
1184 // The binary operator to apply.
1186 // The left hand side operand.
1188 // The right hand side operand.
1192 // A call expression. The go statement needs to dig inside this.
1194 class Call_expression
: public Expression
1197 Call_expression(Expression
* fn
, Expression_list
* args
, bool is_varargs
,
1198 source_location location
)
1199 : Expression(EXPRESSION_CALL
, location
),
1200 fn_(fn
), args_(args
), type_(NULL
), results_(NULL
), tree_(NULL
),
1201 is_varargs_(is_varargs
), are_hidden_fields_ok_(false),
1202 varargs_are_lowered_(false), types_are_determined_(false),
1203 is_deferred_(false), issued_error_(false)
1206 // The function to call.
1209 { return this->fn_
; }
1214 { return this->args_
; }
1216 const Expression_list
*
1218 { return this->args_
; }
1220 // Get the function type.
1222 get_function_type() const;
1224 // Return the number of values this call will return.
1226 result_count() const;
1228 // Return the temporary variable which holds result I. This is only
1229 // valid after the expression has been lowered, and is only valid
1230 // for calls which return multiple results.
1231 Temporary_statement
*
1232 result(size_t i
) const;
1234 // Return whether this is a call to the predeclared function
1237 is_recover_call() const;
1239 // Set the argument for a call to recover.
1241 set_recover_arg(Expression
*);
1243 // Whether the last argument is a varargs argument (f(a...)).
1246 { return this->is_varargs_
; }
1248 // Note that varargs have already been lowered.
1250 set_varargs_are_lowered()
1251 { this->varargs_are_lowered_
= true; }
1253 // Note that it is OK for this call to set hidden fields when
1254 // passing arguments.
1256 set_hidden_fields_are_ok()
1257 { this->are_hidden_fields_ok_
= true; }
1259 // Whether this call is being deferred.
1262 { return this->is_deferred_
; }
1264 // Note that the call is being deferred.
1267 { this->is_deferred_
= true; }
1269 // We have found an error with this call expression; return true if
1270 // we should report it.
1276 do_traverse(Traverse
*);
1279 do_lower(Gogo
*, Named_object
*, Statement_inserter
*, int);
1282 do_discarding_value()
1289 do_determine_type(const Type_context
*);
1292 do_check_types(Gogo
*);
1297 return Expression::make_call(this->fn_
->copy(),
1298 (this->args_
== NULL
1300 : this->args_
->copy()),
1301 this->is_varargs_
, this->location());
1305 do_must_eval_in_order() const;
1308 do_get_tree(Translate_context
*);
1311 do_is_recover_call() const;
1314 do_set_recover_arg(Expression
*);
1316 // Let a builtin expression change the argument list.
1318 set_args(Expression_list
* args
)
1319 { this->args_
= args
; }
1321 // Let a builtin expression lower varargs.
1323 lower_varargs(Gogo
*, Named_object
* function
, Statement_inserter
* inserter
,
1324 Type
* varargs_type
, size_t param_count
);
1326 // Let a builtin expression check whether types have been
1329 determining_types();
1332 do_dump_expression(Ast_dump_context
*) const;
1336 check_argument_type(int, const Type
*, const Type
*, source_location
, bool);
1339 interface_method_function(Translate_context
*,
1340 Interface_field_reference_expression
*,
1344 set_results(Translate_context
*, tree
);
1346 // The function to call.
1348 // The arguments to pass. This may be NULL if there are no
1350 Expression_list
* args_
;
1351 // The type of the expression, to avoid recomputing it.
1353 // The list of temporaries which will hold the results if the
1354 // function returns a tuple.
1355 std::vector
<Temporary_statement
*>* results_
;
1356 // The tree for the call, used for a call which returns a tuple.
1358 // True if the last argument is a varargs argument (f(a...)).
1360 // True if this statement may pass hidden fields in the arguments.
1361 // This is used for generated method stubs.
1362 bool are_hidden_fields_ok_
;
1363 // True if varargs have already been lowered.
1364 bool varargs_are_lowered_
;
1365 // True if types have been determined.
1366 bool types_are_determined_
;
1367 // True if the call is an argument to a defer statement.
1369 // True if we reported an error about a mismatch between call
1370 // results and uses. This is to avoid producing multiple errors
1371 // when there are multiple Call_result_expressions.
1375 // An expression which represents a pointer to a function.
1377 class Func_expression
: public Expression
1380 Func_expression(Named_object
* function
, Expression
* closure
,
1381 source_location location
)
1382 : Expression(EXPRESSION_FUNC_REFERENCE
, location
),
1383 function_(function
), closure_(closure
)
1386 // Return the object associated with the function.
1388 named_object() const
1389 { return this->function_
; }
1391 // Return the closure for this function. This will return NULL if
1392 // the function has no closure, which is the normal case.
1395 { return this->closure_
; }
1397 // Return a tree for this function without evaluating the closure.
1399 get_tree_without_closure(Gogo
*);
1403 do_traverse(Traverse
*);
1409 do_determine_type(const Type_context
*)
1411 if (this->closure_
!= NULL
)
1412 this->closure_
->determine_type_no_context();
1418 return Expression::make_func_reference(this->function_
,
1419 (this->closure_
== NULL
1421 : this->closure_
->copy()),
1426 do_get_tree(Translate_context
*);
1429 do_dump_expression(Ast_dump_context
*) const;
1432 // The function itself.
1433 Named_object
* function_
;
1434 // A closure. This is normally NULL. For a nested function, it may
1435 // be a heap-allocated struct holding pointers to all the variables
1436 // referenced by this function and defined in enclosing functions.
1437 Expression
* closure_
;
1440 // A reference to an unknown name.
1442 class Unknown_expression
: public Parser_expression
1445 Unknown_expression(Named_object
* named_object
, source_location location
)
1446 : Parser_expression(EXPRESSION_UNKNOWN_REFERENCE
, location
),
1447 named_object_(named_object
), is_composite_literal_key_(false)
1450 // The associated named object.
1452 named_object() const
1453 { return this->named_object_
; }
1455 // The name of the identifier which was unknown.
1459 // Note that this expression is being used as the key in a composite
1460 // literal, so it may be OK if it is not resolved.
1462 set_is_composite_literal_key()
1463 { this->is_composite_literal_key_
= true; }
1465 // Note that this expression should no longer be treated as a
1466 // composite literal key.
1468 clear_is_composite_literal_key()
1469 { this->is_composite_literal_key_
= false; }
1473 do_lower(Gogo
*, Named_object
*, Statement_inserter
*, int);
1477 { return new Unknown_expression(this->named_object_
, this->location()); }
1480 do_dump_expression(Ast_dump_context
*) const;
1483 // The unknown name.
1484 Named_object
* named_object_
;
1485 // True if this is the key in a composite literal.
1486 bool is_composite_literal_key_
;
1489 // An index expression. This is lowered to an array index, a string
1490 // index, or a map index.
1492 class Index_expression
: public Parser_expression
1495 Index_expression(Expression
* left
, Expression
* start
, Expression
* end
,
1496 source_location location
)
1497 : Parser_expression(EXPRESSION_INDEX
, location
),
1498 left_(left
), start_(start
), end_(end
), is_lvalue_(false)
1501 // Record that this expression is an lvalue.
1504 { this->is_lvalue_
= true; }
1506 // Dump an index expression, i.e. an expression of the form
1507 // expr[expr] or expr[expr:expr], to a dump context.
1509 dump_index_expression(Ast_dump_context
*, const Expression
* expr
,
1510 const Expression
* start
, const Expression
* end
);
1514 do_traverse(Traverse
*);
1517 do_lower(Gogo
*, Named_object
*, Statement_inserter
*, int);
1522 return new Index_expression(this->left_
->copy(), this->start_
->copy(),
1525 : this->end_
->copy()),
1530 do_dump_expression(Ast_dump_context
*) const;
1533 // The expression being indexed.
1537 // The second index. This is NULL for an index, non-NULL for a
1540 // Whether this is being used as an l-value. We set this during the
1541 // parse because map index expressions need to know.
1545 // An index into a map.
1547 class Map_index_expression
: public Expression
1550 Map_index_expression(Expression
* map
, Expression
* index
,
1551 source_location location
)
1552 : Expression(EXPRESSION_MAP_INDEX
, location
),
1553 map_(map
), index_(index
), is_lvalue_(false),
1554 is_in_tuple_assignment_(false)
1560 { return this->map_
; }
1564 { return this->map_
; }
1566 // Return the index.
1569 { return this->index_
; }
1573 { return this->index_
; }
1575 // Get the type of the map being indexed.
1577 get_map_type() const;
1579 // Record that this map expression is an lvalue. The difference is
1580 // that an lvalue always inserts the key.
1583 { this->is_lvalue_
= true; }
1585 // Return whether this map expression occurs in an assignment to a
1588 is_in_tuple_assignment() const
1589 { return this->is_in_tuple_assignment_
; }
1591 // Record that this map expression occurs in an assignment to a pair
1594 set_is_in_tuple_assignment()
1595 { this->is_in_tuple_assignment_
= true; }
1597 // Return a tree for the map index. This returns a tree which
1598 // evaluates to a pointer to a value in the map. If INSERT is true,
1599 // the key will be inserted if not present, and the value pointer
1600 // will be zero initialized. If INSERT is false, and the key is not
1601 // present in the map, the pointer will be NULL.
1603 get_value_pointer(Translate_context
*, bool insert
);
1607 do_traverse(Traverse
*);
1613 do_determine_type(const Type_context
*);
1616 do_check_types(Gogo
*);
1621 return Expression::make_map_index(this->map_
->copy(),
1622 this->index_
->copy(),
1626 // A map index expression is an lvalue but it is not addressable.
1629 do_get_tree(Translate_context
*);
1632 do_dump_expression(Ast_dump_context
*) const;
1635 // The map we are looking into.
1639 // Whether this is an lvalue.
1641 // Whether this is in a tuple assignment to a pair of values.
1642 bool is_in_tuple_assignment_
;
1645 // An expression which represents a method bound to its first
1648 class Bound_method_expression
: public Expression
1651 Bound_method_expression(Expression
* expr
, Named_object
* method
,
1652 source_location location
)
1653 : Expression(EXPRESSION_BOUND_METHOD
, location
),
1654 expr_(expr
), expr_type_(NULL
), method_(method
)
1657 // Return the object which is the first argument.
1660 { return this->expr_
; }
1662 // Return the implicit type of the first argument. This will be
1663 // non-NULL when using a method from an anonymous field without
1664 // using an explicit stub.
1666 first_argument_type() const
1667 { return this->expr_type_
; }
1669 // Return the method function.
1672 { return this->method_
; }
1674 // Set the implicit type of the expression.
1676 set_first_argument_type(Type
* type
)
1677 { this->expr_type_
= type
; }
1681 do_traverse(Traverse
*);
1687 do_determine_type(const Type_context
*);
1690 do_check_types(Gogo
*);
1695 return new Bound_method_expression(this->expr_
->copy(), this->method_
,
1700 do_get_tree(Translate_context
*);
1703 do_dump_expression(Ast_dump_context
*) const;
1706 // The object used to find the method. This is passed to the method
1707 // as the first argument.
1709 // The implicit type of the object to pass to the method. This is
1710 // NULL in the normal case, non-NULL when using a method from an
1711 // anonymous field which does not require a stub.
1713 // The method itself.
1714 Named_object
* method_
;
1717 // A reference to a field in a struct.
1719 class Field_reference_expression
: public Expression
1722 Field_reference_expression(Expression
* expr
, unsigned int field_index
,
1723 source_location location
)
1724 : Expression(EXPRESSION_FIELD_REFERENCE
, location
),
1725 expr_(expr
), field_index_(field_index
)
1728 // Return the struct expression.
1731 { return this->expr_
; }
1733 // Return the field index.
1736 { return this->field_index_
; }
1738 // Set the struct expression. This is used when parsing.
1740 set_struct_expression(Expression
* expr
)
1742 go_assert(this->expr_
== NULL
);
1748 do_traverse(Traverse
* traverse
)
1749 { return Expression::traverse(&this->expr_
, traverse
); }
1755 do_determine_type(const Type_context
*)
1756 { this->expr_
->determine_type_no_context(); }
1759 do_check_types(Gogo
*);
1764 return Expression::make_field_reference(this->expr_
->copy(),
1770 do_is_addressable() const
1771 { return this->expr_
->is_addressable(); }
1774 do_get_tree(Translate_context
*);
1777 do_dump_expression(Ast_dump_context
*) const;
1780 // The expression we are looking into. This should have a type of
1783 // The zero-based index of the field we are retrieving.
1784 unsigned int field_index_
;
1787 // A reference to a field of an interface.
1789 class Interface_field_reference_expression
: public Expression
1792 Interface_field_reference_expression(Expression
* expr
,
1793 const std::string
& name
,
1794 source_location location
)
1795 : Expression(EXPRESSION_INTERFACE_FIELD_REFERENCE
, location
),
1796 expr_(expr
), name_(name
)
1799 // Return the expression for the interface object.
1802 { return this->expr_
; }
1804 // Return the name of the method to call.
1807 { return this->name_
; }
1809 // Return a tree for the pointer to the function to call, given a
1810 // tree for the expression.
1812 get_function_tree(Translate_context
*, tree
);
1814 // Return a tree for the first argument to pass to the interface
1815 // function, given a tree for the expression. This is the real
1816 // object associated with the interface object.
1818 get_underlying_object_tree(Translate_context
*, tree
);
1822 do_traverse(Traverse
* traverse
);
1828 do_determine_type(const Type_context
*);
1831 do_check_types(Gogo
*);
1836 return Expression::make_interface_field_reference(this->expr_
->copy(),
1842 do_get_tree(Translate_context
*);
1845 do_dump_expression(Ast_dump_context
*) const;
1848 // The expression for the interface object. This should have a type
1849 // of interface or pointer to interface.
1851 // The field we are retrieving--the name of the method.
1855 // A type guard expression.
1857 class Type_guard_expression
: public Expression
1860 Type_guard_expression(Expression
* expr
, Type
* type
, source_location location
)
1861 : Expression(EXPRESSION_TYPE_GUARD
, location
),
1862 expr_(expr
), type_(type
)
1865 // Return the expression to convert.
1868 { return this->expr_
; }
1870 // Return the type to which to convert.
1873 { return this->type_
; }
1877 do_traverse(Traverse
* traverse
);
1881 { return this->type_
; }
1884 do_determine_type(const Type_context
*)
1885 { this->expr_
->determine_type_no_context(); }
1888 do_check_types(Gogo
*);
1893 return new Type_guard_expression(this->expr_
->copy(), this->type_
,
1898 do_get_tree(Translate_context
*);
1901 do_dump_expression(Ast_dump_context
*) const;
1904 // The expression to convert.
1906 // The type to which to convert.
1910 // A receive expression.
1912 class Receive_expression
: public Expression
1915 Receive_expression(Expression
* channel
, source_location location
)
1916 : Expression(EXPRESSION_RECEIVE
, location
),
1917 channel_(channel
), for_select_(false)
1920 // Return the channel.
1923 { return this->channel_
; }
1925 // Note that this is for a select statement.
1928 { this->for_select_
= true; }
1932 do_traverse(Traverse
* traverse
)
1933 { return Expression::traverse(&this->channel_
, traverse
); }
1936 do_discarding_value()
1943 do_determine_type(const Type_context
*)
1944 { this->channel_
->determine_type_no_context(); }
1947 do_check_types(Gogo
*);
1952 return Expression::make_receive(this->channel_
->copy(), this->location());
1956 do_must_eval_in_order() const
1960 do_get_tree(Translate_context
*);
1963 do_dump_expression(Ast_dump_context
*) const;
1966 // The channel from which we are receiving.
1967 Expression
* channel_
;
1968 // Whether this is for a select statement.
1972 #endif // !defined(GO_EXPRESSIONS_H)