1 // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=unsigned-integer-overflow | FileCheck %s --check-prefix=UNSIGNED 2 // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv | FileCheck %s --check-prefix=TRAPV 3 // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=unsigned-integer-overflow -ftrapv | FileCheck %s --check-prefix=BOTH 4 // Verify that -ftrapv and -fsanitize=unsigned-integer-overflow 5 // work together as expected 6 7 8 // UNSIGNED: @test_signed 9 // TRAPV: @test_signed 10 // BOTH: @test_signed 11 void test_signed() { 12 extern volatile int a, b, c; 13 // UNSIGNED: add nsw i32 14 // UNSIGNED-NOT: overflow 15 // TRAPV: sadd.with.overflow.i32 16 // TRAPV-NOT: ubsan 17 // TRAPV: llvm.trap 18 // BOTH: sadd.with.overflow.i32 19 // BOTH-NOT: ubsan 20 // BOTH: llvm.trap 21 a = b + c; 22 } 23 24 // UNSIGNED: @test_unsigned 25 // TRAPV: @test_unsigned 26 // BOTH: @test_unsigned 27 void test_unsigned() { 28 extern volatile unsigned x, y, z; 29 // UNSIGNED: uadd.with.overflow.i32 30 // UNSIGNED-NOT: llvm.trap 31 // UNSIGNED: ubsan 32 // TRAPV-NOT: overflow 33 // TRAPV-NOT: llvm.trap 34 // BOTH: uadd.with.overflow.i32 35 // BOTH: ubsan 36 // BOTH-NOT: llvm.trap 37 x = y + z; 38 } 39