+2020-12-07  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
+
+       * linespec.c (linespec_lexer_lex_keyword): The "-force-condition"
+       keyword may be followed by any keyword.
+       * breakpoint.c (find_condition_and_thread): Advance 'tok' by
+       'toklen' in the case for "-force-condition".
+
 2020-12-07  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
 
        * main.c (catch_command_errors): Add a flag parameter; invoke
 
        {
          int len = strlen (linespec_keywords[i]);
 
-         /* If P begins with one of the keywords and the next
-            character is whitespace, we may have found a keyword.
-            It is only a keyword if it is not followed by another
-            keyword.  */
-         if (strncmp (p, linespec_keywords[i], len) == 0
-             && isspace (p[len]))
+         /* If P begins with
+
+            - "thread" or "task" and the next character is
+            whitespace, we may have found a keyword.  It is only a
+            keyword if it is not followed by another keyword.
+
+            - "-force-condition", the next character may be EOF
+            since this keyword does not take any arguments.  Otherwise,
+            it should be followed by a keyword.
+
+            - "if", ALWAYS stop the lexer, since it is not possible to
+            predict what is going to appear in the condition, which can
+            only be parsed after SaLs have been found.  */
+         if (strncmp (p, linespec_keywords[i], len) == 0)
            {
              int j;
 
-             /* Special case: "-force" is always followed by an "if".  */
+             if (i == FORCE_KEYWORD_INDEX && p[len] == '\0')
+               return linespec_keywords[i];
+
+             if (!isspace (p[len]))
+               continue;
+
              if (i == FORCE_KEYWORD_INDEX)
                {
                  p += len;
                  p = skip_spaces (p);
-                 int nextlen = strlen (linespec_keywords[IF_KEYWORD_INDEX]);
-                 if (!(strncmp (p, linespec_keywords[IF_KEYWORD_INDEX], nextlen) == 0
-                       && isspace (p[nextlen])))
-                   return NULL;
-               }
+                 for (j = 0; linespec_keywords[j] != NULL; ++j)
+                   {
+                     int nextlen = strlen (linespec_keywords[j]);
 
-             /* Special case: "if" ALWAYS stops the lexer, since it
-                is not possible to predict what is going to appear in
-                the condition, which can only be parsed after SaLs have
-                been found.  */
+                     if (strncmp (p, linespec_keywords[j], nextlen) == 0
+                         && isspace (p[nextlen]))
+                       return linespec_keywords[i];
+                   }
+               }
              else if (i != IF_KEYWORD_INDEX)
                {
+                 /* We matched a "thread" or "task".  */
                  p += len;
                  p = skip_spaces (p);
                  for (j = 0; linespec_keywords[j] != NULL; ++j)
 
 # Test NULL location with valid conditional containing a keyword.
 gdb_breakpoint "thread if thread == 0"
 gdb_breakpoint "task if task == 0"
+
+# Test the positional flexibility of the "-force-condition" flag.
+foreach prefix {"" "thread 1 "} {
+    foreach suffix {"" " " " thread 1"} {
+       foreach cond {"" " if 1"} {
+           with_test_prefix "prefix: '$prefix', suffix: '$suffix', cond: '$cond'" {
+               gdb_breakpoint "main ${prefix}-force-condition${suffix}${cond}"\
+                   "message"
+           }
+       }
+    }
+}