diff options
author | Maciej W. Rozycki <macro@linux-mips.org> | 2020-11-26 17:26:43 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@linux-mips.org> | 2020-11-26 17:26:43 +0000 |
commit | beb9afcaf1466996a301c778596c5df209e7913c (patch) | |
tree | cb7e81bf247d50948a6c12748b9057e8f5a3f1d7 /libgfortran | |
parent | c87cce5a339bae3b73f34dbc20409de07caf68da (diff) | |
download | gcc-beb9afcaf1466996a301c778596c5df209e7913c.zip gcc-beb9afcaf1466996a301c778596c5df209e7913c.tar.gz gcc-beb9afcaf1466996a301c778596c5df209e7913c.tar.bz2 |
libgfortran: Verify the presence of all functions for POSIX 2008 locale
While we have `configure' checks for the individual POSIX 2008 extended
locale functions we refer to and use to guard the respective call sites,
we only verify the presence of `newlocale' for our global feature enable
check. Consequently compilation fails for targets like NetBSD that only
have partial support for POSIX 2008 locale features and in particular
lack the `uselocale' function:
.../libgfortran/io/transfer.c: In function 'data_transfer_init_worker':
.../libgfortran/io/transfer.c:3416:30: error:
'old_locale_lock' undeclared (first use in this function)
3416 | __gthread_mutex_lock (&old_locale_lock);
| ^~~~~~~~~~~~~~~
.../libgfortran/io/transfer.c:3416:30: note: each undeclared identifier is reported only once for each function it appears in
.../libgfortran/io/transfer.c:3417:12: error:
'old_locale_ctr' undeclared (first use in this function)
3417 | if (!old_locale_ctr++)
| ^~~~~~~~~~~~~~
.../libgfortran/io/transfer.c:3419:11: error:
'old_locale' undeclared (first use in this function); did you mean 'c_locale'?
3419 | old_locale = setlocale (LC_NUMERIC, NULL);
| ^~~~~~~~~~
| c_locale
.../libgfortran/io/transfer.c: In function 'finalize_transfer':
.../libgfortran/io/transfer.c:4253:26: error:
'old_locale_lock' undeclared (first use in this function)
4253 | __gthread_mutex_lock (&old_locale_lock);
| ^~~~~~~~~~~~~~~
.../libgfortran/io/transfer.c:4254:10: error:
'old_locale_ctr' undeclared (first use in this function)
4254 | if (!--old_locale_ctr)
| ^~~~~~~~~~~~~~
.../libgfortran/io/transfer.c:4256:30: error:
'old_locale' undeclared (first use in this function); did you mean 'c_locale'?
4256 | setlocale (LC_NUMERIC, old_locale);
| ^~~~~~~~~~
| c_locale
make[3]: *** [Makefile:6221: transfer.lo] Error 1
Only enable the use of POSIX 2008 extended locale features then when all
the three functions required are present, removing said build errors.
libgfortran/
* io/io.h [HAVE_NEWLOCALE]: Also check for HAVE_FREELOCALE and
HAVE_USELOCALE.
[HAVE_FREELOCALE && HAVE_NEWLOCALE && HAVE_USELOCALE]
(HAVE_POSIX_2008_LOCALE): New macro.
(st_parameter_dt) [HAVE_NEWLOCALE]: Check for
HAVE_POSIX_2008_LOCALE instead.
* io/transfer.c (data_transfer_init_worker, finalize_transfer)
[HAVE_USELOCALE]: Check for HAVE_POSIX_2008_LOCALE instead.
* io/unit.c [HAVE_NEWLOCALE]: Likewise.
(init_units) [HAVE_NEWLOCALE]: Likewise.
(close_units) [HAVE_FREELOCALE]: Likewise.
* runtime/error.c (gf_strerror) [HAVE_USELOCALE]: Likewise.
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/io/io.h | 10 | ||||
-rw-r--r-- | libgfortran/io/transfer.c | 4 | ||||
-rw-r--r-- | libgfortran/io/unit.c | 6 | ||||
-rw-r--r-- | libgfortran/runtime/error.c | 2 |
4 files changed, 13 insertions, 9 deletions
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index ab4a103..b4a8113 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -52,8 +52,12 @@ struct format_data; typedef struct fnode fnode; struct gfc_unit; -#ifdef HAVE_NEWLOCALE -/* We have POSIX 2008 extended locale stuff. */ +#if defined (HAVE_FREELOCALE) && defined (HAVE_NEWLOCALE) \ + && defined (HAVE_USELOCALE) +/* We have POSIX 2008 extended locale stuff. We only choose to use it + if all the functions required are present as some systems, e.g. NetBSD + do not have `uselocale'. */ +#define HAVE_POSIX_2008_LOCALE extern locale_t c_locale; internal_proto(c_locale); #else @@ -562,7 +566,7 @@ typedef struct st_parameter_dt char *line_buffer; struct format_data *fmt; namelist_info *ionml; -#ifdef HAVE_NEWLOCALE +#ifdef HAVE_POSIX_2008_LOCALE locale_t old_locale; #endif /* Current position within the look-ahead line buffer. */ diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index dc18bc3..c36d8bc 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -3410,7 +3410,7 @@ data_transfer_init_worker (st_parameter_dt *dtp, int read_flag) if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED) { -#ifdef HAVE_USELOCALE +#ifdef HAVE_POSIX_2008_LOCALE dtp->u.p.old_locale = uselocale (c_locale); #else __gthread_mutex_lock (&old_locale_lock); @@ -4243,7 +4243,7 @@ finalize_transfer (st_parameter_dt *dtp) } } -#ifdef HAVE_USELOCALE +#ifdef HAVE_POSIX_2008_LOCALE if (dtp->u.p.old_locale != (locale_t) 0) { uselocale (dtp->u.p.old_locale); diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c index a3b0656..faf6299 100644 --- a/libgfortran/io/unit.c +++ b/libgfortran/io/unit.c @@ -114,7 +114,7 @@ static char stdout_name[] = "stdout"; static char stderr_name[] = "stderr"; -#ifdef HAVE_NEWLOCALE +#ifdef HAVE_POSIX_2008_LOCALE locale_t c_locale; #else /* If we don't have POSIX 2008 per-thread locales, we need to use the @@ -586,7 +586,7 @@ init_units (void) { gfc_unit *u; -#ifdef HAVE_NEWLOCALE +#ifdef HAVE_POSIX_2008_LOCALE c_locale = newlocale (0, "C", 0); #else #ifndef __GTHREAD_MUTEX_INIT @@ -803,7 +803,7 @@ close_units (void) free (newunits); -#ifdef HAVE_FREELOCALE +#ifdef HAVE_POSIX_2008_LOCALE freelocale (c_locale); #endif } diff --git a/libgfortran/runtime/error.c b/libgfortran/runtime/error.c index ff6b852..a401dba 100644 --- a/libgfortran/runtime/error.c +++ b/libgfortran/runtime/error.c @@ -272,7 +272,7 @@ gf_strerror (int errnum, p = strerror (errnum); return p; #elif defined(HAVE_STRERROR_R) -#ifdef HAVE_USELOCALE +#ifdef HAVE_POSIX_2008_LOCALE /* Some targets (Darwin at least) have the POSIX 2008 extended locale functions, but not strerror_l. So reset the per-thread locale here. */ |