No, no, no... You just keep piling up misconceptions. 

First and foremost, the third (the last) 'const' in your parameter 
declaration is completely inconsequential in our context (i.e. for conversion 
purposes). It is ignored by the compiler. It makes no difference 
whatsoever, which is why I removed it from my minimalistic example - to 
avoid unnecessary clutter. My example is exactly 100% equivalent to 
yours and, of course, exactly as relevant. Mine is just way more compact.

Moreover, your statement "We're discussing 'Foo**'->'const Foo * const *const' 
conversion (all-consts)..." is downright nonsensical in formal C terminology. 
In C language all conversions produce _rvalues_ (!). Rvalues cannot be 
'const' in C. Qualifications do not apply to rvalues in C at all 
(see 
https://port70.net/~nsz/c/c11/n1570.html#6.7.3p4). The last 'const' 
in your example, once again, makes no difference and is completely 
ignored by the compiler for conversion purposes.

So, no, we are talking about conversion 
'Foo** -> const Foo * const *' (note: last 'const' removed as irrelevant). 
And, as I explicitly told you in my first response, this conversion is 
_not_ supported in C language as an _implicit_ conversion. End of story.

(BTW, GCC tends to quote that irrelevant third 'const' in its diagnostic 
messages, while Clang removes it. Take a closer look at Clang's 
diagnostics for your example.)

Your experiments with different compilers and builds are completely 
beside the point. Not sure what point you are trying to make with them, 
considering what has already been explained to you. That said, you did find 
a bug in one compiler: in Intel's one. As I have already stated 
previously, Intel's silent behavior in this case is non-compliant. As 
for GCC and Clang... their behavior is perfectly correct: they do issue the 
required diagnostic for this constraint violation.

-- 
Best regards,
Andrey

P.S. As it has already been mentioned by other posters, there are proposals 
aiming to permit this implicit conversion in C (just like it is permitted 
in C++). But we are not there yet. In C23 your code is still invalid.

Reply via email to