compiler: implement comparing channel values

Этот коммит содержится в:
Ayke van Laethem 2019-05-13 20:35:20 +02:00 коммит произвёл Ron Evans
родитель c981f14e61
коммит 0a40219680
3 изменённых файлов: 5 добавлений и 3 удалений

Просмотреть файл

@ -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

2
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

2
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