diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/gc/typecheck.c | 4 | ||||
| -rw-r--r-- | src/pkg/runtime/chan.c | 3 |
2 files changed, 7 insertions, 0 deletions
diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index 052fc74dff..0b2e6f0ca6 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -984,6 +984,10 @@ reswitch: yyerror("invalid operation: %#N (non-chan type %T)", n, t); goto error; } + if(!(t->chan & Csend)) { + yyerror("invalid operation: %#N (cannot close receive-only channel)", n); + goto error; + } ok |= Etop; goto ret; diff --git a/src/pkg/runtime/chan.c b/src/pkg/runtime/chan.c index cc056f65f1..475da233c1 100644 --- a/src/pkg/runtime/chan.c +++ b/src/pkg/runtime/chan.c @@ -1052,6 +1052,9 @@ runtime·closechan(Hchan *c) SudoG *sg; G* gp; + if(c == nil) + runtime·panicstring("close of nil channel"); + if(runtime·gcwaiting) runtime·gosched(); |
