1 // expressions.cc -- Go frontend expression handling.
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.
11 #ifndef ENABLE_BUILD_WITH_CXX
20 #include "tree-iterator.h"
25 #ifndef ENABLE_BUILD_WITH_CXX
34 #include "statements.h"
38 #include "expressions.h"
43 Expression::Expression(Expression_classification classification,
45 : classification_(classification), location_(location)
49 Expression::~Expression()
53 // If this expression has a constant integer value, return it.
56 Expression::integer_constant_value(bool iota_is_constant, mpz_t val,
60 return this->do_integer_constant_value(iota_is_constant, val, ptype);
63 // If this expression has a constant floating point value, return it.
66 Expression::float_constant_value(mpfr_t val, Type** ptype) const
69 if (this->do_float_constant_value(val, ptype))
75 if (!this->do_integer_constant_value(false, ival, &t))
79 mpfr_set_z(val, ival, GMP_RNDN);
86 // If this expression has a constant complex value, return it.
89 Expression::complex_constant_value(mpfr_t real, mpfr_t imag,
93 if (this->do_complex_constant_value(real, imag, ptype))
96 if (this->float_constant_value(real, &t))
98 mpfr_set_ui(imag, 0, GMP_RNDN);
104 // Traverse the expressions.
107 Expression::traverse(Expression** pexpr, Traverse* traverse)
109 Expression* expr = *pexpr;
110 if ((traverse->traverse_mask() & Traverse::traverse_expressions) != 0)
112 int t = traverse->expression(pexpr);
113 if (t == TRAVERSE_EXIT)
114 return TRAVERSE_EXIT;
115 else if (t == TRAVERSE_SKIP_COMPONENTS)
116 return TRAVERSE_CONTINUE;
118 return expr->do_traverse(traverse);
121 // Traverse subexpressions of this expression.
124 Expression::traverse_subexpressions(Traverse* traverse)
126 return this->do_traverse(traverse);
129 // Default implementation for do_traverse for child classes.
132 Expression::do_traverse(Traverse*)
134 return TRAVERSE_CONTINUE;
137 // This virtual function is called by the parser if the value of this
138 // expression is being discarded. By default, we give an error.
139 // Expressions with side effects override.
142 Expression::do_discarding_value()
144 this->unused_value_error();
147 // This virtual function is called to export expressions. This will
148 // only be used by expressions which may be constant.
151 Expression::do_export(Export*) const
156 // Give an error saying that the value of the expression is not used.
159 Expression::unused_value_error()
161 error_at(this->location(), "value computed is not used");
164 // Note that this expression is an error. This is called by children
165 // when they discover an error.
168 Expression::set_is_error()
170 this->classification_ = EXPRESSION_ERROR;
173 // For children to call to report an error conveniently.
176 Expression::report_error(const char* msg)
178 error_at(this->location_, "%s", msg);
179 this->set_is_error();
182 // Set types of variables and constants. This is implemented by the
186 Expression::determine_type(const Type_context* context)
188 this->do_determine_type(context);
191 // Set types when there is no context.
194 Expression::determine_type_no_context()
196 Type_context context;
197 this->do_determine_type(&context);
200 // Return a tree handling any conversions which must be done during
204 Expression::convert_for_assignment(Translate_context* context, Type* lhs_type,
205 Type* rhs_type, tree rhs_tree,
208 if (lhs_type == rhs_type)
211 if (lhs_type->is_error() || rhs_type->is_error())
212 return error_mark_node;
214 if (rhs_tree == error_mark_node || TREE_TYPE(rhs_tree) == error_mark_node)
215 return error_mark_node;
217 Gogo* gogo = context->gogo();
219 tree lhs_type_tree = type_to_tree(lhs_type->get_backend(gogo));
220 if (lhs_type_tree == error_mark_node)
221 return error_mark_node;
223 if (lhs_type->interface_type() != NULL)
225 if (rhs_type->interface_type() == NULL)
226 return Expression::convert_type_to_interface(context, lhs_type,
230 return Expression::convert_interface_to_interface(context, lhs_type,
234 else if (rhs_type->interface_type() != NULL)
235 return Expression::convert_interface_to_type(context, lhs_type, rhs_type,
237 else if (lhs_type->is_slice_type() && rhs_type->is_nil_type())
239 // Assigning nil to an open array.
240 go_assert(TREE_CODE(lhs_type_tree) == RECORD_TYPE);
242 VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 3);
244 constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
245 tree field = TYPE_FIELDS(lhs_type_tree);
246 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
249 elt->value = fold_convert(TREE_TYPE(field), null_pointer_node);
251 elt = VEC_quick_push(constructor_elt, init, NULL);
252 field = DECL_CHAIN(field);
253 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
256 elt->value = fold_convert(TREE_TYPE(field), integer_zero_node);
258 elt = VEC_quick_push(constructor_elt, init, NULL);
259 field = DECL_CHAIN(field);
260 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
263 elt->value = fold_convert(TREE_TYPE(field), integer_zero_node);
265 tree val = build_constructor(lhs_type_tree, init);
266 TREE_CONSTANT(val) = 1;
270 else if (rhs_type->is_nil_type())
272 // The left hand side should be a pointer type at the tree
274 go_assert(POINTER_TYPE_P(lhs_type_tree));
275 return fold_convert(lhs_type_tree, null_pointer_node);
277 else if (lhs_type_tree == TREE_TYPE(rhs_tree))
279 // No conversion is needed.
282 else if (POINTER_TYPE_P(lhs_type_tree)
283 || INTEGRAL_TYPE_P(lhs_type_tree)
284 || SCALAR_FLOAT_TYPE_P(lhs_type_tree)
285 || COMPLEX_FLOAT_TYPE_P(lhs_type_tree))
286 return fold_convert_loc(location.gcc_location(), lhs_type_tree, rhs_tree);
287 else if (TREE_CODE(lhs_type_tree) == RECORD_TYPE
288 && TREE_CODE(TREE_TYPE(rhs_tree)) == RECORD_TYPE)
290 // This conversion must be permitted by Go, or we wouldn't have
292 go_assert(int_size_in_bytes(lhs_type_tree)
293 == int_size_in_bytes(TREE_TYPE(rhs_tree)));
294 return fold_build1_loc(location.gcc_location(), VIEW_CONVERT_EXPR,
295 lhs_type_tree, rhs_tree);
299 go_assert(useless_type_conversion_p(lhs_type_tree, TREE_TYPE(rhs_tree)));
304 // Return a tree for a conversion from a non-interface type to an
308 Expression::convert_type_to_interface(Translate_context* context,
309 Type* lhs_type, Type* rhs_type,
310 tree rhs_tree, Location location)
312 Gogo* gogo = context->gogo();
313 Interface_type* lhs_interface_type = lhs_type->interface_type();
314 bool lhs_is_empty = lhs_interface_type->is_empty();
316 // Since RHS_TYPE is a static type, we can create the interface
317 // method table at compile time.
319 // When setting an interface to nil, we just set both fields to
321 if (rhs_type->is_nil_type())
323 Btype* lhs_btype = lhs_type->get_backend(gogo);
324 return expr_to_tree(gogo->backend()->zero_expression(lhs_btype));
327 // This should have been checked already.
328 go_assert(lhs_interface_type->implements_interface(rhs_type, NULL));
330 tree lhs_type_tree = type_to_tree(lhs_type->get_backend(gogo));
331 if (lhs_type_tree == error_mark_node)
332 return error_mark_node;
334 // An interface is a tuple. If LHS_TYPE is an empty interface type,
335 // then the first field is the type descriptor for RHS_TYPE.
336 // Otherwise it is the interface method table for RHS_TYPE.
337 tree first_field_value;
339 first_field_value = rhs_type->type_descriptor_pointer(gogo, location);
342 // Build the interface method table for this interface and this
343 // object type: a list of function pointers for each interface
345 Named_type* rhs_named_type = rhs_type->named_type();
346 bool is_pointer = false;
347 if (rhs_named_type == NULL)
349 rhs_named_type = rhs_type->deref()->named_type();
353 if (rhs_named_type == NULL)
354 method_table = null_pointer_node;
357 rhs_named_type->interface_method_table(gogo, lhs_interface_type,
359 first_field_value = fold_convert_loc(location.gcc_location(),
360 const_ptr_type_node, method_table);
362 if (first_field_value == error_mark_node)
363 return error_mark_node;
365 // Start building a constructor for the value we will return.
367 VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 2);
369 constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
370 tree field = TYPE_FIELDS(lhs_type_tree);
371 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
372 (lhs_is_empty ? "__type_descriptor" : "__methods")) == 0);
374 elt->value = fold_convert_loc(location.gcc_location(), TREE_TYPE(field),
377 elt = VEC_quick_push(constructor_elt, init, NULL);
378 field = DECL_CHAIN(field);
379 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__object") == 0);
382 if (rhs_type->points_to() != NULL)
384 // We are assigning a pointer to the interface; the interface
385 // holds the pointer itself.
386 elt->value = rhs_tree;
387 return build_constructor(lhs_type_tree, init);
390 // We are assigning a non-pointer value to the interface; the
391 // interface gets a copy of the value in the heap.
393 tree object_size = TYPE_SIZE_UNIT(TREE_TYPE(rhs_tree));
395 tree space = gogo->allocate_memory(rhs_type, object_size, location);
396 space = fold_convert_loc(location.gcc_location(),
397 build_pointer_type(TREE_TYPE(rhs_tree)), space);
398 space = save_expr(space);
400 tree ref = build_fold_indirect_ref_loc(location.gcc_location(), space);
401 TREE_THIS_NOTRAP(ref) = 1;
402 tree set = fold_build2_loc(location.gcc_location(), MODIFY_EXPR,
403 void_type_node, ref, rhs_tree);
405 elt->value = fold_convert_loc(location.gcc_location(), TREE_TYPE(field),
408 return build2(COMPOUND_EXPR, lhs_type_tree, set,
409 build_constructor(lhs_type_tree, init));
412 // Return a tree for the type descriptor of RHS_TREE, which has
413 // interface type RHS_TYPE. If RHS_TREE is nil the result will be
417 Expression::get_interface_type_descriptor(Translate_context*,
418 Type* rhs_type, tree rhs_tree,
421 tree rhs_type_tree = TREE_TYPE(rhs_tree);
422 go_assert(TREE_CODE(rhs_type_tree) == RECORD_TYPE);
423 tree rhs_field = TYPE_FIELDS(rhs_type_tree);
424 tree v = build3(COMPONENT_REF, TREE_TYPE(rhs_field), rhs_tree, rhs_field,
426 if (rhs_type->interface_type()->is_empty())
428 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(rhs_field)),
429 "__type_descriptor") == 0);
433 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(rhs_field)), "__methods")
435 go_assert(POINTER_TYPE_P(TREE_TYPE(v)));
437 tree v1 = build_fold_indirect_ref_loc(location.gcc_location(), v);
438 go_assert(TREE_CODE(TREE_TYPE(v1)) == RECORD_TYPE);
439 tree f = TYPE_FIELDS(TREE_TYPE(v1));
440 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(f)), "__type_descriptor")
442 v1 = build3(COMPONENT_REF, TREE_TYPE(f), v1, f, NULL_TREE);
444 tree eq = fold_build2_loc(location.gcc_location(), EQ_EXPR, boolean_type_node,
445 v, fold_convert_loc(location.gcc_location(),
448 tree n = fold_convert_loc(location.gcc_location(), TREE_TYPE(v1),
450 return fold_build3_loc(location.gcc_location(), COND_EXPR, TREE_TYPE(v1),
454 // Return a tree for the conversion of an interface type to an
458 Expression::convert_interface_to_interface(Translate_context* context,
459 Type *lhs_type, Type *rhs_type,
460 tree rhs_tree, bool for_type_guard,
463 Gogo* gogo = context->gogo();
464 Interface_type* lhs_interface_type = lhs_type->interface_type();
465 bool lhs_is_empty = lhs_interface_type->is_empty();
467 tree lhs_type_tree = type_to_tree(lhs_type->get_backend(gogo));
468 if (lhs_type_tree == error_mark_node)
469 return error_mark_node;
471 // In the general case this requires runtime examination of the type
472 // method table to match it up with the interface methods.
474 // FIXME: If all of the methods in the right hand side interface
475 // also appear in the left hand side interface, then we don't need
476 // to do a runtime check, although we still need to build a new
479 // Get the type descriptor for the right hand side. This will be
480 // NULL for a nil interface.
482 if (!DECL_P(rhs_tree))
483 rhs_tree = save_expr(rhs_tree);
485 tree rhs_type_descriptor =
486 Expression::get_interface_type_descriptor(context, rhs_type, rhs_tree,
489 // The result is going to be a two element constructor.
491 VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 2);
493 constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
494 tree field = TYPE_FIELDS(lhs_type_tree);
499 // A type assertion fails when converting a nil interface.
500 tree lhs_type_descriptor = lhs_type->type_descriptor_pointer(gogo,
502 static tree assert_interface_decl;
503 tree call = Gogo::call_builtin(&assert_interface_decl,
505 "__go_assert_interface",
508 TREE_TYPE(lhs_type_descriptor),
510 TREE_TYPE(rhs_type_descriptor),
511 rhs_type_descriptor);
512 if (call == error_mark_node)
513 return error_mark_node;
514 // This will panic if the interface conversion fails.
515 TREE_NOTHROW(assert_interface_decl) = 0;
516 elt->value = fold_convert_loc(location.gcc_location(), TREE_TYPE(field),
519 else if (lhs_is_empty)
521 // A convertion to an empty interface always succeeds, and the
522 // first field is just the type descriptor of the object.
523 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
524 "__type_descriptor") == 0);
525 elt->value = fold_convert_loc(location.gcc_location(),
526 TREE_TYPE(field), rhs_type_descriptor);
530 // A conversion to a non-empty interface may fail, but unlike a
531 // type assertion converting nil will always succeed.
532 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__methods")
534 tree lhs_type_descriptor = lhs_type->type_descriptor_pointer(gogo,
536 static tree convert_interface_decl;
537 tree call = Gogo::call_builtin(&convert_interface_decl,
539 "__go_convert_interface",
542 TREE_TYPE(lhs_type_descriptor),
544 TREE_TYPE(rhs_type_descriptor),
545 rhs_type_descriptor);
546 if (call == error_mark_node)
547 return error_mark_node;
548 // This will panic if the interface conversion fails.
549 TREE_NOTHROW(convert_interface_decl) = 0;
550 elt->value = fold_convert_loc(location.gcc_location(), TREE_TYPE(field),
554 // The second field is simply the object pointer.
556 elt = VEC_quick_push(constructor_elt, init, NULL);
557 field = DECL_CHAIN(field);
558 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__object") == 0);
561 tree rhs_type_tree = TREE_TYPE(rhs_tree);
562 go_assert(TREE_CODE(rhs_type_tree) == RECORD_TYPE);
563 tree rhs_field = DECL_CHAIN(TYPE_FIELDS(rhs_type_tree));
564 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(rhs_field)), "__object") == 0);
565 elt->value = build3(COMPONENT_REF, TREE_TYPE(rhs_field), rhs_tree, rhs_field,
568 return build_constructor(lhs_type_tree, init);
571 // Return a tree for the conversion of an interface type to a
572 // non-interface type.
575 Expression::convert_interface_to_type(Translate_context* context,
576 Type *lhs_type, Type* rhs_type,
577 tree rhs_tree, Location location)
579 Gogo* gogo = context->gogo();
580 tree rhs_type_tree = TREE_TYPE(rhs_tree);
582 tree lhs_type_tree = type_to_tree(lhs_type->get_backend(gogo));
583 if (lhs_type_tree == error_mark_node)
584 return error_mark_node;
586 // Call a function to check that the type is valid. The function
587 // will panic with an appropriate runtime type error if the type is
590 tree lhs_type_descriptor = lhs_type->type_descriptor_pointer(gogo, location);
592 if (!DECL_P(rhs_tree))
593 rhs_tree = save_expr(rhs_tree);
595 tree rhs_type_descriptor =
596 Expression::get_interface_type_descriptor(context, rhs_type, rhs_tree,
599 tree rhs_inter_descriptor = rhs_type->type_descriptor_pointer(gogo,
602 static tree check_interface_type_decl;
603 tree call = Gogo::call_builtin(&check_interface_type_decl,
605 "__go_check_interface_type",
608 TREE_TYPE(lhs_type_descriptor),
610 TREE_TYPE(rhs_type_descriptor),
612 TREE_TYPE(rhs_inter_descriptor),
613 rhs_inter_descriptor);
614 if (call == error_mark_node)
615 return error_mark_node;
616 // This call will panic if the conversion is invalid.
617 TREE_NOTHROW(check_interface_type_decl) = 0;
619 // If the call succeeds, pull out the value.
620 go_assert(TREE_CODE(rhs_type_tree) == RECORD_TYPE);
621 tree rhs_field = DECL_CHAIN(TYPE_FIELDS(rhs_type_tree));
622 go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(rhs_field)), "__object") == 0);
623 tree val = build3(COMPONENT_REF, TREE_TYPE(rhs_field), rhs_tree, rhs_field,
626 // If the value is a pointer, then it is the value we want.
627 // Otherwise it points to the value.
628 if (lhs_type->points_to() == NULL)
630 val = fold_convert_loc(location.gcc_location(),
631 build_pointer_type(lhs_type_tree), val);
632 val = build_fold_indirect_ref_loc(location.gcc_location(), val);
635 return build2(COMPOUND_EXPR, lhs_type_tree, call,
636 fold_convert_loc(location.gcc_location(), lhs_type_tree, val));
639 // Convert an expression to a tree. This is implemented by the child
640 // class. Not that it is not in general safe to call this multiple
641 // times for a single expression, but that we don't catch such errors.
644 Expression::get_tree(Translate_context* context)
646 // The child may have marked this expression as having an error.
647 if (this->classification_ == EXPRESSION_ERROR)
648 return error_mark_node;
650 return this->do_get_tree(context);
653 // Return a tree for VAL in TYPE.
656 Expression::integer_constant_tree(mpz_t val, tree type)
658 if (type == error_mark_node)
659 return error_mark_node;
660 else if (TREE_CODE(type) == INTEGER_TYPE)
661 return double_int_to_tree(type,
662 mpz_get_double_int(type, val, true));
663 else if (TREE_CODE(type) == REAL_TYPE)
666 mpfr_init_set_z(fval, val, GMP_RNDN);
667 tree ret = Expression::float_constant_tree(fval, type);
671 else if (TREE_CODE(type) == COMPLEX_TYPE)
674 mpfr_init_set_z(fval, val, GMP_RNDN);
675 tree real = Expression::float_constant_tree(fval, TREE_TYPE(type));
677 tree imag = build_real_from_int_cst(TREE_TYPE(type),
679 return build_complex(type, real, imag);
685 // Return a tree for VAL in TYPE.
688 Expression::float_constant_tree(mpfr_t val, tree type)
690 if (type == error_mark_node)
691 return error_mark_node;
692 else if (TREE_CODE(type) == INTEGER_TYPE)
696 mpfr_get_z(ival, val, GMP_RNDN);
697 tree ret = Expression::integer_constant_tree(ival, type);
701 else if (TREE_CODE(type) == REAL_TYPE)
704 real_from_mpfr(&r1, val, type, GMP_RNDN);
706 real_convert(&r2, TYPE_MODE(type), &r1);
707 return build_real(type, r2);
709 else if (TREE_CODE(type) == COMPLEX_TYPE)
712 real_from_mpfr(&r1, val, TREE_TYPE(type), GMP_RNDN);
714 real_convert(&r2, TYPE_MODE(TREE_TYPE(type)), &r1);
715 tree imag = build_real_from_int_cst(TREE_TYPE(type),
717 return build_complex(type, build_real(TREE_TYPE(type), r2), imag);
723 // Return a tree for REAL/IMAG in TYPE.
726 Expression::complex_constant_tree(mpfr_t real, mpfr_t imag, tree type)
728 if (type == error_mark_node)
729 return error_mark_node;
730 else if (TREE_CODE(type) == INTEGER_TYPE || TREE_CODE(type) == REAL_TYPE)
731 return Expression::float_constant_tree(real, type);
732 else if (TREE_CODE(type) == COMPLEX_TYPE)
735 real_from_mpfr(&r1, real, TREE_TYPE(type), GMP_RNDN);
737 real_convert(&r2, TYPE_MODE(TREE_TYPE(type)), &r1);
740 real_from_mpfr(&r3, imag, TREE_TYPE(type), GMP_RNDN);
742 real_convert(&r4, TYPE_MODE(TREE_TYPE(type)), &r3);
744 return build_complex(type, build_real(TREE_TYPE(type), r2),
745 build_real(TREE_TYPE(type), r4));
751 // Return a tree which evaluates to true if VAL, of arbitrary integer
752 // type, is negative or is more than the maximum value of BOUND_TYPE.
753 // If SOFAR is not NULL, it is or'red into the result. The return
754 // value may be NULL if SOFAR is NULL.
757 Expression::check_bounds(tree val, tree bound_type, tree sofar,
760 tree val_type = TREE_TYPE(val);
761 tree ret = NULL_TREE;
763 if (!TYPE_UNSIGNED(val_type))
765 ret = fold_build2_loc(loc.gcc_location(), LT_EXPR, boolean_type_node, val,
766 build_int_cst(val_type, 0));
767 if (ret == boolean_false_node)
771 HOST_WIDE_INT val_type_size = int_size_in_bytes(val_type);
772 HOST_WIDE_INT bound_type_size = int_size_in_bytes(bound_type);
773 go_assert(val_type_size != -1 && bound_type_size != -1);
774 if (val_type_size > bound_type_size
775 || (val_type_size == bound_type_size
776 && TYPE_UNSIGNED(val_type)
777 && !TYPE_UNSIGNED(bound_type)))
779 tree max = TYPE_MAX_VALUE(bound_type);
780 tree big = fold_build2_loc(loc.gcc_location(), GT_EXPR, boolean_type_node,
781 val, fold_convert_loc(loc.gcc_location(),
783 if (big == boolean_false_node)
785 else if (ret == NULL_TREE)
788 ret = fold_build2_loc(loc.gcc_location(), TRUTH_OR_EXPR,
789 boolean_type_node, ret, big);
792 if (ret == NULL_TREE)
794 else if (sofar == NULL_TREE)
797 return fold_build2_loc(loc.gcc_location(), TRUTH_OR_EXPR, boolean_type_node,
802 Expression::dump_expression(Ast_dump_context* ast_dump_context) const
804 this->do_dump_expression(ast_dump_context);
807 // Error expressions. This are used to avoid cascading errors.
809 class Error_expression : public Expression
812 Error_expression(Location location)
813 : Expression(EXPRESSION_ERROR, location)
818 do_is_constant() const
822 do_integer_constant_value(bool, mpz_t val, Type**) const
829 do_float_constant_value(mpfr_t val, Type**) const
831 mpfr_set_ui(val, 0, GMP_RNDN);
836 do_complex_constant_value(mpfr_t real, mpfr_t imag, Type**) const
838 mpfr_set_ui(real, 0, GMP_RNDN);
839 mpfr_set_ui(imag, 0, GMP_RNDN);
844 do_discarding_value()
849 { return Type::make_error_type(); }
852 do_determine_type(const Type_context*)
860 do_is_addressable() const
864 do_get_tree(Translate_context*)
865 { return error_mark_node; }
868 do_dump_expression(Ast_dump_context*) const;
871 // Dump the ast representation for an error expression to a dump context.
874 Error_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
876 ast_dump_context->ostream() << "_Error_" ;
880 Expression::make_error(Location location)
882 return new Error_expression(location);
885 // An expression which is really a type. This is used during parsing.
886 // It is an error if these survive after lowering.
889 Type_expression : public Expression
892 Type_expression(Type* type, Location location)
893 : Expression(EXPRESSION_TYPE, location),
899 do_traverse(Traverse* traverse)
900 { return Type::traverse(this->type_, traverse); }
904 { return this->type_; }
907 do_determine_type(const Type_context*)
911 do_check_types(Gogo*)
912 { this->report_error(_("invalid use of type")); }
919 do_get_tree(Translate_context*)
920 { go_unreachable(); }
922 void do_dump_expression(Ast_dump_context*) const;
925 // The type which we are representing as an expression.
930 Type_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
932 ast_dump_context->dump_type(this->type_);
936 Expression::make_type(Type* type, Location location)
938 return new Type_expression(type, location);
941 // Class Parser_expression.
944 Parser_expression::do_type()
946 // We should never really ask for the type of a Parser_expression.
947 // However, it can happen, at least when we have an invalid const
948 // whose initializer refers to the const itself. In that case we
949 // may ask for the type when lowering the const itself.
950 go_assert(saw_errors());
951 return Type::make_error_type();
954 // Class Var_expression.
956 // Lower a variable expression. Here we just make sure that the
957 // initialization expression of the variable has been lowered. This
958 // ensures that we will be able to determine the type of the variable
962 Var_expression::do_lower(Gogo* gogo, Named_object* function,
963 Statement_inserter* inserter, int)
965 if (this->variable_->is_variable())
967 Variable* var = this->variable_->var_value();
968 // This is either a local variable or a global variable. A
969 // reference to a variable which is local to an enclosing
970 // function will be a reference to a field in a closure.
971 if (var->is_global())
976 var->lower_init_expression(gogo, function, inserter);
981 // Return the type of a reference to a variable.
984 Var_expression::do_type()
986 if (this->variable_->is_variable())
987 return this->variable_->var_value()->type();
988 else if (this->variable_->is_result_variable())
989 return this->variable_->result_var_value()->type();
994 // Determine the type of a reference to a variable.
997 Var_expression::do_determine_type(const Type_context*)
999 if (this->variable_->is_variable())
1000 this->variable_->var_value()->determine_type();
1003 // Something takes the address of this variable. This means that we
1004 // may want to move the variable onto the heap.
1007 Var_expression::do_address_taken(bool escapes)
1011 if (this->variable_->is_variable())
1012 this->variable_->var_value()->set_non_escaping_address_taken();
1013 else if (this->variable_->is_result_variable())
1014 this->variable_->result_var_value()->set_non_escaping_address_taken();
1020 if (this->variable_->is_variable())
1021 this->variable_->var_value()->set_address_taken();
1022 else if (this->variable_->is_result_variable())
1023 this->variable_->result_var_value()->set_address_taken();
1029 // Get the tree for a reference to a variable.
1032 Var_expression::do_get_tree(Translate_context* context)
1034 Bvariable* bvar = this->variable_->get_backend_variable(context->gogo(),
1035 context->function());
1036 tree ret = var_to_tree(bvar);
1037 if (ret == error_mark_node)
1038 return error_mark_node;
1040 if (this->variable_->is_variable())
1041 is_in_heap = this->variable_->var_value()->is_in_heap();
1042 else if (this->variable_->is_result_variable())
1043 is_in_heap = this->variable_->result_var_value()->is_in_heap();
1048 ret = build_fold_indirect_ref_loc(this->location().gcc_location(), ret);
1049 TREE_THIS_NOTRAP(ret) = 1;
1054 // Ast dump for variable expression.
1057 Var_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
1059 ast_dump_context->ostream() << this->variable_->name() ;
1062 // Make a reference to a variable in an expression.
1065 Expression::make_var_reference(Named_object* var, Location location)
1068 return Expression::make_sink(location);
1070 // FIXME: Creating a new object for each reference to a variable is
1072 return new Var_expression(var, location);
1075 // Class Temporary_reference_expression.
1080 Temporary_reference_expression::do_type()
1082 return this->statement_->type();
1085 // Called if something takes the address of this temporary variable.
1086 // We never have to move temporary variables to the heap, but we do
1087 // need to know that they must live in the stack rather than in a
1091 Temporary_reference_expression::do_address_taken(bool)
1093 this->statement_->set_is_address_taken();
1096 // Get a tree referring to the variable.
1099 Temporary_reference_expression::do_get_tree(Translate_context* context)
1101 Bvariable* bvar = this->statement_->get_backend_variable(context);
1103 // The gcc backend can't represent the same set of recursive types
1104 // that the Go frontend can. In some cases this means that a
1105 // temporary variable won't have the right backend type. Correct
1106 // that here by adding a type cast. We need to use base() to push
1107 // the circularity down one level.
1108 tree ret = var_to_tree(bvar);
1109 if (!this->is_lvalue_
1110 && POINTER_TYPE_P(TREE_TYPE(ret))
1111 && VOID_TYPE_P(TREE_TYPE(TREE_TYPE(ret))))
1113 Btype* type_btype = this->type()->base()->get_backend(context->gogo());
1114 tree type_tree = type_to_tree(type_btype);
1115 ret = fold_convert_loc(this->location().gcc_location(), type_tree, ret);
1120 // Ast dump for temporary reference.
1123 Temporary_reference_expression::do_dump_expression(
1124 Ast_dump_context* ast_dump_context) const
1126 ast_dump_context->dump_temp_variable_name(this->statement_);
1129 // Make a reference to a temporary variable.
1131 Temporary_reference_expression*
1132 Expression::make_temporary_reference(Temporary_statement* statement,
1135 return new Temporary_reference_expression(statement, location);
1138 // Class Set_and_use_temporary_expression.
1143 Set_and_use_temporary_expression::do_type()
1145 return this->statement_->type();
1148 // Take the address.
1151 Set_and_use_temporary_expression::do_address_taken(bool)
1153 this->statement_->set_is_address_taken();
1156 // Return the backend representation.
1159 Set_and_use_temporary_expression::do_get_tree(Translate_context* context)
1161 Bvariable* bvar = this->statement_->get_backend_variable(context);
1162 tree var_tree = var_to_tree(bvar);
1163 tree expr_tree = this->expr_->get_tree(context);
1164 if (var_tree == error_mark_node || expr_tree == error_mark_node)
1165 return error_mark_node;
1166 Location loc = this->location();
1167 return build2_loc(loc.gcc_location(), COMPOUND_EXPR, TREE_TYPE(var_tree),
1168 build2_loc(loc.gcc_location(), MODIFY_EXPR, void_type_node,
1169 var_tree, expr_tree),
1176 Set_and_use_temporary_expression::do_dump_expression(
1177 Ast_dump_context* ast_dump_context) const
1179 ast_dump_context->ostream() << '(';
1180 ast_dump_context->dump_temp_variable_name(this->statement_);
1181 ast_dump_context->ostream() << " = ";
1182 this->expr_->dump_expression(ast_dump_context);
1183 ast_dump_context->ostream() << ')';
1186 // Make a set-and-use temporary.
1188 Set_and_use_temporary_expression*
1189 Expression::make_set_and_use_temporary(Temporary_statement* statement,
1190 Expression* expr, Location location)
1192 return new Set_and_use_temporary_expression(statement, expr, location);
1195 // A sink expression--a use of the blank identifier _.
1197 class Sink_expression : public Expression
1200 Sink_expression(Location location)
1201 : Expression(EXPRESSION_SINK, location),
1202 type_(NULL), var_(NULL_TREE)
1207 do_discarding_value()
1214 do_determine_type(const Type_context*);
1218 { return new Sink_expression(this->location()); }
1221 do_get_tree(Translate_context*);
1224 do_dump_expression(Ast_dump_context*) const;
1227 // The type of this sink variable.
1229 // The temporary variable we generate.
1233 // Return the type of a sink expression.
1236 Sink_expression::do_type()
1238 if (this->type_ == NULL)
1239 return Type::make_sink_type();
1243 // Determine the type of a sink expression.
1246 Sink_expression::do_determine_type(const Type_context* context)
1248 if (context->type != NULL)
1249 this->type_ = context->type;
1252 // Return a temporary variable for a sink expression. This will
1253 // presumably be a write-only variable which the middle-end will drop.
1256 Sink_expression::do_get_tree(Translate_context* context)
1258 if (this->var_ == NULL_TREE)
1260 go_assert(this->type_ != NULL && !this->type_->is_sink_type());
1261 Btype* bt = this->type_->get_backend(context->gogo());
1262 this->var_ = create_tmp_var(type_to_tree(bt), "blank");
1267 // Ast dump for sink expression.
1270 Sink_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
1272 ast_dump_context->ostream() << "_" ;
1275 // Make a sink expression.
1278 Expression::make_sink(Location location)
1280 return new Sink_expression(location);
1283 // Class Func_expression.
1285 // FIXME: Can a function expression appear in a constant expression?
1286 // The value is unchanging. Initializing a constant to the address of
1287 // a function seems like it could work, though there might be little
1293 Func_expression::do_traverse(Traverse* traverse)
1295 return (this->closure_ == NULL
1297 : Expression::traverse(&this->closure_, traverse));
1300 // Return the type of a function expression.
1303 Func_expression::do_type()
1305 if (this->function_->is_function())
1306 return this->function_->func_value()->type();
1307 else if (this->function_->is_function_declaration())
1308 return this->function_->func_declaration_value()->type();
1313 // Get the tree for a function expression without evaluating the
1317 Func_expression::get_tree_without_closure(Gogo* gogo)
1319 Function_type* fntype;
1320 if (this->function_->is_function())
1321 fntype = this->function_->func_value()->type();
1322 else if (this->function_->is_function_declaration())
1323 fntype = this->function_->func_declaration_value()->type();
1327 // Builtin functions are handled specially by Call_expression. We
1328 // can't take their address.
1329 if (fntype->is_builtin())
1331 error_at(this->location(),
1332 "invalid use of special builtin function %qs; must be called",
1333 this->function_->name().c_str());
1334 return error_mark_node;
1337 Named_object* no = this->function_;
1339 tree id = no->get_id(gogo);
1340 if (id == error_mark_node)
1341 return error_mark_node;
1344 if (no->is_function())
1345 fndecl = no->func_value()->get_or_make_decl(gogo, no, id);
1346 else if (no->is_function_declaration())
1347 fndecl = no->func_declaration_value()->get_or_make_decl(gogo, no, id);
1351 if (fndecl == error_mark_node)
1352 return error_mark_node;
1354 return build_fold_addr_expr_loc(this->location().gcc_location(), fndecl);
1357 // Get the tree for a function expression. This is used when we take
1358 // the address of a function rather than simply calling it. If the
1359 // function has a closure, we must use a trampoline.
1362 Func_expression::do_get_tree(Translate_context* context)
1364 Gogo* gogo = context->gogo();
1366 tree fnaddr = this->get_tree_without_closure(gogo);
1367 if (fnaddr == error_mark_node)
1368 return error_mark_node;
1370 go_assert(TREE_CODE(fnaddr) == ADDR_EXPR
1371 && TREE_CODE(TREE_OPERAND(fnaddr, 0)) == FUNCTION_DECL);
1372 TREE_ADDRESSABLE(TREE_OPERAND(fnaddr, 0)) = 1;
1374 // For a normal non-nested function call, that is all we have to do.
1375 if (!this->function_->is_function()
1376 || this->function_->func_value()->enclosing() == NULL)
1378 go_assert(this->closure_ == NULL);
1382 // For a nested function call, we have to always allocate a
1383 // trampoline. If we don't always allocate, then closures will not
1384 // be reliably distinct.
1385 Expression* closure = this->closure_;
1387 if (closure == NULL)
1388 closure_tree = null_pointer_node;
1391 // Get the value of the closure. This will be a pointer to
1392 // space allocated on the heap.
1393 closure_tree = closure->get_tree(context);
1394 if (closure_tree == error_mark_node)
1395 return error_mark_node;
1396 go_assert(POINTER_TYPE_P(TREE_TYPE(closure_tree)));
1399 // Now we need to build some code on the heap. This code will load
1400 // the static chain pointer with the closure and then jump to the
1401 // body of the function. The normal gcc approach is to build the
1402 // code on the stack. Unfortunately we can not do that, as Go
1403 // permits us to return the function pointer.
1405 return gogo->make_trampoline(fnaddr, closure_tree, this->location());
1408 // Ast dump for function.
1411 Func_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
1413 ast_dump_context->ostream() << this->function_->name();
1414 if (this->closure_ != NULL)
1416 ast_dump_context->ostream() << " {closure = ";
1417 this->closure_->dump_expression(ast_dump_context);
1418 ast_dump_context->ostream() << "}";
1422 // Make a reference to a function in an expression.
1425 Expression::make_func_reference(Named_object* function, Expression* closure,
1428 return new Func_expression(function, closure, location);
1431 // Class Unknown_expression.
1433 // Return the name of an unknown expression.
1436 Unknown_expression::name() const
1438 return this->named_object_->name();
1441 // Lower a reference to an unknown name.
1444 Unknown_expression::do_lower(Gogo*, Named_object*, Statement_inserter*, int)
1446 Location location = this->location();
1447 Named_object* no = this->named_object_;
1449 if (!no->is_unknown())
1453 real = no->unknown_value()->real_named_object();
1456 if (this->is_composite_literal_key_)
1458 if (!this->no_error_message_)
1459 error_at(location, "reference to undefined name %qs",
1460 this->named_object_->message_name().c_str());
1461 return Expression::make_error(location);
1464 switch (real->classification())
1466 case Named_object::NAMED_OBJECT_CONST:
1467 return Expression::make_const_reference(real, location);
1468 case Named_object::NAMED_OBJECT_TYPE:
1469 return Expression::make_type(real->type_value(), location);
1470 case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
1471 if (this->is_composite_literal_key_)
1473 if (!this->no_error_message_)
1474 error_at(location, "reference to undefined type %qs",
1475 real->message_name().c_str());
1476 return Expression::make_error(location);
1477 case Named_object::NAMED_OBJECT_VAR:
1478 real->var_value()->set_is_used();
1479 return Expression::make_var_reference(real, location);
1480 case Named_object::NAMED_OBJECT_FUNC:
1481 case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
1482 return Expression::make_func_reference(real, NULL, location);
1483 case Named_object::NAMED_OBJECT_PACKAGE:
1484 if (this->is_composite_literal_key_)
1486 if (!this->no_error_message_)
1487 error_at(location, "unexpected reference to package");
1488 return Expression::make_error(location);
1494 // Dump the ast representation for an unknown expression to a dump context.
1497 Unknown_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
1499 ast_dump_context->ostream() << "_Unknown_(" << this->named_object_->name()
1503 // Make a reference to an unknown name.
1506 Expression::make_unknown_reference(Named_object* no, Location location)
1508 return new Unknown_expression(no, location);
1511 // A boolean expression.
1513 class Boolean_expression : public Expression
1516 Boolean_expression(bool val, Location location)
1517 : Expression(EXPRESSION_BOOLEAN, location),
1518 val_(val), type_(NULL)
1526 do_is_constant() const
1533 do_determine_type(const Type_context*);
1540 do_get_tree(Translate_context*)
1541 { return this->val_ ? boolean_true_node : boolean_false_node; }
1544 do_export(Export* exp) const
1545 { exp->write_c_string(this->val_ ? "true" : "false"); }
1548 do_dump_expression(Ast_dump_context* ast_dump_context) const
1549 { ast_dump_context->ostream() << (this->val_ ? "true" : "false"); }
1554 // The type as determined by context.
1561 Boolean_expression::do_type()
1563 if (this->type_ == NULL)
1564 this->type_ = Type::make_boolean_type();
1568 // Set the type from the context.
1571 Boolean_expression::do_determine_type(const Type_context* context)
1573 if (this->type_ != NULL && !this->type_->is_abstract())
1575 else if (context->type != NULL && context->type->is_boolean_type())
1576 this->type_ = context->type;
1577 else if (!context->may_be_abstract)
1578 this->type_ = Type::lookup_bool_type();
1581 // Import a boolean constant.
1584 Boolean_expression::do_import(Import* imp)
1586 if (imp->peek_char() == 't')
1588 imp->require_c_string("true");
1589 return Expression::make_boolean(true, imp->location());
1593 imp->require_c_string("false");
1594 return Expression::make_boolean(false, imp->location());
1598 // Make a boolean expression.
1601 Expression::make_boolean(bool val, Location location)
1603 return new Boolean_expression(val, location);
1606 // Class String_expression.
1611 String_expression::do_type()
1613 if (this->type_ == NULL)
1614 this->type_ = Type::make_string_type();
1618 // Set the type from the context.
1621 String_expression::do_determine_type(const Type_context* context)
1623 if (this->type_ != NULL && !this->type_->is_abstract())
1625 else if (context->type != NULL && context->type->is_string_type())
1626 this->type_ = context->type;
1627 else if (!context->may_be_abstract)
1628 this->type_ = Type::lookup_string_type();
1631 // Build a string constant.
1634 String_expression::do_get_tree(Translate_context* context)
1636 return context->gogo()->go_string_constant_tree(this->val_);
1639 // Write string literal to string dump.
1642 String_expression::export_string(String_dump* exp,
1643 const String_expression* str)
1646 s.reserve(str->val_.length() * 4 + 2);
1648 for (std::string::const_iterator p = str->val_.begin();
1649 p != str->val_.end();
1652 if (*p == '\\' || *p == '"')
1657 else if (*p >= 0x20 && *p < 0x7f)
1659 else if (*p == '\n')
1661 else if (*p == '\t')
1666 unsigned char c = *p;
1667 unsigned int dig = c >> 4;
1668 s += dig < 10 ? '0' + dig : 'A' + dig - 10;
1670 s += dig < 10 ? '0' + dig : 'A' + dig - 10;
1674 exp->write_string(s);
1677 // Export a string expression.
1680 String_expression::do_export(Export* exp) const
1682 String_expression::export_string(exp, this);
1685 // Import a string expression.
1688 String_expression::do_import(Import* imp)
1690 imp->require_c_string("\"");
1694 int c = imp->get_char();
1695 if (c == '"' || c == -1)
1698 val += static_cast<char>(c);
1701 c = imp->get_char();
1702 if (c == '\\' || c == '"')
1703 val += static_cast<char>(c);
1710 c = imp->get_char();
1711 unsigned int vh = c >= '0' && c <= '9' ? c - '0' : c - 'A' + 10;
1712 c = imp->get_char();
1713 unsigned int vl = c >= '0' && c <= '9' ? c - '0' : c - 'A' + 10;
1714 char v = (vh << 4) | vl;
1719 error_at(imp->location(), "bad string constant");
1720 return Expression::make_error(imp->location());
1724 return Expression::make_string(val, imp->location());
1727 // Ast dump for string expression.
1730 String_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
1732 String_expression::export_string(ast_dump_context, this);
1735 // Make a string expression.
1738 Expression::make_string(const std::string& val, Location location)
1740 return new String_expression(val, location);
1743 // Make an integer expression.
1745 class Integer_expression : public Expression
1748 Integer_expression(const mpz_t* val, Type* type, bool is_character_constant,
1750 : Expression(EXPRESSION_INTEGER, location),
1751 type_(type), is_character_constant_(is_character_constant)
1752 { mpz_init_set(this->val_, *val); }
1757 // Return whether VAL fits in the type.
1759 check_constant(mpz_t val, Type*, Location);
1761 // Write VAL to string dump.
1763 export_integer(String_dump* exp, const mpz_t val);
1765 // Write VAL to dump context.
1767 dump_integer(Ast_dump_context* ast_dump_context, const mpz_t val);
1771 do_is_constant() const
1775 do_integer_constant_value(bool, mpz_t val, Type** ptype) const;
1781 do_determine_type(const Type_context* context);
1784 do_check_types(Gogo*);
1787 do_get_tree(Translate_context*);
1792 if (this->is_character_constant_)
1793 return Expression::make_character(&this->val_, this->type_,
1796 return Expression::make_integer(&this->val_, this->type_,
1801 do_export(Export*) const;
1804 do_dump_expression(Ast_dump_context*) const;
1807 // The integer value.
1811 // Whether this is a character constant.
1812 bool is_character_constant_;
1815 // Return an integer constant value.
1818 Integer_expression::do_integer_constant_value(bool, mpz_t val,
1821 if (this->type_ != NULL)
1822 *ptype = this->type_;
1823 mpz_set(val, this->val_);
1827 // Return the current type. If we haven't set the type yet, we return
1828 // an abstract integer type.
1831 Integer_expression::do_type()
1833 if (this->type_ == NULL)
1835 if (this->is_character_constant_)
1836 this->type_ = Type::make_abstract_character_type();
1838 this->type_ = Type::make_abstract_integer_type();
1843 // Set the type of the integer value. Here we may switch from an
1844 // abstract type to a real type.
1847 Integer_expression::do_determine_type(const Type_context* context)
1849 if (this->type_ != NULL && !this->type_->is_abstract())
1851 else if (context->type != NULL
1852 && (context->type->integer_type() != NULL
1853 || context->type->float_type() != NULL
1854 || context->type->complex_type() != NULL))
1855 this->type_ = context->type;
1856 else if (!context->may_be_abstract)
1858 if (this->is_character_constant_)
1859 this->type_ = Type::lookup_integer_type("int32");
1861 this->type_ = Type::lookup_integer_type("int");
1865 // Return true if the integer VAL fits in the range of the type TYPE.
1866 // Otherwise give an error and return false. TYPE may be NULL.
1869 Integer_expression::check_constant(mpz_t val, Type* type,
1874 Integer_type* itype = type->integer_type();
1875 if (itype == NULL || itype->is_abstract())
1878 int bits = mpz_sizeinbase(val, 2);
1880 if (itype->is_unsigned())
1882 // For an unsigned type we can only accept a nonnegative number,
1883 // and we must be able to represent at least BITS.
1884 if (mpz_sgn(val) >= 0
1885 && bits <= itype->bits())
1890 // For a signed type we need an extra bit to indicate the sign.
1891 // We have to handle the most negative integer specially.
1892 if (bits + 1 <= itype->bits()
1893 || (bits <= itype->bits()
1895 && (mpz_scan1(val, 0)
1896 == static_cast<unsigned long>(itype->bits() - 1))
1897 && mpz_scan0(val, itype->bits()) == ULONG_MAX))
1901 error_at(location, "integer constant overflow");
1905 // Check the type of an integer constant.
1908 Integer_expression::do_check_types(Gogo*)
1910 if (this->type_ == NULL)
1912 if (!Integer_expression::check_constant(this->val_, this->type_,
1914 this->set_is_error();
1917 // Get a tree for an integer constant.
1920 Integer_expression::do_get_tree(Translate_context* context)
1922 Gogo* gogo = context->gogo();
1924 if (this->type_ != NULL && !this->type_->is_abstract())
1925 type = type_to_tree(this->type_->get_backend(gogo));
1926 else if (this->type_ != NULL && this->type_->float_type() != NULL)
1928 // We are converting to an abstract floating point type.
1929 Type* ftype = Type::lookup_float_type("float64");
1930 type = type_to_tree(ftype->get_backend(gogo));
1932 else if (this->type_ != NULL && this->type_->complex_type() != NULL)
1934 // We are converting to an abstract complex type.
1935 Type* ctype = Type::lookup_complex_type("complex128");
1936 type = type_to_tree(ctype->get_backend(gogo));
1940 // If we still have an abstract type here, then this is being
1941 // used in a constant expression which didn't get reduced for
1942 // some reason. Use a type which will fit the value. We use <,
1943 // not <=, because we need an extra bit for the sign bit.
1944 int bits = mpz_sizeinbase(this->val_, 2);
1945 if (bits < INT_TYPE_SIZE)
1947 Type* t = Type::lookup_integer_type("int");
1948 type = type_to_tree(t->get_backend(gogo));
1952 Type* t = Type::lookup_integer_type("int64");
1953 type = type_to_tree(t->get_backend(gogo));
1956 type = long_long_integer_type_node;
1958 return Expression::integer_constant_tree(this->val_, type);
1961 // Write VAL to export data.
1964 Integer_expression::export_integer(String_dump* exp, const mpz_t val)
1966 char* s = mpz_get_str(NULL, 10, val);
1967 exp->write_c_string(s);
1971 // Export an integer in a constant expression.
1974 Integer_expression::do_export(Export* exp) const
1976 Integer_expression::export_integer(exp, this->val_);
1977 if (this->is_character_constant_)
1978 exp->write_c_string("'");
1979 // A trailing space lets us reliably identify the end of the number.
1980 exp->write_c_string(" ");
1983 // Import an integer, floating point, or complex value. This handles
1984 // all these types because they all start with digits.
1987 Integer_expression::do_import(Import* imp)
1989 std::string num = imp->read_identifier();
1990 imp->require_c_string(" ");
1991 if (!num.empty() && num[num.length() - 1] == 'i')
1994 size_t plus_pos = num.find('+', 1);
1995 size_t minus_pos = num.find('-', 1);
1997 if (plus_pos == std::string::npos)
1999 else if (minus_pos == std::string::npos)
2003 error_at(imp->location(), "bad number in import data: %qs",
2005 return Expression::make_error(imp->location());
2007 if (pos == std::string::npos)
2008 mpfr_set_ui(real, 0, GMP_RNDN);
2011 std::string real_str = num.substr(0, pos);
2012 if (mpfr_init_set_str(real, real_str.c_str(), 10, GMP_RNDN) != 0)
2014 error_at(imp->location(), "bad number in import data: %qs",
2016 return Expression::make_error(imp->location());
2020 std::string imag_str;
2021 if (pos == std::string::npos)
2024 imag_str = num.substr(pos);
2025 imag_str = imag_str.substr(0, imag_str.size() - 1);
2027 if (mpfr_init_set_str(imag, imag_str.c_str(), 10, GMP_RNDN) != 0)
2029 error_at(imp->location(), "bad number in import data: %qs",
2031 return Expression::make_error(imp->location());
2033 Expression* ret = Expression::make_complex(&real, &imag, NULL,
2039 else if (num.find('.') == std::string::npos
2040 && num.find('E') == std::string::npos)
2042 bool is_character_constant = (!num.empty()
2043 && num[num.length() - 1] == '\'');
2044 if (is_character_constant)
2045 num = num.substr(0, num.length() - 1);
2047 if (mpz_init_set_str(val, num.c_str(), 10) != 0)
2049 error_at(imp->location(), "bad number in import data: %qs",
2051 return Expression::make_error(imp->location());
2054 if (is_character_constant)
2055 ret = Expression::make_character(&val, NULL, imp->location());
2057 ret = Expression::make_integer(&val, NULL, imp->location());
2064 if (mpfr_init_set_str(val, num.c_str(), 10, GMP_RNDN) != 0)
2066 error_at(imp->location(), "bad number in import data: %qs",
2068 return Expression::make_error(imp->location());
2070 Expression* ret = Expression::make_float(&val, NULL, imp->location());
2075 // Ast dump for integer expression.
2078 Integer_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
2080 if (this->is_character_constant_)
2081 ast_dump_context->ostream() << '\'';
2082 Integer_expression::export_integer(ast_dump_context, this->val_);
2083 if (this->is_character_constant_)
2084 ast_dump_context->ostream() << '\'';
2087 // Build a new integer value.
2090 Expression::make_integer(const mpz_t* val, Type* type, Location location)
2092 return new Integer_expression(val, type, false, location);
2095 // Build a new character constant value.
2098 Expression::make_character(const mpz_t* val, Type* type, Location location)
2100 return new Integer_expression(val, type, true, location);
2105 class Float_expression : public Expression
2108 Float_expression(const mpfr_t* val, Type* type, Location location)
2109 : Expression(EXPRESSION_FLOAT, location),
2112 mpfr_init_set(this->val_, *val, GMP_RNDN);
2115 // Constrain VAL to fit into TYPE.
2117 constrain_float(mpfr_t val, Type* type);
2119 // Return whether VAL fits in the type.
2121 check_constant(mpfr_t val, Type*, Location);
2123 // Write VAL to export data.
2125 export_float(String_dump* exp, const mpfr_t val);
2127 // Write VAL to dump file.
2129 dump_float(Ast_dump_context* ast_dump_context, const mpfr_t val);
2133 do_is_constant() const
2137 do_float_constant_value(mpfr_t val, Type**) const;
2143 do_determine_type(const Type_context*);
2146 do_check_types(Gogo*);
2150 { return Expression::make_float(&this->val_, this->type_,
2151 this->location()); }
2154 do_get_tree(Translate_context*);
2157 do_export(Export*) const;
2160 do_dump_expression(Ast_dump_context*) const;
2163 // The floating point value.
2169 // Constrain VAL to fit into TYPE.
2172 Float_expression::constrain_float(mpfr_t val, Type* type)
2174 Float_type* ftype = type->float_type();
2175 if (ftype != NULL && !ftype->is_abstract())
2176 mpfr_prec_round(val, ftype->bits(), GMP_RNDN);
2179 // Return a floating point constant value.
2182 Float_expression::do_float_constant_value(mpfr_t val, Type** ptype) const
2184 if (this->type_ != NULL)
2185 *ptype = this->type_;
2186 mpfr_set(val, this->val_, GMP_RNDN);
2190 // Return the current type. If we haven't set the type yet, we return
2191 // an abstract float type.
2194 Float_expression::do_type()
2196 if (this->type_ == NULL)
2197 this->type_ = Type::make_abstract_float_type();
2201 // Set the type of the float value. Here we may switch from an
2202 // abstract type to a real type.
2205 Float_expression::do_determine_type(const Type_context* context)
2207 if (this->type_ != NULL && !this->type_->is_abstract())
2209 else if (context->type != NULL
2210 && (context->type->integer_type() != NULL
2211 || context->type->float_type() != NULL
2212 || context->type->complex_type() != NULL))
2213 this->type_ = context->type;
2214 else if (!context->may_be_abstract)
2215 this->type_ = Type::lookup_float_type("float64");
2218 // Return true if the floating point value VAL fits in the range of
2219 // the type TYPE. Otherwise give an error and return false. TYPE may
2223 Float_expression::check_constant(mpfr_t val, Type* type,
2228 Float_type* ftype = type->float_type();
2229 if (ftype == NULL || ftype->is_abstract())
2232 // A NaN or Infinity always fits in the range of the type.
2233 if (mpfr_nan_p(val) || mpfr_inf_p(val) || mpfr_zero_p(val))
2236 mp_exp_t exp = mpfr_get_exp(val);
2238 switch (ftype->bits())
2251 error_at(location, "floating point constant overflow");
2257 // Check the type of a float value.
2260 Float_expression::do_check_types(Gogo*)
2262 if (this->type_ == NULL)
2265 if (!Float_expression::check_constant(this->val_, this->type_,
2267 this->set_is_error();
2269 Integer_type* integer_type = this->type_->integer_type();
2270 if (integer_type != NULL)
2272 if (!mpfr_integer_p(this->val_))
2273 this->report_error(_("floating point constant truncated to integer"));
2276 go_assert(!integer_type->is_abstract());
2279 mpfr_get_z(ival, this->val_, GMP_RNDN);
2280 Integer_expression::check_constant(ival, integer_type,
2287 // Get a tree for a float constant.
2290 Float_expression::do_get_tree(Translate_context* context)
2292 Gogo* gogo = context->gogo();
2294 if (this->type_ != NULL && !this->type_->is_abstract())
2295 type = type_to_tree(this->type_->get_backend(gogo));
2296 else if (this->type_ != NULL && this->type_->integer_type() != NULL)
2298 // We have an abstract integer type. We just hope for the best.
2299 type = type_to_tree(Type::lookup_integer_type("int")->get_backend(gogo));
2303 // If we still have an abstract type here, then this is being
2304 // used in a constant expression which didn't get reduced. We
2305 // just use float64 and hope for the best.
2306 Type* ft = Type::lookup_float_type("float64");
2307 type = type_to_tree(ft->get_backend(gogo));
2309 return Expression::float_constant_tree(this->val_, type);
2312 // Write a floating point number to a string dump.
2315 Float_expression::export_float(String_dump *exp, const mpfr_t val)
2318 char* s = mpfr_get_str(NULL, &exponent, 10, 0, val, GMP_RNDN);
2320 exp->write_c_string("-");
2321 exp->write_c_string("0.");
2322 exp->write_c_string(*s == '-' ? s + 1 : s);
2325 snprintf(buf, sizeof buf, "E%ld", exponent);
2326 exp->write_c_string(buf);
2329 // Export a floating point number in a constant expression.
2332 Float_expression::do_export(Export* exp) const
2334 Float_expression::export_float(exp, this->val_);
2335 // A trailing space lets us reliably identify the end of the number.
2336 exp->write_c_string(" ");
2339 // Dump a floating point number to the dump file.
2342 Float_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
2344 Float_expression::export_float(ast_dump_context, this->val_);
2347 // Make a float expression.
2350 Expression::make_float(const mpfr_t* val, Type* type, Location location)
2352 return new Float_expression(val, type, location);
2357 class Complex_expression : public Expression
2360 Complex_expression(const mpfr_t* real, const mpfr_t* imag, Type* type,
2362 : Expression(EXPRESSION_COMPLEX, location),
2365 mpfr_init_set(this->real_, *real, GMP_RNDN);
2366 mpfr_init_set(this->imag_, *imag, GMP_RNDN);
2369 // Constrain REAL/IMAG to fit into TYPE.
2371 constrain_complex(mpfr_t real, mpfr_t imag, Type* type);
2373 // Return whether REAL/IMAG fits in the type.
2375 check_constant(mpfr_t real, mpfr_t imag, Type*, Location);
2377 // Write REAL/IMAG to string dump.
2379 export_complex(String_dump* exp, const mpfr_t real, const mpfr_t val);
2381 // Write REAL/IMAG to dump context.
2383 dump_complex(Ast_dump_context* ast_dump_context,
2384 const mpfr_t real, const mpfr_t val);
2388 do_is_constant() const
2392 do_complex_constant_value(mpfr_t real, mpfr_t imag, Type**) const;
2398 do_determine_type(const Type_context*);
2401 do_check_types(Gogo*);
2406 return Expression::make_complex(&this->real_, &this->imag_, this->type_,
2411 do_get_tree(Translate_context*);
2414 do_export(Export*) const;
2417 do_dump_expression(Ast_dump_context*) const;
2422 // The imaginary part;
2424 // The type if known.
2428 // Constrain REAL/IMAG to fit into TYPE.
2431 Complex_expression::constrain_complex(mpfr_t real, mpfr_t imag, Type* type)
2433 Complex_type* ctype = type->complex_type();
2434 if (ctype != NULL && !ctype->is_abstract())
2436 mpfr_prec_round(real, ctype->bits() / 2, GMP_RNDN);
2437 mpfr_prec_round(imag, ctype->bits() / 2, GMP_RNDN);
2441 // Return a complex constant value.
2444 Complex_expression::do_complex_constant_value(mpfr_t real, mpfr_t imag,
2447 if (this->type_ != NULL)
2448 *ptype = this->type_;
2449 mpfr_set(real, this->real_, GMP_RNDN);
2450 mpfr_set(imag, this->imag_, GMP_RNDN);
2454 // Return the current type. If we haven't set the type yet, we return
2455 // an abstract complex type.
2458 Complex_expression::do_type()
2460 if (this->type_ == NULL)
2461 this->type_ = Type::make_abstract_complex_type();
2465 // Set the type of the complex value. Here we may switch from an
2466 // abstract type to a real type.
2469 Complex_expression::do_determine_type(const Type_context* context)
2471 if (this->type_ != NULL && !this->type_->is_abstract())
2473 else if (context->type != NULL
2474 && context->type->complex_type() != NULL)
2475 this->type_ = context->type;
2476 else if (!context->may_be_abstract)
2477 this->type_ = Type::lookup_complex_type("complex128");
2480 // Return true if the complex value REAL/IMAG fits in the range of the
2481 // type TYPE. Otherwise give an error and return false. TYPE may be
2485 Complex_expression::check_constant(mpfr_t real, mpfr_t imag, Type* type,
2490 Complex_type* ctype = type->complex_type();
2491 if (ctype == NULL || ctype->is_abstract())
2495 switch (ctype->bits())
2507 // A NaN or Infinity always fits in the range of the type.
2508 if (!mpfr_nan_p(real) && !mpfr_inf_p(real) && !mpfr_zero_p(real))
2510 if (mpfr_get_exp(real) > max_exp)
2512 error_at(location, "complex real part constant overflow");
2517 if (!mpfr_nan_p(imag) && !mpfr_inf_p(imag) && !mpfr_zero_p(imag))
2519 if (mpfr_get_exp(imag) > max_exp)
2521 error_at(location, "complex imaginary part constant overflow");
2529 // Check the type of a complex value.
2532 Complex_expression::do_check_types(Gogo*)
2534 if (this->type_ == NULL)
2537 if (!Complex_expression::check_constant(this->real_, this->imag_,
2538 this->type_, this->location()))
2539 this->set_is_error();
2542 // Get a tree for a complex constant.
2545 Complex_expression::do_get_tree(Translate_context* context)
2547 Gogo* gogo = context->gogo();
2549 if (this->type_ != NULL && !this->type_->is_abstract())
2550 type = type_to_tree(this->type_->get_backend(gogo));
2553 // If we still have an abstract type here, this this is being
2554 // used in a constant expression which didn't get reduced. We
2555 // just use complex128 and hope for the best.
2556 Type* ct = Type::lookup_complex_type("complex128");
2557 type = type_to_tree(ct->get_backend(gogo));
2559 return Expression::complex_constant_tree(this->real_, this->imag_, type);
2562 // Write REAL/IMAG to export data.
2565 Complex_expression::export_complex(String_dump* exp, const mpfr_t real,
2568 if (!mpfr_zero_p(real))
2570 Float_expression::export_float(exp, real);
2571 if (mpfr_sgn(imag) > 0)
2572 exp->write_c_string("+");
2574 Float_expression::export_float(exp, imag);
2575 exp->write_c_string("i");
2578 // Export a complex number in a constant expression.
2581 Complex_expression::do_export(Export* exp) const
2583 Complex_expression::export_complex(exp, this->real_, this->imag_);
2584 // A trailing space lets us reliably identify the end of the number.
2585 exp->write_c_string(" ");
2588 // Dump a complex expression to the dump file.
2591 Complex_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
2593 Complex_expression::export_complex(ast_dump_context,
2598 // Make a complex expression.
2601 Expression::make_complex(const mpfr_t* real, const mpfr_t* imag, Type* type,
2604 return new Complex_expression(real, imag, type, location);
2607 // Find a named object in an expression.
2609 class Find_named_object : public Traverse
2612 Find_named_object(Named_object* no)
2613 : Traverse(traverse_expressions),
2614 no_(no), found_(false)
2617 // Whether we found the object.
2620 { return this->found_; }
2624 expression(Expression**);
2627 // The object we are looking for.
2629 // Whether we found it.
2633 // A reference to a const in an expression.
2635 class Const_expression : public Expression
2638 Const_expression(Named_object* constant, Location location)
2639 : Expression(EXPRESSION_CONST_REFERENCE, location),
2640 constant_(constant), type_(NULL), seen_(false)
2645 { return this->constant_; }
2647 // Check that the initializer does not refer to the constant itself.
2649 check_for_init_loop();
2653 do_traverse(Traverse*);
2656 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
2659 do_is_constant() const
2663 do_integer_constant_value(bool, mpz_t val, Type**) const;
2666 do_float_constant_value(mpfr_t val, Type**) const;
2669 do_complex_constant_value(mpfr_t real, mpfr_t imag, Type**) const;
2672 do_string_constant_value(std::string* val) const
2673 { return this->constant_->const_value()->expr()->string_constant_value(val); }
2678 // The type of a const is set by the declaration, not the use.
2680 do_determine_type(const Type_context*);
2683 do_check_types(Gogo*);
2690 do_get_tree(Translate_context* context);
2692 // When exporting a reference to a const as part of a const
2693 // expression, we export the value. We ignore the fact that it has
2696 do_export(Export* exp) const
2697 { this->constant_->const_value()->expr()->export_expression(exp); }
2700 do_dump_expression(Ast_dump_context*) const;
2704 Named_object* constant_;
2705 // The type of this reference. This is used if the constant has an
2708 // Used to prevent infinite recursion when a constant incorrectly
2709 // refers to itself.
2716 Const_expression::do_traverse(Traverse* traverse)
2718 if (this->type_ != NULL)
2719 return Type::traverse(this->type_, traverse);
2720 return TRAVERSE_CONTINUE;
2723 // Lower a constant expression. This is where we convert the
2724 // predeclared constant iota into an integer value.
2727 Const_expression::do_lower(Gogo* gogo, Named_object*,
2728 Statement_inserter*, int iota_value)
2730 if (this->constant_->const_value()->expr()->classification()
2733 if (iota_value == -1)
2735 error_at(this->location(),
2736 "iota is only defined in const declarations");
2740 mpz_init_set_ui(val, static_cast<unsigned long>(iota_value));
2741 Expression* ret = Expression::make_integer(&val, NULL,
2747 // Make sure that the constant itself has been lowered.
2748 gogo->lower_constant(this->constant_);
2753 // Return an integer constant value.
2756 Const_expression::do_integer_constant_value(bool iota_is_constant, mpz_t val,
2763 if (this->type_ != NULL)
2764 ctype = this->type_;
2766 ctype = this->constant_->const_value()->type();
2767 if (ctype != NULL && ctype->integer_type() == NULL)
2770 Expression* e = this->constant_->const_value()->expr();
2775 bool r = e->integer_constant_value(iota_is_constant, val, &t);
2777 this->seen_ = false;
2781 && !Integer_expression::check_constant(val, ctype, this->location()))
2784 *ptype = ctype != NULL ? ctype : t;
2788 // Return a floating point constant value.
2791 Const_expression::do_float_constant_value(mpfr_t val, Type** ptype) const
2797 if (this->type_ != NULL)
2798 ctype = this->type_;
2800 ctype = this->constant_->const_value()->type();
2801 if (ctype != NULL && ctype->float_type() == NULL)
2807 bool r = this->constant_->const_value()->expr()->float_constant_value(val,
2810 this->seen_ = false;
2812 if (r && ctype != NULL)
2814 if (!Float_expression::check_constant(val, ctype, this->location()))
2816 Float_expression::constrain_float(val, ctype);
2818 *ptype = ctype != NULL ? ctype : t;
2822 // Return a complex constant value.
2825 Const_expression::do_complex_constant_value(mpfr_t real, mpfr_t imag,
2832 if (this->type_ != NULL)
2833 ctype = this->type_;
2835 ctype = this->constant_->const_value()->type();
2836 if (ctype != NULL && ctype->complex_type() == NULL)
2842 bool r = this->constant_->const_value()->expr()->complex_constant_value(real,
2846 this->seen_ = false;
2848 if (r && ctype != NULL)
2850 if (!Complex_expression::check_constant(real, imag, ctype,
2853 Complex_expression::constrain_complex(real, imag, ctype);
2855 *ptype = ctype != NULL ? ctype : t;
2859 // Return the type of the const reference.
2862 Const_expression::do_type()
2864 if (this->type_ != NULL)
2867 Named_constant* nc = this->constant_->const_value();
2869 if (this->seen_ || nc->lowering())
2871 this->report_error(_("constant refers to itself"));
2872 this->type_ = Type::make_error_type();
2878 Type* ret = nc->type();
2882 this->seen_ = false;
2886 // During parsing, a named constant may have a NULL type, but we
2887 // must not return a NULL type here.
2888 ret = nc->expr()->type();
2890 this->seen_ = false;
2895 // Set the type of the const reference.
2898 Const_expression::do_determine_type(const Type_context* context)
2900 Type* ctype = this->constant_->const_value()->type();
2901 Type* cetype = (ctype != NULL
2903 : this->constant_->const_value()->expr()->type());
2904 if (ctype != NULL && !ctype->is_abstract())
2906 else if (context->type != NULL
2907 && (context->type->integer_type() != NULL
2908 || context->type->float_type() != NULL
2909 || context->type->complex_type() != NULL)
2910 && (cetype->integer_type() != NULL
2911 || cetype->float_type() != NULL
2912 || cetype->complex_type() != NULL))
2913 this->type_ = context->type;
2914 else if (context->type != NULL
2915 && context->type->is_string_type()
2916 && cetype->is_string_type())
2917 this->type_ = context->type;
2918 else if (context->type != NULL
2919 && context->type->is_boolean_type()
2920 && cetype->is_boolean_type())
2921 this->type_ = context->type;
2922 else if (!context->may_be_abstract)
2924 if (cetype->is_abstract())
2925 cetype = cetype->make_non_abstract_type();
2926 this->type_ = cetype;
2930 // Check for a loop in which the initializer of a constant refers to
2931 // the constant itself.
2934 Const_expression::check_for_init_loop()
2936 if (this->type_ != NULL && this->type_->is_error())
2941 this->report_error(_("constant refers to itself"));
2942 this->type_ = Type::make_error_type();
2946 Expression* init = this->constant_->const_value()->expr();
2947 Find_named_object find_named_object(this->constant_);
2950 Expression::traverse(&init, &find_named_object);
2951 this->seen_ = false;
2953 if (find_named_object.found())
2955 if (this->type_ == NULL || !this->type_->is_error())
2957 this->report_error(_("constant refers to itself"));
2958 this->type_ = Type::make_error_type();
2964 // Check types of a const reference.
2967 Const_expression::do_check_types(Gogo*)
2969 if (this->type_ != NULL && this->type_->is_error())
2972 this->check_for_init_loop();
2974 if (this->type_ == NULL || this->type_->is_abstract())
2977 // Check for integer overflow.
2978 if (this->type_->integer_type() != NULL)
2983 if (!this->integer_constant_value(true, ival, &dummy))
2987 Expression* cexpr = this->constant_->const_value()->expr();
2988 if (cexpr->float_constant_value(fval, &dummy))
2990 if (!mpfr_integer_p(fval))
2991 this->report_error(_("floating point constant "
2992 "truncated to integer"));
2995 mpfr_get_z(ival, fval, GMP_RNDN);
2996 Integer_expression::check_constant(ival, this->type_,
3006 // Return a tree for the const reference.
3009 Const_expression::do_get_tree(Translate_context* context)
3011 Gogo* gogo = context->gogo();
3013 if (this->type_ == NULL)
3014 type_tree = NULL_TREE;
3017 type_tree = type_to_tree(this->type_->get_backend(gogo));
3018 if (type_tree == error_mark_node)
3019 return error_mark_node;
3022 // If the type has been set for this expression, but the underlying
3023 // object is an abstract int or float, we try to get the abstract
3024 // value. Otherwise we may lose something in the conversion.
3025 if (this->type_ != NULL
3026 && (this->constant_->const_value()->type() == NULL
3027 || this->constant_->const_value()->type()->is_abstract()))
3029 Expression* expr = this->constant_->const_value()->expr();
3033 if (expr->integer_constant_value(true, ival, &t))
3035 tree ret = Expression::integer_constant_tree(ival, type_tree);
3043 if (expr->float_constant_value(fval, &t))
3045 tree ret = Expression::float_constant_tree(fval, type_tree);
3052 if (expr->complex_constant_value(fval, imag, &t))
3054 tree ret = Expression::complex_constant_tree(fval, imag, type_tree);
3063 tree const_tree = this->constant_->get_tree(gogo, context->function());
3064 if (this->type_ == NULL
3065 || const_tree == error_mark_node
3066 || TREE_TYPE(const_tree) == error_mark_node)
3070 if (TYPE_MAIN_VARIANT(type_tree) == TYPE_MAIN_VARIANT(TREE_TYPE(const_tree)))
3071 ret = fold_convert(type_tree, const_tree);
3072 else if (TREE_CODE(type_tree) == INTEGER_TYPE)
3073 ret = fold(convert_to_integer(type_tree, const_tree));
3074 else if (TREE_CODE(type_tree) == REAL_TYPE)
3075 ret = fold(convert_to_real(type_tree, const_tree));
3076 else if (TREE_CODE(type_tree) == COMPLEX_TYPE)
3077 ret = fold(convert_to_complex(type_tree, const_tree));
3083 // Dump ast representation for constant expression.
3086 Const_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const
3088 ast_dump_context->ostream() << this->constant_->name();
3091 // Make a reference to a constant in an expression.
3094 Expression::make_const_reference(Named_object* constant,
3097 return new Const_expression(constant, location);
3100 // Find a named object in an expression.
3103 Find_named_object::expression(Expression** pexpr)
3105 switch ((*pexpr)->classification())
3107 case Expression::EXPRESSION_CONST_REFERENCE:
3109 Const_expression* ce = static_cast<Const_expression*>(*pexpr);
3110 if (ce->named_object() == this->no_)
3113 // We need to check a constant initializer explicitly, as
3114 // loops here will not be caught by the loop checking for
3115 // variable initializers.
3116 ce->check_for_init_loop();
3118 return TRAVERSE_CONTINUE;
3121 case Expression::EXPRESSION_VAR_REFERENCE:
3122 if ((*pexpr)->var_expression()->named_object() == this->no_)
3124 return TRAVERSE_CONTINUE;
3125 case Expression::EXPRESSION_FUNC_REFERENCE:
3126 if ((*pexpr)->func_expression()->named_object() == this->no_)
3128 return TRAVERSE_CONTINUE;
3130 return TRAVERSE_CONTINUE;
3132 this->found_ = true;
3133 return TRAVERSE_EXIT;
3138 class Nil_expression : public Expression
3141 Nil_expression(Location location)
3142 : Expression(EXPRESSION_NIL, location)
3150 do_is_constant() const
3155 { return Type::make_nil_type(); }
3158 do_determine_type(const Type_context*)
3166 do_get_tree(Translate_context*)
3167 { return null_pointer_node; }
3170 do_export(Export* exp) const
3171 { exp->write_c_string("nil"); }
3174 do_dump_expression(Ast_dump_context* ast_dump_context) const
3175 { ast_dump_context->ostream() << "nil"; }
3178 // Import a nil expression.
3181 Nil_expression::do_import(Import* imp)
3183 imp->require_c_string("nil");
3184 return Expression::make_nil(imp->location());
3187 // Make a nil expression.
3190 Expression::make_nil(Location location)
3192 return new Nil_expression(location);
3195 // The value of the predeclared constant iota. This is little more
3196 // than a marker. This will be lowered to an integer in
3197 // Const_expression::do_lower, which is where we know the value that
3200 class Iota_expression : public Parser_expression
3203 Iota_expression(Location location)
3204 : Parser_expression(EXPRESSION_IOTA, location)
3209 do_lower(Gogo*, Named_object*, Statement_inserter*, int)
3210 { go_unreachable(); }
3212 // There should only ever be one of these.
3215 { go_unreachable(); }
3218 do_dump_expression(Ast_dump_context* ast_dump_context) const
3219 { ast_dump_context->ostream() << "iota"; }
3222 // Make an iota expression. This is only called for one case: the
3223 // value of the predeclared constant iota.
3226 Expression::make_iota()
3228 static Iota_expression iota_expression(Linemap::unknown_location());
3229 return &iota_expression;
3232 // A type conversion expression.
3234 class Type_conversion_expression : public Expression
3237 Type_conversion_expression(Type* type, Expression* expr,
3239 : Expression(EXPRESSION_CONVERSION, location),
3240 type_(type), expr_(expr), may_convert_function_types_(false)
3243 // Return the type to which we are converting.
3246 { return this->type_; }
3248 // Return the expression which we are converting.
3251 { return this->expr_; }
3253 // Permit converting from one function type to another. This is
3254 // used internally for method expressions.
3256 set_may_convert_function_types()
3258 this->may_convert_function_types_ = true;
3261 // Import a type conversion expression.
3267 do_traverse(Traverse* traverse);
3270 do_lower(Gogo*, Named_object*, Statement_inserter*, int);
3273 do_is_constant() const
3274 { return this->expr_->is_constant(); }
3277 do_integer_constant_value(bool, mpz_t, Type**) const;
3280 do_float_constant_value(mpfr_t, Type**) const;
3283 do_complex_constant_value(mpfr_t, mpfr_t, Type**) const;
3286 do_string_constant_value(std::string*) const;
3290 { return this->type_; }
3293 do_determine_type(const Type_context*)
3295 Type_context subcontext(this->type_, false);
3296 this->expr_->determine_type(&subcontext);
3300 do_check_types(Gogo*);
3305 return new Type_conversion_expression(this->type_, this->expr_->copy(),
3310 do_get_tree(Translate_context* context);
3313 do_export(Export*) const;
3316 do_dump_expression(Ast_dump_context*) const;
3319 // The type to convert to.
3321 // The expression to convert.
3323 // True if this is permitted to convert function types. This is
3324 // used internally for method expressions.
3325 bool may_convert_function_types_;
3331 Type_conversion_expression::do_traverse(Traverse* traverse)
3333 if (Expression::traverse(&this->expr_, traverse) == TRAVERSE_EXIT
3334 || Type::traverse(this->type_, traverse) == TRAVERSE_EXIT)
3335 return TRAVERSE_EXIT;
3336 return TRAVERSE_CONTINUE;
3339 // Convert to a constant at lowering time.
3342 Type_conversion_expression::do_lower(Gogo*, Named_object*,
3343 Statement_inserter*, int)
3345 Type* type = this->type_;
3346 Expression* val = this->expr_;
3347 Location location = this->location();
3349 if (type->integer_type() != NULL)
3354 if (val->integer_constant_value(false, ival, &dummy))
3356 if (!Integer_expression::check_constant(ival, type, location))
3357 mpz_set_ui(ival, 0);
3358 Expression* ret = Expression::make_integer(&ival, type, location);
3365 if (val->float_constant_value(fval, &dummy))
3367 if (!mpfr_integer_p(fval))
3370 "floating point constant truncated to integer");
3371 return Expression::make_error(location);
3373 mpfr_get_z(ival, fval, GMP_RNDN);
3374 if (!Integer_expression::check_constant(ival, type, location))
3375 mpz_set_ui(ival, 0);
3376 Expression* ret = Expression::make_integer(&ival, type, location);
3385 if (type->float_type() != NULL)
3390 if (val->float_constant_value(fval, &dummy))
3392 if (!Float_expression::check_constant(fval, type, location))
3393 mpfr_set_ui(fval, 0, GMP_RNDN);
3394 Float_expression::constrain_float(fval, type);
3395 Expression *ret = Expression::make_float(&fval, type, location);
3402 if (type->complex_type() != NULL)
3409 if (val->complex_constant_value(real, imag, &dummy))
3411 if (!Complex_expression::check_constant(real, imag, type, location))
3413 mpfr_set_ui(real, 0, GMP_RNDN);
3414 mpfr_set_ui(imag, 0, GMP_RNDN);
3416 Complex_expression::constrain_complex(real, imag, type);
3417 Expression* ret = Expression::make_complex(&real, &imag, type,
3427 if (type->is_slice_type())
3429 Type* element_type = type->array_type()->element_type()->forwarded();
3430 bool is_byte = (element_type->integer_type() != NULL
3431 && element_type->integer_type()->is_byte());
3432 bool is_rune = (element_type->integer_type() != NULL
3433 && element_type->integer_type()->is_rune());
3434 if (is_byte || is_rune)
3437 if (val->string_constant_value(&s))
3439 Expression_list* vals = new Expression_list();
3442 for (std::string::const_iterator p = s.begin();
3447 mpz_init_set_ui(val, static_cast<unsigned char>(*p));
3448 Expression* v = Expression::make_integer(&val,
3457 const char *p = s.data();
3458 const char *pend = s.data() + s.length();
3462 int adv = Lex::fetch_char(p, &c);
3465 warning_at(this->location(), 0,
3466 "invalid UTF-8 encoding");
3471 mpz_init_set_ui(val, c);
3472 Expression* v = Expression::make_integer(&val,
3480 return Expression::make_slice_composite_literal(type, vals,
3489 // Return the constant integer value if there is one.
3492 Type_conversion_expression::do_integer_constant_value(bool iota_is_constant,
3496 if (this->type_->integer_type() == NULL)
3502 if (this->expr_->integer_constant_value(iota_is_constant, ival, &dummy))
3504 if (!Integer_expression::check_constant(ival, this->type_,
3512 *ptype = this->type_;
3519 if (this->expr_->float_constant_value(fval, &dummy))
3521 mpfr_get_z(val, fval, GMP_RNDN);
3523 if (!Integer_expression::check_constant(val, this->type_,
3526 *ptype = this->type_;