https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91107
Bug ID: 91107 Summary: __attribute__((pure)) to function with non-const pointers Product: gcc Version: 8.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: colomar.6.4.3 at gmail dot com Target Milestone: --- I have a function that takes two arrays and writes into a third array the result of a pure function (c_i = a_i / b_i): inline void array_division (ptrdiff_t nmemb, double dest[static nmemb], const double src1[static nmemb], const double src2[static nmemb]) __attribute__((nonnull, pure)); inline void array_division (ptrdiff_t nmemb, double dest[static nmemb], const double src1[static nmemb], const double src2[static nmemb]) { for (ptrdiff_t i = 0; i < nmemb; i++) dest[i] = src1[i] / src2[i]; } Given that it works with full arrays instead of single variables, I can't just return the output, and therefore need to modify the array through a pointer, which goes against what a pure function is by the docs. However, I think it is still as valid as any other pure function to be optimized as a pure function. A pure function is one that acts as a function of its parameters, and the values pointed to by those parameters; and if none of the parameters, nor the values pointed to by them, change between two calls, they should be redundant and the call can be omitted, evaluating to the same value returned by the previous call. This function follows all those rules: If none of the 3 arrays change between two function calls, the function call can be completely removed; and they evaluate to the same value (which is none, because it's void). Am I right in thinking that GCC should allow this usage of __attibute__((pure))? Or is there any optimization achieved by pure that would be defeated by this function? Btw, I tricked GCC into accepting to compile this code just by adding a dummy `return 0;`. Is that safe, or is the optimization likely to produce broken code? If this function is finally accepted as a pure function, pure should be accepted to be used in a void function, and accept non-const parameters, but if not, I think there's no reason at all to allow non-const pointers, and should probably be banned.