Index: clang/lib/Lex/PPExpressions.cpp =================================================================== --- clang/lib/Lex/PPExpressions.cpp +++ clang/lib/Lex/PPExpressions.cpp @@ -407,10 +407,10 @@ llvm::APSInt Val(NumBits); // Set the value. Val = Literal.getValue(); - // Set the signedness. UTF-16 and UTF-32 are always unsigned + // Set the signedness. UTF-8, UTF-16 and UTF-32 are always unsigned if (Literal.isWide()) Val.setIsUnsigned(!TargetInfo::isTypeSigned(TI.getWCharType())); - else if (!Literal.isUTF16() && !Literal.isUTF32()) + else if (!Literal.isUTF8() && !Literal.isUTF16() && !Literal.isUTF32()) Val.setIsUnsigned(!PP.getLangOpts().CharIsSigned); if (Result.Val.getBitWidth() > Val.getBitWidth()) { Index: clang/test/Lexer/utf8-char-literal.cpp =================================================================== --- clang/test/Lexer/utf8-char-literal.cpp +++ clang/test/Lexer/utf8-char-literal.cpp @@ -26,3 +26,10 @@ unsigned char : 1), "Surprise!"); #endif + +/// Test u8 char literal preprocessor behavior +#if __cplusplus > 201402L || __STDC_VERSION__ > 202000L +#if u8'\xff' != 0xff +#error u8 char literal is not unsigned +#endif +#endif