// Copyright 2025 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 dwarfgen import ( "debug/dwarf" "internal/platform" "internal/testenv" "io" "runtime" "testing" ) func TestIssue75249(t *testing.T) { testenv.MustHaveGoRun(t) t.Parallel() if !platform.ExecutableHasDWARF(runtime.GOOS, runtime.GOARCH) { t.Skipf("skipping on %s/%s: no DWARF symbol table in executables", runtime.GOOS, runtime.GOARCH) } code := ` package main type Data struct { Field1 int Field2 *int Field3 int Field4 *int Field5 int Field6 *int Field7 int Field8 *int } //go:noinline func InitializeData(d *Data) { d.Field1++ // line 16 d.Field2 = d.Field4 d.Field3++ d.Field4 = d.Field6 d.Field5++ d.Field6 = d.Field8 d.Field7++ d.Field8 = d.Field2 // line 23 } func main() { var data Data InitializeData(&data) } ` _, f := gobuild(t, t.TempDir(), true, []testline{{line: code}}) defer f.Close() dwarfData, err := f.DWARF() if err != nil { t.Fatal(err) } dwarfReader := dwarfData.Reader() for { entry, err := dwarfReader.Next() if err != nil { t.Fatal(err) } if entry == nil { break } if entry.Tag != dwarf.TagCompileUnit { continue } name := entry.AttrField(dwarf.AttrName) if name == nil || name.Class != dwarf.ClassString || name.Val != "main" { continue } lr, err := dwarfData.LineReader(entry) if err != nil { t.Fatal(err) } stmts := map[int]bool{} for { var le dwarf.LineEntry err := lr.Next(&le) if err == io.EOF { break } if err != nil { t.Fatal(err) } if !le.IsStmt { continue } stmts[le.Line] = true } for i := 16; i <= 23; i++ { if !stmts[i] { t.Errorf("missing statement at line %d", i) } } } }