Do not use iterators in ParsedQuicVersionIsValid

This CL fixes a Chrome merge. The issue is that Chrome uses C++14 whereas g3 uses C++17, and std::array::begin() is only constexpr starting in C++17.

gfe-relnote: n/a, no behavior change
PiperOrigin-RevId: 301399514
Change-Id: I2a86e234950d35ff6022285eb592cbd4576881f8
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h
index bf6c39b..8739326 100644
--- a/quic/core/quic_versions.h
+++ b/quic/core/quic_versions.h
@@ -172,7 +172,10 @@
       transport_version == QUIC_VERSION_UNSUPPORTED ||
       transport_version == QUIC_VERSION_RESERVED_FOR_NEGOTIATION;
   if (!transport_version_is_valid) {
-    for (QuicTransportVersion trans_vers : SupportedTransportVersions()) {
+    // Iterators are not constexpr in C++14 which Chrome uses.
+    constexpr auto supported_transport_versions = SupportedTransportVersions();
+    for (size_t i = 0; i < supported_transport_versions.size(); ++i) {
+      const QuicTransportVersion& trans_vers = supported_transport_versions[i];
       if (trans_vers == transport_version) {
         transport_version_is_valid = true;
         break;
diff --git a/quic/core/quic_versions_test.cc b/quic/core/quic_versions_test.cc
index 851619f..216b080 100644
--- a/quic/core/quic_versions_test.cc
+++ b/quic/core/quic_versions_test.cc
@@ -70,6 +70,17 @@
   EXPECT_TRUE(reserved.IsKnown());
   EXPECT_TRUE(ParsedQuicVersionIsValid(reserved.handshake_protocol,
                                        reserved.transport_version));
+  // Check that invalid combinations are not valid.
+  EXPECT_FALSE(ParsedQuicVersionIsValid(PROTOCOL_TLS1_3, QUIC_VERSION_43));
+  EXPECT_FALSE(ParsedQuicVersionIsValid(PROTOCOL_QUIC_CRYPTO,
+                                        QUIC_VERSION_IETF_DRAFT_27));
+  // Check that deprecated versions are not valid.
+  EXPECT_FALSE(ParsedQuicVersionIsValid(PROTOCOL_QUIC_CRYPTO,
+                                        static_cast<QuicTransportVersion>(33)));
+  EXPECT_FALSE(ParsedQuicVersionIsValid(PROTOCOL_QUIC_CRYPTO,
+                                        static_cast<QuicTransportVersion>(99)));
+  EXPECT_FALSE(ParsedQuicVersionIsValid(PROTOCOL_TLS1_3,
+                                        static_cast<QuicTransportVersion>(99)));
 }
 
 TEST_F(QuicVersionsTest, QuicVersionLabelToQuicTransportVersion) {