On 23/10/2020 22.06, Daniele Buono wrote: > Clang 11 finds a couple of spots in the code that trigger new warnings: > > ../qemu-base/hw/usb/dev-uas.c:157:31: error: field 'status' with variable > sized type 'uas_iu' not at the end of a struct or class is a GNU extension > [-Werror,-Wgnu-variable-sized-type-not-at-end] > uas_iu status; > ^ > 1 error generated. > > The data structure is UASStatus, which must end with a QTAILQ_ENTRY, so > I believe we cannot have uas_iu at the end. Since this is a gnu > extension but CLANG supports it, just add > -Wno-gnu-variable-sized-type-not-at-end > to remove the warning. > > ../qemu-base/target/s390x/cpu_models.c:985:21: error: cast to smaller integer > type 'S390Feat' from 'void *' [-Werror,-Wvoid-pointer-to-enum-cast] > S390Feat feat = (S390Feat) opaque; > ^~~~~~~~~~~~~~~~~ > ../qemu-base/target/s390x/cpu_models.c:1002:21: error: cast to smaller > integer type 'S390Feat' from 'void *' [-Werror,-Wvoid-pointer-to-enum-cast] > S390Feat feat = (S390Feat) opaque; > ^~~~~~~~~~~~~~~~~ > ../qemu-base/target/s390x/cpu_models.c:1036:27: error: cast to smaller > integer type 'S390FeatGroup' from 'void *' > [-Werror,-Wvoid-pointer-to-enum-cast] > S390FeatGroup group = (S390FeatGroup) opaque; > ^~~~~~~~~~~~~~~~~~~~~~ > ../qemu-base/target/s390x/cpu_models.c:1057:27: error: cast to smaller > integer type 'S390FeatGroup' from 'void *' > [-Werror,-Wvoid-pointer-to-enum-cast] > S390FeatGroup group = (S390FeatGroup) opaque; > ^~~~~~~~~~~~~~~~~~~~~~ > 4 errors generated. > > These are void * that get casted to enums, which are (or can be) > smaller than a 64bit pointer. > A code reorg may be better on the long term, but for now will > fix this adding > -Wno-void-pointer-to-enum-cast
Compiling all code with -Wno-void-pointer-to-enum-cast sounds like the wrong approach to me, since this might hide some real bugs in other spots instead. Could you please try to cast the value through (uintptr_t) first, e.g. : S390Feat feat = (S390Feat)(uintptr_t) opaque; It's a little bit ugly, but still better than to disable the warning globally, I think. Thomas > Signed-off-by: Daniele Buono <dbu...@linux.vnet.ibm.com> > --- > configure | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/configure b/configure > index e6754c1e87..9dc05cfb8a 100755 > --- a/configure > +++ b/configure > @@ -2000,6 +2000,8 @@ add_to nowarn_flags -Wno-shift-negative-value > add_to nowarn_flags -Wno-string-plus-int > add_to nowarn_flags -Wno-typedef-redefinition > add_to nowarn_flags -Wno-tautological-type-limit-compare > +add_to nowarn_flags -Wno-gnu-variable-sized-type-not-at-end > +add_to nowarn_flags -Wno-void-pointer-to-enum-cast > add_to nowarn_flags -Wno-psabi > > gcc_flags="$warn_flags $nowarn_flags" >