diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
index 2a0dad6782346e5e33b9374f1a07f48a3a6778af..2925a4b76a69daec3e2ea1d9fd253af667ca5682 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
@@ -84,14 +84,18 @@ public final class KeySpecParser {
     }
 
     private static int indexOfLabelEnd(final String keySpec) {
+        final int length = keySpec.length();
         if (keySpec.indexOf(BACKSLASH) < 0) {
             final int labelEnd = keySpec.indexOf(VERTICAL_BAR);
             if (labelEnd == 0) {
+                if (length == 1) {
+                    // Treat a sole vertical bar as a special case of key label.
+                    return -1;
+                }
                 throw new KeySpecParserError("Empty label");
             }
             return labelEnd;
         }
-        final int length = keySpec.length();
         for (int pos = 0; pos < length; pos++) {
             final char c = keySpec.charAt(pos);
             if (c == BACKSLASH && pos + 1 < length) {
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
index a02d4029913a75a2bce7857440608af58429ac79..cb640b3f8fc9bc6b9e45a6cb46763bd0cbe13370 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
@@ -101,7 +101,9 @@ abstract class KeySpecParserTestsBase extends AndroidTestCase {
                 "a", null, ICON_UNDEFINED, 'a');
         assertParser("Single surrogate", SURROGATE_PAIR1,
                 SURROGATE_PAIR1, null, ICON_UNDEFINED, SURROGATE_CODE1);
-        assertParser("Single escaped bar", "\\|",
+        assertParser("Sole vertical bar", "|",
+                "|", null, ICON_UNDEFINED, '|');
+        assertParser("Single escaped vertical bar", "\\|",
                 "|", null, ICON_UNDEFINED, '|');
         assertParser("Single escaped escape", "\\\\",
                 "\\", null, ICON_UNDEFINED, '\\');
@@ -251,8 +253,6 @@ abstract class KeySpecParserTestsBase extends AndroidTestCase {
     }
 
     public void testFormatError() {
-        assertParserError("Single bar", "|",
-                "|", null, ICON_UNDEFINED, '|');
         assertParserError("Empty label with outputText", "|a",
                 null, "a", ICON_UNDEFINED, CODE_UNSPECIFIED);
         assertParserError("Empty label with code", "|" + CODE_SETTINGS,
@@ -261,8 +261,6 @@ abstract class KeySpecParserTestsBase extends AndroidTestCase {
                 "a", null, ICON_UNDEFINED, CODE_UNSPECIFIED);
         assertParserError("Empty outputText with icon", ICON_SETTINGS + "|",
                 null, null, mSettingsIconId, CODE_UNSPECIFIED);
-        assertParserError("Empty icon and code", "|",
-                null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
         assertParserError("Icon without code", ICON_SETTINGS,
                 null, null, mSettingsIconId, CODE_UNSPECIFIED);
         assertParserError("Non existing icon", ICON_NON_EXISTING + "|abc",