diff --git a/data/c.m4 b/data/c.m4
index a1c33e9d..3d812304 100644
--- a/data/c.m4
+++ b/data/c.m4
@@ -267,12 +267,19 @@ m4_define([b4_attribute_define],
# --------------
# Portability issues: define a YY_NULLPTR appropriate for the current
# language (C, C++98, or C++11).
+#
+# In C++ pre C++11 it is standard practice to use 0 (not NULL) for the
+# null pointer. In C, prefer ((void*)0) to avoid having to include stdlib.h.
m4_define([b4_null_define],
[# ifndef YY_NULLPTR
-# if defined __cplusplus && 201103L <= __cplusplus
-# define YY_NULLPTR nullptr
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
# else
-# define YY_NULLPTR 0
+# define YY_NULLPTR ((void*)0)
# endif
# endif[]dnl
])
diff --git a/tests/atlocal.in b/tests/atlocal.in
index 8638d1a0..6b24f1ca 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -16,8 +16,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-# We need 'config.h' (builddir/lib), and the gnulib headers (srcdir/lib).
-CPPFLAGS="-I$abs_top_srcdir/lib -I$abs_top_builddir/lib @CPPFLAGS@"
+# We need 'testsuite.h', (srcdir/test), 'config.h' (builddir/lib), and
+# the gnulib headers (srcdir/lib).
+CPPFLAGS="-I$abs_top_srcdir/tests -I$abs_top_srcdir/lib -I$abs_top_builddir/lib @CPPFLAGS@"
# Don't just check if $POSIXLY_CORRECT is set, as Bash, when launched
# as /bin/sh, sets the shell variable POSIXLY_CORRECT to y, but not
diff --git a/tests/local.at b/tests/local.at
index e1c8f353..ab66b00f 100644
--- a/tests/local.at
+++ b/tests/local.at
@@ -347,11 +347,11 @@ m4_define([AT_LANG_DISPATCH],
# The prologue that should be included in any source code that is
# meant to be compiled. Keep atlocal.in sync (BISON_CXX_WORKS).
m4_define([AT_DATA_SOURCE_PROLOGUE],
-[[#include
-/* We don't need perfect functions for these tests. */
-#undef malloc
-#undef memcmp
-#undef realloc
+[[/* Load config.h, and adjust to the compiler.
+ We used to do it here, but each time we add a new line,
+ we have to adjust all the line numbers in error messages.
+ It's simpler to use a constant include to a varying file. */
+#include
]])
# AT_DATA_GRAMMAR_PROLOGUE
diff --git a/tests/local.mk b/tests/local.mk
index f480afa4..29106220 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -15,7 +15,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-EXTRA_DIST += $(TESTSUITE_AT) tests/testsuite
+EXTRA_DIST += $(TESTSUITE_AT) %D%/testsuite %D%/testsuite.h
DISTCLEANFILES += %D%/atconfig $(check_SCRIPTS)
MAINTAINERCLEANFILES += $(TESTSUITE)
diff --git a/tests/testsuite.h b/tests/testsuite.h
new file mode 100644
index 00000000..e4c8298d
--- /dev/null
+++ b/tests/testsuite.h
@@ -0,0 +1,14 @@
+#include
+/* We don't need perfect functions for these tests. */
+#undef malloc
+#undef memcmp
+#undef realloc
+
+/* In C++ pre C++11 it is standard practice to use 0 for the null
+ pointer. But GCC -std=c++98 with -Wzero-as-null-pointer-constant
+ warns about this. Warning introduced in GCC 4.7. */
+#if defined __cplusplus && __cplusplus < 201103L
+# if defined __GNUC__ && ! defined __clang__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
+# endif
+#endif