diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h index 3c8cc32e..f45ace18 100644 --- a/googlemock/include/gmock/gmock-matchers.h +++ b/googlemock/include/gmock/gmock-matchers.h @@ -3240,6 +3240,11 @@ auto UnpackStructImpl(const T& t, MakeIndexSequence<17>, char) { const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q] = t; return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q); } +template +auto UnpackStructImpl(const T& t, MakeIndexSequence<18>, char) { + const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r] = t; + return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r); +} #endif // defined(__cpp_structured_bindings) template @@ -3306,8 +3311,8 @@ class FieldsAreMatcherImpl> std::vector inner_listener(sizeof...(I)); VariadicExpand( - {failed_pos == ~size_t{} && !std::get(matchers_).MatchAndExplain( - std::get(tuple), &inner_listener[I]) + {failed_pos == ~size_t{}&& !std::get(matchers_).MatchAndExplain( + std::get(tuple), &inner_listener[I]) ? failed_pos = I : 0 ...}); if (failed_pos != ~size_t{}) { diff --git a/googlemock/test/gmock-matchers-comparisons_test.cc b/googlemock/test/gmock-matchers-comparisons_test.cc index c90b0b4e..1c6cac62 100644 --- a/googlemock/test/gmock-matchers-comparisons_test.cc +++ b/googlemock/test/gmock-matchers-comparisons_test.cc @@ -1710,6 +1710,16 @@ TEST(FieldsAreTest, StructuredBindings) { }; EXPECT_THAT(MyVarType16{}, FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + struct MyVarType17 { + int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q; + }; + EXPECT_THAT(MyVarType17{}, + FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + struct MyVarType18 { + int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r; + }; + EXPECT_THAT(MyVarType18{}, + FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); } #endif