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