Addressed PR comments.
diff --git a/BUILD b/BUILD
index 136c4f2..5bed646 100644
--- a/BUILD
+++ b/BUILD
@@ -230,27 +230,10 @@
 
 proto_library(
     name = "msg_test_proto",
-    srcs = [
-        "upb/msg_test.proto",
-        "upb/max_required_test.proto",
-    ],
+    srcs = ["upb/msg_test.proto"],
     deps = ["@com_google_protobuf//:test_messages_proto3_proto"],
 )
 
-genrule(
-    name = "gen_max_required_test_proto",
-    outs = ["upb/max_required_test.proto"],
-    cmd = """
-          echo "syntax = \\\"proto2\\\";" >> $@
-          echo "package upb_test;" >> $@
-          echo "message TestMaxRequiredFields {" >> $@
-          for i in {1..63}; do
-            echo "  required int32 required_int32_$$i = $$i;" >> $@
-          done
-          echo "}" >> $@
-          """,
-)
-
 upb_proto_reflection_library(
     name = "msg_test_upb_proto_reflection",
     deps = [":msg_test_proto"],
diff --git a/upb/msg_internal.h b/upb/msg_internal.h
index 76d8476..247f7e6 100644
--- a/upb/msg_internal.h
+++ b/upb/msg_internal.h
@@ -207,7 +207,7 @@
 UPB_INLINE uint64_t upb_msglayout_requiredmask(const upb_msglayout *l) {
   int n = l->required_count;
   assert(0 < n && n <= 63);
-  return (((uint64_t)1 << n) - 1) << 1;
+  return ((1ULL << n) - 1) << 1;
 }
 
 /** upb_extreg ****************************************************************/
diff --git a/upb/msg_test.cc b/upb/msg_test.cc
index b29dfd1..d390f01 100644
--- a/upb/msg_test.cc
+++ b/upb/msg_test.cc
@@ -31,8 +31,6 @@
 #include "upb/def.hpp"
 #include "upb/json_decode.h"
 #include "upb/json_encode.h"
-#include "upb/max_required_test.upb.h"
-#include "upb/max_required_test.upbdefs.h"
 #include "upb/msg_test.upb.h"
 #include "upb/msg_test.upbdefs.h"
 #include "upb/upb.hpp"
@@ -378,7 +376,7 @@
   upb::MessageDefPtr m(upb_test_TestMaxRequiredFields_getmsgdef(symtab.ptr()));
   upb_msgval val;
   val.int32_val = 1;
-  for (int i = 1; i <= 62; i++) {
+  for (int i = 1; i <= 61; i++) {
     upb::FieldDefPtr f = m.FindFieldByNumber(i);
     ASSERT_TRUE(f);
     upb_msg_set(test_msg, f.ptr(), val, arena.ptr());
@@ -390,7 +388,7 @@
   ASSERT_TRUE(serialized == nullptr);
 
   // Succeeds, all required fields are set.
-  upb::FieldDefPtr f = m.FindFieldByNumber(63);
+  upb::FieldDefPtr f = m.FindFieldByNumber(62);
   ASSERT_TRUE(f);
   upb_msg_set(test_msg, f.ptr(), val, arena.ptr());
   serialized = upb_test_TestMaxRequiredFields_serialize_ex(
diff --git a/upb/msg_test.proto b/upb/msg_test.proto
index 9c49beb..81c7dee 100644
--- a/upb/msg_test.proto
+++ b/upb/msg_test.proto
@@ -93,3 +93,68 @@
 message SubMessageHasRequired {
   optional TestRequiredFields optional_message = 1;
 }
+
+message TestMaxRequiredFields {
+  required int32 required_int32_1 = 1;
+  required int32 required_int32_2 = 2;
+  required int32 required_int32_3 = 3;
+  required int32 required_int32_4 = 4;
+  required int32 required_int32_5 = 5;
+  required int32 required_int32_6 = 6;
+  required int32 required_int32_7 = 7;
+  required int32 required_int32_8 = 8;
+  required int32 required_int32_9 = 9;
+  required int32 required_int32_10 = 10;
+  required int32 required_int32_11 = 11;
+  required int32 required_int32_12 = 12;
+  required int32 required_int32_13 = 13;
+  required int32 required_int32_14 = 14;
+  required int32 required_int32_15 = 15;
+  required int32 required_int32_16 = 16;
+  required int32 required_int32_17 = 17;
+  required int32 required_int32_18 = 18;
+  required int32 required_int32_19 = 19;
+  required int32 required_int32_20 = 20;
+  required int32 required_int32_21 = 21;
+  required int32 required_int32_22 = 22;
+  required int32 required_int32_23 = 23;
+  required int32 required_int32_24 = 24;
+  required int32 required_int32_25 = 25;
+  required int32 required_int32_26 = 26;
+  required int32 required_int32_27 = 27;
+  required int32 required_int32_28 = 28;
+  required int32 required_int32_29 = 29;
+  required int32 required_int32_30 = 30;
+  required int32 required_int32_31 = 31;
+  required int32 required_int32_32 = 32;
+  required int32 required_int32_33 = 33;
+  required int32 required_int32_34 = 34;
+  required int32 required_int32_35 = 35;
+  required int32 required_int32_36 = 36;
+  required int32 required_int32_37 = 37;
+  required int32 required_int32_38 = 38;
+  required int32 required_int32_39 = 39;
+  required int32 required_int32_40 = 40;
+  required int32 required_int32_41 = 41;
+  required int32 required_int32_42 = 42;
+  required int32 required_int32_43 = 43;
+  required int32 required_int32_44 = 44;
+  required int32 required_int32_45 = 45;
+  required int32 required_int32_46 = 46;
+  required int32 required_int32_47 = 47;
+  required int32 required_int32_48 = 48;
+  required int32 required_int32_49 = 49;
+  required int32 required_int32_50 = 50;
+  required int32 required_int32_51 = 51;
+  required int32 required_int32_52 = 52;
+  required int32 required_int32_53 = 53;
+  required int32 required_int32_54 = 54;
+  required int32 required_int32_55 = 55;
+  required int32 required_int32_56 = 56;
+  required int32 required_int32_57 = 57;
+  required int32 required_int32_58 = 58;
+  required int32 required_int32_59 = 59;
+  required int32 required_int32_60 = 60;
+  required int32 required_int32_61 = 61;
+  required int32 required_int32_62 = 62;
+}