Defect Report #131

Submission Date: 03 Dec 93
Submittor: WG14
Source: Douglas Gwyn
Question
I've discovered an apparent bug in the C Standard. The code snippet:
struct {const int a[5]; } s1, s2;
void f(void) {s1 = s2; }

can be contained in a strictly conforming program, which runs counter to my understanding of the meaning of ``const-qualification.'' That occurs because, according to subclause 6.5.3, the member s1.a is not const-qualified and thus slips past the modifiable-lvalue definition in subclause 6.2.2.1. Subclause 6.5.3 says that the elements of the array s1.a are const-qualified, not the array itself, and I can find no reasonable way to construe s1.a[3], for example, as a ``member'' of s1; its only member is s1.a, as I see it. Apparently, the C Standard does not define the term ``member,'' except implicitly through its use in subclause 6.3.2.3 Semantics, which says that s1.a is the member (on which the subscripting operator can operate to extract an element, but the element is not a member of the structure.)
What I think is desirable would be a required diagnostic for this example, as it should be considered to violate the constraint in subclause 6.3.16 that requires the left operand of an assignment operator to be a modifiable lvalue.
Relevant citations:
Subclause 6.2.2.1 Lvalues and function designators:
A modifiable lvalue is an lvalue that does not have array type, does not have an incomplete type, does not have a const-qualified type, and if it is a structure or union, does not have any member (including, recursively, any member of all contained structures or unions) with a const-qualified type.
Subclause 6.3.16 Assignment operators:
Constraints:
An assignment operator shall have a modifiable lvalue as its left operand.
Subclause 6.5.3 Type qualifiers:
If the specification of an array type includes any type qualifiers, the element type is so-qualified, not the array type. If the specification of a function type includes any type qualifiers, the behavior is undefined.
Response
The example code is not strictly conforming, because some objects (the elements of the array s1.a) are being modified through use of an lvalue (s1) with non-const-qualified type, which according to subclause 6.5.3 results in undefined behavior.
However, a diagnostic is indeed desired here.
Correction
In subclause 6.2.2.1, page 36, change the parenthetic remark in the final sentence of the first paragraph:
(including, recursively, any member of all contained structures or unions)
to:
(including, recursively, any member or element of all contained aggregates or unions)
Previous Defect Report < - > Next Defect Report