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 11void 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 27void 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