aboutsummaryrefslogtreecommitdiff
path: root/test/fixedbugs/issue38690.go
blob: af8688d12fb0a4493200c25260131a84f2dbebf0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// compile

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

// Make sure that literal value can be passed to struct
// blank field of array/struct type, see issue #38690.

package main

type A1 = [0]int
type A2 = [1]int

type S1 struct{}

type S2 struct {
	x int
}

type S3 = struct{}

type S4 = struct{ x int }

type S struct {
	x int
	_ [0]int
	_ [1]int
	_ A1
	_ A2
	_ S1
	_ S2
	_ S3
	_ S4
	_ [1]S4
}

var s = S{1, [0]int{}, [1]int{1}, A1{}, A2{1}, S1{}, S2{1}, S3{}, S4{1}, [1]S4{}}

func main() {
	f1()
	mustPanic(f2)
	mustPanic(f3)
}

func f1() {
	_ = S{1, [0]int{}, [1]int{1}, A1{}, A2{1}, S1{}, S2{1}, S3{}, S4{1}, [1]S4{}}
}

func f2() {
	_ = S{1, [0]int{}, [1]int{1}, A1{}, A2{1}, S1{}, S2{1}, S3{}, func() S4 { panic("") }(), [1]S4{}}
}

func f3() {
	_ = S{1, [0]int{}, [1]int{1}, A1{}, A2{1}, S1{}, S2{1}, S3{}, S4{1}, func() [1]S4 { panic("") }()}
}

func mustPanic(f func()) {
	defer func() {
		if recover() == nil {
			panic("expected panic, got nil")
		}
	}()
	f()
}