diff options
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/cppcoreguidelines-narrowing-conversions-unsigned-char.cpp')
-rw-r--r-- | clang-tools-extra/test/clang-tidy/cppcoreguidelines-narrowing-conversions-unsigned-char.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/cppcoreguidelines-narrowing-conversions-unsigned-char.cpp b/clang-tools-extra/test/clang-tidy/cppcoreguidelines-narrowing-conversions-unsigned-char.cpp new file mode 100644 index 00000000000..6bd437f98d4 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/cppcoreguidelines-narrowing-conversions-unsigned-char.cpp @@ -0,0 +1,83 @@ +// RUN: %check_clang_tidy %s cppcoreguidelines-narrowing-conversions %t \ +// RUN: -- -- -target x86_64-unknown-linux -funsigned-char + +void narrow_integer_to_unsigned_integer_is_ok() { + signed char sc; + short s; + int i; + long l; + long long ll; + + char c; + unsigned short us; + unsigned int ui; + unsigned long ul; + unsigned long long ull; + + ui = sc; + c = s; + c = i; + c = l; + c = ll; + + c = c; + c = us; + c = ui; + c = ul; + c = ull; +} + +void narrow_integer_to_signed_integer_is_not_ok() { + signed char sc; + short s; + int i; + long l; + long long ll; + + char c; + unsigned short us; + unsigned int ui; + unsigned long ul; + unsigned long long ull; + + sc = sc; + sc = s; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'short' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] + sc = i; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'int' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] + sc = l; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'long' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] + sc = ll; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'long long' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] + + sc = c; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'char' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] + sc = us; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'unsigned short' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] + sc = ui; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'unsigned int' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] + sc = ul; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'unsigned long' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] + sc = ull; + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: narrowing conversion from 'unsigned long long' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] +} + +void narrow_constant_to_unsigned_integer_is_ok() { + char c1 = -128; // unsigned dst type is well defined. + char c2 = 127; // unsigned dst type is well defined. + char c3 = -129; // unsigned dst type is well defined. + char c4 = 128; // unsigned dst type is well defined. + unsigned char uc1 = 0; + unsigned char uc2 = 255; + unsigned char uc3 = -1; // unsigned dst type is well defined. + unsigned char uc4 = 256; // unsigned dst type is well defined. + signed char sc = 128; + // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: narrowing conversion from constant value 128 (0x00000080) of type 'int' to signed type 'signed char' is implementation-defined [cppcoreguidelines-narrowing-conversions] +} + +void narrow_conditional_operator_contant_to_unsigned_is_ok(bool b) { + // conversion to unsigned char type is well defined. + char c1 = b ? 1 : 0; + char c2 = b ? 1 : 256; + char c3 = b ? -1 : 0; +} |