typedef signed int s32; typedef signed long s64; typedef unsigned int u32; typedef unsigned long u64; extern __inline__ u32 foobar(int logmask) { u32 ret = ~(1 << logmask); // fails // s32 ret = ~(1 << logmask); // ok // u64 ret = ~(1 << logmask); // ok // s64 ret = ~(1 << logmask); // ok return ret; } // This procedure compiles fine... u32 good(u32 var) { var = foobar(0); return var; } // This procedure does not compile... // Same as above, but formal parameter is a pointer // Both good() and fails() compile ok if we choose // a different type for "ret" in foobar(). u32 fails(u32 *var) { *var = foobar(0); return *var; }