From 3f8d08861b7ddd4eed675fcde19eb1d5fe38496f Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Wed, 26 Apr 2017 00:48:28 +0000 Subject: [PATCH] [Support] Avoid UB in sys::fs::perms::operator~. NFC. This was exposed in r297945 and r301220: the intermediate complement is a 32-bit value, and casting it to 'perms' invokes UB. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301373 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/FileSystem.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index 29515c231bc..e3c5de7fbe6 100644 --- a/include/llvm/Support/FileSystem.h +++ b/include/llvm/Support/FileSystem.h @@ -116,7 +116,9 @@ inline perms &operator&=(perms &l, perms r) { return l; } inline perms operator~(perms x) { - return static_cast(~static_cast(x)); + // Avoid UB by explicitly truncating the (unsigned) ~ result. + return static_cast( + static_cast(~static_cast(x))); } class UniqueID { -- 2.50.1