[cfe-commits] r47581 - /cfe/trunk/Sema/SemaDecl.cpp

Chris Lattner sabre at nondot.org
Mon Feb 25 16:33:58 PST 2008


Author: lattner
Date: Mon Feb 25 18:33:57 2008
New Revision: 47581

URL: http://llvm.org/viewvc/llvm-project?rev=47581&view=rev
Log:
Fix PR2092 by making sure the sign of the enum value follows the 
sign of its type in the early exit case.  No testcase, because this
doesn't manifest as a failure.

Modified:
    cfe/trunk/Sema/SemaDecl.cpp

Modified: cfe/trunk/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaDecl.cpp?rev=47581&r1=47580&r2=47581&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/Sema/SemaDecl.cpp Mon Feb 25 18:33:57 2008
@@ -1498,7 +1498,7 @@
       else
         Diag(IdLoc, diag::err_redefinition, Id->getName());
       Diag(PrevDecl->getLocation(), diag::err_previous_definition);
-      // FIXME: Don't leak memory: delete Val;
+      delete Val;
       return 0;
     }
   }
@@ -1514,7 +1514,7 @@
     if (!Val->isIntegerConstantExpr(EnumVal, Context, &ExpLoc)) {
       Diag(ExpLoc, diag::err_enum_value_not_integer_constant_expr, 
            Id->getName());
-      // FIXME: Don't leak memory: delete Val;
+      delete Val;
       Val = 0;  // Just forget about it.
     } else {
       EltTy = Val->getType();
@@ -1577,9 +1577,9 @@
     if (!ECD) continue;  // Already issued a diagnostic.
     
     // If the enum value doesn't fit in an int, emit an extension warning.
-    assert(ECD->getInitVal().getBitWidth() >= IntWidth &&
-           "Should have promoted value to int");
     const llvm::APSInt &InitVal = ECD->getInitVal();
+    assert(InitVal.getBitWidth() >= IntWidth &&
+           "Should have promoted value to int");
     if (InitVal.getBitWidth() > IntWidth) {
       llvm::APSInt V(InitVal);
       V.trunc(IntWidth);
@@ -1590,7 +1590,7 @@
     }
     
     // Keep track of the size of positive and negative values.
-    if (InitVal.isUnsigned() || !InitVal.isNegative())
+    if (InitVal.isUnsigned() || InitVal.isNonNegative())
       NumPositiveBits = std::max(NumPositiveBits,
                                  (unsigned)InitVal.getActiveBits());
     else
@@ -1664,8 +1664,13 @@
     // enumerator value fits in an int, type it as an int, otherwise type it the
     // same as the enumerator decl itself.  This means that in "enum { X = 1U }"
     // that X has type 'int', not 'unsigned'.
-    if (ECD->getType() == Context.IntTy)
+    if (ECD->getType() == Context.IntTy) {
+      // Make sure the init value is signed.
+      llvm::APSInt IV = ECD->getInitVal();
+      IV.setIsSigned(true);
+      ECD->setInitVal(IV);
       continue;  // Already int type.
+    }
 
     // Determine whether the value fits into an int.
     llvm::APSInt InitVal = ECD->getInitVal();





More information about the cfe-commits mailing list