Skip to contentSkip to conversation

mingw: avoid the comma operator

PATCH In review Johannes Schindelin via GitGitGadget 3 participants 3 messages Nov 17, 2025 – Nov 18, 2025

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mingw: avoid the comma operator

From: Johannes Schindelin <[email protected]>

The pattern return errno = ..., -1; is observed several times in compat/mingw.c. It has served us well over the years, but now clang starts complaining:

compat/mingw.c:723:24: error: possible misuse of comma operator here [-Werror,-Wcomma]

    723 |                 return errno = ENOSYS, -1;
        |                                      ^

See for example this failing workflow run:
https://github.com/git-for-windows/git-sdk-arm64/actions/runs/15457893907/job/43513458823#step:8:201

Let's appease clang (and also reduce the use of the no longer common comma operator).

---
mingw: avoid the comma operator

I wonder how many more times I will deal with the comma operator...

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2007%2Fdscho%2Fmingw-avoid-the-comma-operator-5660--v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2007/dscho/mingw-avoid-the-comma-operator-5660--v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2007

 compat/mingw.c | 48 ++++++++++++++++++++++++++++--------------------
 1 file changed, 28 insertions(+), 20 deletions(-)
compat/mingw.c +28 -20
index 736a07a028..90ba5cea9d 100644
@@ -491,8 +491,10 @@ static int mingw_open_append(wchar_t const *wfilename, int oflags, ...)
 	DWORD create = (oflags & O_CREAT) ? OPEN_ALWAYS : OPEN_EXISTING;
 
 	/* only these flags are supported */
-	if ((oflags & ~O_CREAT) != (O_WRONLY | O_APPEND))
-		return errno = ENOSYS, -1;
+	if ((oflags & ~O_CREAT) != (O_WRONLY | O_APPEND)) {
+		errno = ENOSYS;
+		return -1;
+	}
 
 	/*
 	 * FILE_SHARE_WRITE is required to permit child processes
@@ -2450,12 +2452,14 @@ static int start_timer_thread(void)
 	timer_event = CreateEvent(NULL, FALSE, FALSE, NULL);
 	if (timer_event) {
 		timer_thread = (HANDLE) _beginthreadex(NULL, 0, ticktack, NULL, 0, NULL);
-		if (!timer_thread )
-			return errno = ENOMEM,
-				error("cannot start timer thread");
-	} else
-		return errno = ENOMEM,
-			error("cannot allocate resources for timer");
+		if (!timer_thread ) {
+			errno = ENOMEM;
+			return error("cannot start timer thread");
+		}
+	} else {
+		errno = ENOMEM;
+		return error("cannot allocate resources for timer");
+	}
 	return 0;
 }
 
@@ -2488,13 +2492,15 @@ int setitimer(int type UNUSED, struct itimerval *in, struct itimerval *out)
 	static const struct timeval zero;
 	static int atexit_done;
 
-	if (out)
-		return errno = EINVAL,
-			error("setitimer param 3 != NULL not implemented");
+	if (out) {
+		errno = EINVAL;
+		return error("setitimer param 3 != NULL not implemented");
+	}
 	if (!is_timeval_eq(&in->it_interval, &zero) &&
-	    !is_timeval_eq(&in->it_interval, &in->it_value))
-		return errno = EINVAL,
-			error("setitimer: it_interval must be zero or eq it_value");
+	    !is_timeval_eq(&in->it_interval, &in->it_value)) {
+		errno = EINVAL;
+		return error("setitimer: it_interval must be zero or eq it_value");
+	}
 
 	if (timer_thread)
 		stop_timer_thread();
@@ -2516,12 +2522,14 @@ int sigaction(int sig, struct sigaction *in, struct sigaction *out)
 {
 	if (sig == SIGCHLD)
 		return -1;
-	else if (sig != SIGALRM)
-		return errno = EINVAL,
-			error("sigaction only implemented for SIGALRM");
-	if (out)
-		return errno = EINVAL,
-			error("sigaction: param 3 != NULL not implemented");
+	else if (sig != SIGALRM) {
+		errno = EINVAL;
+		return error("sigaction only implemented for SIGALRM");
+	}
+	if (out) {
+		errno = EINVAL;
+		return error("sigaction: param 3 != NULL not implemented");
+	}
 
 	timer_fn = in->sa_handler;
 	return 0;

base-commit: 9a2fb147f2c61d0cab52c883e7e26f5b7948e3ed

Signature · 1 line
gitgitgadget
#1 lore raw

"Johannes Schindelin via GitGitGadget" <[email protected]>

Quoted 13 lines · writes:

From: Johannes Schindelin <[email protected]>

The pattern return errno = ..., -1; is observed several times in compat/mingw.c. It has served us well over the years, but now clang starts complaining:

compat/mingw.c:723:24: error: possible misuse of comma operator here [-Werror,-Wcomma]

    723 |                 return errno = ENOSYS, -1;
        |                                      ^

See for example this failing workflow run:
https://github.com/git-for-windows/git-sdk-arm64/actions/runs/15457893907/job/43513458823#step:8:201

Quoted 8 lines

Let's appease clang (and also reduce the use of the no longer common comma operator).

---
mingw: avoid the comma operator

I wonder how many more times I will deal with the comma operator...

;-)

compat/mingw.c static int mingw_open_append(wchar_t const *wfilename, int oflags, ...) · line 497

Quoted 7 lines
compat/mingw.c +4 -2
 	/* only these flags are supported */
-	if ((oflags & ~O_CREAT) != (O_WRONLY | O_APPEND))
-		return errno = ENOSYS, -1;
+	if ((oflags & ~O_CREAT) != (O_WRONLY | O_APPEND)) {
+		errno = ENOSYS;
+		return -1;
+	}

Good riddance. It indeed is somewhat hard to read, especially because it may not be apparent to readers how "A = B, C" binds (answer: B gets assigned to A and then the whole thing yields C).

I wonder if

	return (errno = ENOSYS), -1;

is accepted by the compiler, but in these error handling we do not have to be cute, and updated code that is both simple and stupid reads very well.

Will queue. Thanks.

#2 lore raw
Quoted 12 lines · Junio C Hamano

compat/mingw.c static int mingw_open_append(wchar_t const *wfilename, int oflags, ...) · line 497

Quoted 7 lines
compat/mingw.c +4 -2
 	/* only these flags are supported */
-	if ((oflags & ~O_CREAT) != (O_WRONLY | O_APPEND))
-		return errno = ENOSYS, -1;
+	if ((oflags & ~O_CREAT) != (O_WRONLY | O_APPEND)) {
+		errno = ENOSYS;
+		return -1;
+	}

Good riddance. It indeed is somewhat hard to read, especially because it may not be apparent to readers how "A = B, C" binds (answer: B gets assigned to A and then the whole thing yields C).

Quoted 7 lines

I wonder if

	return (errno = ENOSYS), -1;

is accepted by the compiler, but in these error handling we do not have to be cute, and updated code that is both simple and stupid reads very well.

Agreed that we are best avoiding comma operators when we can. There is one spot where we use it, though, and I haven't figured out a good way around it: in the error() macro wrapper.

I guess it does not cause the same compiler complaints because there is no assignment in it. So if nobody is complaining, we can just avert our eyes when looking at the macro. :)

-Peff