From d365d5abb55e4132068cb0faa10b806175d17a1e Mon Sep 17 00:00:00 2001
From: Ayke van Laethem <aykevanlaethem@gmail.com>
Date: Sun, 3 Mar 2024 20:53:45 +0100
Subject: [PATCH] cgo: do a basic test that math functions work

They should, but we weren't testing this.
I discovered this while working on
https://github.com/tinygo-org/macos-minimal-sdk/pull/4 which will likely
make math.h not work anymore. So I wanted to make sure we have a test in
place before we update that dependency.
---
 testdata/cgo/main.c  | 5 +++++
 testdata/cgo/main.go | 5 +++++
 testdata/cgo/main.h  | 2 ++
 testdata/cgo/out.txt | 2 ++
 4 files changed, 14 insertions(+)

diff --git a/testdata/cgo/main.c b/testdata/cgo/main.c
index 31b60704f5..7fb702ed67 100644
--- a/testdata/cgo/main.c
+++ b/testdata/cgo/main.c
@@ -1,3 +1,4 @@
+#include <math.h>
 #include "main.h"
 
 int global = 3;
@@ -67,3 +68,7 @@ void unionSetData(short f0, short f1, short f2) {
 void arraydecay(int buf1[5], int buf2[3][8], int buf3[4][7][2]) {
 	// Do nothing.
 }
+
+double doSqrt(double x) {
+	return sqrt(x);
+}
diff --git a/testdata/cgo/main.go b/testdata/cgo/main.go
index aac5221f42..fa3380bcea 100644
--- a/testdata/cgo/main.go
+++ b/testdata/cgo/main.go
@@ -2,6 +2,7 @@ package main
 
 /*
 #include <stdio.h>
+#include <math.h>
 int fortytwo(void);
 #include "main.h"
 #include "test.h"
@@ -171,6 +172,10 @@ func main() {
 	C.strcpy((*C.char)(unsafe.Pointer(&buf2[0])), (*C.char)(unsafe.Pointer(&buf1[0])))
 	println("copied string:", string(buf2[:C.strlen((*C.char)(unsafe.Pointer(&buf2[0])))]))
 
+	// libc: test libm functions (normally bundled in libc)
+	println("CGo sqrt(3):", C.sqrt(3))
+	println("C   sqrt(3):", C.doSqrt(3))
+
 	// libc: test basic stdio functionality
 	putsBuf := []byte("line written using C puts\x00")
 	C.puts((*C.char)(unsafe.Pointer(&putsBuf[0])))
diff --git a/testdata/cgo/main.h b/testdata/cgo/main.h
index 702dab0c00..f5405ade62 100644
--- a/testdata/cgo/main.h
+++ b/testdata/cgo/main.h
@@ -150,3 +150,5 @@ extern int global;
 // Test array decaying into a pointer.
 typedef int arraydecay_buf3[4][7][2];
 void arraydecay(int buf1[5], int buf2[3][8], arraydecay_buf3 buf3);
+
+double doSqrt(double);
diff --git a/testdata/cgo/out.txt b/testdata/cgo/out.txt
index 781187b50c..ae92c87a7c 100644
--- a/testdata/cgo/out.txt
+++ b/testdata/cgo/out.txt
@@ -74,4 +74,6 @@ C.GoString(nil):
 len(C.GoStringN(nil, 0)): 0
 len(C.GoBytes(nil, 0)): 0
 copied string: foobar
+CGo sqrt(3): +1.732051e+000
+C   sqrt(3): +1.732051e+000
 line written using C puts