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

Reply via email to