Commit c92900d1 by Ian Lance Taylor

compiler: Remove old handling of unsafe.Pointer in type assertions.

Fixes issue 17.

From-SVN: r190608
parent 8489a21a
...@@ -12914,26 +12914,8 @@ Type_guard_expression::do_traverse(Traverse* traverse) ...@@ -12914,26 +12914,8 @@ Type_guard_expression::do_traverse(Traverse* traverse)
void void
Type_guard_expression::do_check_types(Gogo*) Type_guard_expression::do_check_types(Gogo*)
{ {
// 6g permits using a type guard with unsafe.pointer; we are
// compatible.
Type* expr_type = this->expr_->type(); Type* expr_type = this->expr_->type();
if (expr_type->is_unsafe_pointer_type()) if (expr_type->interface_type() == NULL)
{
if (this->type_->points_to() == NULL
&& (this->type_->integer_type() == NULL
|| (this->type_->forwarded()
!= Type::lookup_integer_type("uintptr"))))
this->report_error(_("invalid unsafe.Pointer conversion"));
}
else if (this->type_->is_unsafe_pointer_type())
{
if (expr_type->points_to() == NULL
&& (expr_type->integer_type() == NULL
|| (expr_type->forwarded()
!= Type::lookup_integer_type("uintptr"))))
this->report_error(_("invalid unsafe.Pointer conversion"));
}
else if (expr_type->interface_type() == NULL)
{ {
if (!expr_type->is_error() && !this->type_->is_error()) if (!expr_type->is_error() && !this->type_->is_error())
this->report_error(_("type assertion only valid for interface types")); this->report_error(_("type assertion only valid for interface types"));
...@@ -12966,23 +12948,10 @@ Type_guard_expression::do_check_types(Gogo*) ...@@ -12966,23 +12948,10 @@ Type_guard_expression::do_check_types(Gogo*)
tree tree
Type_guard_expression::do_get_tree(Translate_context* context) Type_guard_expression::do_get_tree(Translate_context* context)
{ {
Gogo* gogo = context->gogo();
tree expr_tree = this->expr_->get_tree(context); tree expr_tree = this->expr_->get_tree(context);
if (expr_tree == error_mark_node) if (expr_tree == error_mark_node)
return error_mark_node; return error_mark_node;
Type* expr_type = this->expr_->type(); if (this->type_->interface_type() != NULL)
if ((this->type_->is_unsafe_pointer_type()
&& (expr_type->points_to() != NULL
|| expr_type->integer_type() != NULL))
|| (expr_type->is_unsafe_pointer_type()
&& this->type_->points_to() != NULL))
return convert_to_pointer(type_to_tree(this->type_->get_backend(gogo)),
expr_tree);
else if (expr_type->is_unsafe_pointer_type()
&& this->type_->integer_type() != NULL)
return convert_to_integer(type_to_tree(this->type_->get_backend(gogo)),
expr_tree);
else if (this->type_->interface_type() != NULL)
return Expression::convert_interface_to_interface(context, this->type_, return Expression::convert_interface_to_interface(context, this->type_,
this->expr_->type(), this->expr_->type(),
expr_tree, true, expr_tree, true,
......
...@@ -49,7 +49,7 @@ func (file *File) readdirnames(n int) (names []string, err error) { ...@@ -49,7 +49,7 @@ func (file *File) readdirnames(n int) (names []string, err error) {
file.dirinfo.dir = r file.dirinfo.dir = r
} }
entry_dirent := unsafe.Pointer(&file.dirinfo.buf[0]).(*syscall.Dirent) entry_dirent := (*syscall.Dirent)(unsafe.Pointer(&file.dirinfo.buf[0]))
size := n size := n
if size < 0 { if size < 0 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment