diff --git a/compiler/compiler.go b/compiler/compiler.go index 11854c17..1885f246 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -1953,10 +1953,12 @@ func (c *Compiler) parseBinOp(op token.Token, typ types.Type, x, y llvm.Value, p default: return llvm.Value{}, c.makeError(pos, "binop on interface: "+op.String()) } - case *types.Map, *types.Pointer: + case *types.Chan, *types.Map, *types.Pointer: // Maps are in general not comparable, but can be compared against nil // (which is a nil pointer). This means they can be trivially compared // by treating them as a pointer. + // Channels behave as pointers in that they are equal as long as they + // are created with the same call to make or if both are nil. switch op { case token.EQL: // == return c.builder.CreateICmp(llvm.IntEQ, x, y, ""), nil diff --git a/testdata/channel.go b/testdata/channel.go index e3b8aed3..cdf3fac6 100644 --- a/testdata/channel.go +++ b/testdata/channel.go @@ -4,7 +4,7 @@ import "time" func main() { ch := make(chan int) - println("len, cap of channel:", len(ch), cap(ch)) + println("len, cap of channel:", len(ch), cap(ch), ch == nil) go sender(ch) n, ok := <-ch diff --git a/testdata/channel.txt b/testdata/channel.txt index 0d11d4e6..9daef1be 100644 --- a/testdata/channel.txt +++ b/testdata/channel.txt @@ -1,4 +1,4 @@ -len, cap of channel: 0 0 +len, cap of channel: 0 0 false recv from open channel: 1 true received num: 2 received num: 3