 
 JTC1/SC22/WG14 
N721
JTC1/SC22/WG14 
N721
ISO/IEC JTC1/SC22/WG14 N721
                      Unary * operator - a fix
                          Clive D.W. Feather
Abstract
========
DR076 and N697 address the issue of code like:
    int a[10], *p;
    for (p = &a[0]; p < &a[10]; p++)
        /* ... */
Without rehashing the issues, this proposal fixes the problems by
avoiding them. The approach is that of N720 item DR076, but has some
wording improvements.
Proposal
========
In 6.3.3.2, change the first constraint (paragraph 1) from:
    The operand of the unary & operator shall be a function designator
    or an lvalue that designates an object that is not a bit-field and
    is not declared with the /register/ storage-class specifier.
to:
    The operand of the unary & operator shall be a function designator,
 |  the result of a [] or unary * operator,
    or an lvalue that designates an object that is not a bit-field and
    is not declared with the /register/ storage-class specifier.
Add to the end of paragraph 3:
    If the operand is the result of a unary * operator, neither that
    operator nor the & operator are evaluated, and the result shall
    be as if both were omitted, even if the intermediate object does not
    exist. Similarly, if the operand is the result of a [] operator, 
    neither the & operator nor the unary * that is implied by the []
    are evaluated, and the result shall be as if the & operator was
    removed and the [] operator was changed to a + operator.
Change the first sentence of footnote 54 to:
    Thus &*E is equivalent to E (even if E is a null pointer), and
    &(E1[E2]) to (E1+E2).
In 6.3.6 paragraph 8, change the last sentence from:
    ... the behaviour is undefined if the result is used as an operand
    of the unary * operator.
to:
    ... the behaviour is undefined if the result is used as an operand
    of a unary * operator that is actually evaluated.