]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
configure: Add explicit checks for all GNU99 extensions used.
authorMark Wielaard <mjw@redhat.com>
Tue, 14 Apr 2015 08:18:37 +0000 (10:18 +0200)
committerMark Wielaard <mjw@redhat.com>
Tue, 14 Apr 2015 08:27:12 +0000 (10:27 +0200)
Some compilers (clang) claim to support -std=gnu99 but don't actually
implement all extensions we use in the code. Producing really hard to
parse errors. Add explicit checks for some of the other language
extensions we use, Nested Functions and Arrays of Variable Length,
to the configure check to catch such issues early.

https://bugzilla.redhat.com/show_bug.cgi?id=1211357

Signed-off-by: Mark Wielaard <mjw@redhat.com>
ChangeLog
configure.ac

index 5c8e1c24e4a6632ea05868bf22c9692c6c434e2b..9a0a82db164580e92e84a02f8a801a61a9294b0c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-14  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac (ac_cv_c99): Add explicit checks for all GNU99
+       extensions used.
+
 2015-03-13  Mark Wielaard  <mjw@redhat.com>
 
        * configure.ac (ac_cv_c99): Add explicit return.
index c4b818d02dbf486ed9d70f766512dac9a7005330..ed2c964417f8cdab4d9297036f531302b0106d8e 100644 (file)
@@ -79,15 +79,38 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
 AC_CHECK_TOOL([READELF], [readelf])
 AC_CHECK_TOOL([NM], [nm])
 
-AC_CACHE_CHECK([for gcc with C99 support], ac_cv_c99, [dnl
+# We use -std=gnu99 but have explicit checks for some language constructs
+# and GNU extensions since some compilers claim GNU99 support, but don't
+# really support all language extensions. In particular we need
+# Mixed Declarations and Code
+# https://gcc.gnu.org/onlinedocs/gcc/Mixed-Declarations.html
+# Nested Functions
+# https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
+# Arrays of Variable Length
+# https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
+AC_CACHE_CHECK([for gcc with GNU99 support], ac_cv_c99, [dnl
 old_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -std=gnu99"
 AC_COMPILE_IFELSE([AC_LANG_SOURCE([dnl
-int foo (int a) { for (int i = 0; i < a; ++i) if (i % 4) break; int s = a; return s;}])],
+int foo (int a)
+{
+  for (int i = 0; i < a; ++i) if (i % 4) break; int s = a; return s;
+}
+
+double bar (double a, double b)
+{
+  double square (double z) { return z * z; }
+  return square (a) + square (b);
+}
+
+void baz (int n)
+{
+  struct S { int x[[n]]; };
+}])],
                  ac_cv_c99=yes, ac_cv_c99=no)
 CFLAGS="$old_CFLAGS"])
 AS_IF([test "x$ac_cv_c99" != xyes],
-      AC_MSG_ERROR([gcc with C99 support required]))
+      AC_MSG_ERROR([gcc with GNU99 support required]))
 
 AC_CACHE_CHECK([for __thread support], ac_cv_tls, [dnl
 # Use the same flags that we use for our DSOs, so the test is representative.