1*0031efe6Swheatman // RUN: %clang_cc1 -Wchar-subscripts -fsyntax-only -verify %s 2*0031efe6Swheatman t1(void)3*0031efe6Swheatmanvoid t1(void) { 4*0031efe6Swheatman int array[1] = { 0 }; 5*0031efe6Swheatman char subscript = 0; 6*0031efe6Swheatman int val = array[subscript]; // expected-warning{{array subscript is of type 'char'}} 7*0031efe6Swheatman } 8*0031efe6Swheatman t2(void)9*0031efe6Swheatmanvoid t2(void) { 10*0031efe6Swheatman int array[1] = { 0 }; 11*0031efe6Swheatman char subscript = 0; 12*0031efe6Swheatman int val = subscript[array]; // expected-warning{{array subscript is of type 'char'}} 13*0031efe6Swheatman } 14*0031efe6Swheatman t3(void)15*0031efe6Swheatmanvoid t3(void) { 16*0031efe6Swheatman int *array = 0; 17*0031efe6Swheatman char subscript = 0; 18*0031efe6Swheatman int val = array[subscript]; // expected-warning{{array subscript is of type 'char'}} 19*0031efe6Swheatman } 20*0031efe6Swheatman t4(void)21*0031efe6Swheatmanvoid t4(void) { 22*0031efe6Swheatman int *array = 0; 23*0031efe6Swheatman char subscript = 0; 24*0031efe6Swheatman int val = subscript[array]; // expected-warning{{array subscript is of type 'char'}} 25*0031efe6Swheatman } 26*0031efe6Swheatman 27*0031efe6Swheatman char returnsChar(void); t5(void)28*0031efe6Swheatmanvoid t5(void) { 29*0031efe6Swheatman int *array = 0; 30*0031efe6Swheatman int val = array[returnsChar()]; // expected-warning{{array subscript is of type 'char'}} 31*0031efe6Swheatman } 32*0031efe6Swheatman t6(void)33*0031efe6Swheatmanvoid t6(void) { 34*0031efe6Swheatman int array[1] = { 0 }; 35*0031efe6Swheatman signed char subscript = 0; 36*0031efe6Swheatman int val = array[subscript]; // no warning for explicit signed char 37*0031efe6Swheatman } 38*0031efe6Swheatman t7(void)39*0031efe6Swheatmanvoid t7(void) { 40*0031efe6Swheatman int array[1] = { 0 }; 41*0031efe6Swheatman unsigned char subscript = 0; 42*0031efe6Swheatman int val = array[subscript]; // no warning for unsigned char 43*0031efe6Swheatman } 44*0031efe6Swheatman 45*0031efe6Swheatman typedef char CharTy; t8(void)46*0031efe6Swheatmanvoid t8(void) { 47*0031efe6Swheatman int array[1] = { 0 }; 48*0031efe6Swheatman CharTy subscript = 0; 49*0031efe6Swheatman int val = array[subscript]; // expected-warning{{array subscript is of type 'char'}} 50*0031efe6Swheatman } 51*0031efe6Swheatman 52*0031efe6Swheatman typedef signed char SignedCharTy; t9(void)53*0031efe6Swheatmanvoid t9(void) { 54*0031efe6Swheatman int array[1] = { 0 }; 55*0031efe6Swheatman SignedCharTy subscript = 0; 56*0031efe6Swheatman int val = array[subscript]; // no warning for explicit signed char 57*0031efe6Swheatman } 58*0031efe6Swheatman 59*0031efe6Swheatman typedef unsigned char UnsignedCharTy; t10(void)60*0031efe6Swheatmanvoid t10(void) { 61*0031efe6Swheatman int array[1] = { 0 }; 62*0031efe6Swheatman UnsignedCharTy subscript = 0; 63*0031efe6Swheatman int val = array[subscript]; // no warning for unsigned char 64*0031efe6Swheatman } 65*0031efe6Swheatman t11(void)66*0031efe6Swheatmanvoid t11(void) { 67*0031efe6Swheatman int array[256] = { 0 }; 68*0031efe6Swheatman int val = array['a']; // no warning for char with known positive value 69*0031efe6Swheatman } 70*0031efe6Swheatman t12(void)71*0031efe6Swheatmanvoid t12(void) { 72*0031efe6Swheatman int array[256] = { 0 }; 73*0031efe6Swheatman char b = 'a'; 74*0031efe6Swheatman int val = array[b]; // expected-warning{{array subscript is of type 'char'}} 75*0031efe6Swheatman } 76*0031efe6Swheatman t13(void)77*0031efe6Swheatmanvoid t13(void) { 78*0031efe6Swheatman int array[256] = { 0 }; 79*0031efe6Swheatman const char b = 'a'; 80*0031efe6Swheatman int val = array[b]; // no warning for char with known positive value 81*0031efe6Swheatman } 82*0031efe6Swheatman t14(void)83*0031efe6Swheatmanvoid t14(void) { 84*0031efe6Swheatman int array[256] = { 0 }; 85*0031efe6Swheatman constexpr char b = 'a'; 86*0031efe6Swheatman int val = array[b]; // no warning for char with known positive value 87*0031efe6Swheatman } 88*0031efe6Swheatman t15(void)89*0031efe6Swheatmanvoid t15(void) { 90*0031efe6Swheatman int array[256] = { 0 }; // expected-note {{array 'array' declared here}} 91*0031efe6Swheatman const char b = -1; 92*0031efe6Swheatman // expected-warning@+2 {{array subscript is of type 'char'}} 93*0031efe6Swheatman // expected-warning@+1 {{array index -1 is before the beginning of the array}} 94*0031efe6Swheatman int val = array[b]; 95*0031efe6Swheatman } 96*0031efe6Swheatman t16(void)97*0031efe6Swheatmanvoid t16(void) { 98*0031efe6Swheatman int array[256] = { 0 }; // expected-note {{array 'array' declared here}} 99*0031efe6Swheatman constexpr char b = -1; 100*0031efe6Swheatman // expected-warning@+2 {{array subscript is of type 'char'}} 101*0031efe6Swheatman // expected-warning@+1 {{array index -1 is before the beginning of the array}} 102*0031efe6Swheatman int val = array[b]; 103*0031efe6Swheatman } 104