162debd80SRoman Lebedev // RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK
2e3b64eb3SSimon Pilgrim // RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SANITIZE
3e3b64eb3SSimon Pilgrim // RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fsanitize-recover=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SANITIZE
4e3b64eb3SSimon Pilgrim // RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fsanitize-trap=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECK-SANITIZE
562debd80SRoman Lebedev 
662debd80SRoman Lebedev extern "C" { // Disable name mangling.
762debd80SRoman Lebedev 
862debd80SRoman Lebedev // ========================================================================== //
962debd80SRoman Lebedev // The expected true-negatives.
1062debd80SRoman Lebedev // ========================================================================== //
1162debd80SRoman Lebedev 
1262debd80SRoman Lebedev // Sanitization is explicitly disabled.
1362debd80SRoman Lebedev // ========================================================================== //
1462debd80SRoman Lebedev 
15*8924ba3bSZarko Todorovski // CHECK-LABEL: @ignorelist_0
ignorelist_0(signed int src)16*8924ba3bSZarko Todorovski __attribute__((no_sanitize("undefined"))) unsigned int ignorelist_0(signed int src) {
1762debd80SRoman Lebedev   // We are not in "undefined" group, so that doesn't work.
1862debd80SRoman Lebedev   // CHECK-SANITIZE: call
1962debd80SRoman Lebedev   // CHECK: }
2062debd80SRoman Lebedev   return src;
2162debd80SRoman Lebedev }
2262debd80SRoman Lebedev 
23*8924ba3bSZarko Todorovski // CHECK-LABEL: @ignorelist_1
ignorelist_1(signed int src)24*8924ba3bSZarko Todorovski __attribute__((no_sanitize("integer"))) unsigned int ignorelist_1(signed int src) {
2562debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
2662debd80SRoman Lebedev   // CHECK: }
2762debd80SRoman Lebedev   return src;
2862debd80SRoman Lebedev }
2962debd80SRoman Lebedev 
30*8924ba3bSZarko Todorovski // CHECK-LABEL: @ignorelist_2
ignorelist_2(signed int src)31*8924ba3bSZarko Todorovski __attribute__((no_sanitize("implicit-conversion"))) unsigned int ignorelist_2(signed int src) {
3262debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
3362debd80SRoman Lebedev   // CHECK: }
3462debd80SRoman Lebedev   return src;
3562debd80SRoman Lebedev }
3662debd80SRoman Lebedev 
37*8924ba3bSZarko Todorovski // CHECK-LABEL: @ignorelist_3
ignorelist_3(signed int src)38*8924ba3bSZarko Todorovski __attribute__((no_sanitize("implicit-integer-sign-change"))) unsigned int ignorelist_3(signed int src) {
3962debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
4062debd80SRoman Lebedev   // CHECK: }
4162debd80SRoman Lebedev   return src;
4262debd80SRoman Lebedev }
4362debd80SRoman Lebedev 
4462debd80SRoman Lebedev // Explicit sign-changing conversions.
4562debd80SRoman Lebedev // ========================================================================== //
4662debd80SRoman Lebedev 
4762debd80SRoman Lebedev // CHECK-LABEL: @explicit_signed_int_to_unsigned_int
explicit_signed_int_to_unsigned_int(signed int src)4862debd80SRoman Lebedev unsigned int explicit_signed_int_to_unsigned_int(signed int src) {
4962debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
5062debd80SRoman Lebedev   // CHECK: }
5162debd80SRoman Lebedev   return (unsigned int)src;
5262debd80SRoman Lebedev }
5362debd80SRoman Lebedev 
5462debd80SRoman Lebedev // CHECK-LABEL: @explicit_unsigned_int_to_signed_int
explicit_unsigned_int_to_signed_int(unsigned int src)5562debd80SRoman Lebedev signed int explicit_unsigned_int_to_signed_int(unsigned int src) {
5662debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
5762debd80SRoman Lebedev   // CHECK: }
5862debd80SRoman Lebedev   return (signed int)src;
5962debd80SRoman Lebedev }
6062debd80SRoman Lebedev 
6162debd80SRoman Lebedev // Explicit NOP conversions.
6262debd80SRoman Lebedev // ========================================================================== //
6362debd80SRoman Lebedev 
6462debd80SRoman Lebedev // CHECK-LABEL: @explicit_unsigned_int_to_unsigned_int
explicit_unsigned_int_to_unsigned_int(unsigned int src)6562debd80SRoman Lebedev unsigned int explicit_unsigned_int_to_unsigned_int(unsigned int src) {
6662debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
6762debd80SRoman Lebedev   // CHECK: }
6862debd80SRoman Lebedev   return (unsigned int)src;
6962debd80SRoman Lebedev }
7062debd80SRoman Lebedev 
7162debd80SRoman Lebedev // CHECK-LABEL: @explicit_signed_int_to_signed_int
explicit_signed_int_to_signed_int(signed int src)7262debd80SRoman Lebedev signed int explicit_signed_int_to_signed_int(signed int src) {
7362debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
7462debd80SRoman Lebedev   // CHECK: }
7562debd80SRoman Lebedev   return (signed int)src;
7662debd80SRoman Lebedev }
7762debd80SRoman Lebedev 
7862debd80SRoman Lebedev // Explicit functional sign-changing casts.
7962debd80SRoman Lebedev // ========================================================================== //
8062debd80SRoman Lebedev 
8162debd80SRoman Lebedev using UnsignedInt = unsigned int;
8262debd80SRoman Lebedev using SignedInt = signed int;
8362debd80SRoman Lebedev 
8462debd80SRoman Lebedev // CHECK-LABEL: explicit_functional_unsigned_int_to_signed_int
explicit_functional_unsigned_int_to_signed_int(unsigned int src)8562debd80SRoman Lebedev signed int explicit_functional_unsigned_int_to_signed_int(unsigned int src) {
8662debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
8762debd80SRoman Lebedev   // CHECK: }
8862debd80SRoman Lebedev   return SignedInt(src);
8962debd80SRoman Lebedev }
9062debd80SRoman Lebedev 
9162debd80SRoman Lebedev // CHECK-LABEL: @explicit_functional_signed_int_to_unsigned_int
explicit_functional_signed_int_to_unsigned_int(signed int src)9262debd80SRoman Lebedev unsigned int explicit_functional_signed_int_to_unsigned_int(signed int src) {
9362debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
9462debd80SRoman Lebedev   // CHECK: }
9562debd80SRoman Lebedev   return UnsignedInt(src);
9662debd80SRoman Lebedev }
9762debd80SRoman Lebedev 
9862debd80SRoman Lebedev // Explicit functional NOP casts.
9962debd80SRoman Lebedev // ========================================================================== //
10062debd80SRoman Lebedev 
10162debd80SRoman Lebedev // CHECK-LABEL: @explicit_functional_unsigned_int_to_unsigned_int
explicit_functional_unsigned_int_to_unsigned_int(unsigned int src)10262debd80SRoman Lebedev unsigned int explicit_functional_unsigned_int_to_unsigned_int(unsigned int src) {
10362debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
10462debd80SRoman Lebedev   // CHECK: }
10562debd80SRoman Lebedev   return UnsignedInt(src);
10662debd80SRoman Lebedev }
10762debd80SRoman Lebedev 
10862debd80SRoman Lebedev // CHECK-LABEL: @explicit_functional_signed_int_to_signed_int
explicit_functional_signed_int_to_signed_int(signed int src)10962debd80SRoman Lebedev signed int explicit_functional_signed_int_to_signed_int(signed int src) {
11062debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
11162debd80SRoman Lebedev   // CHECK: }
11262debd80SRoman Lebedev   return SignedInt(src);
11362debd80SRoman Lebedev }
11462debd80SRoman Lebedev 
11562debd80SRoman Lebedev // Explicit C++-style sign-changing casts.
11662debd80SRoman Lebedev // ========================================================================== //
11762debd80SRoman Lebedev 
11862debd80SRoman Lebedev // CHECK-LABEL: @explicit_cppstyle_unsigned_int_to_signed_int
explicit_cppstyle_unsigned_int_to_signed_int(unsigned int src)11962debd80SRoman Lebedev signed int explicit_cppstyle_unsigned_int_to_signed_int(unsigned int src) {
12062debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
12162debd80SRoman Lebedev   // CHECK: }
12262debd80SRoman Lebedev   return static_cast<signed int>(src);
12362debd80SRoman Lebedev }
12462debd80SRoman Lebedev 
12562debd80SRoman Lebedev // CHECK-LABEL: @explicit_cppstyle_signed_int_to_unsigned_int
explicit_cppstyle_signed_int_to_unsigned_int(signed int src)12662debd80SRoman Lebedev unsigned int explicit_cppstyle_signed_int_to_unsigned_int(signed int src) {
12762debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
12862debd80SRoman Lebedev   // CHECK: }
12962debd80SRoman Lebedev   return static_cast<unsigned int>(src);
13062debd80SRoman Lebedev }
13162debd80SRoman Lebedev 
13262debd80SRoman Lebedev // Explicit C++-style casts NOP casts.
13362debd80SRoman Lebedev // ========================================================================== //
13462debd80SRoman Lebedev 
13562debd80SRoman Lebedev // CHECK-LABEL: @explicit_cppstyle_unsigned_int_to_unsigned_int
explicit_cppstyle_unsigned_int_to_unsigned_int(unsigned int src)13662debd80SRoman Lebedev unsigned int explicit_cppstyle_unsigned_int_to_unsigned_int(unsigned int src) {
13762debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
13862debd80SRoman Lebedev   // CHECK: }
13962debd80SRoman Lebedev   return static_cast<unsigned int>(src);
14062debd80SRoman Lebedev }
14162debd80SRoman Lebedev 
14262debd80SRoman Lebedev // CHECK-LABEL: @explicit_cppstyle_signed_int_to_signed_int
explicit_cppstyle_signed_int_to_signed_int(signed int src)14362debd80SRoman Lebedev signed int explicit_cppstyle_signed_int_to_signed_int(signed int src) {
14462debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
14562debd80SRoman Lebedev   // CHECK: }
14662debd80SRoman Lebedev   return static_cast<signed int>(src);
14762debd80SRoman Lebedev }
14862debd80SRoman Lebedev 
14962debd80SRoman Lebedev } // extern "C"
150