Re-reading matchers reference, I found ResultOf
which works with a lambda and provides a nice output on error:
testing::ResultOf("y", [](const auto& s) { return s.y; }, expected_y);
Expected arg #0: whose y is equal to 3
Actual: whose y is 7