mirror of git://gcc.gnu.org/git/gcc.git
compiler: Remove old handling of unsafe.Pointer in type assertions.
Fixes issue 17. From-SVN: r190608
This commit is contained in:
parent
8489a21ac4
commit
c92900d1db
|
|
@ -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*)
|
||||||
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) {
|
||||||
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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue