diff --git a/gnu/dist/grep/lib/getopt.c b/gnu/dist/grep/lib/getopt.c
index 6d7b10b3e9..f3d69bc07e 100644
--- a/gnu/dist/grep/lib/getopt.c
+++ b/gnu/dist/grep/lib/getopt.c
@@ -431,7 +431,7 @@ _getopt_initialize (argc, argv, optstring)
 	  else
 	    {
 	      const char *orig_str = __getopt_nonoption_flags;
-	      int len = nonoption_flags_max_len = strlen (orig_str);
+	      size_t len = nonoption_flags_max_len = strlen (orig_str);
 	      if (nonoption_flags_max_len < argc)
 		nonoption_flags_max_len = argc;
 	      __getopt_nonoption_flags =
diff --git a/gnu/dist/grep/lib/regex.c b/gnu/dist/grep/lib/regex.c
index 169890f491..ac0512da38 100644
--- a/gnu/dist/grep/lib/regex.c
+++ b/gnu/dist/grep/lib/regex.c
@@ -1127,7 +1127,7 @@ print_double_string (where, string1, size1, string2, size2)
     int size1;
     int size2;
 {
-  int this_char;
+  ptrdiff_t this_char;
 
   if (where == NULL)
     printf ("(null)");
diff --git a/gnu/dist/grep/src/ansi2knr.c b/gnu/dist/grep/src/ansi2knr.c
index bacb6f9894..e014720825 100644
--- a/gnu/dist/grep/src/ansi2knr.c
+++ b/gnu/dist/grep/src/ansi2knr.c
@@ -461,7 +461,7 @@ test1(buf)
 	   }
 	   {
 	       char *id = p;
-	       int len;
+	       ptrdiff_t len;
 	       /*
 		* Check for identifier1(identifier2) and not
 		* identifier1(void), or identifier1(identifier2, xxxx).
diff --git a/gnu/dist/grep/src/dfa.c b/gnu/dist/grep/src/dfa.c
index 9220bfeb46..7c4050b71e 100644
--- a/gnu/dist/grep/src/dfa.c
+++ b/gnu/dist/grep/src/dfa.c
@@ -334,9 +334,10 @@ static int hard_LC_COLLATE;	/* Nonzero if LC_COLLATE is hard.  */
 #ifdef MBS_SUPPORT
 /* These variables are used only if (MB_CUR_MAX > 1).  */
 static mbstate_t mbs;		/* Mbstate for mbrlen().  */
-static int cur_mb_len;		/* Byte length of the current scanning
-				   multibyte character.  */
-static int cur_mb_index;        /* Byte index of the current scanning multibyte
+static ssize_t cur_mb_len;	/* Byte length of the current scanning
+				   multibyte character.  Must also handle
+				   negative result from mbrlen().  */
+static ssize_t cur_mb_index;    /* Byte index of the current scanning multibyte
                                    character.
 
 				   singlebyte character : cur_mb_index = 0
@@ -369,7 +370,7 @@ static unsigned char const *buf_end;	/* refference to end in dfaexec().  */
 /* This function update cur_mb_len, and cur_mb_index.
    p points current lexptr, len is the remaining buffer length.  */
 static void
-update_mb_len_index (unsigned char const *p, int len)
+update_mb_len_index (unsigned char const *p, size_t len)
 {
   /* If last character is a part of a multibyte character,
      we update cur_mb_index.  */
@@ -2465,7 +2466,7 @@ match_mb_charset (struct dfa *d, int s, position pos, int index)
   int match;		/* Flag which represent that matching succeed.  */
   int match_len;	/* Length of the character (or collating element)
 			   with which this operator match.  */
-  int op_len;		/* Length of the operator.  */
+  size_t op_len;	/* Length of the operator.  */
   char buffer[128];
   wchar_t wcbuf[6];
 
diff --git a/gnu/dist/grep/src/grep.c b/gnu/dist/grep/src/grep.c
index 3051d52037..5bc636eb0c 100644
--- a/gnu/dist/grep/src/grep.c
+++ b/gnu/dist/grep/src/grep.c
@@ -1286,9 +1286,9 @@ int
 main (int argc, char **argv)
 {
   char *keys;
-  size_t keycc, oldcc, keyalloc;
+  size_t cc, keycc, oldcc, keyalloc;
   int with_filenames;
-  int opt, cc, status;
+  int opt, status;
   int default_context;
   FILE *fp;
   extern char *optarg;
diff --git a/gnu/dist/grep/src/search.c b/gnu/dist/grep/src/search.c
index b7768f8c4d..6cb836c15f 100644
--- a/gnu/dist/grep/src/search.c
+++ b/gnu/dist/grep/src/search.c
@@ -153,7 +153,7 @@ check_multibyte_string(char const *buf, size_t size)
 {
   char *mb_properties = malloc(size);
   mbstate_t cur_state;
-  int i;
+  size_t i;
   memset(&cur_state, 0, sizeof(mbstate_t));
   memset(mb_properties, 0, sizeof(char)*size);
   for (i = 0; i < size ;)
@@ -339,7 +339,8 @@ EGexecute (char const *buf, size_t size, size_t *match_size, int exact)
 {
   register char const *buflim, *beg, *end;
   char eol = eolbyte;
-  int backref, start, len;
+  int backref;
+  ptrdiff_t start, len;
   struct kwsmatch kwsm;
   size_t i;
 #ifdef MBS_SUPPORT
