Re: A: a new bug to old plain C
Jonathan Wakely via Gcc-help <[email protected]>
| Newsgroups | gmane.comp.gcc.help |
|---|---|
| Message-ID | <CAH6eHdSWC1zjGArfwnRV+owiKWwzqnLSBEGqXGWQPEmwZCSUdQ@mail.gmail.com> |
On Fri, 21 Nov 2025 at 13:18, <[email protected]> wrote: > > > -----Ursprüngliche Nachricht----- > > Von: Gcc-help <[email protected]> Im Auftrag von > > Jonathan Wakely via Gcc-help > > Gesendet: Freitag, 21. November 2025 12:47 > > An: Chris S <[email protected]> > > Cc: Александр Поваляев <[email protected]>; gcc-help <gcc- > > [email protected]> > > Betreff: Re: A: a new bug to old plain C > > > > On Fri, 21 Nov 2025 at 03:25, Chris S via Gcc-help <[email protected]> > > wrote: > > > > > > You're applying two consts to the same thing, so it's an error. > > > > No, that's not happening here. > > > > The explanation is > > https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion > > > > > > > > "Const int" and "int const" are the same (look up East vs West const), > > > but "const int const" is an error. Declaring a pointer to that > > > invalid type declaration is still invalid. > > > > > > On Thu, Nov 20, 2025, 5:27 PM Александр Поваляев via Gcc-help < > > > [email protected]> wrote: > > > > > > > struct zzz { > > > > unsigned x, y; > > > > }; > > > > > > > > void square(struct zzz ** arr_of_ptr, unsigned count) { > > > > > > > > *// The first "const" produce an error (not a warning) within some > > > > GCC toolchains, for example ARM GCC trunk (linux), see goldbolt.org > > > > <http://goldbolt.org>* > > > > struct zzz const * const * const end_of_arr = arr_of_ptr + count; > > > > > > > > *// Without the first const "struct zzz * const * const end_of_arr = > > > > arr_of_ptr + count;" it works fine!!!* > > > > > > > > } > > > > > > > > Respectfully, > > > > Aleksandr G Povaliaev. > > > > > > Consider: > > char const * foo1(char * x) { > char const * y = x; This is valid. > *x = 'a'; > return y; > } > > char const ** foo2(char ** x) { > char const ** y = x; This doesn't compile for the reasons explained in the link I gave. > **x = 'a'; > return y; > } > > typedef char * cp; > cp const * foo3(cp * x) { > cp const * y = x; This is completely different, this is: char * const * y = x; > **x = 'a'; > return y; > } > > All three should compile fine, but one does not. No, one should not compile. > It is not consistent. They are three completely different things, with different semantics. Why should things that are not the same be consistent? That makes no sense. The link I gave explains why the language standards are defined this way.