1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package ir
6
7import (
8	"cmd/compile/internal/base"
9	"cmd/internal/src"
10	"fmt"
11	"path/filepath"
12	"strings"
13)
14
15// checkStaticValueResult compares the result from ReassignOracle.StaticValue
16// with the corresponding result from ir.StaticValue to make sure they agree.
17// This method is called only when turned on via build tag.
18func checkStaticValueResult(n Node, newres Node) {
19	oldres := StaticValue(n)
20	if oldres != newres {
21		base.Fatalf("%s: new/old static value disagreement on %v:\nnew=%v\nold=%v", fmtFullPos(n.Pos()), n, newres, oldres)
22	}
23}
24
25// checkReassignedResult compares the result from ReassignOracle.Reassigned
26// with the corresponding result from ir.Reassigned to make sure they agree.
27// This method is called only when turned on via build tag.
28func checkReassignedResult(n *Name, newres bool) {
29	origres := Reassigned(n)
30	if newres != origres {
31		base.Fatalf("%s: new/old reassigned disagreement on %v (class %s) newres=%v oldres=%v", fmtFullPos(n.Pos()), n, n.Class.String(), newres, origres)
32	}
33}
34
35// fmtFullPos returns a verbose dump for pos p, including inlines.
36func fmtFullPos(p src.XPos) string {
37	var sb strings.Builder
38	sep := ""
39	base.Ctxt.AllPos(p, func(pos src.Pos) {
40		fmt.Fprintf(&sb, sep)
41		sep = "|"
42		file := filepath.Base(pos.Filename())
43		fmt.Fprintf(&sb, "%s:%d:%d", file, pos.Line(), pos.Col())
44	})
45	return sb.String()
46}
47