Q:

gcc - Using "-funsigned-char" still results in "-Wchar-subscripts" warnings

This isn't a question on how to prevent this warning but rather as to why I receive the warning at all. 
Consider the following program:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
    char *str = "Hello World!"; 
    int   len = strlen(str);

    // Yes, a char, bare with me
    char index = 6;
    char seek  = 'Z';

    // Reject the string if str[index] ! = seek
    // Include some bounds checks for safety
    if (index < 0 || index >= len || str[index] ! = seek) {
        puts("Rejected");

    } else {
        puts("Kept");
    }

    return 0;
}

If you compile it with all warnings enabled, you get the following:
$ gcc -Wall -Wextra char.c -o char
char.c: In function ‘main’:
char.c:15:5: warning: array subscript has type ‘char’ [-Wchar-subscripts]
     if (index < 0 || index >= len || str[index] ! = seek) {
     ^

Good!   By default, char can be signed and contain a negative value, so str[index] can cause problems if index is negative.   
What if we force all chars to be unsigned with -funsigned-char? 
That will guarantee that they will never be negative and should prevent the warning. 
$ gcc -Wall -Wextra -funsigned-char char.c -o char
char.c: In function ‘main’:
char.c:15:15: warning: comparison is always false due to limited range of data type [-Wtype-limits]
     if (index < 0 || index >= len || str[index] ! = seek) {
               ^
char.c:15:5: warning: array subscript has type ‘char’ [-Wchar-subscripts]
     if (index < 0 || index >= len || str[index] ! = seek) {
     ^

gcc seems to be aware that index < 0 will always be false because index is unsigned.   This explains the first warning. 
However, it still warns about str[index] even though it knows that index will never be negative. 
Why does gcc still warn about char indexes when it already knows that it can never be negative? 

A:

-Wchar-subscripts is intended as a portability warning.  It tells you that in general case char can be signed.  The fact that it is unsigned in your case is not relevant.  If you don't care about general case - disable the warning. 
Note, for example, that you will not receive a warning for int subscripts, even though int can be negative.  The compiler assumes that you know what you are doing when you are using int for subscripts.  But for char it wants to warn. 
Note also that if you explicitly use signed char for subscripts in your code, the warning will disappear, even though signed char can definitely be negative.  The compiler again assumes that you know what you are doing.