以下无效的循环目前被编译器检测到,错误信息为 "涉及f的类型检查循环"。
func f([unsafe.Sizeof(f)]int) {}
https://play.golang.org/p/cfAFJHgsAkX
然而,go/types 并未检测到任何错误,无论是在 master 还是在 dev.typeparams
分支(在那里对函数声明中的循环检测进行了一些更改)。
CC @griesemer
以下无效的循环目前被编译器检测到,错误信息为 "涉及f的类型检查循环"。
func f([unsafe.Sizeof(f)]int) {}
https://play.golang.org/p/cfAFJHgsAkX
然而,go/types 并未检测到任何错误,无论是在 master 还是在 dev.typeparams
分支(在那里对函数声明中的循环检测进行了一些更改)。
CC @griesemer
2条答案
按热度按时间wvt8vs2t1#
我相信这不是一个bug,当然也不是一个发布阻止器。规范说明:
Alignof 和 Sizeof 函数接受任意类型的表达式 x,并返回假设变量 v 的对齐或大小(分别),就好像 v 通过 var v = x 声明一样。
函数类型的变量的大小与函数类型无关,总是相同的,因此可以说这是有效的代码。
规范也没有明确禁止它。
有趣的是,我们确实得到了一个错误(初始化循环):
这并不是一个初始化循环(没有初始化表达式)。同样,这对于编译器/类型检查器来说也不应该是问题。无论如何,这些都不是发布阻止器。
参考一下,
gccgo
可以接受这两种情况(可能意外地)而不报错,并且在64位平台上,函数参数是[8]int
。9bfwbjaz2#
根据上面的编辑评论重新开放。