test failure on FreeBSD 12.0

Bruno Haible <[email protected]>
Newsgroups gmane.comp.gnu.m4.bugs
Message-ID <2875476.t2r7yGXgoR@omega>
Hi,

On FreeBSD 12.0/x86, the newest release m4-1.4.18 and the newest snapshot
from https://gitlab.com/gnu-m4/ci-distcheck/ both exhibit a "make check"
failure:

Checking ../../checks/189.eval
@ ../doc/m4.texi:6405: Origin of test
../../checks/189.eval: stdout mismatch
--- m4-tmp.17036/m4-xout	2020-05-03 02:14:13.289357000 +0200
+++ m4-tmp.17036/m4-out	2020-05-03 02:14:13.279345000 +0200
@@ -2,8 +2,8 @@
 
 1
 1
-overflow occurred
--2147483648
+
+2147483648
 0
 -2
 -2

...

Failed checks were:
  ../../checks/189.eval:out
*** Error code 1

Simplified test case:
$ cat > in <<EOF
define(`max_int', eval(`0x7fffffff'))
define(`min_int', incr(max_int))
min_int
EOF
$ m4 < in

Expected output:


-2147483648

Actual output on FreeBSD:


2147483648

The bug occurs if and only if the source file builtin.c is compiled with
optimization -O2 or higher.

The attached patch (for the 'branch-1.4' branch) fixes the issue.

Bruno
0001-Work-around-a-compiler-optimization-bug-on-FreeBSD-1.patch (text/x-patch, 1.1 KB)
From aaa68d60ab6c84783cf050a9e43aa6f40c81e4df Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Sun, 3 May 2020 03:00:46 +0200
Subject: [PATCH] Work around a compiler optimization bug on FreeBSD 12.0.

* src/builtin.c (ntoa): Declare value parameter as 'volatile'.
---
 src/builtin.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/builtin.c b/src/builtin.c
index 4eaccc6..988cc93 100644
--- a/src/builtin.c
+++ b/src/builtin.c
@@ -1,6 +1,6 @@
 /* GNU m4 -- A simple macro processor
 
-   Copyright (C) 1989-1994, 2000, 2004, 2006-2014, 2016-2017 Free
+   Copyright (C) 1989-1994, 2000, 2004, 2006-2014, 2016-2017, 2020 Free
    Software Foundation, Inc.
 
    This file is part of GNU M4.
@@ -449,8 +449,9 @@ numeric_arg (token_data *macro, const char *arg, int *valuep)
 /* Digits for number to ASCII conversions.  */
 static char const digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
 
+/* The 'volatile' neutralizes a clang 6.0.1 optimization bug.  */
 const char *
-ntoa (int32_t value, int radix)
+ntoa (int32_t volatile value, int radix)
 {
   bool negative;
   uint32_t uvalue;
-- 
2.7.4
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.