Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: base/numerics/safe_numerics_unittest.cc

Issue 2529413002: Loosen restrictions on CheckedNumeric bitwise operators (Closed)
Patch Set: docs and cast Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <limits> 8 #include <limits>
9 #include <type_traits> 9 #include <type_traits>
10 10
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0) << (sizeof(Dst) * CHAR_BIT)); 215 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0) << (sizeof(Dst) * CHAR_BIT));
216 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1); 216 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1);
217 TEST_EXPECTED_VALUE(static_cast<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1), 217 TEST_EXPECTED_VALUE(static_cast<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1),
218 CheckedNumeric<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1)); 218 CheckedNumeric<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1));
219 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0); 219 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0);
220 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1); 220 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1);
221 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT)); 221 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT));
222 TEST_EXPECTED_VALUE(0, 222 TEST_EXPECTED_VALUE(0,
223 CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT - 1)); 223 CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT - 1));
224 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one); 224 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one);
225 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) & static_cast<Dst>(1)); 225 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) & 0x1);
226 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & static_cast<Dst>(0)); 226 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & 0x0);
227 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) & static_cast<Dst>(1)); 227 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) & 0x1);
228 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & static_cast<Dst>(0)); 228 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & 0x0);
229 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | static_cast<Dst>(1)); 229 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | 0x1);
230 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | static_cast<Dst>(0)); 230 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | 0x0);
231 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) | static_cast<Dst>(1)); 231 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) | 0x1);
232 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) | static_cast<Dst>(0)); 232 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) | 0x0);
233 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ static_cast<Dst>(1)); 233 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ 0x1);
234 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ static_cast<Dst>(0)); 234 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ 0x0);
235 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ static_cast<Dst>(1)); 235 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ 0x1);
236 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ static_cast<Dst>(0)); 236 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ 0x0);
237 TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0)); 237 TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0));
238 } 238 }
239 239
240 // Floating point arithmetic. 240 // Floating point arithmetic.
241 template <typename Dst> 241 template <typename Dst>
242 void TestSpecializedArithmetic( 242 void TestSpecializedArithmetic(
243 const char* dst, 243 const char* dst,
244 int line, 244 int line,
245 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { 245 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) {
246 typedef numeric_limits<Dst> DstLimits; 246 typedef numeric_limits<Dst> DstLimits;
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 EXPECT_EQ(static_cast<decltype(d)>(-.5), d); 899 EXPECT_EQ(static_cast<decltype(d)>(-.5), d);
900 auto e = CheckMod(CheckNum(20), 3).ValueOrDie(); 900 auto e = CheckMod(CheckNum(20), 3).ValueOrDie();
901 EXPECT_EQ(static_cast<decltype(e)>(2), e); 901 EXPECT_EQ(static_cast<decltype(e)>(2), e);
902 auto f = CheckLsh(1, CheckNum(2)).ValueOrDie(); 902 auto f = CheckLsh(1, CheckNum(2)).ValueOrDie();
903 EXPECT_EQ(static_cast<decltype(f)>(4), f); 903 EXPECT_EQ(static_cast<decltype(f)>(4), f);
904 auto g = CheckRsh(4, CheckNum(2)).ValueOrDie(); 904 auto g = CheckRsh(4, CheckNum(2)).ValueOrDie();
905 EXPECT_EQ(static_cast<decltype(g)>(1), g); 905 EXPECT_EQ(static_cast<decltype(g)>(1), g);
906 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); 906 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie();
907 EXPECT_EQ(static_cast<decltype(h)>(1), h); 907 EXPECT_EQ(static_cast<decltype(h)>(1), h);
908 } 908 }
OLDNEW
« base/numerics/safe_math_impl.h ('K') | « base/numerics/safe_math_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698