Re: setlocale: Silence a -Wdiscarded-qualifiers warning on Windows.

Collin Funk <[email protected]>
Newsgroups gmane.comp.lib.gnulib.bugs
Message-ID <[email protected]>
Hi Bruno,

Bruno Haible <[email protected]> writes:

> Collin Funk wrote:
>> On Windows (x86_64-w64-mingw32), I see the following warning:
>> 
>>     $ gnulib-tool --create-testdir --dir testdir1
>>     $ cd testdir1
>>     $ ./configure CFLAGS='-Wdiscarded-qualifiers'
>>     $ cd glllib
>>     $ make setlocale.o
>>     depbase=`echo setlocale.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
>>     gcc -DHAVE_CONFIG_H -DEXEEXT=\".exe\" -DEXEEXT=\".exe\" -DNO_XMALLOC -DEXEEXT=\".exe\" -I. -I..  -DGNULIB_STRICT_CHECKING=1 -I/mingw64/include  -Wdiscarded-qualifiers -MT setlocale.o -MD -MP -MF $depbase.Tpo -c -o setlocale.o setlocale.c &&\
>>     mv -f $depbase.Tpo $depbase.Po
>>     setlocale.c: In function 'setlocale_single':
>>     setlocale.c:889:12: warning: return discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
>>       889 |     return setlocale_messages (locale);
>>           |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>> 
>> The attached patch fixes it by casting away the const.
>
> I don't like this because, although in line with the previous code, it
> adds one more cast.

I agree with your dislike of additional casts. I figured it was okay in
this case, given the similar one in setlocale_mtsafe when the result of
setlocale_null is returned. Anyway, glad I asked before committing.

>> Another
>> reasonable solution is changing the definition of setlocale_messages to
>> return a plain "char *".
>
> Returning a 'char *' instead of 'const char *'? This goes in the backward
> direction.
>
> Look: ISO C has 'const char *' since 1990. It also has 'setlocale' since 1990.
> POSIX <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setlocale.html>
> says:
>   "The application shall not modify the string returned."
> Which means that the intended return type is 'const char *'. The return type
> 'char *' is a historical accident. (Probably the ANSI C89 committee simply
> lacked the courage to add 'const'.)
>
> But we can add the intended return type in Gnulib. Done as follows. This
> patch removes two casts, instead of adding a cast.

I considered suggesting this as well for the same reason you mention,
i.e., the standard saying the returned string cannot be modified. But I
mistakenly assumed you would not want to diverge from the standardized
prototype.

Perhaps it is worth bringing this up with the ISO C people. I have CC'd
Alex in case he decides he wants more work to do. I vaguely remember
POSIX being willing to change the return type of gettext to be "const
char *" for similar reasons to this getlocale case. I can hunt down
those links again if they will be useful for a proposal.

Collin
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.