From: Chris Lattner Date: Tue, 26 Feb 2008 00:33:57 +0000 (+0000) Subject: Fix PR2092 by making sure the sign of the enum value follows the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a73349d332009cad1b1d7c4364936b66923a83f0;p=clang 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 808241c803..1a0c3b2079 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -1498,7 +1498,7 @@ Sema::DeclTy *Sema::ActOnEnumConstant(Scope *S, DeclTy *theEnumDecl, 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 @@ Sema::DeclTy *Sema::ActOnEnumConstant(Scope *S, DeclTy *theEnumDecl, 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 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, DeclTy *EnumDeclX, 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 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, DeclTy *EnumDeclX, } // 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 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, DeclTy *EnumDeclX, // 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();