diff --git a/_demo/ctxcancel/ctx.go b/_demo/ctxcancel/ctx.go new file mode 100644 index 00000000..3b9afc26 --- /dev/null +++ b/_demo/ctxcancel/ctx.go @@ -0,0 +1,39 @@ +package main + +import ( + "context" + "fmt" +) + +func main() { + // gen generates integers in a separate goroutine and + // sends them to the returned channel. + // The callers of gen need to cancel the context once + // they are done consuming generated integers not to leak + // the internal goroutine started by gen. + gen := func(ctx context.Context) <-chan int { + dst := make(chan int) + n := 1 + go func() { + for { + select { + case <-ctx.Done(): + return // returning not to leak the goroutine + case dst <- n: + n++ + } + } + }() + return dst + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() // cancel when we are finished consuming integers + + for n := range gen(ctx) { + fmt.Println(n) + if n == 5 { + break + } + } +} diff --git a/ssa/expr.go b/ssa/expr.go index 0010b014..2aed82c3 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -127,7 +127,7 @@ func (p Program) Zero(t Type) Expr { default: panic("todo") } - case *types.Pointer: + case *types.Pointer, *types.Signature, *types.Chan: return Expr{llvm.ConstNull(t.ll), t} case *types.Struct: n := u.NumFields()