On Tue, Dec 20, 2011 at 10:47 AM, Dong Xu Wang <wdon...@linux.vnet.ibm.com> wrote: > 于 2011年12月20日 18:13, Stefan Hajnoczi 写道: > >> On Tue, Dec 20, 2011 at 05:03:47PM +0800, Dong Xu Wang wrote: >>> >>> From: Dong Xu Wang<wdon...@linux.vnet.ibm.com> >>> >>> On some platforms, __LINE__ will not expand to real number in >>> QEMU_BUILD_BUG_ON, >>> so if using QEMU_BUILD_BUG_ON twice, compiler will report errors. This >>> patch will >>> fix it. >>> >>> BTW, I got error message on RHEL 6.1/gcc 4.4.5. >> >> >> Can you post the gcc -E output of the file that produces the error as >> well as the gcc error output? >> >> Stefan >> >> > > I doubled the following lines in block/qcow2-snapshot.c(line 211 and 212): > > QEMU_BUILD_BUG_ON(offsetof(QCowHeader, snapshots_offset) != > offsetof(QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots));" > > > While "gcc -E -C -I. block/qcow2-snapshot.c", I can get: > typedef char > qemu_build_bug_on____LINE__ > # 241 "block/qcow2-snapshot.c" > [(__builtin_offsetof (QCowHeader, snapshots_offset) != __builtin_offsetof > (QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots))?-1:1]; > > ; > typedef char > qemu_build_bug_on____LINE__ > # 243 "block/qcow2-snapshot.c" > [(__builtin_offsetof (QCowHeader, snapshots_offset) != __builtin_offsetof > (QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots))?-1:1]; > > __LINE__ are not expanded to real line number. > > > > While normally compiling, error message is: > CC block/qcow2-snapshot.o > block/qcow2-snapshot.c: In function \u2018qcow2_write_snapshots\u2019: > block/qcow2-snapshot.c:244: error: redefinition of typedef > \u2018qemu_build_bug_on____LINE__\u2019 > block/qcow2-snapshot.c:242: note: previous declaration of > \u2018qemu_build_bug_on____LINE__\u2019 was here > make: *** [block/qcow2-snapshot.o] Error 1
Reviewed-by: Stefan Hajnoczi <stefa...@linux.vnet.ibm.com> This isn't a compiler-specific issue, it has never worked but we didn't realize it. I suggest removing "On some platforms," from the patch description. The preprocessor won't expand __LINE__ since there is a ## and it is inside the QEMU_BUILD_BUG_ON_MACRO(): http://stackoverflow.com/questions/1597007/creating-c-macro-with-and-line-token-concatenation-with-positioning-macr Stefan