Defect Report #150

Submission Date: 11 Jun 95
Submittor: DIN
Source: Jutta Degener
Question
This Defect Report was prepared with considerable help from Mark Brader, Clive Feather, Ronald Guilmette, and a person whose employment conditions require anonymity.
DIN-001:
According to the current C Standard, programs containing
char array[] = "Hello, World";
are not strictly conforming.
A Constraint in subclause 6.5.7 Initialization, demands that:
All the expressions in an initializer for an object that has static storage duration or in an initializer list for an object that has aggregate or union type shall be constant expressions.
Subclause 6.4 Constant expressions, defines various kinds of constant expression. In its Semantics it states that a constant expression in an initializer evaluates 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.
String literals are neither. A string literal used to initialize a character array does not decay to a pointer to its first element, according to Subclause 6.2.2.1:
Except when it is the operand of the sizeof operator or the unary & operator, or is a character string literal used to initialize an array of character type, or is a wide string literal used to initialize an array with element type compatible with wchar_t, an lvalue that has type "array of type" is converted to an expression that has type "pointer to type" that points to the initial element of the array object and is not an lvalue.
and hence is not an address constant.
Suggested Technical Corrigendum:
In subclause 6.5.7, change:
All the expressions in an initializer for an object that has static storage duration or in an initializer list for an object that has aggregate or union type shall be constant expressions.
to:
All the expressions in an initializer for an object that has static storage duration or in an initializer list for an object that has aggregate or union type shall be constant expressions or string literals.
Suggested Future Change
In subclause 6.5.7, change:
All the expressions in an initializer for an object that has static storage duration or in an initializer list for an object that has aggregate or union type shall be constant expressions.
to:
All the expressions in an initializer for an object that has static storage duration or in an initializer list for an object that has aggregate or union type shall be constant expressions or string literals.
Previous Defect Report < - > Next Defect Report