xref: /llvm-project/clang/test/Sema/warn-char-subscripts.cpp (revision 0031efe6be19735402656a76b64a173d17f1f935)
1*0031efe6Swheatman // RUN: %clang_cc1 -Wchar-subscripts -fsyntax-only -verify %s
2*0031efe6Swheatman 
t1(void)3*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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*0031efe6Swheatman void 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