2a6ae474ec2d6b1696065d5aa827d53c318fd69c
[pspp] / m4 / flexmember.m4
1 # Check for flexible array member support.
2
3 # Copyright (C) 2006 Free Software Foundation, Inc.
4
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2, or (at your option)
8 # any later version.
9
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 # 02110-1301, USA.
19
20 # Written by Paul Eggert.
21
22 AC_DEFUN([AC_C_FLEXIBLE_ARRAY_MEMBER],
23 [
24   AC_CACHE_CHECK([for flexible array member],
25     ac_cv_c_flexmember,
26     [AC_COMPILE_IFELSE(
27        [AC_LANG_PROGRAM(
28           [[#include <stdlib.h>
29             #include <stdio.h>
30             #include <stddef.h>
31             struct s { int n; double d[]; };]],
32           [[int m = getchar ();
33             struct s *p = malloc (offsetof (struct s, d)
34                                   + m * sizeof (double));
35             p->d[0] = 0.0;
36             return p->d != (double *) NULL;]])],
37        [ac_cv_c_flexmember=yes],
38        [ac_cv_c_flexmember=no])])
39   if test $ac_cv_c_flexmember = yes; then
40     AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [],
41       [Define to nothing if C supports flexible array members, and to
42        1 if it does not.  That way, with a declaration like `struct s
43        { int n; double d@<:@FLEXIBLE_ARRAY_MEMBER@:>@; };', the struct hack
44        can be used with pre-C99 compilers.])
45   else
46     AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], 1)
47   fi
48 ])