go/types, types2: 函数声明中存在无效循环的缺失错误

5jvtdoz2  于 4个月前  发布在  Go
关注(0)|答案(2)|浏览(62)

以下无效的循环目前被编译器检测到,错误信息为 "涉及f的类型检查循环"。

func f([unsafe.Sizeof(f)]int) {}

https://play.golang.org/p/cfAFJHgsAkX
然而,go/types 并未检测到任何错误,无论是在 master 还是在 dev.typeparams 分支(在那里对函数声明中的循环检测进行了一些更改)。
CC @griesemer

wvt8vs2t

wvt8vs2t1#

我相信这不是一个bug,当然也不是一个发布阻止器。规范说明:
Alignof 和 Sizeof 函数接受任意类型的表达式 x,并返回假设变量 v 的对齐或大小(分别),就好像 v 通过 var v = x 声明一样。
函数类型的变量的大小与函数类型无关,总是相同的,因此可以说这是有效的代码。
规范也没有明确禁止它。
有趣的是,我们确实得到了一个错误(初始化循环):

package p
import "unsafe"
var f func([unsafe.Sizeof(f)]int)

这并不是一个初始化循环(没有初始化表达式)。同样,这对于编译器/类型检查器来说也不应该是问题。无论如何,这些都不是发布阻止器。
参考一下,gccgo 可以接受这两种情况(可能意外地)而不报错,并且在64位平台上,函数参数是 [8]int

9bfwbjaz

9bfwbjaz2#

根据上面的编辑评论重新开放。

相关问题