On 2026-02-24T14:00:39+0100, Alejandro Colomar wrote: > On 2026-02-24T13:56:23+0100, Alejandro Colomar wrote: > > Hi Rene, > > > > On 2026-02-24T13:41:26+0100, Rene Kita wrote: > > > This explains why it went so smooth with Arch. m-( > > > > > > Running the build on Arch I get multiple errors of this kind: > > > browser.c:548:17: error: initialization discards 'const' qualifier from > > > pointer target type [-Werror=discarded-qualifiers] > > > 548 | char *c = strrchr (d, '/'); > > > | ^~~~~~~ > > > > > > This is in function: > > > static int examine_directory (MUTTMENU *menu, struct browser_state *state, > > > const char *d, const char *prefix). > > > > > > AFAIU, strrchr is defined as: char * strrchr(const char *s, int c). > > > > Being Arch, I suspect you're using the latest glibc. C23 has changed > > the prototype of string search functions to use 'QChar', which is just > > a way of saying "the const qualifier, if present on the input, is > > preserved in the output". > > <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf#subsubsection.7.26.5.6> > > > > This makes it possible to write code that is more type-safe. > > > > Since C23, the standard prototype for strrchr(3) is: > > > > QChar *strrchr(QChar *s, int c); > > > > which could be documented in a more C++-style way, with overloads: > > > > char *strrchr(char *s, int c); > > const char *strrchr(const char *s, int c); > > > > I now need to update the manual pages, and think I'm going to use the > > latter, although feel free to suggest some preference or some other way > > to document it. > > > > The glibc commit that changed this was: > > > > glibc.git cd748a63ab1a (2025-11-20; "Implement C23 const-preserving > > standard library macros") > > > > which is contained in glibc-2.43. > > > > > > > > *c is changed later in that function, so we can't make it const. Any > > > ideas what's the best way forward from here? > > > > If *c is later changed, and it derives from d, then d must be non-const, > > doesn't it? Or is c later derived from another pointer? If the latter > > is true, then we'd need to use a different local pointer variable. > > After reading the source code myself, this looks like a bug. d should > be non-const, as we modify it. > > $ grepc examine_directory . | grep -e '\<d\>' -e '\<c\>' -e { -e }; > ./browser.c:static int examine_directory (MUTTMENU *menu, struct > browser_state *state, > const char *d, const char *prefix)
I've tried fixing this, by trying to remove const from above. However,
that triggers a number of warnings like this one:
buffer.h:32:54: warning: passing argument 3 of ‘examine_directory’
discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
32 | #define mutt_b2s(b) (b->data ? (const char *)b->data : "")
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
browser.c:947:44: note: in expansion of macro ‘mutt_b2s’
947 | if (examine_directory (NULL, &state, mutt_b2s
(working_dir), mutt_b2s (prefix)) == -1)
| ^~~~~~~~
browser.c:535:37: note: expected ‘char *’ but argument is of type
‘const char *’
535 | char *d, const char *prefix)
| ~~~~~~^
The solution would be to make that "" modifiable, with a C99 compound
literal. We require C99, so we can do that. However, that would mean:
-#define mutt_b2s(b) (b->data ? (const char *)b->data : "")
+#define mutt_b2s(b) (b->data ? b->data : (char []){""})
which itself carries questions: is it okay to modify such a buffer?
It must be okay, since we're already doing it, but still needs some
research. Also, why was const added there in the first place, if we're
modifying it?
Cheers,
Alex
> {
> while (stat (d, &s) == -1)
> {
> {
> char *c = strrchr (d, '/');
> if (c && (c > d))
> {
> *c = 0;
> }
> }
> mutt_perror (d);
> }
> {
> mutt_error (_("%s is not a directory."), d);
> }
> if ((dp = opendir (d)) == NULL)
> {
> mutt_perror (d);
> }
> {
> mutt_buffer_concat_path (full_path, d, de->d_name);
> {
> }
> }
> }
>
> >
> >
> > Have a lovely day!
> > Alex
> >
> > --
> > <https://www.alejandro-colomar.es>
>
>
>
> --
> <https://www.alejandro-colomar.es>
--
<https://www.alejandro-colomar.es>
signature.asc
Description: PGP signature
