aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/gc/typecheck.c4
-rw-r--r--src/pkg/runtime/chan.c3
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();