~ chicken-core (chicken-5) dc071fbae201f2b8db5539fd016c0d51be0bbe15
commit dc071fbae201f2b8db5539fd016c0d51be0bbe15 Author: Peter Bex <peter.bex@xs4all.nl> AuthorDate: Mon Oct 21 22:15:29 2013 +0200 Commit: Moritz Heidkamp <moritz@twoticketsplease.de> CommitDate: Wed Oct 23 11:53:02 2013 +0200 Use "noreturn" attribute in newer clang versions and get rid of a clang warning. The division procedure C_2_divide would try to call C_fix on the uninitialised variable "iresult" in the case where either of the divident or the divisor values are flonums ("fflag" will be 1 then). In the situation where neither value is a flonum, it'll either barf (which is declared "noreturn"), or properly initialise iresult. This means the C_unfix() call on an uninitialised value which gets C_fix()ed later is pure overhead in the case either value is a flonum. Signed-off-by: Moritz Heidkamp <moritz@twoticketsplease.de> diff --git a/chicken.h b/chicken.h index aea58fec..cb9320ee 100644 --- a/chicken.h +++ b/chicken.h @@ -229,11 +229,16 @@ void *alloca (); #define HAVE_STATEMENT_EXPRESSIONS 1 #endif +#if !defined(__clang__) && !defined(__has_attribute) +/* Define so it won't error on other compilers with keywords like "noreturn" */ +#define __has_attribute(x) 0 +#endif + #if defined(__GNUC__) || defined(__INTEL_COMPILER) # ifndef __cplusplus # define C_cblock ({ # define C_cblockend }) -# ifdef __clang__ +# if defined(__clang__) && !__has_attribute(noreturn) # define C_noret # else # define C_noret __attribute__ ((noreturn)) diff --git a/runtime.c b/runtime.c index 41894761..58f8e078 100644 --- a/runtime.c +++ b/runtime.c @@ -6731,11 +6731,8 @@ C_regparm C_word C_fcall C_2_divide(C_word **ptr, C_word x, C_word y) } else barf(C_BAD_ARGUMENT_TYPE_ERROR, "/", x); - iresult = C_fix(iresult); - - if(fflag || (double)C_unfix(iresult) != fresult) return C_flonum(ptr, fresult); - - return iresult; + if(fflag || (double)iresult != fresult) return C_flonum(ptr, fresult); + else return C_fix(iresult); }Trap