162debd80SRoman Lebedev // RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK
2*e3b64eb3SSimon 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
3*e3b64eb3SSimon 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
4*e3b64eb3SSimon 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 
1562debd80SRoman Lebedev // CHECK-LABEL: @blacklist_0
1662debd80SRoman Lebedev __attribute__((no_sanitize("undefined"))) unsigned int blacklist_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 
2362debd80SRoman Lebedev // CHECK-LABEL: @blacklist_1
2462debd80SRoman Lebedev __attribute__((no_sanitize("integer"))) unsigned int blacklist_1(signed int src) {
2562debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
2662debd80SRoman Lebedev   // CHECK: }
2762debd80SRoman Lebedev   return src;
2862debd80SRoman Lebedev }
2962debd80SRoman Lebedev 
3062debd80SRoman Lebedev // CHECK-LABEL: @blacklist_2
3162debd80SRoman Lebedev __attribute__((no_sanitize("implicit-conversion"))) unsigned int blacklist_2(signed int src) {
3262debd80SRoman Lebedev   // CHECK-SANITIZE-NOT: call
3362debd80SRoman Lebedev   // CHECK: }
3462debd80SRoman Lebedev   return src;
3562debd80SRoman Lebedev }
3662debd80SRoman Lebedev 
3762debd80SRoman Lebedev // CHECK-LABEL: @blacklist_3
3862debd80SRoman Lebedev __attribute__((no_sanitize("implicit-integer-sign-change"))) unsigned int blacklist_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
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
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
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
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
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
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
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
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
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
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
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
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