Hey, On Tue, 29 Nov 2022, Uecker, Martin wrote: > It does not require any changes on how arrays are represented. > > As part of VM-types the size becomes part of the type and this > can be used for static or dynamic analysis, e.g. you can > - today - get a run-time bounds violation with the sanitizer: > > void foo(int n, char (*buf)[n]) > { > (*buf)[n] = 1; > } This can already statically analyzed as being wrong, no need for dynamic checking. What I mean is the checking of the claimed contract. Above you assure for the function body that buf has n elements. This is also a pre-condition for calling this function and _that_ can't be checked in all cases because: void foo (int n, char (*buf)[n]) { (*buf)[n-1] = 1; } void callfoo(char * buf) { foo(10, buf); } buf doesn't have a known size. And a pre-condition that can't be checked is no pre-condition at all, as only then it can become a guarantee for the body. The compiler has no choice than to trust the user that the pre-condition for calling foo is fulfilled. I can see how being able to just check half of the contract might be useful, but if it doesn't give full checking then any proposal for syntax should be even more obviously orthogonal than the current one. > For > > void foo(int n, char buf[n]); > > it semantically has no meaning according to the C standard, > but a compiler could still warn. Hmm? Warn about what in this decl? > It could also warn for > > void foo(int n, char buf[n]); > > int main() > { > char buf[9]; > foo(buf); > } You mean if you write 'foo(10,buf)' (the above, as is, is simply a syntax error for non-matching number of args). Or was it a mispaste and you mean the one from the godbolt link, i.e.: void foo(char buf[10]){ buf[9] = 1; } int main() { char buf[9]; foo(buf); } ? If so, yeah, we warn already. I don't think this is an argument for (or against) introducing new syntax. ... > But in general: This feature is useful not only for documentation > but also for analysis. Which feature we're talking about now? The ones you used all work today, as you demonstrated. I thought we would be talking about that ".whatever" syntax to refer to arbitrary parameters, even following ones? I think a disrupting syntax change like that should have a higher bar than "in some cases, depending on circumstance, we might even be able to warn". Ciao, Michael.