On 11/13/22 14:33, Alejandro Colomar wrote:
Hi Martin,

On 11/13/22 14:19, Alejandro Colomar wrote:
But there are not only syntactical problems, because
also the type of the parameter might become relevant
and then you can get circular dependencies:

void foo(char (*a)[sizeof *.b], char (*b)[sizeof *.a]);

This seems to be a difficult stone in the road.


I am not sure what would the best way to fix it. One
could specifiy that parameters referred to by
the .identifer syntax must of some integer type and
that the sub-expression .identifer is always
converted to a 'size_t'.

That makes sense, but then overnight some quite useful thing came to my mind that would not be possible with this limitation:


<https://software.codidact.com/posts/285946>

char *
stpecpy(char dst[.end - .dst], char *src, char end[1])

Heh, I got an off-by-one error. It should be dst[.end - .dst + 1], of course, and then the result of the whole expression would be 0, which is fine as size_t.

So, never mind.

{
     for (/* void */; dst <= end; dst++) {
         *dst = *src++;
         if (*dst == '\0')
             return dst;
     }
     /* Truncation detected */
     *end = '\0';

#if !defined(NDEBUG)
     /* Consume the rest of the input string. */
     while (*src++) {};
#endif

     return end + 1;
}


And I forgot to say it:  Default promotions rank high (probably the highest) in my list of most hated features^Wbugs in C.  I wouldn't convert it to size_t, but rather follow normal promotion rules.

Since you can use anything between INTMAX_MIN and UINTMAX_MAX for accessing an array (which took me some time to understand), I'd also allow the same here. So, the type of the expression between [] could perfectly be signed or unsigned.

So, you could use size_t for very high indices, or e.g. ptrdiff_t if you want to allow negative numbers.  In the function above, since dst can be a pointer to one-past-the-end (it represents a previous truncation; that's why the test dst<=end), forcing a size_t conversion would disallow that syntax.

Cheers,

Alex


--
<http://www.alejandro-colomar.es/>

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to