diff --git a/find/parser.c b/find/parser.c
index 75bbe69..3a39828 100644
--- a/find/parser.c
+++ b/find/parser.c
@@ -911,8 +911,10 @@ static boolean
 parse_gid (const struct parser_table* entry, char **argv, int *arg_ptr)
 {
   struct predicate *p = insert_num (argv, arg_ptr, entry);
+  if (p == NULL)
+    return false;
   p->est_success_rate = (p->args.numinfo.l_val < 100) ? 0.99 : 0.2;
-  return p;
+  return true;
 }
 
 static boolean
@@ -1111,9 +1113,11 @@ static boolean
 parse_inum (const struct parser_table* entry, char **argv, int *arg_ptr)
 {
   struct predicate *p =  insert_num (argv, arg_ptr, entry);
+  if (p == NULL)
+    return false;
   /* inode number is exact match only, so very low proportions of files match */
   p->est_success_rate = 1e-6;
-  return p;
+  return true;
 }
 
 /* -ipath is deprecated (at RMS's request) in favour of 
@@ -1157,13 +1161,15 @@ static boolean
 parse_links (const struct parser_table* entry, char **argv, int *arg_ptr)
 {
   struct predicate *p = insert_num (argv, arg_ptr, entry);
+  if (p == NULL)
+    return false;
   if (p->args.numinfo.l_val == 1)
     p->est_success_rate = 0.99;
   else if (p->args.numinfo.l_val == 2)
     p->est_success_rate = 0.01;
   else
     p->est_success_rate = 1e-3;
-  return p;
+  return true;
 }
 
 static boolean
@@ -2208,8 +2214,10 @@ static boolean
 parse_uid (const struct parser_table* entry, char **argv, int *arg_ptr)
 {
   struct predicate *p = insert_num (argv, arg_ptr, entry);
+  if (p == NULL)
+    return false;
   p->est_success_rate = (p->args.numinfo.l_val < 100) ? 0.99 : 0.2;
-  return p;
+  return true;
 }
 
 static boolean
@@ -3125,7 +3133,10 @@ parse_time (const struct parser_table* entry, char *argv[], int *arg_ptr)
     }
   
   if (!get_relative_timestamp(timearg, &tval, origin, DAYSECS, errmsg))
-    return false;
+    {
+      *arg_ptr -= 1;
+      return false;
+    }
 
   our_pred = insert_primary (entry);
   our_pred->args.reftime = tval;
@@ -3255,6 +3266,8 @@ insert_num (char **argv, int *arg_ptr, const struct parser_table *entry)
           }
         return our_pred;
       }
+    else
+      *arg_ptr -= 1;
   }
   return NULL;
 }
diff --git a/find/tree.c b/find/tree.c
index e0c44c8..f657a80 100644
--- a/find/tree.c
+++ b/find/tree.c
@@ -1247,7 +1247,7 @@ build_expression_tree(int argc, char *argv[], int end_of_leading_options)
       oldi = i;
       if (!(*(parse_entry->parser_func)) (parse_entry, argv, &i))
         {
-          if (argv[i])
+          if (argv[i] && argv[i][0] != '-')
             {
               if ( (ARG_SPECIAL_PARSE == parse_entry->type) && (i == oldi) )
                 {
