On 2019-01-09 13:58, Daniel P. Berrangé wrote: > On Wed, Jan 09, 2019 at 01:52:02PM +0100, Thomas Huth wrote: >> On 2019-01-09 12:44, Daniel P. Berrangé wrote: >>> On Wed, Jan 09, 2019 at 12:25:43PM +0100, Thomas Huth wrote: >>>> On 2019-01-09 11:58, Daniel P. Berrangé wrote: >>>>> On Mon, Jan 07, 2019 at 11:45:26AM +0100, Thomas Huth wrote: >>>>>> Different versions of GCC and Clang use different versions of the C >>>>>> standard. >>>>>> This repeatedly caused problems already, e.g. with duplicated typedefs: >>>>>> >>>>>> https://lists.gnu.org/archive/html/qemu-devel/2018-11/msg05829.html >>>>>> >>>>>> or with for-loop variable initializers: >>>>>> >>>>>> https://lists.gnu.org/archive/html/qemu-devel/2019-01/msg00237.html >>>>>> >>>>>> To avoid these problems, we should enforce the C language version to the >>>>>> same level for all compilers. Since our minimum compiler versions are >>>>>> GCC v4.8 and Clang v3.4 now, and both basically support "gnu11" already, >>>>>> this seems to be a good choice. >>>>> >>>>> In 4.x gnu11 is marked as experimental. I'm not really comfortable >>>>> using experimental features - even if its warning free there's a risk >>>>> it would silently mis-compile something. >>>>> >>>>> gnu99 is ok with 4.x - it is merely "incomplete". >>>> >>>> gnu11 has the big advantage that it also fixes the problem with >>>> duplicated typedefs that are reported by older versions of Clang. >>>> >>>> Are you sure about the experimental character in 4.x? I just looked at >>>> https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/Standards.html and it says: >>>> >>>> "A fourth version of the C standard, known as C11, was published in 2011 >>>> as ISO/IEC 9899:2011. GCC has limited incomplete support for parts of >>>> this standard, enabled with -std=c11 or -std=iso9899:2011." >>>> >>>> It does not say anything about "experimental" there. The word >>>> "experimental" is only used for the C++ support, but we hardly have C++ >>>> code in QEMU -- if you worry about that, I could simply drop the >>>> "-std=gnu++11" part from my patch? >>> >>> I was looking at the "info gcc" docs on RHEL7, gcc-4.8.5-16.el7_4.1.x86_64: >>> >>> "3.4 Options Controlling C Dialect >>> >>> ....snip... >>> >>> 'gnu11' >>> 'gnu1x' >>> GNU dialect of ISO C11. Support is incomplete and >>> experimental. The name 'gnu1x' is deprecated." >> >> Ok. Looks like the "Support is incomplete and experimental" sentence has >> been removed with GCC 4.9.0 here. So GCC 4.8 is likely pretty close >> already. IMHO we could give it a try and enable gnu11 for QEMU with GCC >> v4.8, too. If we later find problems, we could still switch back to >> gnu99 instead. Other opinions? > > Our code is already cleanly compiling with gnu99 standard - the problem > is merely that we sometimes introduce regressions due to not enforcing > that standard level. I don't think the features in gnu11 are compelling > enough to justify using something that's declared experimental. What about the duplicated typedef problem? See:
https://lists.gnu.org/archive/html/qemu-devel/2018-11/msg05829.html That one occured with Clang, but I think we've had plenty of these in the past with GCC, too... Thomas