@@ -3626,8 +3626,13 @@ Unary_expression::do_flatten(Gogo* gogo, Named_object*,
3626
3626
Type* ptype = this->expr_->type()->points_to();
3627
3627
if (!ptype->is_void_type())
3628
3628
{
3629
- Btype* pbtype = ptype->get_backend(gogo);
3630
- int64_t s = gogo->backend()->type_size(pbtype);
3629
+ int64_t s;
3630
+ bool ok = ptype->backend_type_size(gogo, &s);
3631
+ if (!ok)
3632
+ {
3633
+ go_assert(saw_errors());
3634
+ return Expression::make_error(this->location());
3635
+ }
3631
3636
if (s >= 4096 || this->issue_nil_check_)
3632
3637
{
3633
3638
Temporary_statement* temp =
@@ -4131,7 +4136,13 @@ Unary_expression::do_get_backend(Translate_context* context)
4131
4136
Btype* pbtype = ptype->get_backend(gogo);
4132
4137
if (!ptype->is_void_type())
4133
4138
{
4134
- int64_t s = gogo->backend()->type_size(pbtype);
4139
+ int64_t s;
4140
+ bool ok = ptype->backend_type_size(gogo, &s);
4141
+ if (!ok)
4142
+ {
4143
+ go_assert(saw_errors());
4144
+ return gogo->backend()->error_expression();
4145
+ }
4135
4146
if (s >= 4096 || this->issue_nil_check_)
4136
4147
{
4137
4148
go_assert(this->expr_->is_variable());
@@ -8339,8 +8350,14 @@ Builtin_call_expression::do_get_backend(Translate_context* context)
8339
8350
Expression::make_conditional(cond, arg1_len, arg2_len, location);
8340
8351
8341
8352
Type* element_type = at->element_type();
8342
- Btype* element_btype = element_type->get_backend(gogo);
8343
- int64_t element_size = gogo->backend()->type_size(element_btype);
8353
+ int64_t element_size;
8354
+ bool ok = element_type->backend_type_size(gogo, &element_size);
8355
+ if (!ok)
8356
+ {
8357
+ go_assert(saw_errors());
8358
+ return gogo->backend()->error_expression();
8359
+ }
8360
+
8344
8361
Expression* size_expr = Expression::make_integer_int64(element_size,
8345
8362
length->type(),
8346
8363
location);
@@ -8381,8 +8398,12 @@ Builtin_call_expression::do_get_backend(Translate_context* context)
8381
8398
{
8382
8399
arg2_val = at->get_value_pointer(gogo, arg2);
8383
8400
arg2_len = at->get_length(gogo, arg2);
8384
- Btype* element_btype = element_type->get_backend(gogo);
8385
- size = gogo->backend()->type_size(element_btype);
8401
+ bool ok = element_type->backend_type_size(gogo, &size);
8402
+ if (!ok)
8403
+ {
8404
+ go_assert(saw_errors());
8405
+ return gogo->backend()->error_expression();
8406
+ }
8386
8407
}
8387
8408
Expression* element_size =
8388
8409
Expression::make_integer_int64(size, NULL, location);
@@ -11539,14 +11560,20 @@ Allocation_expression::do_get_backend(Translate_context* context)
11539
11560
Gogo* gogo = context->gogo();
11540
11561
Location loc = this->location();
11541
11562
11542
- Btype* btype = this->type_->get_backend(gogo);
11543
11563
if (this->allocate_on_stack_)
11544
11564
{
11545
- int64_t size = gogo->backend()->type_size(btype);
11565
+ int64_t size;
11566
+ bool ok = this->type_->backend_type_size(gogo, &size);
11567
+ if (!ok)
11568
+ {
11569
+ go_assert(saw_errors());
11570
+ return gogo->backend()->error_expression();
11571
+ }
11546
11572
return gogo->backend()->stack_allocation_expression(size, loc);
11547
11573
}
11548
11574
11549
- Bexpression* space =
11575
+ Btype* btype = this->type_->get_backend(gogo);
11576
+ Bexpression* space =
11550
11577
gogo->allocate_memory(this->type_, loc)->get_backend(context);
11551
11578
Btype* pbtype = gogo->backend()->pointer_type(btype);
11552
11579
return gogo->backend()->convert_expression(pbtype, space, loc);
@@ -13731,23 +13758,28 @@ Type_info_expression::do_type()
13731
13758
Bexpression*
13732
13759
Type_info_expression::do_get_backend(Translate_context* context)
13733
13760
{
13734
- Btype* btype = this->type_->get_backend(context->gogo());
13735
13761
Gogo* gogo = context->gogo();
13762
+ bool ok = true;
13736
13763
int64_t val;
13737
13764
switch (this->type_info_)
13738
13765
{
13739
13766
case TYPE_INFO_SIZE:
13740
- val = gogo->backend()->type_size(btype );
13767
+ ok = this->type_->backend_type_size(gogo, &val );
13741
13768
break;
13742
13769
case TYPE_INFO_ALIGNMENT:
13743
- val = gogo->backend()->type_alignment(btype );
13770
+ ok = this->type_->backend_type_align(gogo, &val );
13744
13771
break;
13745
13772
case TYPE_INFO_FIELD_ALIGNMENT:
13746
- val = gogo->backend()->type_field_alignment(btype );
13773
+ ok = this->type_->backend_type_field_align(gogo, &val );
13747
13774
break;
13748
13775
default:
13749
13776
go_unreachable();
13750
13777
}
13778
+ if (!ok)
13779
+ {
13780
+ go_assert(saw_errors());
13781
+ return gogo->backend()->error_expression();
13782
+ }
13751
13783
Expression* e = Expression::make_integer_int64(val, this->type(),
13752
13784
this->location());
13753
13785
return e->get_backend(context);
0 commit comments