ICU-20511 Merge release-64-2 to master

diff --git a/icu4c/source/allinone/Build.Windows.Library.WarningSettings.ProjectConfiguration.props b/icu4c/source/allinone/Build.Windows.Library.WarningSettings.ProjectConfiguration.props
index 6e92e87..a00e2c4 100644
--- a/icu4c/source/allinone/Build.Windows.Library.WarningSettings.ProjectConfiguration.props
+++ b/icu4c/source/allinone/Build.Windows.Library.WarningSettings.ProjectConfiguration.props
@@ -17,8 +17,10 @@
           C4005 Macro redifintion.
           C4068 Unknown pragma.
           C4267 Conversion from size_t to type, possible loss of data.
+          C4910 __declspec(dllexport) and extern are incompatible on an explicit instantiation.
+          C4003 Not enough parameters for macro.
       -->
-      <TreatSpecificWarningsAsErrors>4251;4661;4715;4706;4005;4068;4267;%(TreatSpecificWarningsAsErrors)</TreatSpecificWarningsAsErrors>
+      <TreatSpecificWarningsAsErrors>4251;4661;4715;4706;4005;4068;4267;4910;4003;%(TreatSpecificWarningsAsErrors)</TreatSpecificWarningsAsErrors>
     </ClCompile>
   </ItemDefinitionGroup>
 </Project>
diff --git a/icu4c/source/i18n/regexcmp.cpp b/icu4c/source/i18n/regexcmp.cpp
index 2d14aa8..e27c3ca 100644
--- a/icu4c/source/i18n/regexcmp.cpp
+++ b/icu4c/source/i18n/regexcmp.cpp
@@ -2285,7 +2285,7 @@
                 error(U_REGEX_LOOK_BEHIND_LIMIT);
                 break;
             }
