diff --git a/src/runtime/cgo/cgo.go b/src/runtime/cgo/cgo.go
index 1e3a50291838d1dcb00309035b033d83e9c9bf4f..6b0acf70235dd6174e5030481944b35230d51f28 100644
--- a/src/runtime/cgo/cgo.go
+++ b/src/runtime/cgo/cgo.go
@@ -25,7 +25,8 @@ package cgo
 
 // Use -fno-stack-protector to avoid problems locating the
 // proper support functions. See issues #52919, #54313, #58385.
-#cgo CFLAGS: -Wall -Werror -fno-stack-protector
+// Use -Wdeclaration-after-statement because some CI builds use it.
+#cgo CFLAGS: -Wall -Werror -fno-stack-protector -Wdeclaration-after-statement
 
 #cgo solaris CPPFLAGS: -D_POSIX_PTHREAD_SEMANTICS
 
diff --git a/src/runtime/cgo/gcc_libinit.c b/src/runtime/cgo/gcc_libinit.c
index 33a9ff93cad52711313784832c5097a20073c4b7..6cceae34c6c3547605f9a0ac865e76833cfecb5a 100644
--- a/src/runtime/cgo/gcc_libinit.c
+++ b/src/runtime/cgo/gcc_libinit.c
@@ -48,9 +48,11 @@ x_cgo_sys_thread_create(void* (*func)(void*), void* arg) {
 uintptr_t
 _cgo_wait_runtime_init_done(void) {
 	void (*pfn)(struct context_arg*);
+	int done;
+
 	pfn = __atomic_load_n(&cgo_context_function, __ATOMIC_CONSUME);
 
-	int done = 2;
+	done = 2;
 	if (__atomic_load_n(&runtime_init_done, __ATOMIC_CONSUME) != done) {
 		pthread_mutex_lock(&runtime_init_mu);
 		while (__atomic_load_n(&runtime_init_done, __ATOMIC_CONSUME) == 0) {
diff --git a/src/runtime/cgo/gcc_libinit_windows.c b/src/runtime/cgo/gcc_libinit_windows.c
index 9a8c65ea291ad8c342e448a52bc7e72c69549257..d43d12a24ae28d576b1cedbd3821e87f91d14821 100644
--- a/src/runtime/cgo/gcc_libinit_windows.c
+++ b/src/runtime/cgo/gcc_libinit_windows.c
@@ -69,8 +69,10 @@ x_cgo_sys_thread_create(void (*func)(void*), void* arg) {
 
 int
 _cgo_is_runtime_initialized() {
+	 int status;
+
 	 EnterCriticalSection(&runtime_init_cs);
-	 int status = runtime_init_done;
+	 status = runtime_init_done;
 	 LeaveCriticalSection(&runtime_init_cs);
 	 return status;
 }