Index: clang/lib/Format/IntegerLiteralSeparatorFixer.cpp =================================================================== --- clang/lib/Format/IntegerLiteralSeparatorFixer.cpp +++ clang/lib/Format/IntegerLiteralSeparatorFixer.cpp @@ -106,6 +106,12 @@ (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 @@ 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) { Index: clang/unittests/Format/IntegerLiteralSeparatorTest.cpp =================================================================== --- clang/unittests/Format/IntegerLiteralSeparatorTest.cpp +++ clang/unittests/Format/IntegerLiteralSeparatorTest.cpp @@ -49,7 +49,21 @@ 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); }