Groups | Search | Server Info | Keyboard shortcuts | Login | Register
Groups > comp.lang.c > #397435
| From | Keith Thompson <Keith.S.Thompson+u@gmail.com> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: pedantic gcc and const 2D arrays |
| Date | 2026-04-08 15:57 -0700 |
| Organization | None to speak of |
| Message-ID | <87ldex2h8e.fsf@example.invalid> (permalink) |
| References | <20260409012107.00006dc5@yahoo.com> |
Michael S <already5chosen@yahoo.com> writes:
> IIRC, this is my first on-topic post in comp.lang.c group.
> As they say, nobody is perfect.
>
> // pedant_2d.c
> int bar(const int a[5][42])
> {
> return a[0][0];
> }
>
> int foo(int x)
> {
> int a[5][42];
> a[0][0] = 1;
> return bar(a);
> }
>
> // end of pedant_2d.c
>
>
> $ gcc -std=c17 -pedantic -c pedant_2d.c
> pedant_2d.c: In function 'foo':
> pedant_2d.c:10:14: warning: invalid use of pointers to arrays with
> different qualifiers in ISO C before C23 [-Wpedantic] 10 | return
> bar(a); | ^
>
> What does it mean ?
This is an incomplete answer. Perhaps someone else can fill in
some more details.
Given the parameter declaration `const int a[5][42]`, a is of
course a pointer, not an array. Specifically, it's of type
`constint(*)[42])`, or "pointer to array 42 of const int".
(The 5 is quietly ignored.)
The argument `a` in the call (it might have been clearer to use
distinct names) is of type `int[5][42]`, or "array 5 of array
42 of int". In the call, as in most contexts, it decays to
`int (*)[42]`, or "pointer to array 42 of int".
The problem is that the types "pointer to array N of int" and
"pointer to array N of const int" are distinct and are not
assignment-compatible.
This seems to be a case where forbidding assignment does not promote
safety. Assigning a `const int*` value to an `int*` object, if
it were allowed, would permit bypassing const correctness, such as
quietly permitting an attempt to assign a value to a const object.
But prior to C23, the rules were a bit more strict than they need
to be.
A simple example:
int main(void) {
int (*x)[10];
const int (*y)[10];
x = y; // discards "const"
y = x;
}
The first assignment is a constraint violation in all versions of
standard C because it discards the "const" qualifier. The second
gets the "before C23" diagnostic with gcc. (clang doesn't
complain about it with either "-pedantic-errors -std=c17" or
"-pedantic-errors -std=c23".)
I'm actually not sure what specific changes were made in C23 in
this area. I've compared the "Simple assignment" sections of C17
and C23 (drafts), and the only significant changes were to allow for
values of type nullptr_t.
--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
void Void(void) { Void(); } /* The recursive call of the void */
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar
pedantic gcc and const 2D arrays Michael S <already5chosen@yahoo.com> - 2026-04-09 01:21 +0300
Re: pedantic gcc and const 2D arrays Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2026-04-08 15:57 -0700
Re: pedantic gcc and const 2D arrays Michael S <already5chosen@yahoo.com> - 2026-04-09 03:09 +0300
Re: pedantic gcc and const 2D arrays 🇵🇱Jacek Marcin Jaworski🇵🇱 <jmj@energokod.gda.pl> - 2026-04-09 02:33 +0200
Re: pedantic gcc and const 2D arrays Tim Rentsch <tr.17687@z991.linuxsc.com> - 2026-04-08 21:42 -0700
Re: pedantic gcc and const 2D arrays Andrey Tarasevich <noone@noone.net> - 2026-04-08 20:34 -0700
Re: pedantic gcc and const 2D arrays Michael S <already5chosen@yahoo.com> - 2026-04-09 11:09 +0300
Re: pedantic gcc and const 2D arrays "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-04-09 02:38 -0700
Re: pedantic gcc and const 2D arrays Michael S <already5chosen@yahoo.com> - 2026-04-09 14:06 +0300
Re: pedantic gcc and const 2D arrays "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2026-04-09 13:09 -0700
Re: pedantic gcc and const 2D arrays Andrey Tarasevich <noone@noone.net> - 2026-04-12 11:30 -0700
Re: pedantic gcc and const 2D arrays Tim Rentsch <tr.17687@z991.linuxsc.com> - 2026-04-13 05:40 -0700
csiph-web