From: David Majnemer Date: Fri, 6 Mar 2015 18:04:22 +0000 (+0000) Subject: Sema: The i8 suffix should yield a literal of type char X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=de6ee06961459c02dbe52441b99781c1404627a5;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231494 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index d6e0debee1..8f0edd0756 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -1069,7 +1069,8 @@ void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { // Emit suffixes. Integer literals are always a builtin integer type. switch (Node->getType()->getAs()->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; diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 84315be781..a793d45da4 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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, diff --git a/test/SemaCXX/ms_integer_suffix.cpp b/test/SemaCXX/ms_integer_suffix.cpp index 6b4594dd5b..d65e7f4634 100644 --- a/test/SemaCXX/ms_integer_suffix.cpp +++ b/test/SemaCXX/ms_integer_suffix.cpp @@ -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__, "");