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.