diff --git a/clang/lib/Format/IntegerLiteralSeparatorFixer.cpp b/clang/lib/Format/IntegerLiteralSeparatorFixer.cpp index 0eac3498d7215..35a8db0ce76e1 100644 --- a/clang/lib/Format/IntegerLiteralSeparatorFixer.cpp +++ b/clang/lib/Format/IntegerLiteralSeparatorFixer.cpp @@ -106,6 +106,12 @@ IntegerLiteralSeparatorFixer::process(const Environment &Env, (IsBase16 && SkipHex) || B == Base::Other) { continue; } + if (Style.isCpp()) { + if (const auto Pos = Text.find_first_of("_i"); Pos != StringRef::npos) { + Text = Text.substr(0, Pos); + Length = Pos; + } + } if ((IsBase10 && Text.find_last_of(".eEfFdDmM") != StringRef::npos) || (IsBase16 && Text.find_last_of(".pP") != StringRef::npos)) { continue; @@ -116,7 +122,7 @@ IntegerLiteralSeparatorFixer::process(const Environment &Env, continue; } const auto Start = Text[0] == '0' ? 2 : 0; - auto End = Text.find_first_of("uUlLzZn"); + auto End = Text.find_first_of("uUlLzZn", Start); if (End == StringRef::npos) End = Length; if (Start > 0 || End < Length) { diff --git a/clang/unittests/Format/IntegerLiteralSeparatorTest.cpp b/clang/unittests/Format/IntegerLiteralSeparatorTest.cpp index 1c9ccebf44e99..eb0ca7e21ee5a 100644 --- a/clang/unittests/Format/IntegerLiteralSeparatorTest.cpp +++ b/clang/unittests/Format/IntegerLiteralSeparatorTest.cpp @@ -49,7 +49,21 @@ TEST_F(IntegerLiteralSeparatorTest, SingleQuoteAsSeparator) { verifyFormat("o0 = 0;\n" "o1 = 07;\n" - "o5 = 012345", + "o5 = 012345;", + Style); + + verifyFormat("bi = 0b1'0000i;\n" + "dif = 1'234if;\n" + "hil = 0xA'BCil;", + "bi = 0b10000i;\n" + "dif = 1234if;\n" + "hil = 0xABCil;", + Style); + + verifyFormat("d = 5'678_km;\n" + "h = 0xD'EF_u16;", + "d = 5678_km;\n" + "h = 0xDEF_u16;", Style); }