// Copyright 2024 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. package ssa_test import ( "fmt" "path/filepath" "testing" "golang.org/x/tools/go/packages" "golang.org/x/tools/go/ssa/ssautil" "golang.org/x/tools/internal/testenv" ) func TestDominatorOrder(t *testing.T) { testenv.NeedsGoBuild(t) // for go/packages const src = `package p func f(cond bool) { // (Print operands match BasicBlock IDs.) print(0) if cond { print(1) } else { print(2) } print(3) } ` dir := t.TempDir() cfg := &packages.Config{ Dir: dir, Mode: packages.LoadSyntax, Overlay: map[string][]byte{ filepath.Join(dir, "p.go"): []byte(src), }, } initial, err := packages.Load(cfg, "./p.go") if err != nil { t.Fatal(err) } if packages.PrintErrors(initial) > 0 { t.Fatal("packages contain errors") } _, pkgs := ssautil.Packages(initial, 0) p := pkgs[0] p.Build() f := p.Func("f") if got, want := fmt.Sprint(f.DomPreorder()), "[0 1 2 3]"; got != want { t.Errorf("DomPreorder: got %v, want %s", got, want) } if got, want := fmt.Sprint(f.DomPostorder()), "[1 2 3 0]"; got != want { t.Errorf("DomPostorder: got %v, want %s", got, want) } }