Commit 70dd90c4 authored by Robert Griesemer's avatar Robert Griesemer

cmd/compile: revert "typecheck types and funcs before consts"

This reverts commit 9ce87a63.

The fix addresses the specific test case, but not the general
problem.

Updates #24755.

Change-Id: I0ba8463b41b099b1ebf49759f88a423b40f70d58
Reviewed-on: https://go-review.googlesource.com/c/145617
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 8fc99d20
......@@ -480,7 +480,7 @@ func Main(archInit func(*Arch)) {
// Process top-level declarations in phases.
// Phase 1: type, and names and types of funcs.
// Phase 1: const, type, and names and types of funcs.
// This will gather all the information about types
// and methods but doesn't depend on any of it.
defercheckwidth()
......@@ -489,29 +489,16 @@ func Main(archInit func(*Arch)) {
timings.Start("fe", "typecheck", "top1")
for i := 0; i < len(xtop); i++ {
n := xtop[i]
if op := n.Op; op != ODCL && op != OAS && op != OAS2 && op != ODCLCONST {
if op := n.Op; op != ODCL && op != OAS && op != OAS2 {
xtop[i] = typecheck(n, Etop)
}
}
// Phase 2: Constant declarations.
// To have named types fully type checked, depends on phase 1.
// Don't use range--typecheck can add closures to xtop.
timings.Start("fe", "typecheck", "top2")
for i := 0; i < len(xtop); i++ {
n := xtop[i]
if op := n.Op; op == ODCLCONST {
xtop[i] = typecheck(n, Etop)
}
}
// Phase 3: Variable assignments.
// Phase 2: Variable assignments.
// To check interface assignments, depends on phase 1.
// To use constants, depends on phase 2.
// Don't use range--typecheck can add closures to xtop.
timings.Start("fe", "typecheck", "top3")
timings.Start("fe", "typecheck", "top2")
for i := 0; i < len(xtop); i++ {
n := xtop[i]
if op := n.Op; op == ODCL || op == OAS || op == OAS2 {
......
// errorcheck
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Tests that all types and functions are type-checked before any constant
// declaration is. Issue #24755.
package p
type I interface{ F() }
type T struct{}
const _ = I(T{}) // ERROR "const initializer I\(T literal\) is not a constant"
func (T) F() {}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment