]> Cypherpunks.ru repositories - gostls13.git/blob - src/cmd/cgo/internal/testplugin/testdata/issue18676/main.go
misc/cgo: move easy tests to cmd/cgo/internal
[gostls13.git] / src / cmd / cgo / internal / testplugin / testdata / issue18676 / main.go
1 // Copyright 2017 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
5 // The bug happened like this:
6 //  1. The main binary adds an itab for *json.UnsupportedValueError / error
7 //     (concrete type / interface type).  This itab goes in hash bucket 0x111.
8 //  2. The plugin adds that same itab again.  That makes a cycle in the itab
9 //     chain rooted at hash bucket 0x111.
10 //  3. The main binary then asks for the itab for *dynamodbstreamsevt.Event /
11 //     json.Unmarshaler.  This itab happens to also live in bucket 0x111.
12 //     The lookup code goes into an infinite loop searching for this itab.
13 //
14 // The code is carefully crafted so that the two itabs are both from the
15 // same bucket, and so that the second itab doesn't exist in
16 // the itab hashmap yet (so the entire linked list must be searched).
17 package main
18
19 import (
20         "encoding/json"
21         "plugin"
22         "testplugin/issue18676/dynamodbstreamsevt"
23 )
24
25 func main() {
26         plugin.Open("plugin.so")
27
28         var x interface{} = (*dynamodbstreamsevt.Event)(nil)
29         if _, ok := x.(json.Unmarshaler); !ok {
30                 println("something")
31         }
32 }