GNU bug report logs - #20031
Solaris 10: <cstdlib> doesn't declare malloc, free, exit in the global namespace

Previous Next

Package: automake;

Reported by: "dclarke <at> blastwave.org" <dclarke <at> blastwave.org>

Date: Sat, 7 Mar 2015 17:28:02 UTC

Severity: normal

Tags: confirmed

Done: Mike Frysinger <vapier <at> gentoo.org>

Bug is archived. No further changes may be made.

Full log


Message #16 received at 20031 <at> debbugs.gnu.org (full text, mbox):

From: Mike Frysinger <vapier <at> gentoo.org>
To: 20031 <at> debbugs.gnu.org
Subject: [PATCH] tests: fix yacc C++ tests with some C++ compilers
Date: Sun, 20 Feb 2022 14:32:09 -0500
Fixes automake bug https://bugs.gnu.org/20031.

The C++ standard does not require symbols be placed into the global
namespace, just in the std namespace.  The GNU implementation will
place symbols in both.  For our specific code, we don't care either.

Unfortunately, it looks like generated flex code assumes that some
stdlib.h symbols (free, malloc, exit) are in the global namespace,
even when compiling for C++.  So when we include <cstdlib> but not
<stdlib.h>, we might not get the symbols in the global namespace.

We can workaround this by including stdlib.h in these tests without
invalidating the point of the tests in general.

* t/yacc-cxx.sh: Include stdlib.h.
* t/yacc-d-cxx.sh: Likewise.
* t/yacc-mix-c-cxx.sh: Likewise.
---
 t/yacc-cxx.sh       | 3 +++
 t/yacc-d-cxx.sh     | 3 +++
 t/yacc-mix-c-cxx.sh | 4 ++++
 3 files changed, 10 insertions(+)

diff --git a/t/yacc-cxx.sh b/t/yacc-cxx.sh
index 9dd9aabf7f38..33e73cbc0837 100644
--- a/t/yacc-cxx.sh
+++ b/t/yacc-cxx.sh
@@ -43,6 +43,9 @@ END
 
 cat > parse1.yy << 'END'
 %{
+// Include C header to provide global symbols that flex assumes.
+// https://bugs.gnu.org/20031
+#include <stdlib.h>
 // Valid C++, but deliberately invalid C.
 #include <cstdio>
 #include <cstdlib>
diff --git a/t/yacc-d-cxx.sh b/t/yacc-d-cxx.sh
index ce7a9b123094..b6390a67a51d 100644
--- a/t/yacc-d-cxx.sh
+++ b/t/yacc-d-cxx.sh
@@ -26,6 +26,9 @@ write_parse ()
   header=$1
   unindent <<END
     %{
+    // Include C header to provide global symbols that flex assumes.
+    // https://bugs.gnu.org/20031
+    #include <stdlib.h>
     // Valid C++, but deliberately invalid C.
     #include <cstdlib>
     #include "$header"
diff --git a/t/yacc-mix-c-cxx.sh b/t/yacc-mix-c-cxx.sh
index eb02d4cd5790..475a8e9f5588 100644
--- a/t/yacc-mix-c-cxx.sh
+++ b/t/yacc-mix-c-cxx.sh
@@ -82,6 +82,10 @@ END
 
 cat > parse.yy <<'END'
 %{
+// Include C header to provide global symbols that flex assumes.
+// https://bugs.gnu.org/20031
+#include <stdlib.h>
+// Valid C++, but deliberately invalid C.
 #include <cstdlib>
 #include "parse.hh"
 int yylex (void) { return 0; }
-- 
2.34.1





This bug report was last modified 3 years and 93 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.