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 Lebedevunsigned 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 Lebedevsigned 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 Lebedevunsigned 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 Lebedevsigned 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 Lebedevsigned 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 Lebedevunsigned 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 Lebedevunsigned 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 Lebedevsigned 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 Lebedevsigned 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 Lebedevunsigned 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 Lebedevunsigned 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 Lebedevsigned 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