// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=unsigned-integer-overflow | FileCheck %s --check-prefix=UNSIGNED // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv | FileCheck %s --check-prefix=TRAPV // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=unsigned-integer-overflow -ftrapv | FileCheck %s --check-prefix=BOTH // Verify that -ftrapv and -fsanitize=unsigned-integer-overflow // work together as expected // UNSIGNED: @test_signed // TRAPV: @test_signed // BOTH: @test_signed void test_signed() { extern volatile int a, b, c; // UNSIGNED: add nsw i32 // UNSIGNED-NOT: overflow // TRAPV: sadd.with.overflow.i32 // TRAPV-NOT: ubsan // TRAPV: llvm.trap // BOTH: sadd.with.overflow.i32 // BOTH-NOT: ubsan // BOTH: llvm.trap a = b + c; } // UNSIGNED: @test_unsigned // TRAPV: @test_unsigned // BOTH: @test_unsigned void test_unsigned() { extern volatile unsigned x, y, z; // UNSIGNED: uadd.with.overflow.i32 // UNSIGNED-NOT: llvm.trap // UNSIGNED: ubsan // TRAPV-NOT: overflow // TRAPV-NOT: llvm.trap // BOTH: uadd.with.overflow.i32 // BOTH: ubsan // BOTH-NOT: llvm.trap x = y + z; }