On 2019-01-09 15:20, Markus Armbruster wrote: > Thomas Huth <th...@redhat.com> writes: > >> On 2019-01-09 14:10, Markus Armbruster wrote: >>> Thomas Huth <th...@redhat.com> writes: >>> >>>> 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? >>> >>> Switchinh back could be somewhat painful if we already started using C11 >>> features. And if we don't plan to, then what exactly will -std=gnu11 >>> buy us? >> >> With C11, we get safety for the "duplicated typedef" problem that we run >> into regularly again and again, see e.g.: >> >> https://lists.gnu.org/archive/html/qemu-devel/2018-11/msg05829.html > > That's a compilation failure. "Support is experimental" makes me afraid > of run time failures. > > If we truly want C11, shouldn't we bump minimum required GCC to 4.9?
That's not possible, since we claim to support RHEL7 / CentOS7 that is still using GCC v4.8. Thomas