-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Remove warnings from -Wchar-subscripts for known positive constants (#…
…69061) Fixes #18763 Remove warnings when using a signed char as an array bound if the char is a known positive constant. This goes one step farther than gcc does. For example given the following code ```c++ char upper[300]; int main() { upper['a'] = 'A'; char b = 'a'; upper[b] = 'A'; const char c = 'a'; upper[c] = 'A'; constexpr char d = 'a'; upper[d] = 'A'; char e = -1; upper[e] = 'A'; const char f = -1; upper[f] = 'A'; constexpr char g = -1; upper[g] = 'A'; return 1; } ``` clang currently gives warnings for all cases, while gcc gives warnings for all cases except for 'a' (https://godbolt.org/z/5ahjETTv3) With the change there is no longer any warning for 'a', 'c', or 'd'.
- Loading branch information
Showing
4 changed files
with
138 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
// RUN: %clang_cc1 -Wchar-subscripts -fsyntax-only -verify %s | ||
|
||
void t1(void) { | ||
int array[1] = { 0 }; | ||
char subscript = 0; | ||
int val = array[subscript]; // expected-warning{{array subscript is of type 'char'}} | ||
} | ||
|
||
void t2(void) { | ||
int array[1] = { 0 }; | ||
char subscript = 0; | ||
int val = subscript[array]; // expected-warning{{array subscript is of type 'char'}} | ||
} | ||
|
||
void t3(void) { | ||
int *array = 0; | ||
char subscript = 0; | ||
int val = array[subscript]; // expected-warning{{array subscript is of type 'char'}} | ||
} | ||
|
||
void t4(void) { | ||
int *array = 0; | ||
char subscript = 0; | ||
int val = subscript[array]; // expected-warning{{array subscript is of type 'char'}} | ||
} | ||
|
||
char returnsChar(void); | ||
void t5(void) { | ||
int *array = 0; | ||
int val = array[returnsChar()]; // expected-warning{{array subscript is of type 'char'}} | ||
} | ||
|
||
void t6(void) { | ||
int array[1] = { 0 }; | ||
signed char subscript = 0; | ||
int val = array[subscript]; // no warning for explicit signed char | ||
} | ||
|
||
void t7(void) { | ||
int array[1] = { 0 }; | ||
unsigned char subscript = 0; | ||
int val = array[subscript]; // no warning for unsigned char | ||
} | ||
|
||
typedef char CharTy; | ||
void t8(void) { | ||
int array[1] = { 0 }; | ||
CharTy subscript = 0; | ||
int val = array[subscript]; // expected-warning{{array subscript is of type 'char'}} | ||
} | ||
|
||
typedef signed char SignedCharTy; | ||
void t9(void) { | ||
int array[1] = { 0 }; | ||
SignedCharTy subscript = 0; | ||
int val = array[subscript]; // no warning for explicit signed char | ||
} | ||
|
||
typedef unsigned char UnsignedCharTy; | ||
void t10(void) { | ||
int array[1] = { 0 }; | ||
UnsignedCharTy subscript = 0; | ||
int val = array[subscript]; // no warning for unsigned char | ||
} | ||
|
||
void t11(void) { | ||
int array[256] = { 0 }; | ||
int val = array['a']; // no warning for char with known positive value | ||
} | ||
|
||
void t12(void) { | ||
int array[256] = { 0 }; | ||
char b = 'a'; | ||
int val = array[b]; // expected-warning{{array subscript is of type 'char'}} | ||
} | ||
|
||
void t13(void) { | ||
int array[256] = { 0 }; | ||
const char b = 'a'; | ||
int val = array[b]; // no warning for char with known positive value | ||
} | ||
|
||
void t14(void) { | ||
int array[256] = { 0 }; | ||
constexpr char b = 'a'; | ||
int val = array[b]; // no warning for char with known positive value | ||
} | ||
|
||
void t15(void) { | ||
int array[256] = { 0 }; // expected-note {{array 'array' declared here}} | ||
const char b = -1; | ||
// expected-warning@+2 {{array subscript is of type 'char'}} | ||
// expected-warning@+1 {{array index -1 is before the beginning of the array}} | ||
int val = array[b]; | ||
} | ||
|
||
void t16(void) { | ||
int array[256] = { 0 }; // expected-note {{array 'array' declared here}} | ||
constexpr char b = -1; | ||
// expected-warning@+2 {{array subscript is of type 'char'}} | ||
// expected-warning@+1 {{array index -1 is before the beginning of the array}} | ||
int val = array[b]; | ||
} |