# Sanity test a C compiler.

# Copyright (C) 2006, 2009-2012 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Written by Paul Eggert.

AC_DEFUN([BISON_TEST_FOR_WORKING_C_COMPILER], [
  AC_COMPILE_IFELSE(
    [AC_LANG_PROGRAM(
       [[#include <limits.h>
	 int test_array[CHAR_BIT];]])],
    [],
    [AC_MSG_FAILURE([cannot compile a simple C program])])
   AC_SUBST([BISON_C_WORKS], [:])
])

# BISON_CHECK_WITH_POSIXLY_CORRECT(CODE)
# --------------------------------------
# Run the Autoconf CODE with POSIXLY_CORRECT set to 1, and restored to
# its initial value afterwards.
AC_DEFUN([BISON_CHECK_WITH_POSIXLY_CORRECT],
[gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
  xx) gl_had_POSIXLY_CORRECT=exported ;;
  x)  gl_had_POSIXLY_CORRECT=yes      ;;
  *)  gl_had_POSIXLY_CORRECT=         ;;
esac
POSIXLY_CORRECT=1
export POSIXLY_CORRECT
$1
case $gl_had_POSIXLY_CORRECT in
  exported) ;;
  yes) AS_UNSET([POSIXLY_CORRECT]); POSIXLY_CORRECT=1 ;;
  *) AS_UNSET([POSIXLY_CORRECT]) ;;
esac
])

# BISON_LANG_COMPILER_POSIXLY_CORRECT
# -----------------------------------
# Whether the compiler for the current language supports -g in
# POSIXLY_CORRECT mode.  clang-2.9 on OS X does not, because
# "clang-mp-2.9 -o test -g test.c" launches "/usr/bin/dsymutil test -o
# test.dSYM" which fails with "error: unable to open executable '-o'".
#
# Sets <LANG>_COMPILER_POSIXLY_CORRECT to true/false.
AC_DEFUN([BISON_LANG_COMPILER_POSIXLY_CORRECT],
[AC_CACHE_CHECK([whether $_AC_CC supports POSIXLY_CORRECT=1],
                [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct],
[BISON_CHECK_WITH_POSIXLY_CORRECT(
[AC_LINK_IFELSE([AC_LANG_PROGRAM],
                [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct=yes],
                [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct=no])])])
case $bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct in
  yes) AC_SUBST(_AC_LANG_PREFIX[_COMPILER_POSIXLY_CORRECT], [true]) ;;
  no)  AC_SUBST(_AC_LANG_PREFIX[_COMPILER_POSIXLY_CORRECT], [false]);;
esac
])

# BISON_C_COMPILER_POSIXLY_CORRECT
# --------------------------------
# Whether the C compiler supports -g in POSIXLY_CORRECT mode.
AC_DEFUN([BISON_C_COMPILER_POSIXLY_CORRECT],
[AC_LANG_PUSH([C])
BISON_LANG_COMPILER_POSIXLY_CORRECT
AC_LANG_POP([C])
])
