../../disas/arm-a64.cc
In file included from /usr/include/glib-2.0/glib/gmacros.h:241, from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9, from /usr/include/glib-2.0/glib/gtypes.h:32, from /usr/include/glib-2.0/glib/galloca.h:32, from /usr/include/glib-2.0/glib.h:30, from /<<BUILDDIR>>/qemu-5.2+dfsg/include/glib-compat.h:32, from /<<BUILDDIR>>/qemu-5.2+dfsg/include/qemu/osdep.h:126, from ../../disas/arm-a64.cc:21:
/usr/include/c++/10/type_traits:56:3: error: template with C linkage
56 | template<typename _Tp, _Tp __v>
| ^~~~~~~~
../../disas/arm-a64.cc:20:1: note: ‘extern "C"’ linkage started here
20 | extern "C" {
| ^~~~~~~~~~
Through the chain of headers as reported above this gets to the templates
in /usr/include/c++/10/type_traits which fails due to that.
So C++ constructs within a C scope which is this bug.
Upstream qemu has not recently changed yet for this.
The code is the same since 2016 via commit e78490c44: "disas/arm-a64.cc:
Include osdep.h first" by Peter Maydell.
But what was different before to break it now?
To find that I was comparing Hirsute vs Hirsute-proposed ...
It is indeed failing in -proposed but working in hirsute-release.
Old:
/*
* We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
* __typeof__ is used in a few places in GLib, provide a pre-processor symbol
* to factor the check out from callers.
*
* This symbol is private.
*/
#undef g_has_typeof
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && !defined(__cplusplus)
#define g_has_typeof
#endif
New:
/*
* We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
* __typeof__ is used in a few places in GLib, provide a pre-processor symbol
* to factor the check out from callers.
*
* This symbol is private.
*/
#undef glib_typeof
#if !defined(__cplusplus) && \
((defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || \
defined(__clang__))
#define glib_typeof(t) __typeof__ (t)
#elif defined(__cplusplus) && __cplusplus >= 201103L
/* C++11 decltype() is close enough for our usage */
#include <type_traits> <--- THIS IS WHAT BREAKS US
#define glib_typeof(t) typename std::remove_reference<decltype (t)>::type
#define glib_typeof_2_68
#endif
qemu now breaks in Hirsute (it didn't 23h ago) /launchpadlibra rian.net/ 524654684/ buildlog_ ubuntu- hirsute- amd64.qemu_ 1%3A5.2+ dfsg-6ubuntu1_ BUILDING. txt.gz
Broken:
https:/
Good before: /launchpad. net/~ci- train-ppa- service/ +archive/ ubuntu/ 4471/+packages
https:/
Error:
../../disas/ arm-a64. cc glib-2. 0/glib/ gmacros. h:241,
from /usr/lib/ x86_64- linux-gnu/ glib-2. 0/include/ glibconfig. h:9,
from /usr/include/ glib-2. 0/glib/ gtypes. h:32,
from /usr/include/ glib-2. 0/glib/ galloca. h:32,
from /usr/include/ glib-2. 0/glib. h:30,
from /<<BUILDDIR> >/qemu- 5.2+dfsg/ include/ glib-compat. h:32,
from /<<BUILDDIR> >/qemu- 5.2+dfsg/ include/ qemu/osdep. h:126,
from ../../disas/ arm-a64. cc:21: c++/10/ type_traits: 56:3: error: template with C linkage arm-a64. cc:20:1: note: ‘extern "C"’ linkage started here
In file included from /usr/include/
/usr/include/
56 | template<typename _Tp, _Tp __v>
| ^~~~~~~~
../../disas/
20 | extern "C" {
| ^~~~~~~~~~
Also in disas/nanomips.cpp, ...
And indeed disas/arm-a64.cc has:
20 extern "C" {
21 #include "qemu/osdep.h"
22 #include "disas/dis-asm.h"
23 }
Through the chain of headers as reported above this gets to the templates c++/10/ type_traits which fails due to that.
in /usr/include/
So C++ constructs within a C scope which is this bug.
Upstream qemu has not recently changed yet for this.
The code is the same since 2016 via commit e78490c44: "disas/arm-a64.cc:
Include osdep.h first" by Peter Maydell.
But what was different before to break it now?
To find that I was comparing Hirsute vs Hirsute-proposed ...
It is indeed failing in -proposed but working in hirsute-release.
10.2.1-20ubuntu1 : bad
repro in broken build: 5.2+dfsg/ b/qemu include/ pixman- 1 -I/usr/ include/ virgl -I/usr/ include/ libpng16 -I/usr/ include/ spice-server -I/usr/ include/ spice-1 -I/usr/ include/ libusb- 1.0 -I/usr/ include/ libmount -I/usr/ include/ blkid -I/usr/ include/ glib-2. 0 -I/usr/ lib/x86_ 64-linux- gnu/glib- 2.0/include -I/usr/ include/ gio-unix- 2.0 -I/usr/ include/ cacard -I/usr/include/nss -I/usr/include/nspr -I/usr/include/PCSC -I/usr/ include/ slirp -fdiagnostics- color=auto -pipe -Wall -Winvalid-pch -Wnon-virtual-dtor -std=gnu++11 -O2 -g -D__STDC_ LIMIT_MACROS -D__STDC_ CONSTANT_ MACROS -D__STDC_ FORMAT_ MACROS -U_FORTIFY_SOURCE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_ OFFSET_ BITS=64 -D_LARGEFILE_SOURCE -Wundef -Wwrite-strings -fno-strict- aliasing -fno-common -fwrapv -g -O2 -ffile- prefix- map=/root/ qemu-5. 2+dfsg= . -fstack- protector- strong -Wformat -Werror= format- security -Wdate-time -D_FORTIFY_SOURCE=2 -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored- qualifiers -Wempty-body -Wendif-labels -Wexpansion- to-defined -Wno-missing- include- dirs -Wno-shift- negative- value -Wno-psabi -fstack- protector- strong -isystem /root/qemu- 5.2+dfsg/ linux-headers -isystem linux-headers -iquote /root/qemu- 5.2+dfsg/ tcg/i386 -iquote . -iquote /root/qemu-5.2+dfsg -iquote /root/qemu- 5.2+dfsg/ accel/tcg -iquote /root/qemu- 5.2+dfsg/ include -iquote /root/qemu- 5.2+dfsg/ disas/libvixl -pthread -fPIE -DSTRUCT_ IOVEC_DEFINED -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DNCURSES_WIDECHAR -MD -MQ libcommon. fa.p/disas_ nanomips. cpp.o -MF libcommon. fa.p/disas_ nanomips. cpp.o.d -o libcommon. fa.p/disas_ nanomips. cpp.o -c ../../disas/ nanomips. cpp
$ cd /root/qemu-
$ c++ -Ilibcommon.fa.p -I. -I../.. -Iqapi -Itrace -Iui -Iui/shader -I/usr/
With that I have a test env...
Doko asked me to test /launchpad. net/ubuntu/ +source/ gcc-10/ 10.2.1- 19ubuntu1/ +build/ 20995220/ +files/ g++-10_ 10.2.1- 19ubuntu1_ amd64.deb
https:/
That fails as well, but also good as well as bad case have 10.10.2.1-20ubuntu1
It must be something else.
The difference were ~340 packages I was upgrading them to spot what broke it.
I eventually found glib 2.66 -> 2.67 to break it.
libglib2. 0-0/hirsute- proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1] 0-bin/hirsute- proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1] 0-data/ hirsute- proposed 2.67.4-1 all [upgradable from: 2.66.4-1] 0-dev-bin/ hirsute- proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1] 0-dev/hirsute- proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]
libglib2.
libglib2.
libglib2.
libglib2.
Old: __cplusplus)
/*
* We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
* __typeof__ is used in a few places in GLib, provide a pre-processor symbol
* to factor the check out from callers.
*
* This symbol is private.
*/
#undef g_has_typeof
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && !defined(
#define g_has_typeof
#endif
New: __cplusplus) && \ defined( __GNUC_ _) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || \ __clang_ _)) __cplusplus) && __cplusplus >= 201103L reference< decltype (t)>::type
/*
* We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
* __typeof__ is used in a few places in GLib, provide a pre-processor symbol
* to factor the check out from callers.
*
* This symbol is private.
*/
#undef glib_typeof
#if !defined(
((
defined(
#define glib_typeof(t) __typeof__ (t)
#elif defined(
/* C++11 decltype() is close enough for our usage */
#include <type_traits> <--- THIS IS WHAT BREAKS US
#define glib_typeof(t) typename std::remove_
#define glib_typeof_2_68
#endif
On the glib side this is due to: /gitlab. gnome.org/ GNOME/glib/ -/issues/ 2331 /gitlab. gnome.org/ GNOME/glib/ -/merge_ requests/ 1935 /thread/ J3P4TRHLWNDIKXF 76OLYZNAPTABCZ3 U5/#7LXFUDBBBIT 23FE44QJYWX3I7U 4EHW6M
https:/
Also related:
https:/
https://<email address hidden>
Qemu try to fix/discussion at: /lists. gnu.org/ archive/ html/qemu- devel/2021- 02/msg07294. html
https:/
This won't be the final solution, but it gets things going for the time being.