1//===--- APSIntType.cpp - Simple record of the type of APSInts ------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h"
11
12using namespace clang;
13using namespace ento;
14
15APSIntType::RangeTestResultKind
16APSIntType::testInRange(const llvm::APSInt &Value) const {
17  // Negative numbers cannot be losslessly converted to unsigned type.
18  if (IsUnsigned && Value.isSigned() && Value.isNegative())
19    return RTR_Below;
20
21  // Signed integers can be converted to signed integers of the same width
22  // or (if positive) unsigned integers with one fewer bit.
23  // Unsigned integers can be converted to unsigned integers of the same width
24  // or signed integers with one more bit.
25  unsigned MinBits;
26  if (Value.isSigned())
27    MinBits = Value.getMinSignedBits() - IsUnsigned;
28  else
29    MinBits = Value.getActiveBits() + !IsUnsigned;
30
31  if (MinBits <= BitWidth)
32    return RTR_Within;
33
34  if (Value.isSigned() && Value.isNegative())
35    return RTR_Below;
36  else
37    return RTR_Above;
38}
39