https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121376

            Bug ID: 121376
           Summary: Objects with temporary lifetime do not work correctly
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: luigighiron at gmail dot com
  Target Milestone: ---

The following program demonstrates the issues with how GCC handles objects with
temporary lifetime:

int main(){
    struct{int x[1];}x={};
    int*p;
    return p=(0,x).x,*x.x=1,*p;
}

The expression (0,x) uses how the comma operator always results in a non-lvalue
expression. So (0,x).x is not pointing at *x.x but rather at a temporary object
which holds a copy of the array. This temporary object lives for the full
expression, so *p later is valid and should have the same value as same value
as when the temporary object was created. Hence, despite changing *x.x to 1 the
program should return zero. GCC does not implement this correctly, and treats
p=(0,x).x the same as p=x.x so it results in one. Note that even though the
temporary object has a non-unique address, x has a unique address so they
shouldn't share addresses.

Clang used to have the same issue, but they have recently fixed it:
https://github.com/llvm/llvm-project/pull/133472.

Reply via email to