Re: [PATCH net] tcp: Fix -Wc23-extensions in tcp_options_write()

From: Palmer Dabbelt
Date: Wed Nov 01 2023 - 20:41:18 EST


On Tue, 31 Oct 2023 13:23:35 PDT (-0700), nathan@xxxxxxxxxx wrote:
Clang warns (or errors with CONFIG_WERROR=y) when CONFIG_TCP_AO is set:

net/ipv4/tcp_output.c:663:2: error: label at end of compound statement is a C23 extension [-Werror,-Wc23-extensions]
663 | }
| ^
1 error generated.

On earlier releases (such as clang-11, the current minimum supported
version for building the kernel) that do not support C23, this was a
hard error unconditionally:

net/ipv4/tcp_output.c:663:2: error: expected statement
}
^
1 error generated.

Add a semicolon after the label to create an empty statement, which
resolves the warning or error for all compilers.

Closes: https://github.com/ClangBuiltLinux/linux/issues/1953
Fixes: 1e03d32bea8e ("net/tcp: Add TCP-AO sign to outgoing packets")
Signed-off-by: Nathan Chancellor <nathan@xxxxxxxxxx>
---
net/ipv4/tcp_output.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index f558c054cf6e..6064895daece 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -658,7 +658,7 @@ static void tcp_options_write(struct tcphdr *th, struct tcp_sock *tp,
memset(ptr, TCPOPT_NOP, sizeof(*ptr));
ptr++;
}
-out_ao:
+out_ao:;
#endif
}
if (unlikely(opts->mss)) {

---
base-commit: 55c900477f5b3897d9038446f72a281cae0efd86
change-id: 20231031-tcp-ao-fix-label-in-compound-statement-warning-ebd6c9978498

Best regards,

This gives me a

linux/net/ipv4/tcp_output.c:663:2: error: expected statement
}

on GCC for me. So I think something like

diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index f558c054cf6e..ca09763acaa8 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -659,6 +659,11 @@ static void tcp_options_write(struct tcphdr *th, struct tcp_sock *tp,
ptr++;
}
out_ao:
+ /*
+ * Labels at the end of compound statements are a C23 feature, so
+ * introduce a block to avoid a warning/error on strict toolchains.
+ */
+ {}
#endif
}
if (unlikely(opts->mss)) {

should do it (though it's still build testing...)