зеркало из https://github.com/microsoft/clang-1.git
Fix a few enum-related fixme's
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41513 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
42a297700e
Коммит
421a23d405
|
@ -936,6 +936,9 @@ Sema::DeclTy *Sema::ParseEnumConstant(Scope *S, DeclTy *theEnumDecl,
|
|||
llvm::APSInt EnumVal(32);
|
||||
QualType EltTy;
|
||||
if (Val) {
|
||||
// Make sure to promote the operand type to int.
|
||||
UsualUnaryConversions(Val);
|
||||
|
||||
// C99 6.7.2.2p2: Make sure we have an integer constant expression.
|
||||
SourceLocation ExpLoc;
|
||||
if (!Val->isIntegerConstantExpr(EnumVal, Context, &ExpLoc)) {
|
||||
|
@ -952,17 +955,19 @@ Sema::DeclTy *Sema::ParseEnumConstant(Scope *S, DeclTy *theEnumDecl,
|
|||
// Assign the last value + 1.
|
||||
EnumVal = LastEnumConst->getInitVal();
|
||||
++EnumVal;
|
||||
// FIXME: detect overflow!
|
||||
|
||||
// Check for overflow on increment.
|
||||
if (EnumVal < LastEnumConst->getInitVal())
|
||||
Diag(IdLoc, diag::warn_enum_value_overflow);
|
||||
|
||||
EltTy = LastEnumConst->getType();
|
||||
} else {
|
||||
// First value, set to zero.
|
||||
EltTy = Context.IntTy;
|
||||
// FIXME: Resize EnumVal to the size of int.
|
||||
EnumVal.zextOrTrunc(Context.getTypeSize(EltTy, IdLoc));
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Default promotions to int/uint.
|
||||
|
||||
// TODO: If the result value doesn't fit in an int, it must be a long or long
|
||||
// long value. ISO C does not support this, but GCC does as an extension,
|
||||
// emit a warning.
|
||||
|
|
|
@ -285,6 +285,8 @@ DIAG(ext_mixed_decls_code, EXTENSION,
|
|||
|
||||
DIAG(ext_empty_struct_union_enum, EXTENSION,
|
||||
"use of empty %0 extension")
|
||||
DIAG(warn_enum_value_overflow, WARNING,
|
||||
"overflow in enumeration value")
|
||||
|
||||
DIAG(ext_ident_list_in_param, EXTENSION,
|
||||
"type-less parameter names in function declaration")
|
||||
|
|
Загрузка…
Ссылка в новой задаче