Bug 47143 - warning about const multidimensional array as function parameter
Summary: warning about const multidimensional array as function parameter
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 4.4.3
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-01-01 05:38 UTC by Igor
Modified: 2011-01-01 16:36 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
source which produces warning (125 bytes, application/octet-stream)
2011-01-01 05:38 UTC, Igor
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Igor 2011-01-01 05:38:31 UTC
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.
Comment 1 Joseph S. Myers 2011-01-01 12:02:28 UTC
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.
Comment 2 Igor 2011-01-01 13:02:09 UTC
And is it possible to write function definitions that avoid this while maintaining my precious a[i][j] accesibility inside functions?
Comment 3 Igor 2011-01-01 13:16:39 UTC
(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.
Comment 4 Joseph S. Myers 2011-01-01 15:06:34 UTC
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".
Comment 5 Igor 2011-01-01 15:42:34 UTC
(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.
Comment 6 Jakub Jelinek 2011-01-01 16:36:27 UTC
Please stop reopening the PR, there is no bug on the gcc side.