diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index 7d901e1f1aa..3321f226f3e 100644 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -273,6 +273,30 @@ fi])# PGAC_C_BUILTIN_UNREACHABLE +# PGAC_C_COMPUTED_GOTO +# ----------------------- +# Check if the C compiler knows computed gotos (gcc extension, also +# available in at least clang). If so, define HAVE_COMPUTED_GOTO. +# +# Checking whether computed gotos are supported syntax-wise ought to +# be enough, as the syntax is otherwise illegal. +AC_DEFUN([PGAC_C_COMPUTED_GOTO], +[AC_CACHE_CHECK(for computed goto support, pgac_cv_computed_goto, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], +[[void *labeladdrs[] = {&&my_label}; + goto *labeladdrs[0]; + my_label: + return 1; +]])], +[pgac_cv_computed_goto=yes], +[pgac_cv_computed_goto=no])]) +if test x"$pgac_cv_computed_goto" = xyes ; then +AC_DEFINE(HAVE_COMPUTED_GOTO, 1, + [Define to 1 if your compiler handles computed gotos.]) +fi])# PGAC_C_COMPUTED_GOTO + + + # PGAC_C_VA_ARGS # -------------- # Check if the C compiler understands C99-style variadic macros, diff --git a/configure b/configure index b5cdebb510b..9528622421e 100755 --- a/configure +++ b/configure @@ -11531,6 +11531,40 @@ if test x"$pgac_cv__builtin_unreachable" = xyes ; then $as_echo "#define HAVE__BUILTIN_UNREACHABLE 1" >>confdefs.h +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for computed goto support" >&5 +$as_echo_n "checking for computed goto support... " >&6; } +if ${pgac_cv_computed_goto+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +void *labeladdrs[] = {&&my_label}; + goto *labeladdrs[0]; + my_label: + return 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + pgac_cv_computed_goto=yes +else + pgac_cv_computed_goto=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_computed_goto" >&5 +$as_echo "$pgac_cv_computed_goto" >&6; } +if test x"$pgac_cv_computed_goto" = xyes ; then + +$as_echo "#define HAVE_COMPUTED_GOTO 1" >>confdefs.h + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __VA_ARGS__" >&5 $as_echo_n "checking for __VA_ARGS__... " >&6; } diff --git a/configure.in b/configure.in index 1d99cda1d8e..7f234f543da 100644 --- a/configure.in +++ b/configure.in @@ -1322,6 +1322,7 @@ PGAC_C_BUILTIN_BSWAP32 PGAC_C_BUILTIN_BSWAP64 PGAC_C_BUILTIN_CONSTANT_P PGAC_C_BUILTIN_UNREACHABLE +PGAC_C_COMPUTED_GOTO PGAC_C_VA_ARGS PGAC_STRUCT_TIMEZONE PGAC_UNION_SEMUN diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 5bcd8a1160f..6a8176b323e 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -108,6 +108,9 @@ /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME +/* Define to 1 if your compiler handles computed gotos. */ +#undef HAVE_COMPUTED_GOTO + /* Define to 1 if you have the header file. */ #undef HAVE_CRTDEFS_H diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32 index 3e4132cd824..5af8369202c 100644 --- a/src/include/pg_config.h.win32 +++ b/src/include/pg_config.h.win32 @@ -78,6 +78,9 @@ /* Define to 1 if you have the `clock_gettime' function. */ /* #undef HAVE_CLOCK_GETTIME */ +/* Define to 1 if your compiler handles computed gotos. */ +/* #undef HAVE_COMPUTED_GOTO */ + /* Define to 1 if you have the `crypt' function. */ /* #undef HAVE_CRYPT */