[OpenAFS-devel] latest 1_5_x doesn't compile on fedora 9 gcc-4.3
Derrick Brashear
shadow@gmail.com
Wed, 13 Aug 2008 18:57:06 -0400
Crept in from my sandbox. Apologies
Derrick
On Aug 13, 2008, at 6:41 PM, Jeffrey Hutzelman <jhutz@cmu.edu> wrote:
> --On Thursday, August 14, 2008 01:18:34 AM +0300 Dragos Tatulea <dragos.tatulea@gmail.com
> > wrote:
>
>> Hi,
>>
>> I'm using the following config options: --enable-debug
>> --enable-debug-kernel --enable-warnings --enable-disconnected
>> --with-krb5-conf=/path and I'm getting the following compiling error:
>> vol-salvage.c:2692: error: lvalue required as left operand of
>> assignment
>> Looking into the code we find the line:
>> VNDISK_GET_LEN(vnodeLength, vnode);
>>
>> Which expands into versions:
>> # define VNDISK_GET_LEN(N, V) FillInt64(N, (V)->reserved6, (V)-
>> >length)
>> (AFS_LARGEFILE_ENV enabled)
>> and FillInt64 is :
>> # define FillInt64(t,h,l) (t) = (h); ((afs_uint64)t) <<= 32; (t) |=
>> (l);
>
> This was a bogus fix; applying a cast to the left-hand side of an
> assignment is pretty much never the right thing to do (though it may
> be appropriate to apply a cast to a pointer which is dereferenced to
> produce the lhs). The result of a cast is not an lvalue.
>
>> Making FillInt64:
>> # define FillInt64(t,h,l) (t) = (h);t <<= 32; (t) |= (l);
>> Solves the problem... I know it's not the right way to go, but what
>> can I
>> make to have it compilable with gcc4.3?
>
> This makes the error message go away, but that is not the same thing
> as solving the problem. In fact, what this does is reintroduce the
> bug that the previous change tried to fix.
>
> The right fix is to rewrite the expression without using the <<=
> shorthand, so that a cast can be applied to the _right-hand_
> argument without trying to apply it to the left-hand side:
>
> #define FillInt64(t,h,l) (t) = (h); (t) = ((afs_uint64)t) << 32; (t)
> |=(l);
>
> A simpler form would be:
>
> #define FillInt64(t,h,l) (t) = ((afs_uint64)(h) << 32) | (l);
>
>
> -- Jeff
> _______________________________________________
> OpenAFS-devel mailing list
> OpenAFS-devel@openafs.org
> https://lists.openafs.org/mailman/listinfo/openafs-devel