Skip to contentSkip to conversation

hyperv: Avoid -Wflex-array-member-not-at-end warning

PATCH Applied Gustavo A. R. Silva 3 participants 5 messages Dec 12, 2025 – Dec 19, 2025

Subsystems (3)

v1 of 3 Applied Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 hyperv: Avoid -Wflex-array-member-not-at-end warning

-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.

Use the new __TRAILING_OVERLAP() helper to fix the following warning:

include/hyperv/hvgdk_mini.h:581:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]

This helper creates a union between a flexible-array member (FAM) and a set of MEMBERS that would otherwise follow it.

This overlays the trailing MEMBER u64 gva_list[]; onto the FAM struct hv_tlb_flush_ex::hv_vp_set.bank_contents[], while keeping the FAM and the start of MEMBER aligned.

The static_assert() ensures this alignment remains, and it's intentionally placed inmediately after the related structure --no blank line in between.

---
 include/hyperv/hvgdk_mini.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
include/hyperv/hvgdk_mini.h +5 -2
index 04b18d0e37af..30fbbde81c5c 100644
@@ -578,9 +578,12 @@ struct hv_tlb_flush {	 /* HV_INPUT_FLUSH_VIRTUAL_ADDRESS_LIST */
 struct hv_tlb_flush_ex {
 	u64 address_space;
 	u64 flags;
-	struct hv_vpset hv_vp_set;
-	u64 gva_list[];
+	__TRAILING_OVERLAP(struct hv_vpset, hv_vp_set, bank_contents, __packed,
+		u64 gva_list[];
+	);
 } __packed;
+static_assert(offsetof(struct hv_tlb_flush_ex, hv_vp_set.bank_contents) ==
+	      offsetof(struct hv_tlb_flush_ex, gva_list));
 
 struct ms_hyperv_tsc_page {	 /* HV_REFERENCE_TSC_PAGE */
 	volatile u32 tsc_sequence;
Signature · 1 line
2.43.0
maintainer
#1 lore raw
Quoted 14 lines · Gustavo A. R. Silva

-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.

Use the new __TRAILING_OVERLAP() helper to fix the following warning:

include/hyperv/hvgdk_mini.h:581:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]

This helper creates a union between a flexible-array member (FAM) and a set of MEMBERS that would otherwise follow it.

This overlays the trailing MEMBER u64 gva_list[]; onto the FAM struct hv_tlb_flush_ex::hv_vp_set.bank_contents[], while keeping the FAM and the start of MEMBER aligned.

Quoted 5 lines

The static_assert() ensures this alignment remains, and it's intentionally placed inmediately after the related structure --no blank line in between.

Gustavo, what is your build command? I would like to incorporate that into my own build tests.

Thanks,
Wei

Quoted 26 lines
---
 include/hyperv/hvgdk_mini.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
include/hyperv/hvgdk_mini.h +5 -2
index 04b18d0e37af..30fbbde81c5c 100644
@@ -578,9 +578,12 @@ struct hv_tlb_flush {	 /* HV_INPUT_FLUSH_VIRTUAL_ADDRESS_LIST */
 struct hv_tlb_flush_ex {
 	u64 address_space;
 	u64 flags;
-	struct hv_vpset hv_vp_set;
-	u64 gva_list[];
+	__TRAILING_OVERLAP(struct hv_vpset, hv_vp_set, bank_contents, __packed,
+		u64 gva_list[];
+	);
 } __packed;
+static_assert(offsetof(struct hv_tlb_flush_ex, hv_vp_set.bank_contents) ==
+	      offsetof(struct hv_tlb_flush_ex, gva_list));
 
 struct ms_hyperv_tsc_page {	 /* HV_REFERENCE_TSC_PAGE */
 	volatile u32 tsc_sequence;
Signature · 1 line
2.43.0
#2 lore raw
Quoted 15 lines · Wei Liu
Quoted 14 lines · Gustavo A. R. Silva

-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.

Use the new __TRAILING_OVERLAP() helper to fix the following warning:

include/hyperv/hvgdk_mini.h:581:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]

This helper creates a union between a flexible-array member (FAM) and a set of MEMBERS that would otherwise follow it.

This overlays the trailing MEMBER u64 gva_list[]; onto the FAM struct hv_tlb_flush_ex::hv_vp_set.bank_contents[], while keeping the FAM and the start of MEMBER aligned.

Quoted 8 lines
Quoted 5 lines

The static_assert() ensures this alignment remains, and it's intentionally placed inmediately after the related structure --no blank line in between.

Gustavo, what is your build command? I would like to incorporate that into my own build tests.

I'm using the following patch (which is the one I'll actually submit upstream once all these warnings are fixed).

Makefile +2 -0
index e404e4767944..0d6a0d8f791b 100644
@@ -1086,6 +1086,8 @@ KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3)
 # Allow including a tagged struct or union anonymously in another struct/union.
 KBUILD_CFLAGS += -fms-extensions
 
