On Wed, 7 Aug 2024, Alejandro Colomar wrote:

> +@node Length
> +@section Determining the Length of Arrays
> +@cindex lengthof
> +@cindex length
> +@cindex array length
> +
> +The keyword @code{__lengthof__} determines the length of an array operand,
> +that is, the number of elements in the array.
> +Its syntax is just like @code{sizeof}.
> +The operand must be a complete array type.

I think you mean the operand must be *an expression whose type is a 
complete array type* or *a type name for a complete array type*.  The 
wording you have suggests only type names, you need to be clear about both 
kinds of operands being possible (and include examples for them).

> +@smallexample
> +__lengthof__ (int [7][n++]);  // constexpr
> +__lengthof__ (int [n++][7]);  // run-time value
> +@end smallexample

I don't think using "constexpr" to mean "constant expression" is a good 
idea, they're different things.

> +void
> +incomplete (int p[])
> +{
> +  unsigned n;
> +
> +  n = __lengthof__ (x);  /* { dg-error "incomplete" } */
> +
> +  /* We want to support the following one in the future,
> +     but for now it should fail.  */
> +  n = __lengthof__ (p);  /* { dg-error "invalid" } */

This seems to be the only test you have for a non-array operand.  I'd 
expect such tests (both for type name operands and for expression 
operands) covering cases that we *don't* want to support in future, not 
just this one that we would like to be supportable in future.

I don't see any tests for the constraints on external definitions from 
6.9.1 that we discussed - that referenced to undefined internal linkage 
identifiers are OK inside __lengthof__ returning a constant (both 
constant-length arrays of non-VLA and constant-length arrays of VLA) but 
not in the cases where __lengthof__ is evaluated.

-- 
Joseph S. Myers
josmy...@redhat.com

Reply via email to