Re: A: a new bug to old plain C
Jonathan Wakely via Gcc-help <[email protected]>
| Newsgroups | gmane.comp.gcc.help,gmane.comp.gcc.devel |
|---|---|
| Message-ID | <CAH6eHdThFtYnJy5ysuLZk7PRjHhWKd4fWXTwMcBX7xbFBJwvTw@mail.gmail.com> |
On Wed, 3 Dec 2025, 13:01 Martin Uecker, <[email protected]> wrote: > > I am not sure this has been pointed out, but you can downgrade this > to a warning with -fpermissive. > Or with -Wno-incompatible-pointer-conversions It's been said more than once, but despite insisting on his "logic" and that he's correct, he doesn't actually read or understand most of the replies. > Otherwise, I do not quite I understand the point of this discussion. > Somebody needs to write a patch downgrading the warning in this > specific case (but not others that are problematic) to a pedantic > warning. I would assume that such a patch would have a good chance > of being accepted. > > Martin > > > > Am Mittwoch, dem 03.12.2025 um 15:49 +0300 schrieb Александр Поваляев via > Gcc: > > Hi David! Thank you a lot for your time and postings! > > > > I agree that it should be an option and it should be a developer decision > > whether to turn on/off pedantic errors. > > But as for now, we have no option whether to treat such conversion > ("Foo**" > > -> "const Foo * const * const") as an error or warning. > > > > Up to version 13.4 GCC x86-64 also treats it as a warning by default. > > So, if you compiles the following code snippet with x86-64 gcc 13.4 ( > > godbolt.org was used) > > " > > struct zzz { > > unsigned x, y; > > }; > > > > void subfunc(struct zzz const * const * const arg) { > > > > if (arg != NULL) { > > printf("%s", "Done!"); > > } > > } > > > > void func(struct zzz ** arr_of_ptr, unsigned count) { > > > > subfunc(arr_of_ptr); > > } > > " > > you will get only the warning. > > So, starting from version 3.4.6 up to version 13.4 gcc x86-64 DOES > provide > > an option for decades. > > > > But then SOMETHING happened to version 14.1 of gcc x86-64, so it started > > returning an error. > > It BROKES BAKE COMPATIBILITY of safe conversion without any reasoning. Is > > that right? > > > > The same change of default behaviour (when converting "Foo**" -> "const > Foo > > * const * const") is observed within POWER gcc compiler: > > it treated it as a warning starting from version 4.8.5 until the version > > 13.4. Starting from 14.1 POWER GCC returns an error. > > And the same story with versions happens for ARM GCC... > > > > --------------------------------------------- > > > > The interesting fact is that if you add "-std=c90 -pedantic" compiler > > options, all the versions will work FINE! returning a warning. > > > > So, the BUG IS ABOUT CHANGING OF DEFAULT GCC BEHAVIOUR WHEN CONVERTING > > "Foo**" -> "const Foo * const * const". > > IT BROKES BACK-COMPATIBILITY WITHOUT ANY VISIBLE REASON AND IT SHOULD BE > > FIXED!!! > > > > Respectfully, > > Aleksandr G Povaliaev. > > > > P.S. This e-mail would be much shorter if it had been less irrelevant > > examples and proofs. > > > > > > ср, 3 дек. 2025 г. в 12:02, David Brown <[email protected]>: > > > > > This has been explained to you repeatedly, by many people, on both the > > > gcc help list (which is for people asking for help about gcc, not for > > > people needing help with the C language) and the gcc developers list > > > (which is for discussing gcc development and is totally inappropriate > > > for your posts). > > > > > > It has been explained to you, repeatedly, that the C standards could > not > > > and do not have a list of "explicitly prohibited" conversions. They > > > have a list of /allowed/ conversions. You have been directed to these, > > > with chapter and paragraph numbers and direct quotations from the > > > standards. The conversion you want is not allowed in C as of C23 (and > > > before), though it is allowed in C++ and will likely be allowed in > > > future C versions. The C standard term for "not allowed" here is > > > "constraint violation". In C, /nothing/ is allowed unless it is > > > explicitly allowed in the standards. > > > > > > It does not matter if your use of this conversion is "safe" and gives > > > correct working code with some compilers, or when you add explicit > casts > > > to your C. What matters is that the rules of C do not allow it. > > > Countless things can be considered "safe" and are yet not allowed by > the > > > C standards. > > > > > > When a conforming C compiler encounters a constraint violation - such > as > > > in your code - it is required to "issue a diagnostic". This typically > > > means either a warning message (continuing compilation) or an error > > > message (halting compilation). A compiler implementation can choose > > > either strategy. Some compiler implementations will choose one, others > > > will choose a different option - both are allowed. Good compilers > > > (including gcc and clang) offer command-line options to let you > override > > > the compiler's default actions here. > > > > > > So it is fine that clang gives a warning and continues compilation. It > > > is also fine that gcc gives an error and halts compilation. (As a > > > general rule, I believe compilers should be strict by default but allow > > > less strict modes by compiler flags, so I personally prefer gcc's > > > approach.) > > > > > > Neither gcc, clang, or any other compilers you tried have a bug here > > > (unless they didn't even give a warning). > > > > > > > > > > > > No matter what any compiler does with your code, your C code is > > > incorrect - it has a constraint violation. > > > > > > > > > This has all been explained to you several times. It is quite apparent > > > that you do not have familiarity with the C standards - the definition > > > of the language. You are either incapable of understanding them, or > > > have not bothered trying - despite being spoon-feed the relevant > > > sections. (No one expects you to read the entire standard.) You are > > > not qualified to judge what is and is not allowed in C, or what is or > is > > > not a bug in a compiler. You can have your opinions, but they are not > > > qualified or informed opinions, and as such they are worthless to > > > everyone else. (A qualified and informed opinion would be "I know this > > > is not allowed in C, but I think it should be".) > > > > > > > > > You should come away from all this with certain facts: > > > > > > 1. The conversion you want is not allowed in C. > > > > > > 2. It is extremely easy to write C code that /is/ valid, and works > > > exactly as you want - add an explicit cast. > > > > > > 3. GCC is never going to consider this behaviour a bug, and is never > > > going to change its behaviour here. > > > > > > I sincerely hope you understand facts 2 and 3 here. > > > > > > You can continue to beat your head against the wall claiming that 1 > > > above is not true. As long as it is your own head in the privacy of > > > your own room, go for it. It won't change reality. > > > > > > No one can force you to understand this. But I hope that you can > > > appreciate that your continued posts are a waste of everyone's time, > and > > > the practical way forward is just to change your code and stop posting > > > on these mailing lists. I don't think anyone will particularly care if > > > you go away thinking "we agree to disagree", or even "they are wrong > but > > > won't admit it" - just as long as you go away. > > > > > > Please let this be an end to these posts to the gcc mailing lists. If > > > you want to email to me personally, go ahead - I am willing to try > again > > > to explain things to you if it stops you from wasting the time of > > > thousands of list members. But if you continue, then it is perhaps > time > > > for the list administrators to consider blacklisting you (I know that > is > > > a step they are always very reluctant to take). > > > > > > > > > > > > On 03/12/2025 07:38, Александр Поваляев via Gcc wrote: > > > > Hi there! Thank you for being on it! > > > > > > > > You've written quite a lot of messages and replies. Thank you again > for > > > > this. > > > > > > > > However, I still don't see how you're proving that such a kind of > > > > conversion must be rejected by any C compiler within an error. > > > > Liu previously tried to do it (to provide logical reasoning), but his > > > prove > > > > lacks some logical consistency. > > > > And so, I don't see that such conversion ("Foo**" -> "const Foo * > const * > > > > const) is NOT explicitly prohibited by C standard. > > > > And still there is no sign that what is not explicitly prohibited by > C > > > > standard should end up with a compiler error. > > > > > > > > Per my understanding, an error "diagnostic" message should be present > > > only > > > > if there is a possible way of getting the program working wrong or > > > leading > > > > to fault. > > > > And a warning "diagnostic" message should be present if there is a > > > possible > > > > way of unsafe behavior. > > > > But in our case, a conversion "Foo**" -> "const Foo * const * const" > is > > > an > > > > absolutely safe way of coding. > > > > > > > > This is the reason why commercial compilers (like Microsoft/IBM and > > > Intel) > > > > DO support such a kind of conversion. > > > > And so this is an artefact. > > > > It appears when an absolutely safe way of coding which is not > explicitly > > > > prohibited by C standard is identified by an ERROR. > > > > > > > > I consider such behaviour as a BUG which should be fixed. > > > > This is my attitude. > > > > > > > > Respectfully, > > > > Aleksandr G Povaliaev. > > > > > > > > > > > > > > > > > > > > > > > > ср, 3 дек. 2025 г. в 06:08, Andrey Tarasevich < > [email protected]>: > > > > > > > > > It looks like we are getting nowhere here... To conclude this > > > "discussion" > > > > > I'll > > > > > reiterate just the relevant points as concisely as I can: > > > > > > > > > > 1. Standard C language does not allow the following pointer > conversions > > > as > > > > > implicit conversions: > > > > > > > > > > T ** -> const T *const * > > > > > T ** -> const T *const *const > > > > > > > > > > A program that attempts to rely on such conversions (as implicit > > > > > conversions) is > > > > > invalid, i.e. it contains a constraint violation - a "hard error" > in > > > > > standard C. > > > > > > > > > > 2. Compliant C compilers are required to issue diagnostic messages > for > > > > > constraint violations. Format and wording of such diagnostic > messages > > > are > > > > > not > > > > > standardized in any way. Standard C does not have concepts of > "errors" > > > or > > > > > "warnings". > > > > > > > > > > It is your responsibility to figure out that a diagnostic message > issued > > > > > for > > > > > this constraint violation indicates a "hard error", provided you > possess > > > > > sufficiently pedantic knowledge of C standard. If you don't > possess this > > > > > level > > > > > of knowledge of C standard (which is apparently the case in your > case), > > > > > but > > > > > still want to write code in standard C, configuration settings like > > > > > `-pedantic-errors` will help you. Moreover, in the latter case, > you are > > > > > not > > > > > allowed to even approach C compilers without `-pedantic-errors`. > Trying > > > to > > > > > do so > > > > > will only lead to confusion. > > > > > > > > > > 3. If you do not have a "language-lawyer" level of knowledge of C > > > > > standard, you > > > > > do not get to make such bold statements as "I found a bug in C > > > compiler". > > > > > Which > > > > > is well-illustrated by this thread: in this case there's no bug. > The > > > > > compiler is > > > > > behaving 100% correctly, despite your claims to the contrary. > > > > > > > > > > 4. As it has been stated repeatedly, there's ongoing work aiming to > > > > > support such > > > > > conversions in future iterations of C language standard. But as of > C23, > > > > > these > > > > > conversions are not supported (as implicit conversions). > > > > > > > > > > -- > > > > > Best regards, > > > > > Andrey > > > > > > > > > > > > > > > > > -- > Univ.-Prof. Dr. rer. nat. Martin Uecker > Graz University of Technology > Institute of Biomedical Imaging > >