+2012-06-05  Joel Brobecker  <brobecker@adacore.com>
+
+       * breakpoint.c (find_condition_and_thread): Stop parsing
+       as soon as the first invalid keyword is found.
+
 2012-06-05  Joel Brobecker  <brobecker@adacore.com>
 
        * copyright.py (EXCLUDE_LIST): Add 'gdb/CONTRIBUTE' to list.
 
       else if (rest)
        {
          *rest = savestring (tok, strlen (tok));
-         tok += toklen;
+         return;
        }
       else
        error (_("Junk at end of arguments."));
 
+2012-06-05  Joel Brobecker  <brobecker@adacore.com>
+
+       * gdb.ada/bad-task-bp-keyword: New testcase.
+
 2012-06-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.base/code_elim.exp (add-symbol-file ${testfile1} 0x100000):
 
--- /dev/null
+# Copyright 2012 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "ada.exp"
+
+set testdir "bad-task-bp-keyword"
+set testfile "${testdir}/foo"
+set srcfile ${srcdir}/${subdir}/${testfile}.adb
+set binfile ${objdir}/${subdir}/${testfile}
+
+file mkdir ${objdir}/${subdir}/${testdir}
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
+  return -1
+}
+
+clean_restart ${testfile}
+
+# Star the program in order to have some tasks running...
+set bp_location [gdb_get_line_number "STOP_HERE" ${testdir}/foo.adb]
+runto "foo.adb:$bp_location"
+
+# Try inserting a breakpoint on task 2, but using the wrong capitalization
+# on the 'task' keyword ("TASK" instead of "task").  The debugger should
+# report an error.  Try various weird combinations too.
+
+gdb_test "break *break_me'address TASK 2" \
+         "Garbage 'TASK 2' at end of command"
+
+set test "break *break_me'address TASK Task TaSK 2"
+gdb_test_multiple "$test" $test {
+    -re "Garbage 'TASK Task TaSK 2' at end of command\[\r\n\]+$gdb_prompt $" {
+        pass $test
+        }
+    -re "Garbage 'TaSK 2' at end of command\[\r\n\]+$gdb_prompt $" {
+        kfail gdb/14111 "$test"
+        }
+}
+
+gdb_test "break *break_me'address TASK if" \
+         "Garbage 'TASK if' at end of command"
 
--- /dev/null
+--  Copyright 2009-2012 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+procedure Foo is
+
+   task type Caller is
+      entry Initialize;
+      entry Call_Break_Me;
+      entry Finalize;
+   end Caller;
+   type Caller_Ptr is access Caller;
+
+   procedure Break_Me is
+   begin
+      null;
+   end Break_Me;
+
+   task body Caller is
+   begin
+      accept Initialize do
+         null;
+      end Initialize;
+      accept Call_Break_Me do
+         Break_Me;
+      end Call_Break_Me;
+      accept Finalize do
+         null;
+      end Finalize;
+   end Caller;
+
+   Task_List : array (1 .. 3) of Caller_Ptr;
+
+begin
+
+   --  Start all our tasks, and call the "Initialize" entry to make
+   --  sure all of them have now been started.  We call that entry
+   --  immediately after having created the task in order to make sure
+   --  that we wait for that task to be created before we try to create
+   --  another one.  That way, we know that the order in our Task_List
+   --  corresponds to the order in the GNAT runtime.
+   for J in Task_List'Range loop
+      Task_List (J) := new Caller;
+      Task_List (J).Initialize;
+   end loop;
+
+   --  Next, call their Call_Break_Me entry of each task, using the same
+   --  order as the order used to create them.
+   for J in Task_List'Range loop  -- STOP_HERE
+      Task_List (J).Call_Break_Me;
+   end loop;
+
+   --  And finally, let all the tasks die...
+   for J in Task_List'Range loop
+      Task_List (J).Finalize;
+   end loop;
+end Foo;