Defect Report #145

Submission Date: 23 Feb 95
Submittor: BSI
Source: Clive D.W. Feather
Question
Submitted to BSI by Clive D.W. Feather [email protected].
In this Defect Report, identifiers lexically identical to those declared in standard headers refer to the identifiers declared in those standard headers, whether or not the header is explicitly mentioned.
This Defect Report has been prepared with considerable help from Mark Brader, Jutta Degener, Ronald Guilmette, and a person whose employment conditions require anonymity. However, except where stated, opinions expressed or implied should not be assumed to be those of any person other than myself.
Defect Report UK 029: Constant expressions
There is a confusion of contextual levels in subclause 6.4. Subclause 6.4 lists four possible forms for a constant expression in an initializer:
Such a constant expression shall evaluate to one of the following:

an arithmetic constant expression,
a null pointer constant,
an address constant, or
an address constant for an object type plus or minus an integral constant expression.
The first two of these are syntactic forms, not something that a syntactic form would evaluate to. The third is the result of an evaluation, and the fourth is a compound of the two types of entity.
This confusion makes it unclear whether expressions like:
(int *)0
which is not a null pointer constant, or
x[5] - x[2]
which is clearly a constant, are permitted in initializers.
Suggested Technical Corrigendum:
Replace the quoted text with:
Such a constant expression shall be either an arithmetic constant expression, a null pointer constant, or an address constant expression.
In the second subsequent paragraph, change:
An address constant is a pointer to an lvalue designating an object of static storage duration, or to a function designator; it shall be created explicitly, using the unary & operator, or implicitly ...
to:
An address constant expression shall have pointer type, and shall evaluate to:

a null pointer,
the address of a function, or
the address of an object of static storage duration plus or minus some integer.
The address may be created explicitly, using the unary & operator, or implicitly ...
Future Change
In subclause 6.4 Sematics, change:
More latitude is permitted for constant expressions in initializers. Such an expression shall evaluate to one of the following:
to:
More latitude is permitted for consant expressions in initializers. Such an expression shall be, or evaluate to, one of the following:
and change:
An address constant is a pointer to an lvalue designating an object of static storage duration, or to a function designator; it shall be created explicitly, using the unary & operator, or implicity, by the use of an expression of array or function type.
to:
An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or a pointer to a function desingator. It shall be created explicitly using the unary & operator or an integral constant expression cast to pointer type, or implicitly by the use of an expression of array or function type.
Previous Defect Report < - > Next Defect Report