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.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47581 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp
index 808241c..1a0c3b2 100644
--- a/Sema/SemaDecl.cpp
+++ b/Sema/SemaDecl.cpp
@@ -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();