From 55072f2b8b90dec674be361b676b1da5fe9b3ff0 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 13 Dec 2011 18:09:56 +0000 Subject: [PATCH] compiler: Permit converting between string and named []byte/[]rune. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182291 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/go/gofrontend/expressions.cc | 15 +++------------ gcc/go/gofrontend/types.cc | 6 ++---- gcc/testsuite/go.test/test/convlit.go | 16 ++++++++-------- gcc/testsuite/go.test/test/named1.go | 5 ++--- 4 files changed, 15 insertions(+), 27 deletions(-) diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 18858d519a0..ab6f4feeaf3 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -3322,7 +3322,7 @@ Type_conversion_expression::do_lower(Gogo*, Named_object*, mpfr_clear(imag); } - if (type->is_slice_type() && type->named_type() == NULL) + if (type->is_slice_type()) { Type* element_type = type->array_type()->element_type()->forwarded(); bool is_byte = element_type == Type::lookup_integer_type("uint8"); @@ -3621,20 +3621,11 @@ Type_conversion_expression::do_get_tree(Translate_context* context) integer_type_node, fold_convert(integer_type_node, expr_tree)); } - else if (type->is_string_type() - && (expr_type->array_type() != NULL - || (expr_type->points_to() != NULL - && expr_type->points_to()->array_type() != NULL))) + else if (type->is_string_type() && expr_type->is_slice_type()) { - Type* t = expr_type; - if (t->points_to() != NULL) - { - t = t->points_to(); - expr_tree = build_fold_indirect_ref(expr_tree); - } if (!DECL_P(expr_tree)) expr_tree = save_expr(expr_tree); - Array_type* a = t->array_type(); + Array_type* a = expr_type->array_type(); Type* e = a->element_type()->forwarded(); go_assert(e->integer_type() != NULL); tree valptr = fold_convert(const_ptr_type_node, diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index fed83b31b9a..432a6472217 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -662,7 +662,7 @@ Type::are_convertible(const Type* lhs, const Type* rhs, std::string* reason) { if (rhs->integer_type() != NULL) return true; - if (rhs->is_slice_type() && rhs->named_type() == NULL) + if (rhs->is_slice_type()) { const Type* e = rhs->array_type()->element_type()->forwarded(); if (e->integer_type() != NULL @@ -673,9 +673,7 @@ Type::are_convertible(const Type* lhs, const Type* rhs, std::string* reason) } // A string may be converted to []byte or []int. - if (rhs->is_string_type() - && lhs->is_slice_type() - && lhs->named_type() == NULL) + if (rhs->is_string_type() && lhs->is_slice_type()) { const Type* e = lhs->array_type()->element_type()->forwarded(); if (e->integer_type() != NULL diff --git a/gcc/testsuite/go.test/test/convlit.go b/gcc/testsuite/go.test/test/convlit.go index 90ac5490c84..1e82d1f2f56 100644 --- a/gcc/testsuite/go.test/test/convlit.go +++ b/gcc/testsuite/go.test/test/convlit.go @@ -36,7 +36,7 @@ var good3 int = 1e9 var good4 float64 = 1e20 // explicit conversion of string is okay -var _ = []int("abc") +var _ = []rune("abc") var _ = []byte("abc") // implicit is not @@ -47,20 +47,20 @@ var _ []byte = "abc" // ERROR "cannot use|incompatible|invalid" type Tstring string var ss Tstring = "abc" -var _ = []int(ss) +var _ = []rune(ss) var _ = []byte(ss) // implicit is still not -var _ []int = ss // ERROR "cannot use|incompatible|invalid" +var _ []rune = ss // ERROR "cannot use|incompatible|invalid" var _ []byte = ss // ERROR "cannot use|incompatible|invalid" -// named slice is not -type Tint []int +// named slice is now ok +type Trune []rune type Tbyte []byte -var _ = Tint("abc") // ERROR "convert|incompatible|invalid" -var _ = Tbyte("abc") // ERROR "convert|incompatible|invalid" +var _ = Trune("abc") // ok +var _ = Tbyte("abc") // ok // implicit is still not -var _ Tint = "abc" // ERROR "cannot use|incompatible|invalid" +var _ Trune = "abc" // ERROR "cannot use|incompatible|invalid" var _ Tbyte = "abc" // ERROR "cannot use|incompatible|invalid" diff --git a/gcc/testsuite/go.test/test/named1.go b/gcc/testsuite/go.test/test/named1.go index 7e7aab9c1d8..499b77b9615 100644 --- a/gcc/testsuite/go.test/test/named1.go +++ b/gcc/testsuite/go.test/test/named1.go @@ -41,7 +41,6 @@ func main() { asBool(i < j) // ERROR "cannot use.*type bool.*as type Bool" _, b = m[2] // ERROR "cannot .* bool.*type Bool" - m[2] = 1, b // ERROR "cannot use.*type Bool.*as type bool" var inter interface{} _, b = inter.(Map) // ERROR "cannot .* bool.*type Bool" @@ -55,8 +54,8 @@ func main() { _, bb := <-c asBool(bb) // ERROR "cannot use.*type bool.*as type Bool" - _, b = <-c // ERROR "cannot .* bool.*type Bool" + _, b = <-c // ERROR "cannot .* bool.*type Bool" _ = b - asString(String(slice)) // ERROR "cannot .*type Slice.*type String" + asString(String(slice)) // ok } -- 2.11.0