aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2017-09-14 03:48:51 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2017-09-14 03:48:51 +0000
commitce64a8b4a2334fd6982a21d1ab020a1108562f6b (patch)
tree83191e42d888f13aa922cfda85d4c7eafe051622 /gcc
parented52163bea1916404119f397e6f99a4b90477f37 (diff)
downloadgcc-ce64a8b4a2334fd6982a21d1ab020a1108562f6b.zip
gcc-ce64a8b4a2334fd6982a21d1ab020a1108562f6b.tar.gz
gcc-ce64a8b4a2334fd6982a21d1ab020a1108562f6b.tar.bz2
compiler, reflect: fix struct field names for embedded aliases
This adds much of https://golang.org/cl/35731 and https://golang.org/cl/35732 to the gofrontend code. This is a step toward updating libgo to the 1.9 release. The gofrontend already supports type aliases, and this is required for correct support of type aliases when used as embedded fields. The change to expressions.cc is to handle the << 1, used for the newly renamed offsetAnon field, in the constant context used for type descriptor initialization. Reviewed-on: https://go-review.googlesource.com/62710 From-SVN: r252746
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/expressions.cc63
-rw-r--r--gcc/go/gofrontend/types.cc24
3 files changed, 51 insertions, 38 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index c4600de..a905f58 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-8c6d9ff6f60b737d1e96c0dab0b4e67402bf3316
+b0a46c2cdb915ddc4a4e401af9ef6eb2bcd4d4ea
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 6f9c1c9..1e4d906 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -6044,35 +6044,46 @@ Binary_expression::do_get_backend(Translate_context* context)
{
go_assert(left_type->integer_type() != NULL);
- mpz_t bitsval;
int bits = left_type->integer_type()->bits();
- mpz_init_set_ui(bitsval, bits);
- Bexpression* bits_expr =
- gogo->backend()->integer_constant_expression(right_btype, bitsval);
- Bexpression* compare =
- gogo->backend()->binary_expression(OPERATOR_LT,
- right, bits_expr, loc);
-
- Bexpression* zero_expr =
- gogo->backend()->integer_constant_expression(left_btype, zero);
- overflow = zero_expr;
- Bfunction* bfn = context->function()->func_value()->get_decl();
- if (this->op_ == OPERATOR_RSHIFT
- && !left_type->integer_type()->is_unsigned())
+
+ Numeric_constant nc;
+ unsigned long ul;
+ if (!this->right_->numeric_constant_value(&nc)
+ || nc.to_unsigned_long(&ul) != Numeric_constant::NC_UL_VALID
+ || ul >= static_cast<unsigned long>(bits))
{
- Bexpression* neg_expr =
- gogo->backend()->binary_expression(OPERATOR_LT, left,
- zero_expr, loc);
- Bexpression* neg_one_expr =
- gogo->backend()->integer_constant_expression(left_btype, neg_one);
- overflow = gogo->backend()->conditional_expression(bfn,
- btype, neg_expr,
- neg_one_expr,
- zero_expr, loc);
+ mpz_t bitsval;
+ mpz_init_set_ui(bitsval, bits);
+ Bexpression* bits_expr =
+ gogo->backend()->integer_constant_expression(right_btype, bitsval);
+ Bexpression* compare =
+ gogo->backend()->binary_expression(OPERATOR_LT,
+ right, bits_expr, loc);
+
+ Bexpression* zero_expr =
+ gogo->backend()->integer_constant_expression(left_btype, zero);
+ overflow = zero_expr;
+ Bfunction* bfn = context->function()->func_value()->get_decl();
+ if (this->op_ == OPERATOR_RSHIFT
+ && !left_type->integer_type()->is_unsigned())
+ {
+ Bexpression* neg_expr =
+ gogo->backend()->binary_expression(OPERATOR_LT, left,
+ zero_expr, loc);
+ Bexpression* neg_one_expr =
+ gogo->backend()->integer_constant_expression(left_btype,
+ neg_one);
+ overflow = gogo->backend()->conditional_expression(bfn,
+ btype,
+ neg_expr,
+ neg_one_expr,
+ zero_expr,
+ loc);
+ }
+ ret = gogo->backend()->conditional_expression(bfn, btype, compare,
+ ret, overflow, loc);
+ mpz_clear(bitsval);
}
- ret = gogo->backend()->conditional_expression(bfn, btype, compare, ret,
- overflow, loc);
- mpz_clear(bitsval);
}
// Add checks for division by zero and division overflow as needed.
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index cdf1f40..e91922c 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -6372,7 +6372,7 @@ Struct_type::make_struct_type_descriptor_type()
"pkgPath", pointer_string_type,
"typ", ptdt,
"tag", pointer_string_type,
- "offset", uintptr_type);
+ "offsetAnon", uintptr_type);
Type* nsf = Type::make_builtin_named_type("structField", sf);
Type* slice_type = Type::make_array_type(nsf, NULL);
@@ -6429,14 +6429,9 @@ Struct_type::do_type_descriptor(Gogo* gogo, Named_type* name)
Struct_field_list::const_iterator q = f->begin();
go_assert(q->is_field_name("name"));
- if (pf->is_anonymous())
- fvals->push_back(Expression::make_nil(bloc));
- else
- {
- std::string n = Gogo::unpack_hidden_name(pf->field_name());
- Expression* s = Expression::make_string(n, bloc);
- fvals->push_back(Expression::make_unary(OPERATOR_AND, s, bloc));
- }
+ std::string n = Gogo::unpack_hidden_name(pf->field_name());
+ Expression* s = Expression::make_string(n, bloc);
+ fvals->push_back(Expression::make_unary(OPERATOR_AND, s, bloc));
++q;
go_assert(q->is_field_name("pkgPath"));
@@ -6469,8 +6464,15 @@ Struct_type::do_type_descriptor(Gogo* gogo, Named_type* name)
}
++q;
- go_assert(q->is_field_name("offset"));
- fvals->push_back(Expression::make_struct_field_offset(this, &*pf));
+ go_assert(q->is_field_name("offsetAnon"));
+ Type* uintptr_type = Type::lookup_integer_type("uintptr");
+ Expression* o = Expression::make_struct_field_offset(this, &*pf);
+ Expression* one = Expression::make_integer_ul(1, uintptr_type, bloc);
+ o = Expression::make_binary(OPERATOR_LSHIFT, o, one, bloc);
+ int av = pf->is_anonymous() ? 1 : 0;
+ Expression* anon = Expression::make_integer_ul(av, uintptr_type, bloc);
+ o = Expression::make_binary(OPERATOR_OR, o, anon, bloc);
+ fvals->push_back(o);
Expression* v = Expression::make_struct_composite_literal(element_type,
fvals, bloc);