Skip to content

cmd/compile: type parameter involving constraint with channels seems like it should be inferrable #69153

Open
@mark-rushakoff

Description

@mark-rushakoff

Go version

go1.23 and go tip

Output of go env in your module/workspace:

n/a, using go.dev/play

What did you do?

https://go.dev/play/p/-psvliJDE_j

package main

import "fmt"

// Constraint to allow function to operate on a channel,
// regardless of the channel's directionality.
type channelConstraint[T any] interface {
	chan T | <-chan T | chan<- T
}

func main() {
	var sendOnlyCh chan<- string = make(chan string)
	printCap(sendOnlyCh)
	// Needs to be:
	printCap[string](sendOnlyCh)

	var receiveOnlyCh <-chan int = make(chan int, 1)
	printCap(receiveOnlyCh)
	// Needs to be:
	printCap[int](receiveOnlyCh)

	bidiCh := make(chan any)
	printCap(bidiCh)
	// Needs to be:
	printCap[any](bidiCh)
}

// printCap prints the capacity of ch,
// regardless of ch's directionality.
func printCap[T any, C channelConstraint[T]](ch C) {
	fmt.Println(cap(ch))
}

I want to write a small utility that takes a specific action that is determined by a channel's length and/or capacity. In this codebase, there are a general mix of directional and bidirectional channels. I thought I would be able to write a constraint such that my helper can accept a channel of any directionality. And I can indeed write that constraint, but when I call a function with that constraint, I have to provide the channel's element type as a type parameter in order to get the program to compile.

I am surprised that I have to provide the channel's element type, but maybe I am missing something about constraints or generics.

What did you see happen?

./prog.go:13:10: in call to printCap, cannot infer T (prog.go:28:15)

What did you expect to see?

I expected that printCap(ch) would compile; that I would not have to write printCap[int](ch).

I tried searching the issues for variations of "constraints", "channels", and "direction" or "directionality" but I was not able to find any issues that looked similar.

Metadata

Metadata

Assignees

Labels

TypeInferenceIssue is related to generic type inferencecompiler/runtimeIssues related to the Go compiler and/or runtime.

Type

No type

Projects

Status

Todo

Relationships

None yet

Development

No branches or pull requests

Issue actions