René Scharfe <l.s.r@xxxxxx> writes: > We compare the types of the elements, so effectively we do this: > > __builtin_types_compatible_p(__typeof__(const char *), __typeof__(char *)) > > ... which returns 0. True. I wonder if (const const char *) and (const char *) are deemed compatible? Even if so, probably we cannot write __builtin_types_compatible_p(const __typeof__(*(dst)), const __typeof__(*(src))) so that line of thoguht would lead nowhere X-<. > We can remove the const like we already do for Visual Studio. But > then we have to add two casts when passing on argv2, like in > mingw_execv(), because adding a const to a pointer of a pointer > must be done explicitly in C (even though Visual Studio seems to > do it implicitly without complaining). Feels a bit silly. :-| Indeed. Let's see what folks, whom "git blame" tells us to be area experts around here, think. The "if _MSC, add const" was added in 12fb9bd8 (msvc: mark a variable as non-const, 2019-06-19) by JeffH, and try_shell_exec() function itself came from f1a4dfb8 (Windows: Wrap execve so that shell scripts can be invoked., 2007-12-04), added by J6t. > --- >8 --- > Subject: [PATCH 1.5/4] mingw: make argv2 in try_shell_exec() non-const > > Prepare for a stricter type check in COPY_ARRAY by removing the const > qualifier of argv2, like we already do to placate Visual Studio. We > have to add it back using explicit casts when actually using the > variable, unfortunately, because GCC (rightly) refuses to add it > implicitly. Similar casts are already used in mingw_execv(). > > Signed-off-by: René Scharfe <l.s.r@xxxxxx> > --- > compat/mingw.c | 7 ++----- > 1 file changed, 2 insertions(+), 5 deletions(-) > > diff --git a/compat/mingw.c b/compat/mingw.c > index d614f156df..e131eb9b07 100644 > --- a/compat/mingw.c > +++ b/compat/mingw.c > @@ -1839,16 +1839,13 @@ static int try_shell_exec(const char *cmd, char *const *argv) > if (prog) { > int exec_id; > int argc = 0; > -#ifndef _MSC_VER > - const > -#endif > char **argv2; > while (argv[argc]) argc++; > ALLOC_ARRAY(argv2, argc + 1); > argv2[0] = (char *)cmd; /* full path to the script file */ > COPY_ARRAY(&argv2[1], &argv[1], argc); > - exec_id = trace2_exec(prog, argv2); > - pid = mingw_spawnv(prog, argv2, 1); > + exec_id = trace2_exec(prog, (const char **)argv2); > + pid = mingw_spawnv(prog, (const char **)argv2, 1); > if (pid >= 0) { > int status; > if (waitpid(pid, &status, 0) < 0) > -- > 2.38.1.windows.1