-            if (minML == INT32_MAX && maxML == 0) {
+            if (minML == INT32_MAX) {
                 // This condition happens when no match is possible, such as with a
                 // [set] expression containing no elements.
                 // In principle, the generated code to evaluate the expression could be deleted,
@@ -2328,7 +2328,7 @@
                 error(U_REGEX_LOOK_BEHIND_LIMIT);
                 break;
             }
-            if (minML == INT32_MAX && maxML == 0) {
+            if (minML == INT32_MAX) {
                 // This condition happens when no match is possible, such as with a
                 // [set] expression containing no elements.
                 // In principle, the generated code to evaluate the expression could be deleted,
diff --git a/icu4c/source/test/testdata/regextst.txt b/icu4c/source/test/testdata/regextst.txt
index ba84af0..677f482 100644
--- a/icu4c/source/test/testdata/regextst.txt
+++ b/icu4c/source/test/testdata/regextst.txt
@@ -1439,13 +1439,16 @@
 "[^\u0000-\U0010ffff]"             "a"
 "[^[^\u0000-\U0010ffff]]"          "<0>a</0>"
 
+# Bug ICU-20544. Similar to 20385, above. Assertion failure with a negative look-behind assertion containing
+#                a set with no contents. Look-behind pattern includes more than just the empty set.
+
+"(?<![ⰿ&&m]c)"                     "<0></0>abc"   # note: first 'ⰿ' is \u2c3f, hence empty set.
+"(?<![^\u0000-\U0010ffff]c)"       "<0></0>abc"
+"(?<=[^[^]]†)"                 "abc"          # Problem also exists w positive look-behind
 
 #  Random debugging, Temporary
 #
 
-
-
-
 #
 #  Regexps from http://www.regexlib.com
 #
diff --git a/icu4j/main/tests/packaging/src/com/ibm/icu/dev/test/TestLocaleNamePackaging.java b/icu4j/main/tests/packaging/src/com/ibm/icu/dev/test/TestLocaleNamePackaging.java
index e062b72..9905eed 100644
--- a/icu4j/main/tests/packaging/src/com/ibm/icu/dev/test/TestLocaleNamePackaging.java
+++ b/icu4j/main/tests/packaging/src/com/ibm/icu/dev/test/TestLocaleNamePackaging.java
@@ -68,10 +68,10 @@
             "Deutschland",
             "Thailand",
             "",
-            "United States",
-            "Spain",
-            "Germany",
-            "Thailand",
+            "US",
+            "ES",
+            "DE",
+            "TH",
         };
         String[] expectedWithoutRegionData = {
             "",
@@ -117,34 +117,34 @@
             "en",
             "es",
             "de",
-            "und",
+            "",
             "",
             "English",
             "Spanish",
             "German",
-            "Unknown Language",
+            "",
             "",
             "ingl\u00E9s",
             "espa\u00F1ol",
             "alem\u00E1n",
-            "lengua desconocida",
+            "",
             "",
             "Englisch",
             "Spanisch",
             "Deutsch",
-            "Unbestimmte Sprache",
             "",
-            "English",
-            "Spanish",
-            "German",
-            "Unknown Language",
+            "",
+            "en",
+            "es",
+            "de",
+            "",
         };
         String[] expectedWithoutLanguageData = {
             "",
             "en",
             "es",
             "de",
-            "und"
+            "",
         };
         String[] expected = LocaleDisplayNamesImpl.haveData(LANG) ?
             expectedWithLanguageData : expectedWithoutLanguageData;
@@ -166,9 +166,12 @@
         for (Locale displayJavaLocale : javaLocales) {
             LocaleDisplayNames dn = LocaleDisplayNames.getInstance(displayJavaLocale);
             for (Locale targetLocale : javaLocales) {
-                String result = dn.languageDisplayName(targetLocale.getLanguage());
-                assertEquals(targetLocale + " in " + displayJavaLocale, expected[n++], result);
-                if (n == expected.length) {
+                // ICU-20273: ICU and Java handle "und" differently, skip those test cases.
+                if (!"und".equals(targetLocale.getLanguage())) {
+                    String result = dn.languageDisplayName(targetLocale.getLanguage());
+                    assertEquals(targetLocale + " in " + displayJavaLocale, expected[n], result);
+                }
+                if (++n == expected.length) {
                     n = 0;
                 }
             }
@@ -180,14 +183,14 @@
     @Test
     public void testLocaleDisplayNameWithKeywords() {
         String[] expectedWithLanguageData = {
-            "root (collation=phonebook)",
-            "Root (Phonebook Sort Order)",
-            "ra\u00EDz (orden de list\u00EDn telef\u00F3nico)",
-            "Root (Telefonbuch-Sortierung)",
-            "Root (Phonebook Sort Order)",
+            "und (collation=phonebook)",
+            "Unknown language (Phonebook Sort Order)",
+            "lengua desconocida (orden de list\u00EDn telef\u00F3nico)",
+            "Unbekannte Sprache (Telefonbuch-Sortierung)",
+            "und (collation=phonebook)",
         };
         String[] expectedWithoutLanguageData = {
-            "root (collation=phonebook)",
+            "und (collation=phonebook)",
         };
         String[] expected = LocaleDisplayNamesImpl.haveData(LANG) ?
             expectedWithLanguageData : expectedWithoutLanguageData;
diff --git a/tools/commit-checker/README.md b/tools/commit-checker/README.md
index ce76402..4365f9b 100644
--- a/tools/commit-checker/README.md
+++ b/tools/commit-checker/README.md
@@ -30,17 +30,13 @@
 
 Make sure you have updated your repository:
 
-    $ git checkout master
-    $ git pull upstream master
     $ git fetch --tags upstream
 
-Sanity check: ensure that the "latest" tag is correct (points to the latest release).  You may need to force-fetch the tags.
+Run the tool and save the result into REPORT.md; set fixVersion to the upcoming ICU version, and take the revision range between the previous release and the tip for the upcoming release:
 
-    $ git show latest
-    # should show a commit with both "latest" and the previous version number
-
-Run the tool and save the result into REPORT.md; set fixVersion to the *upcoming* ICU version:
-
-    $ pipenv run python3 check.py --jira-query "project=ICU AND fixVersion=64.1" > REPORT.md
+    $ pipenv run python3 check.py \
+        --jira-query "project=ICU AND fixVersion=64.1" \
+        --rev-range "release-63-1..upstream/maint/maint-64"
+        > REPORT.md
 
 Create a branch and open a pull request so others can view the report easily.
diff --git a/tools/commit-checker/check.py b/tools/commit-checker/check.py
index 7f6d724..578461d 100644
--- a/tools/commit-checker/check.py
+++ b/tools/commit-checker/check.py
@@ -32,8 +32,8 @@
 )
 flag_parser.add_argument(
     "--rev-range",
-    help = "A git revision range; see https://git-scm.com/docs/gitrevisions",
-    default = "latest..master"
+    help = "A git revision range; see https://git-scm.com/docs/gitrevisions. Should be the two-dot range between the previous release and the current tip.",
+    required = True
 )
 flag_parser.add_argument(
     "--jira-hostname",
@@ -183,6 +183,7 @@
     print("Environment:")
     print("- Latest Commit: %s" % commits[0].commit.hexsha)
     print("- Jira Query: %s" % args.jira_query)
+    print("- Rev Range: %s" % args.rev_range)
     print("- Authenticated: %s" % "Yes" if authenticated else "No (sensitive tickets not shown)")
     print()
     print("## Problem Categories")