Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -1144,12 +1144,11 @@ ++PPBranchLevel; assert(PPBranchLevel >= 0 && PPBranchLevel <= (int)PPLevelBranchIndex.size()); if (PPBranchLevel == (int)PPLevelBranchIndex.size()) { - // If the first branch is unreachable, set the BranchIndex to 1. This way - // the next branch will be parsed if there is one. - PPLevelBranchIndex.push_back(Unreachable ? 1 : 0); + PPLevelBranchIndex.push_back(0); PPLevelBranchCount.push_back(0); } - PPChainBranchIndex.push(0); + if (!Unreachable) + PPChainBranchIndex.push(0); bool Skip = PPLevelBranchIndex[PPBranchLevel] > 0; conditionalCompilationCondition(Unreachable || Skip); } Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -6119,7 +6119,7 @@ "#endif"); // Verify that indentation is correct when there is an `#if 0` with an - // `#else`. + // `#else`/`#elif`. verifyFormat("#if 0\n" "{\n" "#else\n" @@ -6127,6 +6127,26 @@ "#endif\n" " x;\n" "}"); + verifyFormat("#if 0\n" + "{\n" + "#elif FOO\n" + "{\n" + "#endif\n" + " x;\n" + "}"); + + verifyFormat("#if 0\n" + "#endif\n" + "#if X\n" + "int something_fairly_long; // Align here please\n" + "#endif // Should be aligned"); + + verifyFormat("#if 0\n" + "#endif\n" + "#if X\n" + "#else // Align\n" + ";\n" + "#endif // Align"); } TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {