https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114574
--- Comment #6 from uecker at gcc dot gnu.org --- Hm, this is enough: const struct S * x; struct S {}; void f(const struct S **); The TYPE_CANONICAL of the pointer type depends on TYPE_CANONICAL of the target. So it seems if I set it for completed types the new pointer get a new TYPE_CANONICAL while old pointers to the incomplete struct are not updated which then somehow triggers the assertion (and is wrong).