update reserved names: add finally, fn, match, yield
diff --git a/php/ext/google/protobuf/names.c b/php/ext/google/protobuf/names.c
index ff04b3c..20a36a2 100644
--- a/php/ext/google/protobuf/names.c
+++ b/php/ext/google/protobuf/names.c
@@ -71,21 +71,22 @@
 /* def name -> classname ******************************************************/
 
 const char *const kReservedNames[] = {
-    "abstract",   "and",        "array",        "as",           "break",
-    "callable",   "case",       "catch",        "class",        "clone",
-    "const",      "continue",   "declare",      "default",      "die",
-    "do",         "echo",       "else",         "elseif",       "empty",
-    "enddeclare", "endfor",     "endforeach",   "endif",        "endswitch",
-    "endwhile",   "eval",       "exit",         "extends",      "final",
-    "for",        "foreach",    "function",     "global",       "goto",
-    "if",         "implements", "include",      "include_once", "instanceof",
-    "insteadof",  "interface",  "isset",        "list",         "namespace",
-    "new",        "or",         "print",        "private",      "protected",
-    "public",     "require",    "require_once", "return",       "static",
-    "switch",     "throw",      "trait",        "try",          "unset",
-    "use",        "var",        "while",        "xor",          "int",
-    "float",      "bool",       "string",       "true",         "false",
-    "null",       "void",       "iterable",     NULL};
+    "abstract",     "and",        "array",      "as",           "break",
+    "callable",     "case",       "catch",      "class",        "clone",
+    "const",        "continue",   "declare",    "default",      "die",
+    "do",           "echo",       "else",       "elseif",       "empty",
+    "enddeclare",   "endfor",     "endforeach", "endif",        "endswitch",
+    "endwhile",     "eval",       "exit",       "extends",      "final",
+    "finally",      "fn"          "for",        "foreach",      "function",
+    "if",           "implements", "include",    "include_once", "instanceof",
+    "global",       "goto",       "insteadof",  "interface",    "isset",
+    "list",         "match",      "namespace",  "new",          "or",
+    "print",        "private",    "protected",  "public",       "require",
+    "require_once", "return",     "static",     "switch",       "throw",
+    "trait",        "try",        "unset",      "use",          "var",
+    "while",        "xor",        "yield",      "int",          "float",
+    "bool",         "string",     "true",       "false",        "null",
+    "void",         "iterable",   NULL};
 
 bool is_reserved_name(const char* name) {
   int i;
diff --git a/php/src/Google/Protobuf/Internal/GPBUtil.php b/php/src/Google/Protobuf/Internal/GPBUtil.php
index cd65d8b..1dd6645 100644
--- a/php/src/Google/Protobuf/Internal/GPBUtil.php
+++ b/php/src/Google/Protobuf/Internal/GPBUtil.php
@@ -279,15 +279,16 @@
             "do"=>0, "echo"=>0, "else"=>0, "elseif"=>0, "empty"=>0,
             "enddeclare"=>0, "endfor"=>0, "endforeach"=>0, "endif"=>0,
             "endswitch"=>0, "endwhile"=>0, "eval"=>0, "exit"=>0, "extends"=>0,
-            "final"=>0, "for"=>0, "foreach"=>0, "function"=>0, "global"=>0,
-            "goto"=>0, "if"=>0, "implements"=>0, "include"=>0,
-            "include_once"=>0, "instanceof"=>0, "insteadof"=>0, "interface"=>0,
-            "isset"=>0, "list"=>0, "namespace"=>0, "new"=>0, "or"=>0,
-            "print"=>0, "private"=>0, "protected"=>0, "public"=>0, "require"=>0,
-            "require_once"=>0, "return"=>0, "static"=>0, "switch"=>0,
-            "throw"=>0, "trait"=>0, "try"=>0, "unset"=>0, "use"=>0, "var"=>0,
-            "while"=>0, "xor"=>0, "int"=>0, "float"=>0, "bool"=>0, "string"=>0,
-            "true"=>0, "false"=>0, "null"=>0, "void"=>0, "iterable"=>0
+            "final"=>0, "finally"=>0, "fn"=>0, "for"=>0, "foreach"=>0,
+            "function"=>0, "global"=>0, "goto"=>0, "if"=>0, "implements"=>0,
+            "include"=>0, "include_once"=>0, "instanceof"=>0, "insteadof"=>0,
+            "interface"=>0, "isset"=>0, "list"=>0, "match"=>0, "namespace"=>0,
+            "new"=>0, "or"=>0, "print"=>0, "private"=>0, "protected"=>0,
+            "public"=>0, "require"=>0, "require_once"=>0, "return"=>0,
+            "static"=>0, "switch"=>0, "throw"=>0, "trait"=>0, "try"=>0,
+            "unset"=>0, "use"=>0, "var"=>0, "while"=>0, "xor"=>0, "yield"=>0,
+            "int"=>0, "float"=>0, "bool"=>0, "string"=>0, "true"=>0, "false"=>0,
+            "null"=>0, "void"=>0, "iterable"=>0
         );
 
         if (array_key_exists(strtolower($classname), $reserved_words)) {
diff --git a/php/tests/GeneratedClassTest.php b/php/tests/GeneratedClassTest.php
index 4874cb7..2b15e42 100644
--- a/php/tests/GeneratedClassTest.php
+++ b/php/tests/GeneratedClassTest.php
@@ -913,6 +913,8 @@
         $m = new \Lower\PBexit();
         $m = new \Lower\PBextends();
         $m = new \Lower\PBfinal();
+        $m = new \Lower\PBfinally();
+        $m = new \Lower\PBfn();
         $m = new \Lower\PBfor();
         $m = new \Lower\PBforeach();
         $m = new \Lower\PBfunction();
@@ -927,6 +929,7 @@
         $m = new \Lower\PBinterface();
         $m = new \Lower\PBisset();
         $m = new \Lower\PBlist();
+        $m = new \Lower\PBmatch();
         $m = new \Lower\PBnamespace();
         $m = new \Lower\PBnew();
         $m = new \Lower\PBor();
@@ -947,6 +950,7 @@
         $m = new \Lower\PBvar();
         $m = new \Lower\PBwhile();
         $m = new \Lower\PBxor();
+        $m = new \Lower\PByield();
         $m = new \Lower\PBint();
         $m = new \Lower\PBfloat();
         $m = new \Lower\PBbool();
@@ -987,6 +991,8 @@
         $m = new \Upper\PBEXIT();
         $m = new \Upper\PBEXTENDS();
         $m = new \Upper\PBFINAL();
+        $m = new \Upper\PBFINALLY();
+        $m = new \Upper\PBFN();
         $m = new \Upper\PBFOR();
         $m = new \Upper\PBFOREACH();
         $m = new \Upper\PBFUNCTION();
@@ -1001,6 +1007,7 @@
         $m = new \Upper\PBINTERFACE();
         $m = new \Upper\PBISSET();
         $m = new \Upper\PBLIST();
+        $m = new \Upper\PBMATCH();
         $m = new \Upper\PBNAMESPACE();
         $m = new \Upper\PBNEW();
         $m = new \Upper\PBOR();
@@ -1021,6 +1028,7 @@
         $m = new \Upper\PBVAR();
         $m = new \Upper\PBWHILE();
         $m = new \Upper\PBXOR();
+        $m = new \Upper\PBYIELD();
         $m = new \Upper\PBINT();
         $m = new \Upper\PBFLOAT();
         $m = new \Upper\PBBOOL();
@@ -1061,6 +1069,8 @@
         $m = new \Lower_enum\PBexit();
         $m = new \Lower_enum\PBextends();
         $m = new \Lower_enum\PBfinal();
+        $m = new \Lower_enum\PBfinally();
+        $m = new \Lower_enum\PBfn();
         $m = new \Lower_enum\PBfor();
         $m = new \Lower_enum\PBforeach();
         $m = new \Lower_enum\PBfunction();
@@ -1075,6 +1085,7 @@
         $m = new \Lower_enum\PBinterface();
         $m = new \Lower_enum\PBisset();
         $m = new \Lower_enum\PBlist();
+        $m = new \Lower_enum\PBmatch();
         $m = new \Lower_enum\PBnamespace();
         $m = new \Lower_enum\PBnew();
         $m = new \Lower_enum\PBor();
@@ -1095,6 +1106,7 @@
         $m = new \Lower_enum\PBvar();
         $m = new \Lower_enum\PBwhile();
         $m = new \Lower_enum\PBxor();
+        $m = new \Lower_enum\PByield();
         $m = new \Lower_enum\PBint();
         $m = new \Lower_enum\PBfloat();
         $m = new \Lower_enum\PBbool();
@@ -1135,6 +1147,8 @@
         $m = new \Upper_enum\PBEXIT();
         $m = new \Upper_enum\PBEXTENDS();
         $m = new \Upper_enum\PBFINAL();
+        $m = new \Upper_enum\PBFINALLY();
+        $m = new \Upper_enum\PBFN();
         $m = new \Upper_enum\PBFOR();
         $m = new \Upper_enum\PBFOREACH();
         $m = new \Upper_enum\PBFUNCTION();
@@ -1149,6 +1163,7 @@
         $m = new \Upper_enum\PBINTERFACE();
         $m = new \Upper_enum\PBISSET();
         $m = new \Upper_enum\PBLIST();
+        $m = new \Upper_enum\PBMATCH();
         $m = new \Upper_enum\PBNAMESPACE();
         $m = new \Upper_enum\PBNEW();
         $m = new \Upper_enum\PBOR();
@@ -1169,6 +1184,7 @@
         $m = new \Upper_enum\PBVAR();
         $m = new \Upper_enum\PBWHILE();
         $m = new \Upper_enum\PBXOR();
+        $m = new \Upper_enum\PBYIELD();
         $m = new \Upper_enum\PBINT();
         $m = new \Upper_enum\PBFLOAT();
         $m = new \Upper_enum\PBBOOL();
@@ -1209,6 +1225,8 @@
         $m = \Lower_enum_value\NotAllowed::PBexit;
         $m = \Lower_enum_value\NotAllowed::PBextends;
         $m = \Lower_enum_value\NotAllowed::PBfinal;
+        $m = \Lower_enum_value\NotAllowed::PBfinally;
+        $m = \Lower_enum_value\NotAllowed::PBfn;
         $m = \Lower_enum_value\NotAllowed::PBfor;
         $m = \Lower_enum_value\NotAllowed::PBforeach;
         $m = \Lower_enum_value\NotAllowed::PBfunction;
@@ -1223,6 +1241,7 @@
         $m = \Lower_enum_value\NotAllowed::PBinterface;
         $m = \Lower_enum_value\NotAllowed::PBisset;
         $m = \Lower_enum_value\NotAllowed::PBlist;
+        $m = \Lower_enum_value\NotAllowed::PBmatch;
         $m = \Lower_enum_value\NotAllowed::PBnamespace;
         $m = \Lower_enum_value\NotAllowed::PBnew;
         $m = \Lower_enum_value\NotAllowed::PBor;
@@ -1243,6 +1262,7 @@
         $m = \Lower_enum_value\NotAllowed::PBvar;
         $m = \Lower_enum_value\NotAllowed::PBwhile;
         $m = \Lower_enum_value\NotAllowed::PBxor;
+        $m = \Lower_enum_value\NotAllowed::PByield;
         $m = \Lower_enum_value\NotAllowed::int;
         $m = \Lower_enum_value\NotAllowed::float;
         $m = \Lower_enum_value\NotAllowed::bool;
@@ -1283,6 +1303,8 @@
         $m = \Upper_enum_value\NotAllowed::PBEXIT;
         $m = \Upper_enum_value\NotAllowed::PBEXTENDS;
         $m = \Upper_enum_value\NotAllowed::PBFINAL;
+        $m = \Upper_enum_value\NotAllowed::PBFINALLY;
+        $m = \Upper_enum_value\NotAllowed::PBFN;
         $m = \Upper_enum_value\NotAllowed::PBFOR;
         $m = \Upper_enum_value\NotAllowed::PBFOREACH;
         $m = \Upper_enum_value\NotAllowed::PBFUNCTION;
@@ -1297,6 +1319,7 @@
         $m = \Upper_enum_value\NotAllowed::PBINTERFACE;
         $m = \Upper_enum_value\NotAllowed::PBISSET;
         $m = \Upper_enum_value\NotAllowed::PBLIST;
+        $m = \Upper_enum_value\NotAllowed::PBMATCH;
         $m = \Upper_enum_value\NotAllowed::PBNAMESPACE;
         $m = \Upper_enum_value\NotAllowed::PBNEW;
         $m = \Upper_enum_value\NotAllowed::PBOR;
@@ -1317,6 +1340,7 @@
         $m = \Upper_enum_value\NotAllowed::PBVAR;
         $m = \Upper_enum_value\NotAllowed::PBWHILE;
         $m = \Upper_enum_value\NotAllowed::PBXOR;
+        $m = \Upper_enum_value\NotAllowed::PBYIELD;
         $m = \Upper_enum_value\NotAllowed::INT;
         $m = \Upper_enum_value\NotAllowed::FLOAT;
         $m = \Upper_enum_value\NotAllowed::BOOL;
diff --git a/php/tests/proto/test_reserved_enum_lower.proto b/php/tests/proto/test_reserved_enum_lower.proto
index d2daeaf..088459b 100644
--- a/php/tests/proto/test_reserved_enum_lower.proto
+++ b/php/tests/proto/test_reserved_enum_lower.proto
@@ -32,6 +32,8 @@
 enum exit { ZERO28 = 0; }
 enum extends { ZERO29 = 0; }
 enum final { ZERO30 = 0; }
+enum finally { ZERO30 = 0; }
+enum fn { ZERO30 = 0; }
 enum for { ZERO31 = 0; }
 enum foreach { ZERO32 = 0; }
 enum function { ZERO33 = 0; }
@@ -46,6 +48,7 @@
 enum interface { ZERO42 = 0; }
 enum isset { ZERO43 = 0; }
 enum list { ZERO44 = 0; }
+enum match { ZERO30 = 0; }
 enum namespace { ZERO45 = 0; }
 enum new { ZERO46 = 0; }
 enum or { ZERO47 = 0; }
@@ -66,6 +69,7 @@
 enum var { ZERO62 = 0; }
 enum while { ZERO63 = 0; }
 enum xor { ZERO64 = 0; }
+enum yield { ZERO30 = 0; }
 enum int { ZERO65 = 0; }
 enum float { ZERO66 = 0; }
 enum bool { ZERO67 = 0; }
diff --git a/php/tests/proto/test_reserved_enum_upper.proto b/php/tests/proto/test_reserved_enum_upper.proto
index a396fea..a107332 100644
--- a/php/tests/proto/test_reserved_enum_upper.proto
+++ b/php/tests/proto/test_reserved_enum_upper.proto
@@ -32,46 +32,50 @@
 enum EXIT { ZERO28 = 0; }
 enum EXTENDS { ZERO29 = 0; }
 enum FINAL { ZERO30 = 0; }
-enum FOR { ZERO31 = 0; }
-enum FOREACH { ZERO32 = 0; }
-enum FUNCTION { ZERO33 = 0; }
-enum GLOBAL { ZERO34 = 0; }
-enum GOTO { ZERO35 = 0; }
-enum IF { ZERO36 = 0; }
-enum IMPLEMENTS { ZERO37 = 0; }
-enum INCLUDE { ZERO38 = 0; }
-enum INCLUDE_ONCE { ZERO39 = 0; }
-enum INSTANCEOF { ZERO40 = 0; }
-enum INSTEADOF { ZERO41 = 0; }
-enum INTERFACE { ZERO42 = 0; }
-enum ISSET { ZERO43 = 0; }
-enum LIST { ZERO44 = 0; }
-enum NAMESPACE { ZERO45 = 0; }
-enum NEW { ZERO46 = 0; }
-enum OR { ZERO47 = 0; }
-enum PRINT { ZERO48 = 0; }
-enum PRIVATE { ZERO49 = 0; }
-enum PROTECTED { ZERO50 = 0; }
-enum PUBLIC { ZERO51 = 0; }
-enum REQUIRE { ZERO52 = 0; }
-enum REQUIRE_ONCE { ZERO53 = 0; }
-enum RETURN { ZERO54 = 0; }
-enum STATIC { ZERO55 = 0; }
-enum SWITCH { ZERO56 = 0; }
-enum THROW { ZERO57 = 0; }
-enum TRAIT { ZERO58 = 0; }
-enum TRY { ZERO59 = 0; }
-enum UNSET { ZERO60 = 0; }
-enum USE { ZERO61 = 0; }
-enum VAR { ZERO62 = 0; }
-enum WHILE { ZERO63 = 0; }
-enum XOR { ZERO64 = 0; }
-enum INT { ZERO65 = 0; }
-enum FLOAT { ZERO66 = 0; }
-enum BOOL { ZERO67 = 0; }
-enum STRING { ZERO68 = 0; }
-enum TRUE { ZERO69 = 0; }
-enum FALSE { ZERO70 = 0; }
-enum NULL { ZERO71 = 0; }
-enum VOID { ZERO72 = 0; }
-enum ITERABLE { ZERO73 = 0; }
+enum FINALLY { ZERO31 = 0; }
+enum FN { ZERO32 = 0; }
+enum FOR { ZERO33 = 0; }
+enum FOREACH { ZERO34 = 0; }
+enum FUNCTION { ZERO35 = 0; }
+enum GLOBAL { ZERO36 = 0; }
+enum GOTO { ZERO37 = 0; }
+enum IF { ZERO38 = 0; }
+enum IMPLEMENTS { ZERO39 = 0; }
+enum INCLUDE { ZERO40 = 0; }
+enum INCLUDE_ONCE { ZERO41 = 0; }
+enum INSTANCEOF { ZERO42 = 0; }
+enum INSTEADOF { ZERO43 = 0; }
+enum INTERFACE { ZERO44 = 0; }
+enum ISSET { ZERO45 = 0; }
+enum LIST { ZERO46 = 0; }
+enum MATCH { ZERO47 = 0; }
+enum NAMESPACE { ZERO48 = 0; }
+enum NEW { ZERO49 = 0; }
+enum OR { ZERO50 = 0; }
+enum PRINT { ZERO51 = 0; }
+enum PRIVATE { ZERO52 = 0; }
+enum PROTECTED { ZERO53 = 0; }
+enum PUBLIC { ZERO54 = 0; }
+enum REQUIRE { ZERO55 = 0; }
+enum REQUIRE_ONCE { ZERO56 = 0; }
+enum RETURN { ZERO57 = 0; }
+enum STATIC { ZERO58 = 0; }
+enum SWITCH { ZERO59 = 0; }
+enum THROW { ZERO60 = 0; }
+enum TRAIT { ZERO61 = 0; }
+enum TRY { ZERO62 = 0; }
+enum UNSET { ZERO63 = 0; }
+enum USE { ZERO64 = 0; }
+enum VAR { ZERO65 = 0; }
+enum WHILE { ZERO66 = 0; }
+enum XOR { ZERO67 = 0; }
+enum YIELD { ZERO68 = 0; }
+enum INT { ZERO69 = 0; }
+enum FLOAT { ZERO70 = 0; }
+enum BOOL { ZERO71 = 0; }
+enum STRING { ZERO72 = 0; }
+enum TRUE { ZERO73 = 0; }
+enum FALSE { ZERO74 = 0; }
+enum NULL { ZERO75 = 0; }
+enum VOID { ZERO76 = 0; }
+enum ITERABLE { ZERO77 = 0; }
diff --git a/php/tests/proto/test_reserved_enum_value_lower.proto b/php/tests/proto/test_reserved_enum_value_lower.proto
index 96da319..4682906 100644
--- a/php/tests/proto/test_reserved_enum_value_lower.proto
+++ b/php/tests/proto/test_reserved_enum_value_lower.proto
@@ -33,47 +33,51 @@
   exit = 27;
   extends = 28;
   final = 29;
-  for = 30;
-  foreach = 31;
-  function = 32;
-  global = 33;
-  goto = 34;
-  if = 35;
-  implements = 36;
-  include = 37;
-  include_once = 38;
-  instanceof = 39;
-  insteadof = 40;
-  interface = 41;
-  isset = 42;
-  list = 43;
-  namespace = 44;
-  new = 45;
-  or = 46;
-  print = 47;
-  private = 48;
-  protected = 49;
-  public = 50;
-  require = 51;
-  require_once = 52;
-  return = 53;
-  static = 54;
-  switch = 55;
-  throw = 56;
-  trait = 57;
-  try = 58;
-  unset = 59;
-  use = 60;
-  var = 61;
-  while = 62;
-  xor = 63;
-  int = 64;
-  float = 65;
-  bool = 66;
-  string = 67;
-  true = 68;
-  false = 69;
-  null = 70;
-  void = 71;
-  iterable = 72;
+  finally = 30;
+  fn = 31;
+  for = 32;
+  foreach = 33;
+  function = 34;
+  global = 35;
+  goto = 36;
+  if = 37;
+  implements = 38;
+  include = 39;
+  include_once = 40;
+  instanceof = 41;
+  insteadof = 42;
+  interface = 43;
+  isset = 44;
+  list = 45;
+  match = 46;
+  namespace = 47;
+  new = 48;
+  or = 49;
+  print = 50;
+  private = 51;
+  protected = 52;
+  public = 53;
+  require = 54;
+  require_once = 55;
+  return = 56;
+  static = 57;
+  switch = 58;
+  throw = 59;
+  trait = 60;
+  try = 61;
+  unset = 62;
+  use = 63;
+  var = 64;
+  while = 65;
+  xor = 66;
+  yield = 67;
+  int = 68;
+  float = 69;
+  bool = 70;
+  string = 71;
+  true = 72;
+  false = 73;
+  null = 74;
+  void = 75;
+  iterable = 76;
 }
