--- Comment #9 from ilatypov at infradead dot org 2010-03-12 03:49 ---
(In reply to comment #7)
> I am reopening the bug cause I still don't have a clue why "pointer to array
> of
> ints" typed expression is assignment incompatible with a "pointer to array of
> const ints" typed lvalue. Especially when "pointer to int" typed expression IS
> assignment compatible with "pointer to const int" typed lvalue. This is what
> is
> this bug all about.
Comment #9 to bug 33076 showed me a link explaining how constness of a multiply
referenced value cannot be promised, and, therefore, C propagates the compile
-time constness requirement up the assignment chain in cases where the level of
pointer indirection is greater than 1.
http://c-faq.com/ansi/constmismatch.html
I came up with a similar example for the "array of const ints". It shows that
the const promise might have been violated inside the function if
multiply-indirected lvalue constness was relaxed.
typedef const int carr_t[8];
typedef int arr_t[8];
void foo(carr_t *carrp) {
arr_t *hacker;
carr_t **holder = &hacker; // a warning
(*holder) = carrp; // "hacker = carrp" in disguise, but both sides are
(carr_t *)
(*hacker)[ 0 ] = 9; // no warning
}
void bar(void) {
arr_t arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
foo(arr); // a warning
}
--
ilatypov at infradead dot org changed:
What|Removed |Added
------------
CC| |ilatypov at infradead dot
||org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16602