diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2014-08-07 17:16:40 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-08-07 17:17:25 -0700 |
commit | f6156ba05083625751a23fe2df1cd6694f42f356 (patch) | |
tree | 59e3f453152104a1b9a6e2f791ab1ee4b6b1d92a | |
parent | 8a8e0756756e0981d8b33c63ff55cd08182b3d67 (diff) | |
download | autoconf-f6156ba05083625751a23fe2df1cd6694f42f356.tar.gz |
autoconf: modernize AC_C_VARARRAYS for C11
* lib/autoconf/c.m4 (AC_C_VARARRAYS): Define __STDC_NO_VLA__ if
VLAs are not supported, as this is what C11 does. The old macro
HAVE_C_VARARRAYS is still defined if they are supported, but is
now obsolescent. Also, check for VLA bug in GCC 3.4.3.
* doc/autoconf.texi (C Compiler), NEWS: Document the above.
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | doc/autoconf.texi | 12 | ||||
-rw-r--r-- | lib/autoconf/c.m4 | 52 |
3 files changed, 60 insertions, 10 deletions
@@ -31,6 +31,12 @@ GNU Autoconf NEWS - User visible changes. - New macro AC_C__GENERIC. +- AC_C_VARARRAYS now defines __STDC_NO_VLA__ if variable-length + arrays are not supported and if the compiler does not already + define __STDC_NO_VLA__. This is for compatibility with C11. + For backward compatibility with Autoconf 2.61-2.69 AC_C_VARARRAYS + still defines HAVE_C_VARARRAYS, but this usage is obsolescent. + - AC_CONFIG_MACRO_DIRS New macro, used to declare multiple directories when looking for local M4 macros. This macro overcomes some of the shortfalls in the diff --git a/doc/autoconf.texi b/doc/autoconf.texi index 791436bf..83e66431 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -7488,11 +7488,15 @@ for (i = 0; i < n; i++) @defmac AC_C_VARARRAYS @acindex{C_VARARRAYS} +@cvindex __STDC_NO_VLA__ @cvindex HAVE_C_VARARRAYS -If the C compiler supports variable-length arrays, define -@code{HAVE_C_VARARRAYS}. A variable-length array is an array of automatic -storage duration whose length is determined at run time, when the array -is declared. +If the C compiler does not support variable-length arrays, define the +macro @code{__STDC_NO_VLA__} to be 1 if it is not already defined. A +variable-length array is an array of automatic storage duration whose +length is determined at run time, when the array is declared. For +backward compatibility this macro also defines @code{HAVE_C_VARARRAYS} +if the C compiler supports variable-length arrays, but this usage is +obsolescent and new programs should use @code{__STDC_NO_VLA__}. @end defmac @defmac AC_C_TYPEOF diff --git a/lib/autoconf/c.m4 b/lib/autoconf/c.m4 index b58e42d3..a9445295 100644 --- a/lib/autoconf/c.m4 +++ b/lib/autoconf/c.m4 @@ -1995,14 +1995,54 @@ AC_DEFUN([AC_C_VARARRAYS], [ AC_CACHE_CHECK([for variable-length arrays], ac_cv_c_vararrays, - [AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM([], - [[static int x; char a[++x]; a[sizeof a - 1] = 0; return a[0];]])], - [ac_cv_c_vararrays=yes], - [ac_cv_c_vararrays=no])]) - if test $ac_cv_c_vararrays = yes; then + [AC_EGREP_CPP([defined], + [#ifdef __STDC_NO_VLA__ + defined + #endif + ], + [ac_cv_c_vararrays='no: __STDC_NO_VLA__ is defined'], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[/* Test for VLA support. This test is partly inspired + from examples in the C standard. Use at least two VLA + functions to detect the GCC 3.4.3 bug described in: + http://lists.gnu.org/archive/html/bug-gnulib/2014-08/msg00014.html + */ + #ifdef __STDC_NO_VLA__ + syntax error; + #else + extern int n; + int B[100]; + int fvla (int m, int C[m][m]); + + int + simple (int count, int all[static count]) + { + return all[count - 1]; + } + + int + fvla (int m, int C[m][m]) + { + typedef int VLA[m][m]; + VLA x; + int D[m]; + static int (*q)[m] = &B; + int (*s)[n] = q; + return C && &x[0][0] == &D[0] && &D[0] == s[0]; + } + #endif + ]])], + [ac_cv_c_vararrays=yes], + [ac_cv_c_vararrays=no])])]) + if test "$ac_cv_c_vararrays" = yes; then + dnl This is for compatibility with Autoconf 2.61-2.69. AC_DEFINE([HAVE_C_VARARRAYS], 1, [Define to 1 if C supports variable-length arrays.]) + elif test "$ac_cv_c_vararrays" = no; then + AC_DEFINE([__STDC_NO_VLA__], 1, + [Define to 1 if C does not support variable-length arrays, and + if the compiler does not already define this.]) fi ]) |