diff --git a/php/tests/proto/test_reserved_message_lower.proto b/php/tests/proto/test_reserved_message_lower.proto
index ed12080..05344ff 100644
--- a/php/tests/proto/test_reserved_message_lower.proto
+++ b/php/tests/proto/test_reserved_message_lower.proto
@@ -32,6 +32,8 @@
 message exit {}
 message extends {}
 message final {}
+message finally {}
+message fn {}
 message for {}
 message foreach {}
 message function {}
@@ -46,6 +48,7 @@
 message interface {}
 message isset {}
 message list {}
+message match {}
 message namespace {}
 message new {}
 message or {}
@@ -66,6 +69,7 @@
 message var {}
 message while {}
 message xor {}
+message yield {}
 message int {}
 message float {}
 message bool {}
diff --git a/php/tests/proto/test_reserved_message_upper.proto b/php/tests/proto/test_reserved_message_upper.proto
index 2917fd1..853a17d 100644
--- a/php/tests/proto/test_reserved_message_upper.proto
+++ b/php/tests/proto/test_reserved_message_upper.proto
@@ -32,6 +32,8 @@
 message EXIT {}
 message EXTENDS {}
 message FINAL {}
+message FINALLY {}
+message FN {}
 message FOR {}
 message FOREACH {}
 message FUNCTION {}
@@ -46,6 +48,7 @@
 message INTERFACE {}
 message ISSET {}
 message LIST {}
+message MATCH {}
 message NAMESPACE {}
 message NEW {}
 message OR {}
@@ -66,6 +69,7 @@
 message VAR {}
 message WHILE {}
 message XOR {}
+message YIELD {}
 message INT {}
 message FLOAT {}
 message BOOL {}