Sema: The i8 suffix should yield a literal of type char
We would make i8 literals turn into signed char instead of char. This is incompatible with MSVC. This fixes PR22824. llvm-svn: 231494
This commit is contained in:
parent
ef648462d2
commit
be09e8e5cf
|
@ -1069,7 +1069,8 @@ void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
|
|||
// Emit suffixes. Integer literals are always a builtin integer type.
|
||||
switch (Node->getType()->getAs<BuiltinType>()->getKind()) {
|
||||
default: llvm_unreachable("Unexpected type for integer literal!");
|
||||
case BuiltinType::SChar: OS << "i8"; break;
|
||||
case BuiltinType::Char_S:
|
||||
case BuiltinType::Char_U: OS << "i8"; break;
|
||||
case BuiltinType::UChar: OS << "Ui8"; break;
|
||||
case BuiltinType::Short: OS << "i16"; break;
|
||||
case BuiltinType::UShort: OS << "Ui16"; break;
|
||||
|
|
|
@ -3324,6 +3324,9 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {
|
|||
Diag(Tok.getLocation(), diag::err_int128_unsupported);
|
||||
Width = MaxWidth;
|
||||
Ty = Context.getIntMaxType();
|
||||
} else if (Literal.MicrosoftInteger == 8 && !Literal.isUnsigned) {
|
||||
Width = 8;
|
||||
Ty = Context.CharTy;
|
||||
} else {
|
||||
Width = Literal.MicrosoftInteger;
|
||||
Ty = Context.getIntTypeForBitwidth(Width,
|
||||
|
|
|
@ -3,6 +3,11 @@
|
|||
|
||||
#ifdef __SIZEOF_INT8__
|
||||
static_assert(sizeof(0i8) == __SIZEOF_INT8__, "");
|
||||
|
||||
constexpr int f(char) { return 1; }
|
||||
constexpr int f(signed char) { return 2; }
|
||||
|
||||
static_assert(f(0i8) == 1, "");
|
||||
#endif
|
||||
#ifdef __SIZEOF_INT16__
|
||||
static_assert(sizeof(0i16) == __SIZEOF_INT16__, "");
|
||||
|
|
Loading…
Reference in New Issue