Akim Demaille wrote: ... >>> (And for my information, why is this function not-pure ? >> >> Because it may fail to return normally (abort). > > Yes, I see that, but there I found nothing against this in GCC's > documentation, and given the kind of optimization involved, I don't > see what can actually go wrong. > > http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Function-Attributes.html >> pure >> Many functions have no effects except the return value and their >> return value depends only on the parameters and/or global >> variables. Such a function can be subject to common subexpression >> elimination and loop optimization just as an arithmetic operator >> would be. These functions should be declared with the attribute >> pure. For example, >> int square (int) __attribute__ ((pure)); >> >> >> says that the hypothetical function square is safe to call fewer >> times than the program says. >> >> Some of common examples of pure functions are strlen or >> memcmp. Interesting non-pure functions are functions with infinite >> loops or those depending on volatile memory or other system >> resource, that may change between two consecutive calls (such as >> feof in a multithreading environment). >> >> The attribute pure is not implemented in GCC versions earlier than 2.96. > > (And I didn't find any bug report about the bad warning :)
Hi Akim, Is this explanation enough? http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html --------------------- -Wsuggest-attribute=[pure|const|noreturn] Warn for cases where adding an attribute may be beneficial. The attributes currently supported are listed below. -Wsuggest-attribute=pure -Wsuggest-attribute=const -Wsuggest-attribute=noreturn Warn about functions which might be candidates for attributes pure, const or noreturn. The compiler only warns for functions visible in other compilation units or (in the case of pure and const) if it cannot prove that the function returns normally. A function returns normally if it doesn't contain an infinite loop nor returns abnormally by throwing, calling abort() or trapping. This analysis requires option -fipa-pure-const, which is enabled by default at -O and higher. Higher optimization levels improve the accuracy of the analysis.
