Sujet : Re: Regarding assignment to struct
De : nbowler (at) *nospam* draconx.ca (Nick Bowler)
Groupes : comp.lang.cDate : 06. May 2025, 20:06:20
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vvdmjb$3ilpe$1@dont-email.me>
References : 1 2 3 4 5 6 7
User-Agent : Pan/0.149 (Bellevue; 4c157ba git@gitlab.gnome.org:GNOME/pan.git)
On Mon, 05 May 2025 13:43:31 -0700, Keith Thompson wrote:
Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:
Andrey Tarasevich <noone@noone.net> writes:
[...]
>
#include <stdio.h>
>
struct S { int a[10]; };
>
int main()
{
struct S a, b = { 0 };
int *pa, *pb, *pc;
>
pa = &a.a[5];
pb = &b.a[5];
pc = &(a = b).a[5];
>
printf("%p %p %p\n", pa, pb, pc);
}
>
[...]
>
I think that code has undefined behavior.
>
Right. [*]
[...]
[*] Assuming C11 semantics. At best inadvisable under C99
semantics, and a constraint violation under C90 semantics.
What C90 constraint does it violate? Both gcc and clang reject it
with "-std=c90 -pedantic-errors", with an error message "ISO C90
forbids subscripting non-lvalue array", but I don't see a relevant
constraint in the C90 standard.
I don't know about C90, but in C89 the above code violates the
constraint on the [] operator that "one of the expressions shall
have type ``pointer to object type.''" (3.3.2.1, first paragraph)
C89 (3.2.2.1, third paragraph) only describes conversion of lvalues with
array type into pointers. No similar rule applies for an expression
with array type which is not an lvalue, so such expressions are not
converted to pointers.
So, given:
struct { int a[10]; } a, b;
/* ... */
(a = b).a[5];
Since (a = b).a is not an lvalue, it is not converted to a pointer, so
neither operand of [] has pointer type, so a diagnostic is required.
I know that C11 introduced "temporary lifetime" to cover cases
like this. In C99, the wording for the indexing operator implicitly
assumes that there's an array object; if there isn't, I'd argue the
behavior is undefined by omission. I'm not aware of any relevant
change from C90 to C99.
The rule about conversions from arrays to pointers is different in C99
(n1124 6.3.2.1, third paragraph) compared to C89. In particular,
"an lvalue that has type ``array of type'' ..." was changed to
"an expression that has type ``array of type'' ...".