+KBUILD_CFLAGS += $(call cc-option, -Wflex-array-member-not-at-end)
+
 # disable invalid "can't wrap" optimizations for signed / pointers
 KBUILD_CFLAGS  += -fno-strict-overflow
 

Thanks
-Gustavo

Quoted 30 lines

Thanks,
Wei

Quoted 26 lines
---
  include/hyperv/hvgdk_mini.h | 7 +++++--
  1 file changed, 5 insertions(+), 2 deletions(-)
include/hyperv/hvgdk_mini.h +5 -2
index 04b18d0e37af..30fbbde81c5c 100644
@@ -578,9 +578,12 @@ struct hv_tlb_flush {	 /* HV_INPUT_FLUSH_VIRTUAL_ADDRESS_LIST */
  struct hv_tlb_flush_ex {
  	u64 address_space;
  	u64 flags;
-	struct hv_vpset hv_vp_set;
-	u64 gva_list[];
+	__TRAILING_OVERLAP(struct hv_vpset, hv_vp_set, bank_contents, __packed,
+		u64 gva_list[];
+	);
  } __packed;
+static_assert(offsetof(struct hv_tlb_flush_ex, hv_vp_set.bank_contents) ==
+	      offsetof(struct hv_tlb_flush_ex, gva_list));
 
  struct ms_hyperv_tsc_page {	 /* HV_REFERENCE_TSC_PAGE */
  	volatile u32 tsc_sequence;
Signature · 1 line
2.43.0
maintainer Applied
#3 lore raw
In reply to Gustavo A. R. Silva
Quoted 14 lines · Gustavo A. R. Silva

-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.

Use the new __TRAILING_OVERLAP() helper to fix the following warning:

include/hyperv/hvgdk_mini.h:581:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]

This helper creates a union between a flexible-array member (FAM) and a set of MEMBERS that would otherwise follow it.

This overlays the trailing MEMBER u64 gva_list[]; onto the FAM struct hv_tlb_flush_ex::hv_vp_set.bank_contents[], while keeping the FAM and the start of MEMBER aligned.

Quoted 5 lines

The static_assert() ensures this alignment remains, and it's intentionally placed inmediately after the related structure --no blank line in between.

Applied. I fixed a typo in the commit message ("inmediately" -> "immediately").

Wei

Quoted 26 lines
---
 include/hyperv/hvgdk_mini.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
include/hyperv/hvgdk_mini.h +5 -2
index 04b18d0e37af..30fbbde81c5c 100644
@@ -578,9 +578,12 @@ struct hv_tlb_flush {	 /* HV_INPUT_FLUSH_VIRTUAL_ADDRESS_LIST */
 struct hv_tlb_flush_ex {
 	u64 address_space;
 	u64 flags;
-	struct hv_vpset hv_vp_set;
-	u64 gva_list[];
+	__TRAILING_OVERLAP(struct hv_vpset, hv_vp_set, bank_contents, __packed,
+		u64 gva_list[];
+	);
 } __packed;
+static_assert(offsetof(struct hv_tlb_flush_ex, hv_vp_set.bank_contents) ==
+	      offsetof(struct hv_tlb_flush_ex, gva_list));
 
 struct ms_hyperv_tsc_page {	 /* HV_REFERENCE_TSC_PAGE */
 	volatile u32 tsc_sequence;
Signature · 1 line
2.43.0
#4 lore raw
Quoted 15 lines · Wei Liu
Quoted 14 lines · Gustavo A. R. Silva

-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.

Use the new __TRAILING_OVERLAP() helper to fix the following warning:

include/hyperv/hvgdk_mini.h:581:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]

This helper creates a union between a flexible-array member (FAM) and a set of MEMBERS that would otherwise follow it.

This overlays the trailing MEMBER u64 gva_list[]; onto the FAM struct hv_tlb_flush_ex::hv_vp_set.bank_contents[], while keeping the FAM and the start of MEMBER aligned.

Quoted 8 lines
Quoted 5 lines

The static_assert() ensures this alignment remains, and it's intentionally placed inmediately after the related structure --no blank line in between.

Applied. I fixed a typo in the commit message ("inmediately" -> "immediately").

Awesome. :)

Thanks
-Gustavo