Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Mar 2026 17:25:57 +0000
From:      Yuri Victorovich <yuri@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: 000e016f64cc - main - math/lean4: Fix stack overflow test
Message-ID:  <69c80f25.377c4.379d3367@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by yuri:

URL: https://cgit.FreeBSD.org/ports/commit/?id=000e016f64cc0b4fb7a483672c98adc451939c6d

commit 000e016f64cc0b4fb7a483672c98adc451939c6d
Author:     Yuri Victorovich <yuri@FreeBSD.org>
AuthorDate: 2026-03-28 17:20:55 +0000
Commit:     Yuri Victorovich <yuri@FreeBSD.org>
CommitDate: 2026-03-28 17:25:55 +0000

    math/lean4: Fix stack overflow test
    
    All other failing tests fail spuriously due to parallel contention.
    They all pass when run individually.
---
 math/lean4/Makefile                                 |  3 ++-
 .../files/patch-src_runtime_stack__overflow.cpp     | 21 ++++++++++++++++++++-
 .../patch-stage0_src_runtime_stack__overflow.cpp    | 21 ++++++++++++++++++++-
 math/lean4/files/run-tests-one-by-one.sh            | 14 ++++++++++++++
 4 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/math/lean4/Makefile b/math/lean4/Makefile
index d36f0279a70f..2033d6a08123 100644
--- a/math/lean4/Makefile
+++ b/math/lean4/Makefile
@@ -1,6 +1,7 @@
 PORTNAME=	lean4
 DISTVERSIONPREFIX=	v
 DISTVERSION=	4.29.0
+PORTREVISION=	1
 CATEGORIES=	math lang devel # lean4 is primarily a math theorem prover, but it is also a language and a development environment
 
 MAINTAINER=	yuri@FreeBSD.org
@@ -79,6 +80,6 @@ post-install:
 
 # tests as of 4.25.2-20251201: 100% tests passed, 0 tests failed out of 3367
 # tests as of 4.29.0-rc2: 99% tests passed, 12 tests failed out of 3584, see https://github.com/leanprover/lean4/issues/12721
-# tests as of 4.29.0: 99% tests passed, 19 tests failed out of 3582
+# tests as of 4.29.0: 99% tests passed, 18 tests failed out of 3582
 
 .include <bsd.port.mk>
diff --git a/math/lean4/files/patch-src_runtime_stack__overflow.cpp b/math/lean4/files/patch-src_runtime_stack__overflow.cpp
index e888a55cfead..15e3f049261b 100644
--- a/math/lean4/files/patch-src_runtime_stack__overflow.cpp
+++ b/math/lean4/files/patch-src_runtime_stack__overflow.cpp
@@ -1,4 +1,4 @@
---- src/runtime/stack_overflow.cpp.orig	2025-11-18 02:29:21 UTC
+--- src/runtime/stack_overflow.cpp.orig	2026-03-27 12:45:03 UTC
 +++ src/runtime/stack_overflow.cpp
 @@ -21,6 +21,11 @@ Port of the corresponding Rust code (see links below).
  #include <initializer_list>
@@ -12,3 +12,22 @@
  namespace lean {
  // stack guard of the main thread
  static stack_guard * g_stack_guard;
+@@ -64,8 +69,18 @@ bool is_within_stack_guard(void * addr) {
+ #endif
+     // close enough; the actual guard might be bigger, but it's unlikely a Lean function will have stack frames that big
+     size_t guardsize = static_cast<size_t>(sysconf(_SC_PAGESIZE));
++#if defined(__FreeBSD__)
++    // On FreeBSD the guard page position depends on how the thread was created:
++    // - Main thread with ulimit: guard is below stackaddr (Linux-style, linux_check)
++    // - Spawned threads with explicit stacksize: guard is the first page of the
++    //   region starting at stackaddr (freebsd_check)
++    // Accept either convention.
++    return (stackaddr - guardsize <= addr && addr < stackaddr) ||
++           (stackaddr <= addr && addr < stackaddr + guardsize);
++#else
+     // the stack guard is *below* the stack
+     return stackaddr - guardsize <= addr && addr < stackaddr;
++#endif
+ }
+ 
+ extern "C" LEAN_EXPORT void segv_handler(int signum, siginfo_t * info, void *) {
diff --git a/math/lean4/files/patch-stage0_src_runtime_stack__overflow.cpp b/math/lean4/files/patch-stage0_src_runtime_stack__overflow.cpp
index cb4949c8e4d2..c1fa5ae36845 100644
--- a/math/lean4/files/patch-stage0_src_runtime_stack__overflow.cpp
+++ b/math/lean4/files/patch-stage0_src_runtime_stack__overflow.cpp
@@ -1,4 +1,4 @@
---- stage0/src/runtime/stack_overflow.cpp.orig	2025-05-06 09:12:17 UTC
+--- stage0/src/runtime/stack_overflow.cpp.orig	2026-03-27 12:45:03 UTC
 +++ stage0/src/runtime/stack_overflow.cpp
 @@ -7,6 +7,10 @@ Port of the corresponding Rust code (see links below).
  Print a nicer error message on stack overflow.
@@ -11,3 +11,22 @@
  #ifdef LEAN_WINDOWS
  #include <windows.h>
  #else
+@@ -64,8 +68,18 @@ bool is_within_stack_guard(void * addr) {
+ #endif
+     // close enough; the actual guard might be bigger, but it's unlikely a Lean function will have stack frames that big
+     size_t guardsize = static_cast<size_t>(sysconf(_SC_PAGESIZE));
++#if defined(__FreeBSD__)
++    // On FreeBSD the guard page position depends on how the thread was created:
++    // - Main thread with ulimit: guard is below stackaddr (Linux-style, linux_check)
++    // - Spawned threads with explicit stacksize: guard is the first page of the
++    //   region starting at stackaddr (freebsd_check)
++    // Accept either convention.
++    return (stackaddr - guardsize <= addr && addr < stackaddr) ||
++           (stackaddr <= addr && addr < stackaddr + guardsize);
++#else
+     // the stack guard is *below* the stack
+     return stackaddr - guardsize <= addr && addr < stackaddr;
++#endif
+ }
+ 
+ extern "C" LEAN_EXPORT void segv_handler(int signum, siginfo_t * info, void *) {
diff --git a/math/lean4/files/run-tests-one-by-one.sh b/math/lean4/files/run-tests-one-by-one.sh
new file mode 100755
index 000000000000..351b92009cb3
--- /dev/null
+++ b/math/lean4/files/run-tests-one-by-one.sh
@@ -0,0 +1,14 @@
+cd /usr/ports/math/lean4/work/lean4-`make -V PORTVERSION`/tests/lean/run
+export PATH=/usr/ports/math/lean4/work/.build/stage1/bin:$PATH
+
+for t in letToHave.lean 983.lean ExprLens.lean try_heartbeats.lean collectLooseBVars.lean whereCmd.lean async_select_channel.lean; do
+	echo "==> Running test: $t"
+	result=$(bash test_single.sh $t 2>&1; echo "exit=$?")
+	echo "... output for $t: $result"
+
+	if [ "$result" == "exit=0" ]; then
+		echo "<== Test $t passed."
+	else
+		echo "<== Test $t failed. Output: $result"
+	fi
+done


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69c80f25.377c4.379d3367>