Defect Report #125

Submission Date: 03 Dec 93
Submittor: WG14
Source: Ron Guilmette
ANSI/ISO C Defect Report #rfg32:
Subject: Using things declared as ``extern (qualified) void.''
May a conforming implementation fail to correctly translate a translation unit containing the following declarations?
extern const void etext;
const void *vp = &etext;

Defect Report #012 discusses at length the issue of applying unary & to an expression whose type is some void type. The conclusion of that discussion seem to be that although unary & may not be applied to an expression having the void type (because such expressions are not lvalues) it is permissible to apply unary & to an expression whose type is some qualified version of void. The text of the interpretation for Defect Report #012 even goes so far as to actively recommend the practice of declaring things to be extern and to have some qualified void type (so that the address may then be taken).
The question raised herein is a different one. Tom Pennello has pointed out the following rule from the second Semantics paragraph of subclause 6.7:
If an identifier declared with external linkage is used in an expression (other than as part of the operand of a sizeof operator), somewhere in the entire program there shall be exactly one external definition for the identifier; ...
Thus, as Tom has noted, applying unary & to an entity declared to be both extern and of some qualified void type is a ``use'' of that entity which would necessarily force you to supply a definition of that entity, somewhere in the program. But as Tom has further noted, there is simply no way to accomplish that (in a strictly conforming program) because of the following rule (given in subclause 6.5):
All declarations ... that refer to the same object or function shall specify compatible types.
Thus, if you either define or fail to define etext, it would appear that the behavior is undefined. Is this a correct interpretation?
(Footnote: It would appear that a strictly conforming program may contain a mere declaration of an extern entity whose type is any qualified or unqualified void type, but that any use of such an entity within an expression, other than within a sizeof expression, renders the program not strictly conforming.)
Applying & to an identifier of type const void has undefined behavior. Thus an implementation can define any semantics it wishes. A strictly conforming program cannot contain such a construct.
Previous Defect Report < - > Next Defect Report