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