summaryrefslogtreecommitdiffstats
path: root/misc/cgo/test/testdata
diff options
context:
space:
mode:
Diffstat (limited to 'misc/cgo/test/testdata')
-rw-r--r--misc/cgo/test/testdata/cgo_linux_test.go9
-rw-r--r--misc/cgo/test/testdata/cgo_test.go18
-rw-r--r--misc/cgo/test/testdata/gcc68255.go17
-rw-r--r--misc/cgo/test/testdata/gcc68255/a.go17
-rw-r--r--misc/cgo/test/testdata/gcc68255/c.c8
-rw-r--r--misc/cgo/test/testdata/gcc68255/c.h5
-rw-r--r--misc/cgo/test/testdata/issue20266.go21
-rw-r--r--misc/cgo/test/testdata/issue20266/issue20266.h9
-rw-r--r--misc/cgo/test/testdata/issue23555.go11
-rw-r--r--misc/cgo/test/testdata/issue23555a/a.go12
-rw-r--r--misc/cgo/test/testdata/issue23555b/a.go12
-rw-r--r--misc/cgo/test/testdata/issue24161_darwin_test.go31
-rw-r--r--misc/cgo/test/testdata/issue24161arg/def.go17
-rw-r--r--misc/cgo/test/testdata/issue24161arg/use.go19
-rw-r--r--misc/cgo/test/testdata/issue24161e0/main.go29
-rw-r--r--misc/cgo/test/testdata/issue24161e1/main.go38
-rw-r--r--misc/cgo/test/testdata/issue24161e2/main.go40
-rw-r--r--misc/cgo/test/testdata/issue24161res/restype.go23
-rw-r--r--misc/cgo/test/testdata/issue26213/jni.h29
-rw-r--r--misc/cgo/test/testdata/issue26213/test26213.go46
-rw-r--r--misc/cgo/test/testdata/issue26430.go10
-rw-r--r--misc/cgo/test/testdata/issue26430/a.go13
-rw-r--r--misc/cgo/test/testdata/issue26430/b.go13
-rw-r--r--misc/cgo/test/testdata/issue26743.go10
-rw-r--r--misc/cgo/test/testdata/issue26743/a.go11
-rw-r--r--misc/cgo/test/testdata/issue26743/b.go9
-rw-r--r--misc/cgo/test/testdata/issue27054/egl.h8
-rw-r--r--misc/cgo/test/testdata/issue27054/test27054.go21
-rw-r--r--misc/cgo/test/testdata/issue27340.go12
-rw-r--r--misc/cgo/test/testdata/issue27340/a.go42
-rw-r--r--misc/cgo/test/testdata/issue29563.go12
-rw-r--r--misc/cgo/test/testdata/issue29563/weak.go13
-rw-r--r--misc/cgo/test/testdata/issue29563/weak1.c11
-rw-r--r--misc/cgo/test/testdata/issue29563/weak2.c11
-rw-r--r--misc/cgo/test/testdata/issue30527.go14
-rw-r--r--misc/cgo/test/testdata/issue30527/a.go19
-rw-r--r--misc/cgo/test/testdata/issue30527/b.go11
-rw-r--r--misc/cgo/test/testdata/issue41761.go20
-rw-r--r--misc/cgo/test/testdata/issue41761a/a.go14
-rw-r--r--misc/cgo/test/testdata/issue43639.go9
-rw-r--r--misc/cgo/test/testdata/issue43639/a.go8
-rw-r--r--misc/cgo/test/testdata/issue52611.go13
-rw-r--r--misc/cgo/test/testdata/issue52611a/a.go16
-rw-r--r--misc/cgo/test/testdata/issue52611a/b.go11
-rw-r--r--misc/cgo/test/testdata/issue52611b/a.go11
-rw-r--r--misc/cgo/test/testdata/issue52611b/b.go16
-rw-r--r--misc/cgo/test/testdata/issue8756.go17
-rw-r--r--misc/cgo/test/testdata/issue8756/issue8756.go11
-rw-r--r--misc/cgo/test/testdata/issue8828.go16
-rw-r--r--misc/cgo/test/testdata/issue8828/issue8828.c7
-rw-r--r--misc/cgo/test/testdata/issue8828/trivial.go8
-rw-r--r--misc/cgo/test/testdata/issue9026.go9
-rw-r--r--misc/cgo/test/testdata/issue9026/issue9026.go36
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_386.s27
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_amd64x.s27
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_arm.s39
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_arm64.s39
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_loong64.s28
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_mips64x.s33
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_mipsx.s31
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_ppc64x.s32
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_riscv64.s31
-rw-r--r--misc/cgo/test/testdata/issue9400/asm_s390x.s26
-rw-r--r--misc/cgo/test/testdata/issue9400/gccgo.go26
-rw-r--r--misc/cgo/test/testdata/issue9400/stubs.go11
-rw-r--r--misc/cgo/test/testdata/issue9400_linux.go67
-rw-r--r--misc/cgo/test/testdata/issue9510.go24
-rw-r--r--misc/cgo/test/testdata/issue9510a/a.go15
-rw-r--r--misc/cgo/test/testdata/issue9510b/b.go15
-rw-r--r--misc/cgo/test/testdata/test26213.go15
70 files changed, 1359 insertions, 0 deletions
diff --git a/misc/cgo/test/testdata/cgo_linux_test.go b/misc/cgo/test/testdata/cgo_linux_test.go
new file mode 100644
index 0000000..5cef09f
--- /dev/null
+++ b/misc/cgo/test/testdata/cgo_linux_test.go
@@ -0,0 +1,9 @@
+// Copyright 2012 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 cgotest
+
+import "testing"
+
+func Test9400(t *testing.T) { test9400(t) }
diff --git a/misc/cgo/test/testdata/cgo_test.go b/misc/cgo/test/testdata/cgo_test.go
new file mode 100644
index 0000000..ffa076f
--- /dev/null
+++ b/misc/cgo/test/testdata/cgo_test.go
@@ -0,0 +1,18 @@
+// Copyright 2011 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 cgotest
+
+import "testing"
+
+// The actual test functions are in non-_test.go files
+// so that they can use cgo (import "C").
+// These wrappers are here for gotest to find.
+
+func Test8756(t *testing.T) { test8756(t) }
+func Test9026(t *testing.T) { test9026(t) }
+func Test9510(t *testing.T) { test9510(t) }
+func Test20266(t *testing.T) { test20266(t) }
+func Test26213(t *testing.T) { test26213(t) }
+func TestGCC68255(t *testing.T) { testGCC68255(t) }
diff --git a/misc/cgo/test/testdata/gcc68255.go b/misc/cgo/test/testdata/gcc68255.go
new file mode 100644
index 0000000..b431462
--- /dev/null
+++ b/misc/cgo/test/testdata/gcc68255.go
@@ -0,0 +1,17 @@
+// Copyright 2015 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 cgotest
+
+import (
+ "testing"
+
+ "cgotest/gcc68255"
+)
+
+func testGCC68255(t *testing.T) {
+ if !gcc68255.F() {
+ t.Error("C global variable was not initialized")
+ }
+}
diff --git a/misc/cgo/test/testdata/gcc68255/a.go b/misc/cgo/test/testdata/gcc68255/a.go
new file mode 100644
index 0000000..e106dee
--- /dev/null
+++ b/misc/cgo/test/testdata/gcc68255/a.go
@@ -0,0 +1,17 @@
+// Copyright 2015 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.
+
+// Test that it's OK to have C code that does nothing other than
+// initialize a global variable. This used to fail with gccgo.
+
+package gcc68255
+
+/*
+#include "c.h"
+*/
+import "C"
+
+func F() bool {
+ return C.v != nil
+}
diff --git a/misc/cgo/test/testdata/gcc68255/c.c b/misc/cgo/test/testdata/gcc68255/c.c
new file mode 100644
index 0000000..a4fe193
--- /dev/null
+++ b/misc/cgo/test/testdata/gcc68255/c.c
@@ -0,0 +1,8 @@
+// Copyright 2015 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.
+
+static void f(void) {
+}
+
+void (*v)(void) = f;
diff --git a/misc/cgo/test/testdata/gcc68255/c.h b/misc/cgo/test/testdata/gcc68255/c.h
new file mode 100644
index 0000000..05ecd81
--- /dev/null
+++ b/misc/cgo/test/testdata/gcc68255/c.h
@@ -0,0 +1,5 @@
+// Copyright 2015 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.
+
+extern void (*v)(void);
diff --git a/misc/cgo/test/testdata/issue20266.go b/misc/cgo/test/testdata/issue20266.go
new file mode 100644
index 0000000..9f95086
--- /dev/null
+++ b/misc/cgo/test/testdata/issue20266.go
@@ -0,0 +1,21 @@
+// Copyright 2017 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.
+
+// Issue 20266: use -I with a relative path.
+
+package cgotest
+
+/*
+#cgo CFLAGS: -I issue20266 -Iissue20266 -Ddef20266
+#include "issue20266.h"
+*/
+import "C"
+
+import "testing"
+
+func test20266(t *testing.T) {
+ if got, want := C.issue20266, 20266; got != want {
+ t.Errorf("got %d, want %d", got, want)
+ }
+}
diff --git a/misc/cgo/test/testdata/issue20266/issue20266.h b/misc/cgo/test/testdata/issue20266/issue20266.h
new file mode 100644
index 0000000..8d3258e
--- /dev/null
+++ b/misc/cgo/test/testdata/issue20266/issue20266.h
@@ -0,0 +1,9 @@
+// Copyright 2017 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.
+
+#define issue20266 20266
+
+#ifndef def20266
+#error "expected def20266 to be defined"
+#endif
diff --git a/misc/cgo/test/testdata/issue23555.go b/misc/cgo/test/testdata/issue23555.go
new file mode 100644
index 0000000..4e944b5
--- /dev/null
+++ b/misc/cgo/test/testdata/issue23555.go
@@ -0,0 +1,11 @@
+// Copyright 2018 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.
+
+// Test that we can have two identical cgo packages in a single binary.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cgotest/issue23555a"
+import _ "cgotest/issue23555b"
diff --git a/misc/cgo/test/testdata/issue23555a/a.go b/misc/cgo/test/testdata/issue23555a/a.go
new file mode 100644
index 0000000..cb6626b
--- /dev/null
+++ b/misc/cgo/test/testdata/issue23555a/a.go
@@ -0,0 +1,12 @@
+// Copyright 2018 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 issue23555
+
+// #include <stdlib.h>
+import "C"
+
+func X() {
+ C.free(C.malloc(10))
+}
diff --git a/misc/cgo/test/testdata/issue23555b/a.go b/misc/cgo/test/testdata/issue23555b/a.go
new file mode 100644
index 0000000..cb6626b
--- /dev/null
+++ b/misc/cgo/test/testdata/issue23555b/a.go
@@ -0,0 +1,12 @@
+// Copyright 2018 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 issue23555
+
+// #include <stdlib.h>
+import "C"
+
+func X() {
+ C.free(C.malloc(10))
+}
diff --git a/misc/cgo/test/testdata/issue24161_darwin_test.go b/misc/cgo/test/testdata/issue24161_darwin_test.go
new file mode 100644
index 0000000..e60eb4e
--- /dev/null
+++ b/misc/cgo/test/testdata/issue24161_darwin_test.go
@@ -0,0 +1,31 @@
+// Copyright 2018 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 cgotest
+
+import (
+ "testing"
+
+ "cgotest/issue24161arg"
+ "cgotest/issue24161e0"
+ "cgotest/issue24161e1"
+ "cgotest/issue24161e2"
+ "cgotest/issue24161res"
+)
+
+func Test24161Arg(t *testing.T) {
+ issue24161arg.Test(t)
+}
+func Test24161Res(t *testing.T) {
+ issue24161res.Test(t)
+}
+func Test24161Example0(t *testing.T) {
+ issue24161e0.Test(t)
+}
+func Test24161Example1(t *testing.T) {
+ issue24161e1.Test(t)
+}
+func Test24161Example2(t *testing.T) {
+ issue24161e2.Test(t)
+}
diff --git a/misc/cgo/test/testdata/issue24161arg/def.go b/misc/cgo/test/testdata/issue24161arg/def.go
new file mode 100644
index 0000000..d33479a
--- /dev/null
+++ b/misc/cgo/test/testdata/issue24161arg/def.go
@@ -0,0 +1,17 @@
+// Copyright 2018 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 darwin
+
+package issue24161arg
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+
+func test24161array() C.CFArrayRef {
+ return C.CFArrayCreate(0, nil, 0, nil)
+}
diff --git a/misc/cgo/test/testdata/issue24161arg/use.go b/misc/cgo/test/testdata/issue24161arg/use.go
new file mode 100644
index 0000000..3e74944
--- /dev/null
+++ b/misc/cgo/test/testdata/issue24161arg/use.go
@@ -0,0 +1,19 @@
+// Copyright 2018 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 darwin
+
+package issue24161arg
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+import "testing"
+
+func Test(t *testing.T) {
+ a := test24161array()
+ C.CFArrayCreateCopy(0, a)
+}
diff --git a/misc/cgo/test/testdata/issue24161e0/main.go b/misc/cgo/test/testdata/issue24161e0/main.go
new file mode 100644
index 0000000..efe5345
--- /dev/null
+++ b/misc/cgo/test/testdata/issue24161e0/main.go
@@ -0,0 +1,29 @@
+// Copyright 2018 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 darwin
+
+package issue24161e0
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
+ typedef CFStringRef SecKeyAlgorithm;
+ static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+ #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+ static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import "testing"
+
+func f1() {
+ C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func Test(t *testing.T) {}
diff --git a/misc/cgo/test/testdata/issue24161e1/main.go b/misc/cgo/test/testdata/issue24161e1/main.go
new file mode 100644
index 0000000..82bf172
--- /dev/null
+++ b/misc/cgo/test/testdata/issue24161e1/main.go
@@ -0,0 +1,38 @@
+// Copyright 2018 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 darwin
+
+package issue24161e1
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
+ typedef CFStringRef SecKeyAlgorithm;
+ static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+ #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+ static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import (
+ "fmt"
+ "testing"
+)
+
+func f1() {
+ C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func f2(e C.CFErrorRef) {
+ if desc := C.CFErrorCopyDescription(e); desc != 0 {
+ fmt.Println(desc)
+ }
+}
+
+func Test(t *testing.T) {}
diff --git a/misc/cgo/test/testdata/issue24161e2/main.go b/misc/cgo/test/testdata/issue24161e2/main.go
new file mode 100644
index 0000000..82d2ec1
--- /dev/null
+++ b/misc/cgo/test/testdata/issue24161e2/main.go
@@ -0,0 +1,40 @@
+// Copyright 2018 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 darwin
+
+package issue24161e2
+
+/*
+#cgo CFLAGS: -x objective-c
+#cgo LDFLAGS: -framework CoreFoundation -framework Security
+#include <TargetConditionals.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
+ typedef CFStringRef SecKeyAlgorithm;
+ static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
+ #define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
+ static SecKeyAlgorithm foo(void){return NULL;}
+#endif
+*/
+import "C"
+import (
+ "fmt"
+ "testing"
+)
+
+var _ C.CFStringRef
+
+func f1() {
+ C.SecKeyCreateSignature(0, C.kSecKeyAlgorithmECDSASignatureDigestX962SHA1, 0, nil)
+}
+
+func f2(e C.CFErrorRef) {
+ if desc := C.CFErrorCopyDescription(e); desc != 0 {
+ fmt.Println(desc)
+ }
+}
+
+func Test(t *testing.T) {}
diff --git a/misc/cgo/test/testdata/issue24161res/restype.go b/misc/cgo/test/testdata/issue24161res/restype.go
new file mode 100644
index 0000000..e5719f2
--- /dev/null
+++ b/misc/cgo/test/testdata/issue24161res/restype.go
@@ -0,0 +1,23 @@
+// Copyright 2018 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 darwin
+
+package issue24161res
+
+/*
+#cgo LDFLAGS: -framework CoreFoundation
+#include <CoreFoundation/CoreFoundation.h>
+*/
+import "C"
+import (
+ "reflect"
+ "testing"
+)
+
+func Test(t *testing.T) {
+ if k := reflect.TypeOf(C.CFArrayCreate(0, nil, 0, nil)).Kind(); k != reflect.Uintptr {
+ t.Fatalf("bad kind %s\n", k)
+ }
+}
diff --git a/misc/cgo/test/testdata/issue26213/jni.h b/misc/cgo/test/testdata/issue26213/jni.h
new file mode 100644
index 0000000..0c76979
--- /dev/null
+++ b/misc/cgo/test/testdata/issue26213/jni.h
@@ -0,0 +1,29 @@
+// Copyright 2018 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.
+
+// It's going to be hard to include a whole real JVM to test this.
+// So we'll simulate a really easy JVM using just the parts we need.
+
+// This is the relevant part of jni.h.
+
+// On Android NDK16, jobject is defined like this in C and C++
+typedef void* jobject;
+
+typedef jobject jclass;
+typedef jobject jthrowable;
+typedef jobject jstring;
+typedef jobject jarray;
+typedef jarray jbooleanArray;
+typedef jarray jbyteArray;
+typedef jarray jcharArray;
+typedef jarray jshortArray;
+typedef jarray jintArray;
+typedef jarray jlongArray;
+typedef jarray jfloatArray;
+typedef jarray jdoubleArray;
+typedef jarray jobjectArray;
+
+typedef jobject jweak;
+
+// Note: jvalue is already a non-pointer type due to it being a C union.
diff --git a/misc/cgo/test/testdata/issue26213/test26213.go b/misc/cgo/test/testdata/issue26213/test26213.go
new file mode 100644
index 0000000..5d1f637
--- /dev/null
+++ b/misc/cgo/test/testdata/issue26213/test26213.go
@@ -0,0 +1,46 @@
+// Copyright 2018 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 issue26213
+
+/*
+#include "jni.h"
+*/
+import "C"
+import (
+ "testing"
+)
+
+func Test26213(t *testing.T) {
+ var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
+ _ = x1
+ var x2 C.jclass = 0
+ _ = x2
+ var x3 C.jthrowable = 0
+ _ = x3
+ var x4 C.jstring = 0
+ _ = x4
+ var x5 C.jarray = 0
+ _ = x5
+ var x6 C.jbooleanArray = 0
+ _ = x6
+ var x7 C.jbyteArray = 0
+ _ = x7
+ var x8 C.jcharArray = 0
+ _ = x8
+ var x9 C.jshortArray = 0
+ _ = x9
+ var x10 C.jintArray = 0
+ _ = x10
+ var x11 C.jlongArray = 0
+ _ = x11
+ var x12 C.jfloatArray = 0
+ _ = x12
+ var x13 C.jdoubleArray = 0
+ _ = x13
+ var x14 C.jobjectArray = 0
+ _ = x14
+ var x15 C.jweak = 0
+ _ = x15
+}
diff --git a/misc/cgo/test/testdata/issue26430.go b/misc/cgo/test/testdata/issue26430.go
new file mode 100644
index 0000000..14c7a7c
--- /dev/null
+++ b/misc/cgo/test/testdata/issue26430.go
@@ -0,0 +1,10 @@
+// Copyright 2018 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.
+
+// Issue 26430: incomplete typedef leads to inconsistent typedefs error.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cgotest/issue26430"
diff --git a/misc/cgo/test/testdata/issue26430/a.go b/misc/cgo/test/testdata/issue26430/a.go
new file mode 100644
index 0000000..fbaa46b
--- /dev/null
+++ b/misc/cgo/test/testdata/issue26430/a.go
@@ -0,0 +1,13 @@
+// Copyright 2018 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
+
+// typedef struct S ST;
+// static ST* F() { return 0; }
+import "C"
+
+func F1() {
+ C.F()
+}
diff --git a/misc/cgo/test/testdata/issue26430/b.go b/misc/cgo/test/testdata/issue26430/b.go
new file mode 100644
index 0000000..a7c527c
--- /dev/null
+++ b/misc/cgo/test/testdata/issue26430/b.go
@@ -0,0 +1,13 @@
+// Copyright 2018 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
+
+// typedef struct S ST;
+// struct S { int f; };
+import "C"
+
+func F2(p *C.ST) {
+ p.f = 1
+}
diff --git a/misc/cgo/test/testdata/issue26743.go b/misc/cgo/test/testdata/issue26743.go
new file mode 100644
index 0000000..000fb2b
--- /dev/null
+++ b/misc/cgo/test/testdata/issue26743.go
@@ -0,0 +1,10 @@
+// Copyright 2018 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.
+
+// Issue 26743: typedef of uint leads to inconsistent typedefs error.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cgotest/issue26743"
diff --git a/misc/cgo/test/testdata/issue26743/a.go b/misc/cgo/test/testdata/issue26743/a.go
new file mode 100644
index 0000000..a3df179
--- /dev/null
+++ b/misc/cgo/test/testdata/issue26743/a.go
@@ -0,0 +1,11 @@
+// Copyright 2018 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 issue26743
+
+// typedef unsigned int uint;
+// int C1(uint x) { return x; }
+import "C"
+
+var V1 = C.C1(0)
diff --git a/misc/cgo/test/testdata/issue26743/b.go b/misc/cgo/test/testdata/issue26743/b.go
new file mode 100644
index 0000000..c5f1ae4
--- /dev/null
+++ b/misc/cgo/test/testdata/issue26743/b.go
@@ -0,0 +1,9 @@
+// Copyright 2018 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 issue26743
+
+import "C"
+
+var V2 C.uint
diff --git a/misc/cgo/test/testdata/issue27054/egl.h b/misc/cgo/test/testdata/issue27054/egl.h
new file mode 100644
index 0000000..3079627
--- /dev/null
+++ b/misc/cgo/test/testdata/issue27054/egl.h
@@ -0,0 +1,8 @@
+// Copyright 2018 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.
+
+// This is the relevant part of EGL/egl.h.
+
+typedef void *EGLDisplay;
+typedef void *EGLConfig;
diff --git a/misc/cgo/test/testdata/issue27054/test27054.go b/misc/cgo/test/testdata/issue27054/test27054.go
new file mode 100644
index 0000000..01bf43a
--- /dev/null
+++ b/misc/cgo/test/testdata/issue27054/test27054.go
@@ -0,0 +1,21 @@
+// Copyright 2018 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 issue27054
+
+/*
+#include "egl.h"
+*/
+import "C"
+import (
+ "testing"
+)
+
+func Test27054(t *testing.T) {
+ var (
+ // Note: 0, not nil. That makes sure we use uintptr for these types.
+ _ C.EGLDisplay = 0
+ _ C.EGLConfig = 0
+ )
+}
diff --git a/misc/cgo/test/testdata/issue27340.go b/misc/cgo/test/testdata/issue27340.go
new file mode 100644
index 0000000..337550f
--- /dev/null
+++ b/misc/cgo/test/testdata/issue27340.go
@@ -0,0 +1,12 @@
+// Copyright 2018 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.
+
+// Failed to resolve typedefs consistently.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import "cgotest/issue27340"
+
+var issue27340Var = issue27340.Issue27340GoFunc
diff --git a/misc/cgo/test/testdata/issue27340/a.go b/misc/cgo/test/testdata/issue27340/a.go
new file mode 100644
index 0000000..f5b120c
--- /dev/null
+++ b/misc/cgo/test/testdata/issue27340/a.go
@@ -0,0 +1,42 @@
+// Copyright 2018 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.
+
+// Failed to resolve typedefs consistently.
+// No runtime test; just make sure it compiles.
+// In separate directory to isolate #pragma GCC diagnostic.
+
+package issue27340
+
+// We use the #pragma to avoid a compiler warning about incompatible
+// pointer types, because we generate code passing a struct ptr rather
+// than using the typedef. This warning is expected and does not break
+// a normal build.
+// We can only disable -Wincompatible-pointer-types starting with GCC 5.
+
+// #if __GNU_MAJOR__ >= 5
+//
+// #pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
+//
+// typedef struct {
+// int a;
+// } issue27340Struct, *issue27340Ptr;
+//
+// static void issue27340CFunc(issue27340Ptr p) {}
+//
+// #else /* _GNU_MAJOR_ < 5 */
+//
+// typedef struct {
+// int a;
+// } issue27340Struct;
+//
+// static issue27340Struct* issue27340Ptr(issue27340Struct* p) { return p; }
+//
+// static void issue27340CFunc(issue27340Struct *p) {}
+// #endif /* _GNU_MAJOR_ < 5 */
+import "C"
+
+func Issue27340GoFunc() {
+ var s C.issue27340Struct
+ C.issue27340CFunc(C.issue27340Ptr(&s))
+}
diff --git a/misc/cgo/test/testdata/issue29563.go b/misc/cgo/test/testdata/issue29563.go
new file mode 100644
index 0000000..84def3c
--- /dev/null
+++ b/misc/cgo/test/testdata/issue29563.go
@@ -0,0 +1,12 @@
+// 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 !windows
+
+// Issue 29563: internal linker fails on duplicate weak symbols.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import _ "cgotest/issue29563"
diff --git a/misc/cgo/test/testdata/issue29563/weak.go b/misc/cgo/test/testdata/issue29563/weak.go
new file mode 100644
index 0000000..21cf635
--- /dev/null
+++ b/misc/cgo/test/testdata/issue29563/weak.go
@@ -0,0 +1,13 @@
+// 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 issue29563
+
+//int foo1();
+//int foo2();
+import "C"
+
+func Bar() int {
+ return int(C.foo1()) + int(C.foo2())
+}
diff --git a/misc/cgo/test/testdata/issue29563/weak1.c b/misc/cgo/test/testdata/issue29563/weak1.c
new file mode 100644
index 0000000..86a2273
--- /dev/null
+++ b/misc/cgo/test/testdata/issue29563/weak1.c
@@ -0,0 +1,11 @@
+// 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.
+
+extern int weaksym __attribute__((__weak__));
+int weaksym = 42;
+
+int foo1()
+{
+ return weaksym;
+}
diff --git a/misc/cgo/test/testdata/issue29563/weak2.c b/misc/cgo/test/testdata/issue29563/weak2.c
new file mode 100644
index 0000000..e01eae8
--- /dev/null
+++ b/misc/cgo/test/testdata/issue29563/weak2.c
@@ -0,0 +1,11 @@
+// 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.
+
+extern int weaksym __attribute__((__weak__));
+int weaksym = 42;
+
+int foo2()
+{
+ return weaksym;
+}
diff --git a/misc/cgo/test/testdata/issue30527.go b/misc/cgo/test/testdata/issue30527.go
new file mode 100644
index 0000000..4ea7d31
--- /dev/null
+++ b/misc/cgo/test/testdata/issue30527.go
@@ -0,0 +1,14 @@
+// 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.
+
+// Issue 30527: function call rewriting casts untyped
+// constants to int because of ":=" usage.
+
+package cgotest
+
+import "cgotest/issue30527"
+
+func issue30527G() {
+ issue30527.G(nil)
+}
diff --git a/misc/cgo/test/testdata/issue30527/a.go b/misc/cgo/test/testdata/issue30527/a.go
new file mode 100644
index 0000000..eb50147
--- /dev/null
+++ b/misc/cgo/test/testdata/issue30527/a.go
@@ -0,0 +1,19 @@
+// 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 issue30527
+
+import "math"
+
+/*
+#include <inttypes.h>
+
+static void issue30527F(char **p, uint64_t mod, uint32_t unused) {}
+*/
+import "C"
+
+func G(p **C.char) {
+ C.issue30527F(p, math.MaxUint64, 1)
+ C.issue30527F(p, 1<<64-1, Z)
+}
diff --git a/misc/cgo/test/testdata/issue30527/b.go b/misc/cgo/test/testdata/issue30527/b.go
new file mode 100644
index 0000000..87e8255
--- /dev/null
+++ b/misc/cgo/test/testdata/issue30527/b.go
@@ -0,0 +1,11 @@
+// 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 issue30527
+
+const (
+ X = 1 << iota
+ Y
+ Z
+)
diff --git a/misc/cgo/test/testdata/issue41761.go b/misc/cgo/test/testdata/issue41761.go
new file mode 100644
index 0000000..919c749
--- /dev/null
+++ b/misc/cgo/test/testdata/issue41761.go
@@ -0,0 +1,20 @@
+// 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.
+
+package cgotest
+
+/*
+ typedef struct S S;
+*/
+import "C"
+
+import (
+ "cgotest/issue41761a"
+ "testing"
+)
+
+func test41761(t *testing.T) {
+ var x issue41761a.T
+ _ = (*C.struct_S)(x.X)
+}
diff --git a/misc/cgo/test/testdata/issue41761a/a.go b/misc/cgo/test/testdata/issue41761a/a.go
new file mode 100644
index 0000000..ca5c181
--- /dev/null
+++ b/misc/cgo/test/testdata/issue41761a/a.go
@@ -0,0 +1,14 @@
+// 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.
+
+package issue41761a
+
+/*
+ typedef struct S S;
+*/
+import "C"
+
+type T struct {
+ X *C.S
+}
diff --git a/misc/cgo/test/testdata/issue43639.go b/misc/cgo/test/testdata/issue43639.go
new file mode 100644
index 0000000..e755fbd
--- /dev/null
+++ b/misc/cgo/test/testdata/issue43639.go
@@ -0,0 +1,9 @@
+// Copyright 2021 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 cgotest
+
+// Issue 43639: No runtime test needed, make sure package cgotest/issue43639 compiles well.
+
+import _ "cgotest/issue43639"
diff --git a/misc/cgo/test/testdata/issue43639/a.go b/misc/cgo/test/testdata/issue43639/a.go
new file mode 100644
index 0000000..fe37d5e
--- /dev/null
+++ b/misc/cgo/test/testdata/issue43639/a.go
@@ -0,0 +1,8 @@
+// Copyright 2021 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 issue43639
+
+// #cgo CFLAGS: -W -Wall -Werror
+import "C"
diff --git a/misc/cgo/test/testdata/issue52611.go b/misc/cgo/test/testdata/issue52611.go
new file mode 100644
index 0000000..32d2240
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611.go
@@ -0,0 +1,13 @@
+// Copyright 2022 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.
+
+// Issue 52611: inconsistent compiler behaviour when compiling a C.struct.
+// No runtime test; just make sure it compiles.
+
+package cgotest
+
+import (
+ _ "cgotest/issue52611a"
+ _ "cgotest/issue52611b"
+)
diff --git a/misc/cgo/test/testdata/issue52611a/a.go b/misc/cgo/test/testdata/issue52611a/a.go
new file mode 100644
index 0000000..0764688
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611a/a.go
@@ -0,0 +1,16 @@
+// Copyright 2022 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 issue52611a
+
+/*
+typedef struct Foo {
+ int X;
+} Foo;
+*/
+import "C"
+
+func GetX1(foo *C.struct_Foo) int32 {
+ return int32(foo.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611a/b.go b/misc/cgo/test/testdata/issue52611a/b.go
new file mode 100644
index 0000000..74a50c5
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611a/b.go
@@ -0,0 +1,11 @@
+// Copyright 2022 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 issue52611a
+
+import "C"
+
+func GetX2(foo *C.struct_Foo) int32 {
+ return int32(foo.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611b/a.go b/misc/cgo/test/testdata/issue52611b/a.go
new file mode 100644
index 0000000..730b52f
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611b/a.go
@@ -0,0 +1,11 @@
+// Copyright 2022 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 issue52611b
+
+import "C"
+
+func GetX1(bar *C.struct_Bar) int32 {
+ return int32(bar.X)
+}
diff --git a/misc/cgo/test/testdata/issue52611b/b.go b/misc/cgo/test/testdata/issue52611b/b.go
new file mode 100644
index 0000000..d304175
--- /dev/null
+++ b/misc/cgo/test/testdata/issue52611b/b.go
@@ -0,0 +1,16 @@
+// Copyright 2022 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 issue52611b
+
+/*
+typedef struct Bar {
+ int X;
+} Bar;
+*/
+import "C"
+
+func GetX2(bar *C.struct_Bar) int32 {
+ return int32(bar.X)
+}
diff --git a/misc/cgo/test/testdata/issue8756.go b/misc/cgo/test/testdata/issue8756.go
new file mode 100644
index 0000000..406c64c
--- /dev/null
+++ b/misc/cgo/test/testdata/issue8756.go
@@ -0,0 +1,17 @@
+package cgotest
+
+/*
+#cgo LDFLAGS: -lm
+#include <math.h>
+*/
+import "C"
+import (
+ "testing"
+
+ "cgotest/issue8756"
+)
+
+func test8756(t *testing.T) {
+ issue8756.Pow()
+ C.pow(1, 2)
+}
diff --git a/misc/cgo/test/testdata/issue8756/issue8756.go b/misc/cgo/test/testdata/issue8756/issue8756.go
new file mode 100644
index 0000000..5f6b777
--- /dev/null
+++ b/misc/cgo/test/testdata/issue8756/issue8756.go
@@ -0,0 +1,11 @@
+package issue8756
+
+/*
+#cgo LDFLAGS: -lm
+#include <math.h>
+*/
+import "C"
+
+func Pow() {
+ C.pow(1, 2)
+}
diff --git a/misc/cgo/test/testdata/issue8828.go b/misc/cgo/test/testdata/issue8828.go
new file mode 100644
index 0000000..0bca0f2
--- /dev/null
+++ b/misc/cgo/test/testdata/issue8828.go
@@ -0,0 +1,16 @@
+// compile
+
+// Copyright 2014 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.
+
+// Issue 8828: compiling a file with -compiler=gccgo fails if a .c file
+// has the same name as compiled directory.
+
+package cgotest
+
+import "cgotest/issue8828"
+
+func p() {
+ issue8828.Bar()
+}
diff --git a/misc/cgo/test/testdata/issue8828/issue8828.c b/misc/cgo/test/testdata/issue8828/issue8828.c
new file mode 100644
index 0000000..27ec23a
--- /dev/null
+++ b/misc/cgo/test/testdata/issue8828/issue8828.c
@@ -0,0 +1,7 @@
+// Copyright 2014 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.
+
+void foo()
+{
+}
diff --git a/misc/cgo/test/testdata/issue8828/trivial.go b/misc/cgo/test/testdata/issue8828/trivial.go
new file mode 100644
index 0000000..e7b9a4e
--- /dev/null
+++ b/misc/cgo/test/testdata/issue8828/trivial.go
@@ -0,0 +1,8 @@
+package issue8828
+
+//void foo();
+import "C"
+
+func Bar() {
+ C.foo()
+}
diff --git a/misc/cgo/test/testdata/issue9026.go b/misc/cgo/test/testdata/issue9026.go
new file mode 100644
index 0000000..3f48881
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9026.go
@@ -0,0 +1,9 @@
+package cgotest
+
+import (
+ "testing"
+
+ "cgotest/issue9026"
+)
+
+func test9026(t *testing.T) { issue9026.Test(t) }
diff --git a/misc/cgo/test/testdata/issue9026/issue9026.go b/misc/cgo/test/testdata/issue9026/issue9026.go
new file mode 100644
index 0000000..ff269ca
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9026/issue9026.go
@@ -0,0 +1,36 @@
+package issue9026
+
+// This file appears in its own package since the assertion tests the
+// per-package counter used to create fresh identifiers.
+
+/*
+typedef struct { int i; } git_merge_file_input;
+
+typedef struct { int j; } git_merge_file_options;
+
+void git_merge_file(
+ git_merge_file_input *in,
+ git_merge_file_options *opts) {}
+*/
+import "C"
+import (
+ "fmt"
+ "testing"
+)
+
+func Test(t *testing.T) {
+ var in C.git_merge_file_input
+ var opts *C.git_merge_file_options
+ C.git_merge_file(&in, opts)
+
+ // Test that the generated type names are deterministic.
+ // (Previously this would fail about 10% of the time.)
+ //
+ // Brittle: the assertion may fail spuriously when the algorithm
+ // changes, but should remain stable otherwise.
+ got := fmt.Sprintf("%T %T", in, opts)
+ want := "issue9026._Ctype_struct___0 *issue9026._Ctype_struct___1"
+ if got != want {
+ t.Errorf("Non-deterministic type names: got %s, want %s", got, want)
+ }
+}
diff --git a/misc/cgo/test/testdata/issue9400/asm_386.s b/misc/cgo/test/testdata/issue9400/asm_386.s
new file mode 100644
index 0000000..96b8b60
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_386.s
@@ -0,0 +1,27 @@
+// Copyright 2014 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 gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+ MOVL $·Baton(SB), BX
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADDL $(1024 * 8), SP
+
+ // Ask signaller to setgid
+ MOVL $1, (BX)
+
+ // Wait for setgid completion
+loop:
+ PAUSE
+ MOVL (BX), AX
+ CMPL AX, $0
+ JNE loop
+
+ // Restore stack
+ SUBL $(1024 * 8), SP
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_amd64x.s b/misc/cgo/test/testdata/issue9400/asm_amd64x.s
new file mode 100644
index 0000000..99509bc
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_amd64x.s
@@ -0,0 +1,27 @@
+// Copyright 2014 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 amd64 amd64p32
+// +build gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADDQ $(1024 * 8), SP
+
+ // Ask signaller to setgid
+ MOVL $1, ·Baton(SB)
+
+ // Wait for setgid completion
+loop:
+ PAUSE
+ MOVL ·Baton(SB), AX
+ CMPL AX, $0
+ JNE loop
+
+ // Restore stack
+ SUBQ $(1024 * 8), SP
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_arm.s b/misc/cgo/test/testdata/issue9400/asm_arm.s
new file mode 100644
index 0000000..cc92856
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_arm.s
@@ -0,0 +1,39 @@
+// Copyright 2014 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 gc
+
+#include "textflag.h"
+
+TEXT cas<>(SB),NOSPLIT,$0
+ MOVW $0xffff0fc0, R15 // R15 is PC
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+ // Save link register
+ MOVW R14, R4
+
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADD $(1024 * 8), R13
+
+ // Ask signaller to setgid
+ MOVW $·Baton(SB), R2
+storeloop:
+ MOVW 0(R2), R0
+ MOVW $1, R1
+ BL cas<>(SB)
+ BCC storeloop
+
+ // Wait for setgid completion
+loop:
+ MOVW $0, R0
+ MOVW $0, R1
+ BL cas<>(SB)
+ BCC loop
+
+ // Restore stack
+ SUB $(1024 * 8), R13
+
+ MOVW R4, R14
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_arm64.s b/misc/cgo/test/testdata/issue9400/asm_arm64.s
new file mode 100644
index 0000000..2565793
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_arm64.s
@@ -0,0 +1,39 @@
+// Copyright 2014 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 gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+ // Save link register
+ MOVD R30, R9
+
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADD $(1024 * 8), RSP
+
+ // Ask signaller to setgid
+ MOVD $·Baton(SB), R0
+ MOVD $1, R1
+storeloop:
+ LDAXRW (R0), R2
+ STLXRW R1, (R0), R3
+ CBNZ R3, storeloop
+
+ // Wait for setgid completion
+ MOVW $0, R1
+ MOVW $0, R2
+loop:
+ LDAXRW (R0), R3
+ CMPW R1, R3
+ BNE loop
+ STLXRW R2, (R0), R3
+ CBNZ R3, loop
+
+ // Restore stack
+ SUB $(1024 * 8), RSP
+
+ MOVD R9, R30
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_loong64.s b/misc/cgo/test/testdata/issue9400/asm_loong64.s
new file mode 100644
index 0000000..c242fc6
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_loong64.s
@@ -0,0 +1,28 @@
+// Copyright 2022 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.
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADDV $(1024*8), R3
+
+ // Ask signaller to setgid
+ MOVW $1, R12
+ DBAR
+ MOVW R12, ·Baton(SB)
+ DBAR
+
+ // Wait for setgid completion
+loop:
+ DBAR
+ MOVW ·Baton(SB), R12
+ OR R13, R13, R13 // hint that we're in a spin loop
+ BNE R12, loop
+ DBAR
+
+ // Restore stack
+ ADDV $(-1024*8), R3
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_mips64x.s b/misc/cgo/test/testdata/issue9400/asm_mips64x.s
new file mode 100644
index 0000000..693231d
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_mips64x.s
@@ -0,0 +1,33 @@
+// Copyright 2016 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 mips64 mips64le
+// +build gc
+
+#include "textflag.h"
+
+#define SYNC WORD $0xf
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADDV $(1024*8), R29
+
+ // Ask signaller to setgid
+ MOVW $1, R1
+ SYNC
+ MOVW R1, ·Baton(SB)
+ SYNC
+
+ // Wait for setgid completion
+loop:
+ SYNC
+ MOVW ·Baton(SB), R1
+ OR R2, R2, R2 // hint that we're in a spin loop
+ BNE R1, loop
+ SYNC
+
+ // Restore stack
+ ADDV $(-1024*8), R29
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_mipsx.s b/misc/cgo/test/testdata/issue9400/asm_mipsx.s
new file mode 100644
index 0000000..63261bb
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_mipsx.s
@@ -0,0 +1,31 @@
+// Copyright 2016 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 mips mipsle
+// +build gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADDU $(1024*8), R29
+
+ // Ask signaller to setgid
+ MOVW $1, R1
+ SYNC
+ MOVW R1, ·Baton(SB)
+ SYNC
+
+ // Wait for setgid completion
+loop:
+ SYNC
+ MOVW ·Baton(SB), R1
+ OR R2, R2, R2 // hint that we're in a spin loop
+ BNE R1, loop
+ SYNC
+
+ // Restore stack
+ ADDU $(-1024*8), R29
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_ppc64x.s b/misc/cgo/test/testdata/issue9400/asm_ppc64x.s
new file mode 100644
index 0000000..b5613fb
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_ppc64x.s
@@ -0,0 +1,32 @@
+// Copyright 2014 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 ppc64 ppc64le
+// +build gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADD $(1024 * 8), R1
+
+ // Ask signaller to setgid
+ MOVW $1, R3
+ SYNC
+ MOVW R3, ·Baton(SB)
+
+ // Wait for setgid completion
+loop:
+ SYNC
+ MOVW ·Baton(SB), R3
+ CMP R3, $0
+ // Hint that we're in a spin loop
+ OR R1, R1, R1
+ BNE loop
+ ISYNC
+
+ // Restore stack
+ SUB $(1024 * 8), R1
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_riscv64.s b/misc/cgo/test/testdata/issue9400/asm_riscv64.s
new file mode 100644
index 0000000..244dada
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_riscv64.s
@@ -0,0 +1,31 @@
+// 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.
+
+// +build riscv64
+// +build gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT|NOFRAME,$0-0
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADD $(1024*8), X2
+
+ // Ask signaller to setgid
+ MOV $1, X5
+ FENCE
+ MOVW X5, ·Baton(SB)
+ FENCE
+
+ // Wait for setgid completion
+loop:
+ FENCE
+ MOVW ·Baton(SB), X5
+ OR X6, X6, X6 // hint that we're in a spin loop
+ BNE ZERO, X5, loop
+ FENCE
+
+ // Restore stack
+ ADD $(-1024*8), X2
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/asm_s390x.s b/misc/cgo/test/testdata/issue9400/asm_s390x.s
new file mode 100644
index 0000000..4856492
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/asm_s390x.s
@@ -0,0 +1,26 @@
+// Copyright 2016 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 gc
+
+#include "textflag.h"
+
+TEXT ·RewindAndSetgid(SB),NOSPLIT,$0-0
+ // Rewind stack pointer so anything that happens on the stack
+ // will clobber the test pattern created by the caller
+ ADD $(1024 * 8), R15
+
+ // Ask signaller to setgid
+ MOVD $·Baton(SB), R5
+ MOVW $1, 0(R5)
+
+ // Wait for setgid completion
+loop:
+ SYNC
+ MOVW ·Baton(SB), R3
+ CMPBNE R3, $0, loop
+
+ // Restore stack
+ SUB $(1024 * 8), R15
+ RET
diff --git a/misc/cgo/test/testdata/issue9400/gccgo.go b/misc/cgo/test/testdata/issue9400/gccgo.go
new file mode 100644
index 0000000..a9b62b0
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/gccgo.go
@@ -0,0 +1,26 @@
+// Copyright 2014 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 gccgo
+
+package issue9400
+
+import (
+ "runtime"
+ "sync/atomic"
+)
+
+// The test for the gc compiler resets the stack pointer so that the
+// stack gets modified. We don't have a way to do that for gccgo
+// without writing more assembly code, which we haven't bothered to
+// do. So this is not much of a test.
+
+var Baton int32
+
+func RewindAndSetgid() {
+ atomic.StoreInt32(&Baton, 1)
+ for atomic.LoadInt32(&Baton) != 0 {
+ runtime.Gosched()
+ }
+}
diff --git a/misc/cgo/test/testdata/issue9400/stubs.go b/misc/cgo/test/testdata/issue9400/stubs.go
new file mode 100644
index 0000000..e431c5a
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400/stubs.go
@@ -0,0 +1,11 @@
+// Copyright 2014 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 gc
+
+package issue9400
+
+var Baton int32
+
+func RewindAndSetgid()
diff --git a/misc/cgo/test/testdata/issue9400_linux.go b/misc/cgo/test/testdata/issue9400_linux.go
new file mode 100644
index 0000000..051b9ab
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9400_linux.go
@@ -0,0 +1,67 @@
+// Copyright 2014 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.
+
+// Test that SIGSETXID runs on signal stack, since it's likely to
+// overflow if it runs on the Go stack.
+
+package cgotest
+
+/*
+#include <sys/types.h>
+#include <unistd.h>
+*/
+import "C"
+
+import (
+ "runtime"
+ "runtime/debug"
+ "sync/atomic"
+ "testing"
+
+ "cgotest/issue9400"
+)
+
+func test9400(t *testing.T) {
+ // We synchronize through a shared variable, so we need two procs
+ defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
+
+ // Start signaller
+ atomic.StoreInt32(&issue9400.Baton, 0)
+ go func() {
+ // Wait for RewindAndSetgid
+ for atomic.LoadInt32(&issue9400.Baton) == 0 {
+ runtime.Gosched()
+ }
+ // Broadcast SIGSETXID
+ runtime.LockOSThread()
+ C.setgid(0)
+ // Indicate that signalling is done
+ atomic.StoreInt32(&issue9400.Baton, 0)
+ }()
+
+ // Grow the stack and put down a test pattern
+ const pattern = 0x123456789abcdef
+ var big [1024]uint64 // len must match assembly
+ for i := range big {
+ big[i] = pattern
+ }
+
+ // Disable GC for the duration of the test.
+ // This avoids a potential GC deadlock when spinning in uninterruptable ASM below #49695.
+ defer debug.SetGCPercent(debug.SetGCPercent(-1))
+ // SetGCPercent waits until the mark phase is over, but the runtime
+ // also preempts at the start of the sweep phase, so make sure that's
+ // done too. See #49695.
+ runtime.GC()
+
+ // Temporarily rewind the stack and trigger SIGSETXID
+ issue9400.RewindAndSetgid()
+
+ // Check test pattern
+ for i := range big {
+ if big[i] != pattern {
+ t.Fatalf("entry %d of test pattern is wrong; %#x != %#x", i, big[i], uint64(pattern))
+ }
+ }
+}
diff --git a/misc/cgo/test/testdata/issue9510.go b/misc/cgo/test/testdata/issue9510.go
new file mode 100644
index 0000000..2c79fab
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9510.go
@@ -0,0 +1,24 @@
+// Copyright 2015 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.
+
+// Test that we can link together two different cgo packages that both
+// use the same libgcc function.
+
+package cgotest
+
+import (
+ "runtime"
+ "testing"
+
+ "cgotest/issue9510a"
+ "cgotest/issue9510b"
+)
+
+func test9510(t *testing.T) {
+ if runtime.GOARCH == "arm" {
+ t.Skip("skipping because libgcc may be a Thumb library")
+ }
+ issue9510a.F(1, 1)
+ issue9510b.F(1, 1)
+}
diff --git a/misc/cgo/test/testdata/issue9510a/a.go b/misc/cgo/test/testdata/issue9510a/a.go
new file mode 100644
index 0000000..1a5224b
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9510a/a.go
@@ -0,0 +1,15 @@
+package issue9510a
+
+/*
+static double csquare(double a, double b) {
+ __complex__ double d;
+ __real__ d = a;
+ __imag__ d = b;
+ return __real__ (d * d);
+}
+*/
+import "C"
+
+func F(a, b float64) float64 {
+ return float64(C.csquare(C.double(a), C.double(b)))
+}
diff --git a/misc/cgo/test/testdata/issue9510b/b.go b/misc/cgo/test/testdata/issue9510b/b.go
new file mode 100644
index 0000000..5016b39
--- /dev/null
+++ b/misc/cgo/test/testdata/issue9510b/b.go
@@ -0,0 +1,15 @@
+package issue9510b
+
+/*
+static double csquare(double a, double b) {
+ __complex__ double d;
+ __real__ d = a;
+ __imag__ d = b;
+ return __real__ (d * d);
+}
+*/
+import "C"
+
+func F(a, b float64) float64 {
+ return float64(C.csquare(C.double(a), C.double(b)))
+}
diff --git a/misc/cgo/test/testdata/test26213.go b/misc/cgo/test/testdata/test26213.go
new file mode 100644
index 0000000..c80032c
--- /dev/null
+++ b/misc/cgo/test/testdata/test26213.go
@@ -0,0 +1,15 @@
+// Copyright 2018 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 cgotest
+
+import (
+ "testing"
+
+ "cgotest/issue26213"
+)
+
+func test26213(t *testing.T) {
+ issue26213.Test26213(t)
+}