diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-10-25 16:35:24 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-10-25 16:35:24 +0000 |
commit | 09367c0d60f551d7d05b6212b649a71636b623ce (patch) | |
tree | c10e4945a3688d1e9989fda3872cb8d6ba04f4e3 | |
parent | 0d53e34681bfbb0849726ee8d3b17cf330a33a76 (diff) | |
download | gcc-09367c0d60f551d7d05b6212b649a71636b623ce.zip gcc-09367c0d60f551d7d05b6212b649a71636b623ce.tar.gz gcc-09367c0d60f551d7d05b6212b649a71636b623ce.tar.bz2 |
Don't permit close of receive-only channel.
Better panic on attempt to close nil channel.
From-SVN: r180437
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 2 | ||||
-rw-r--r-- | libgo/runtime/go-close.c | 3 |
2 files changed, 5 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 180279e..cdf2bad 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -8153,6 +8153,8 @@ Builtin_call_expression::do_check_types(Gogo*) { if (this->one_arg()->type()->channel_type() == NULL) this->report_error(_("argument must be channel")); + else if (!this->one_arg()->type()->channel_type()->may_send()) + this->report_error(_("cannot close receive-only channel")); } break; diff --git a/libgo/runtime/go-close.c b/libgo/runtime/go-close.c index 44533eb..778eab3 100644 --- a/libgo/runtime/go-close.c +++ b/libgo/runtime/go-close.c @@ -16,6 +16,9 @@ __go_builtin_close (struct __go_channel *channel) { int i; + if (channel == NULL) + __go_panic_msg ("close of nil channel"); + i = pthread_mutex_lock (&channel->lock); __go_assert (i == 0); |