newlocale: Linux incompatibility

Ken Brown
Thu Mar 23 19:48:35 GMT 2023

I'm reporting this here rather than the newlib list because the behavior 
is compatible with Posix but not Linux, so I think it's a Cygwin issue.

Consider the following test case:

$ cat locale_test.c
#include <stdio.h>
#include <locale.h>

int main ()
   const char *locale = "en_DE.UTF-8";
   locale_t loc = newlocale (LC_COLLATE_MASK | LC_CTYPE_MASK, locale, 0);
   if (!loc)
     perror ("newlocale");
     printf ("newlocale succeeded on invalid locale %s\n", locale);

$ gcc -o locale_test locale_test.c

$ ./locale_test.exe
newlocale succeeded on invalid locale en_DE.UTF-8

On Linux, the newlocale call fails with ENOENT, as is documented on the 
man page.  Posix doesn't say what should happen on an invalid locale, so 
this is not, strictly speaking, a bug.


P.S. I noticed this because of a failing Emacs test.  No one else has 
reported this test failure, so it seems that newlocale fails on an 
invalid locale on all platforms supported by Emacs other than Cygwin.

More information about the Cygwin mailing list