The C gimplifier always creates a scalar LHS: a.f = foo () is gimplified into temp = foo () a.f = temp Note that if a.f is not a scalar, this is a transformation that can cause a large copy.