1 //===--- APSIntType.cpp - Simple record of the type of APSInts ------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h"
10 
11 using namespace clang;
12 using namespace ento;
13 
14 APSIntType::RangeTestResultKind
testInRange(const llvm::APSInt & Value,bool AllowSignConversions) const15 APSIntType::testInRange(const llvm::APSInt &Value,
16                         bool AllowSignConversions) const {
17 
18   // Negative numbers cannot be losslessly converted to unsigned type.
19   if (IsUnsigned && !AllowSignConversions &&
20       Value.isSigned() && Value.isNegative())
21     return RTR_Below;
22 
23   unsigned MinBits;
24   if (AllowSignConversions) {
25     if (Value.isSigned() && !IsUnsigned)
26       MinBits = Value.getMinSignedBits();
27     else
28       MinBits = Value.getActiveBits();
29 
30   } else {
31     // Signed integers can be converted to signed integers of the same width
32     // or (if positive) unsigned integers with one fewer bit.
33     // Unsigned integers can be converted to unsigned integers of the same width
34     // or signed integers with one more bit.
35     if (Value.isSigned())
36       MinBits = Value.getMinSignedBits() - IsUnsigned;
37     else
38       MinBits = Value.getActiveBits() + !IsUnsigned;
39   }
40 
41   if (MinBits <= BitWidth)
42     return RTR_Within;
43 
44   if (Value.isSigned() && Value.isNegative())
45     return RTR_Below;
46   else
47     return RTR_Above;
48 }
49