[cfe-commits] r53072 - /cfe/trunk/include/clang/AST/APValue.h

Anders Carlsson andersca at mac.com
Wed Jul 2 21:00:59 PDT 2008


Author: andersca
Date: Wed Jul  2 23:00:59 2008
New Revision: 53072

URL: http://llvm.org/viewvc/llvm-project?rev=53072&view=rev
Log:
Make APValue an APSInt.

Modified:
    cfe/trunk/include/clang/AST/APValue.h

Modified: cfe/trunk/include/clang/AST/APValue.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/APValue.h?rev=53072&r1=53071&r2=53072&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/APValue.h (original)
+++ cfe/trunk/include/clang/AST/APValue.h Wed Jul  2 23:00:59 2008
@@ -1,4 +1,4 @@
-//===--- APValue.h - Union class for APFloat/APInt/Complex ------*- C++ -*-===//
+//===--- APValue.h - Union class for APFloat/APSInt/Complex -----*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -14,52 +14,55 @@
 #ifndef LLVM_CLANG_AST_APVALUE_H
 #define LLVM_CLANG_AST_APVALUE_H
 
-#include "llvm/ADT/APInt.h"
+#include "llvm/ADT/APSInt.h"
 #include "llvm/ADT/APFloat.h"
 
 namespace clang {
 
 /// APValue - This class implements a discriminated union of [uninitialized]
-/// [APInt] [APFloat], [Complex APInt] [Complex APFloat].
+/// [APSInt] [APFloat], [Complex APSInt] [Complex APFloat].
 class APValue {
-  typedef llvm::APInt APInt;
+  typedef llvm::APSInt APSInt;
   typedef llvm::APFloat APFloat;
 public:
   enum ValueKind {
     Uninitialized,
-    Int,
+    SInt,
     Float,
-    ComplexInt,
+    ComplexSInt,
     ComplexFloat
   };
 private:
   ValueKind Kind;
   
-  struct ComplexAPInt { APInt Real, Imag; };
+  struct ComplexAPSInt { 
+    APSInt Real, Imag; 
+    ComplexAPSInt() : Real(1), Imag(1) {}
+  };
   struct ComplexAPFloat {
     APFloat Real, Imag;
     ComplexAPFloat() : Real(0.0), Imag(0.0) {}
   };
   
   enum {
-    MaxSize = (sizeof(ComplexAPInt) > sizeof(ComplexAPFloat) ? 
-               sizeof(ComplexAPInt) : sizeof(ComplexAPFloat))
+    MaxSize = (sizeof(ComplexAPSInt) > sizeof(ComplexAPFloat) ? 
+               sizeof(ComplexAPSInt) : sizeof(ComplexAPFloat))
   };
   
   /// Data - space for the largest member in units of void*.  This is an effort
-  /// to ensure that the APInt/APFloat values have proper alignment.
+  /// to ensure that the APSInt/APFloat values have proper alignment.
   void *Data[(MaxSize+sizeof(void*)-1)/sizeof(void*)];
   
 public:
   APValue() : Kind(Uninitialized) {}
-  explicit APValue(const APInt &I) : Kind(Uninitialized) {
-    MakeInt(); setInt(I);
+  explicit APValue(const APSInt &I) : Kind(Uninitialized) {
+    MakeSInt(); setSInt(I);
   }
   explicit APValue(const APFloat &F) : Kind(Uninitialized) {
     MakeFloat(); setFloat(F);
   }
-  APValue(const APInt &R, const APInt &I) : Kind(Uninitialized) {
-    MakeComplexInt(); setComplexInt(R, I);
+  APValue(const APSInt &R, const APSInt &I) : Kind(Uninitialized) {
+    MakeComplexSInt(); setComplexSInt(R, I);
   }
   APValue(const APFloat &R, const APFloat &I) : Kind(Uninitialized) {
     MakeComplexFloat(); setComplexFloat(R, I);
@@ -73,26 +76,26 @@
   
   ValueKind getKind() const { return Kind; }
   bool isUninit() const { return Kind == Uninitialized; }
-  bool isInt() const { return Kind == Int; }
+  bool isSInt() const { return Kind == SInt; }
   bool isFloat() const { return Kind == Float; }
-  bool isComplexInt() const { return Kind == ComplexInt; }
+  bool isComplexSInt() const { return Kind == ComplexSInt; }
   bool isComplexFloat() const { return Kind == ComplexFloat; }
   
-  const APInt &getInt() const {
-    assert(isInt() && "Invalid accessor");
-    return *(const APInt*)(const void*)Data;
+  const APSInt &getSInt() const {
+    assert(isSInt() && "Invalid accessor");
+    return *(const APSInt*)(const void*)Data;
   }
   const APFloat &getFloat() const {
     assert(isFloat() && "Invalid accessor");
     return *(const APFloat*)(const void*)Data;
   }
-  const APInt &getComplexIntReal() const {
-    assert(isComplexInt() && "Invalid accessor");
-    return ((const ComplexAPInt*)(const void*)Data)->Real;
-  }
-  const APInt &getComplexIntImag() const {
-    assert(isComplexInt() && "Invalid accessor");
-    return ((const ComplexAPInt*)(const void*)Data)->Imag;
+  const APSInt &getComplexSIntReal() const {
+    assert(isComplexSInt() && "Invalid accessor");
+    return ((const ComplexAPSInt*)(const void*)Data)->Real;
+  }
+  const APSInt &getComplexSIntImag() const {
+    assert(isComplexSInt() && "Invalid accessor");
+    return ((const ComplexAPSInt*)(const void*)Data)->Imag;
   }
   const APFloat &getComplexFloatReal() const {
     assert(isComplexFloat() && "Invalid accessor");
@@ -103,18 +106,18 @@
     return ((const ComplexAPFloat*)(const void*)Data)->Imag;
   }
   
-  void setInt(const APInt &I) {
-    assert(isInt() && "Invalid accessor");
-    *(APInt*)(void*)Data = I;
+  void setSInt(const APSInt &I) {
+    assert(isSInt() && "Invalid accessor");
+    *(APSInt*)(void*)Data = I;
   }
   void setFloat(const APFloat &F) {
     assert(isFloat() && "Invalid accessor");
     *(APFloat*)(void*)Data = F;
   }
-  void setComplexInt(const APInt &R, const APInt &I) {
-    assert(isComplexInt() && "Invalid accessor");
-    ((ComplexAPInt*)(void*)Data)->Real = R;
-    ((ComplexAPInt*)(void*)Data)->Imag = I;
+  void setComplexSInt(const APSInt &R, const APSInt &I) {
+    assert(isComplexSInt() && "Invalid accessor");
+    ((ComplexAPSInt*)(void*)Data)->Real = R;
+    ((ComplexAPSInt*)(void*)Data)->Imag = I;
   }
   void setComplexFloat(const APFloat &R, const APFloat &I) {
     assert(isComplexFloat() && "Invalid accessor");
@@ -125,21 +128,21 @@
   const APValue &operator=(const APValue &RHS) {
     if (Kind != RHS.Kind) {
       MakeUninit();
-      if (RHS.isInt())
-        MakeInt();
+      if (RHS.isSInt())
+        MakeSInt();
       else if (RHS.isFloat())
         MakeFloat();
-      else if (RHS.isComplexInt())
-        MakeComplexInt();
+      else if (RHS.isComplexSInt())
+        MakeComplexSInt();
       else if (RHS.isComplexFloat())
         MakeComplexFloat();
     }
-    if (isInt())
-      setInt(RHS.getInt());
+    if (isSInt())
+      setSInt(RHS.getSInt());
     else if (isFloat())
       setFloat(RHS.getFloat());
-    else if (isComplexInt())
-      setComplexInt(RHS.getComplexIntReal(), RHS.getComplexIntImag());
+    else if (isComplexSInt())
+      setComplexSInt(RHS.getComplexSIntReal(), RHS.getComplexSIntImag());
     else if (isComplexFloat())
       setComplexFloat(RHS.getComplexFloatReal(), RHS.getComplexFloatImag());
     return *this;
@@ -147,29 +150,29 @@
   
 private:
   void MakeUninit() {
-    if (Kind == Int)
-      ((APInt*)(void*)Data)->~APInt();
+    if (Kind == SInt)
+      ((APSInt*)(void*)Data)->~APSInt();
     else if (Kind == Float)
       ((APFloat*)(void*)Data)->~APFloat();
-    else if (Kind == ComplexInt)
-      ((ComplexAPInt*)(void*)Data)->~ComplexAPInt();
+    else if (Kind == ComplexSInt)
+      ((ComplexAPSInt*)(void*)Data)->~ComplexAPSInt();
     else if (Kind == ComplexFloat)
       ((ComplexAPFloat*)(void*)Data)->~ComplexAPFloat();
   }
-  void MakeInt() {
+  void MakeSInt() {
     assert(isUninit() && "Bad state change");
-    new ((void*)Data) APInt();
-    Kind = Int;
+    new ((void*)Data) APSInt(1);
+    Kind = SInt;
   }
   void MakeFloat() {
     assert(isUninit() && "Bad state change");
     new ((APFloat*)(void*)Data) APFloat(0.0);
     Kind = Float;
   }
-  void MakeComplexInt() {
+  void MakeComplexSInt() {
     assert(isUninit() && "Bad state change");
-    new ((ComplexAPInt*)(void*)Data) ComplexAPInt();
-    Kind = ComplexInt;
+    new ((ComplexAPSInt*)(void*)Data) ComplexAPSInt();
+    Kind = ComplexSInt;
   }
   void MakeComplexFloat() {
     assert(isUninit() && "Bad state change");





More information about the cfe-commits mailing list