Defect Report #145
 
Submission Date: 23 Feb 95
Submittor: BSI
Source: Clive D.W. Feather
Question
Submitted to BSI by Clive D.W. Feather clive@sco.com.
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