Created attachment 22876 [details] source which produces warning Ehllo, I'm getting some strange warning about this code: --- snip --- typedef double mat4[4][4]; void mprod4(mat4 r, const mat4 a, const mat4 b) { /* yes, function is empty */ } int main() { mat4 mr, ma, mb; mprod4(mr, ma, mb); } ------------ gcc output as follows: --- snip ---- $ gcc -o test test.c test.c: In function 'main': test.c:13: warning: passing argument 2 of 'mprod4' from incompatible pointer type test.c:4: note: expected 'const double (*)[4]' but argument is of type 'double (*)[4]' test.c:13: warning: passing argument 3 of 'mprod4' from incompatible pointer type test.c:4: note: expected 'const double (*)[4]' but argument is of type 'double (*)[4]' ------------ defining the function as: --- snip --- void mprod4(mat4 r, mat4 a, mat4 b) { } ------------ OR defining matrices at main as: --- snip --- mat4 mr; const mat4 ma; const mat4 mb; ------------ OR calling teh function in main as: --- snip --- mprod4(mr, (const double(*)[4])ma, (const double(*)[4])mb); ------------ OR even defining mat4 as: --- snip --- typedef double mat4[16]; ------------ make teh warning go away. Wat is happening here? Am I doing something invalid? I have attached source code. Thanks for your attention.
Not a bug. The function parameters are of type "pointer to array[4] of const double" because const on an array type applies to the element type, recursively, and then the outermost array type, only, of a parameter of array type decays to a pointer, and the arguments passed are of type "pointer to array[4] of double" after array-to-pointer decay, and the only case where qualifiers are permitted to be added in assignment, argument passing etc. is qualifiers on the immediate pointer target, not those nested more deeply.
And is it possible to write function definitions that avoid this while maintaining my precious a[i][j] accesibility inside functions?
(In reply to comment #1) > Not a bug. The function parameters are of type "pointer to array[4] of const > double" because const on an array type applies to the element type, > recursively, and then the outermost array type, only, of a parameter of array > type decays to a pointer, and the arguments passed are of type "pointer to > array[4] of double" after array-to-pointer decay, and the only case where > qualifiers are permitted to be added in assignment, argument passing etc. is > qualifiers on the immediate pointer target, not those nested more deeply. This was somewhat confusing to me. Did you mean that funcion expects: pointer to array[4] of const doubles and I am passing pointer to const array[4] of doubles instead? This really seems pretty much teh same to me. Correct me if I'm wrong please.
If you want to use const here only on the callee side then you will need to use casts. I meant what I said: you are passing "pointer to array[4] of double", with no const in there, to a function expecting "pointer to array[4] of const double", and this is not a case permitted by C99 6.5.16.1#1. C does not have a type "pointer to const array[4] of double".
(In reply to comment #4) > If you want to use const here only on the callee side then you will need to use > casts. I meant what I said: you are passing "pointer to array[4] of double", > with no const in there, to a function expecting "pointer to array[4] of const > double", and this is not a case permitted by C99 6.5.16.1#1. C does not have a > type "pointer to const array[4] of double". Let me see if I understood. const double a[4][4] will become a "pointer to array of consts". So when i call my function passing a "pointer to array", teh conversion fails since it's only allowed to apply teh qualifier (const) to teh _pointer type_, which is an array, and not to it's elements as teh function was expecting. Correct me if I'm wrong again please and thanks for your patience.
Please stop reopening the PR, there is no bug on the gcc side.
This is supported as an extension since GCC 5 and will be supported with the upcoming C23 standard.