[Patch] Fix type signature of feof and ferror in c++

Craig Howland howland@LGSInnovations.com
Thu Dec 11 17:39:00 GMT 2014


On 12/11/2014 12:23 PM, Jonathan Roelofs wrote:
>
>
> On 12/11/14 10:04 AM, Corinna Vinschen wrote:
>> On Dec 11 09:08, Jonathan Roelofs wrote:
>>> This fixes one of the libc++ tests: depr/depr.c.headers/stdio_h.pass.cpp
>> ...
>>>   #ifndef _REENT_SMALL
>>> -#define    feof(p)        __sfeof(p)
>>> -#define    ferror(p)    __sferror(p)
>>> +#define    feof(p)        ((int)__sfeof(p))
>>> +#define    ferror(p)    ((int)__sferror(p))
>>>   #define    clearerr(p)    __sclearerr(p)
>>>   #endif
>>
>> Wouldn't it make more sense for all targets to move this into the
>> definitions of __sfeof/__sferror?
> Depends on what the type signature of __sfeof and __sferror are supposed to 
> be... that I don't know.  If those are just internal newlib things, then I 
> don't think it really matters, either way would work.
      This really is a language-dependent thing.  C defines the results of != as 
being int, so the cast is both superfluous and potentially misleading (from the 
point of view that its being there implies it is somehow needed), while C++ 
defines the result as bool (and why the cast is needed to pass the check).  This 
suggests that however it is done it is perhaps worth a comment to point out why 
the casts are there.  (Perhaps something like "/* (int) casts for C++, not 
needed but do no harm for C */"?)
      The signature should be matching the actual feof() and ferror() functions.
                 Craig
>
>>
>> Index: libc/include/stdio.h
>> ===================================================================
>> RCS file: /cvs/src/src/newlib/libc/include/stdio.h,v
>> retrieving revision 1.71
>> diff -u -p -r1.71 stdio.h
>> --- libc/include/stdio.h    9 May 2014 14:25:32 -0000    1.71
>> +++ libc/include/stdio.h    11 Dec 2014 17:03:03 -0000
>> @@ -649,8 +649,8 @@ _ELIDABLE_INLINE int __sputc_r(struct _r
>>   #endif
>>   #endif
>>
>> -#define    __sfeof(p)    (((p)->_flags & __SEOF) != 0)
>> -#define    __sferror(p)    (((p)->_flags & __SERR) != 0)
>> +#define    __sfeof(p)    ((int)(((p)->_flags & __SEOF) != 0))
>> +#define    __sferror(p)    ((int)(((p)->_flags & __SERR) != 0))
>>   #define    __sclearerr(p)    ((void)((p)->_flags &= ~(__SERR|__SEOF)))
>>   #define    __sfileno(p)    ((p)->_file)



More information about the Newlib mailing list