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: >> >> >> >> >> 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 > --