Hi Nathan, On 4/23/20 22:47, Nathan Chancellor wrote: > Hi Gustavo, > > That patch in -next appears to introduce some warnings with clang when > CONFIG_UAPI_HEADER_TEST is enabled (allyesconfig/allmodconfig exposed it > for us with KernelCI [1]): > Thanks a lot for reporting this. > ./usr/include/rdma/ib_user_verbs.h:436:34: warning: field 'base' with > variable sized type 'struct ib_uverbs_create_cq_resp' not at the end of > a struct or class is a GNU extension > [-Wgnu-variable-sized-type-not-at-end] > struct ib_uverbs_create_cq_resp base; > ^ > ./usr/include/rdma/ib_user_verbs.h:647:34: warning: field 'base' with > variable sized type 'struct ib_uverbs_create_qp_resp' not at the end of > a struct or class is a GNU extension > [-Wgnu-variable-sized-type-not-at-end] > struct ib_uverbs_create_qp_resp base; > ^ > ./usr/include/rdma/ib_user_verbs.h:743:29: warning: field 'base' with > variable sized type 'struct ib_uverbs_modify_qp' not at the end of a > struct or class is a GNU extension > [-Wgnu-variable-sized-type-not-at-end] > struct ib_uverbs_modify_qp base; > ^ > 3 warnings generated. > > I presume this is part of the point of the conversion since you mention > a compiler warning when the flexible member is not at the end of a > struct. How should they be fixed? That should probably happen before the > patch gets merged. > For all the cases above, the solution seems to be to move the declaration of the "base" member to the end of the corresponding structure, as below: diff --git a/include/uapi/rdma/ib_user_verbs.h b/include/uapi/rdma/ib_user_verbs.h index a390a667b3f3..e05538be8b30 100644 --- a/include/uapi/rdma/ib_user_verbs.h +++ b/include/uapi/rdma/ib_user_verbs.h @@ -644,9 +644,9 @@ struct ib_uverbs_create_qp_resp { }; struct ib_uverbs_ex_create_qp_resp { - struct ib_uverbs_create_qp_resp base; __u32 comp_mask; __u32 response_length; + struct ib_uverbs_create_qp_resp base; }; /* but I guess this will change the ABI? Also, notice that: "A structure containing a flexible array member, or a union containing such a structure (possibly recursively), may not be a member of a structure or an element of an array. (However, these uses are permitted by GCC as extensions.)"[1] [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html Thanks -- Gustavo