Skip to content

Commit

Permalink
test: new test for issue 30908
Browse files Browse the repository at this point in the history
New test case designed to mimic the code in issue 30908, which
features duplicate but non-indentical DWARF abstract subprogram DIEs.

Updates #30908.

Change-Id: Iacb4b53e6a988e46c801cdac236cef883c553f8f
Reviewed-on: https://go-review.googlesource.com/c/go/+/168957
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
  • Loading branch information
thanm committed Mar 25, 2019
1 parent fbd74a8 commit 6582ee9
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 0 deletions.
32 changes: 32 additions & 0 deletions test/fixedbugs/issue30908.dir/a.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2019 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 a

import (
"errors"
"strings"
)

var G interface{}

func Unmarshal(data []byte, o interface{}) error {
G = o
v, ok := o.(*map[string]interface{})
if !ok {
return errors.New("eek")
}
vals := make(map[string]interface{})
s := string(data)
items := strings.Split(s, " ")
var err error
for _, item := range items {
vals[item] = s
if item == "error" {
err = errors.New("ouch")
}
}
*v = vals
return err
}
35 changes: 35 additions & 0 deletions test/fixedbugs/issue30908.dir/b.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright 2019 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 b

import (
"io/ioutil"

"./a"
)

var G int

// An inlinable function. To trigger the bug in question this needs
// to be inlined here within the package and also inlined into some
// other package that imports it.
func ReadValues(data []byte) (vals map[string]interface{}, err error) {
err = a.Unmarshal(data, &vals)
if len(vals) == 0 {
vals = map[string]interface{}{}
}
return
}

// A local call to the function above, which triggers the "move to heap"
// of the output param.
func CallReadValues(filename string) (map[string]interface{}, error) {
defer func() { G++ }()
data, err := ioutil.ReadFile(filename)
if err != nil {
return map[string]interface{}{}, err
}
return ReadValues(data)
}
21 changes: 21 additions & 0 deletions test/fixedbugs/issue30908.dir/m.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright 2019 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 main

import (
"os"

"./b"
)

func main() {
seed := "some things are better"
bsl := []byte(seed)
b.CallReadValues("/dev/null")
vals, err := b.ReadValues(bsl)
if vals["better"] != seed || err != nil {
os.Exit(1)
}
}
9 changes: 9 additions & 0 deletions test/fixedbugs/issue30908.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// rundir -P -l=4 -ldflags -strictdups=2

// Copyright 2019 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.

// +build !nacl,!js

package ignored

0 comments on commit 6582ee9

Please sign in to comment.