Indeed, the only values of n that would require a diagnostic are 0 and 1.

I think the original intent was to make q smaller than 28 (the space required for 14 wide characters), then copy p to q (buffer overrun),
but this rule doesn’t actually address that and the copy isn’t included in the example. That is, I think the original example was to be
of the form:

This does have an issue - buffer overrun, but still doesn’t violate 5.21 as currently stated (14 is still >= 2).
I think the reason 5.21 got changed was either:

buffer overrun is addressed elsewhere - though I cannot see where that is:

Annex C maps CWEs with Buffer Overrun to 5.22 – but that only talks about constructing an invalid pointer by pointer arithmetic or indexing – neither of which apply here

wcscpy may be regarded as a restricted sink, with a requirement that the size of the first parameter array >= the size of the second, so 5.46 could apply – except that 5.46 only applies to tainted data. The data in this example isn’t tainted

It was recognised that it’s too difficult to carry the information around that lets you check what use is made of a buffer at an arbitrary point later in the program. The problem in the f2 example is on the line after the allocation, but in general it could be anywhere in the program

or the rule needs to be changed to reflect that the allocated memory is in effect an array of size n/sizeof(T),
and that it shouldn’t be indexed beyond that size (including by copy functions such as wcscpy etc. - this caveat may also need to be added to 5.22)