<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/85937>85937</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang-format] Combination of AlignArrayOfStructures with AlignEscapedNewlines does not work well within macros
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-format
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          BenoitLabrique-EH
      </td>
    </tr>
</table>

<pre>
    Considering the following code to format:
```
#define DEFINE_COMMAND_PROCESS_TABLE(Enum)                \
    const STExample TCommand::EXPL_MAIN[] = { \
        {Enum::GetName(), "shows help"} \
        {Enum::GetAttribute(), "do something"} \
        {Enum::GetState(), "do whatever"}             \
 };
```

Having the following settings in .clang-format:

ColumnLimit: 80
AlignEscapedNewlines: Left
AlignArrayOfStructures: None

results in
```
#define DEFINE_COMMAND_PROCESS_TABLE(Enum)                                     \
 const STExample TCommand::EXPL_MAIN[] = {{Enum::GetName(), "shows help"} { \
        Enum::GetAttribute(), "do something"} { \
        Enum::GetState(), "do whatever"}};
```
as expected.
Now having AlignArrayOfStructures set to 'Left' instead of 'None':
```
#define DEFINE_COMMAND_PROCESS_TABLE(Enum)          \
 const STExample TCommand::EXPL_MAIN[] = {       \
 {Enum::GetName(),      "shows help"  } \
        {           \
 Enum::GetAttribute(), "do something"} \
        { \
 Enum::GetState(),     "do whatever" } \
    };
```
aligns the columns within the array of structs, but messes up the alignment of the backslashes. It may align the columns after aligning the backslashes instead of the other way around.

Clang-Format version is 18.1.2
Full configuration I'm using is the following:
---
Language: Cpp
Standard: c++20

AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments:
 Enabled:       true
  AlignCompound: true
  PadOperators: false
AlignConsecutiveBitFields: AcrossEmptyLines
AlignConsecutiveDeclarations: Consecutive
AlignConsecutiveMacros: Consecutive
AlignEscapedNewlines: Left
AlignOperands: Align
AlignTrailingComments: Always
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine : None
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None # DEPRECATED
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros:
  - __capability
  - __packed
BinPackArguments: true
BinPackParameters: true
BitFieldColonSpacing: Both
BraceWrapping:
  AfterCaseLabel: true
  AfterClass:            true
  AfterControlStatement: Always
  AfterEnum:             true
  AfterFunction:         true
 AfterNamespace:        true
  AfterObjCDeclaration:  true
 AfterStruct:           true
  AfterUnion:            true
 AfterExternBlock:      true
  BeforeCatch:           true
  BeforeElse: true
  BeforeLambdaBody:      true
  BeforeWhile: false
  IndentBraces:          false
  SplitEmptyFunction:    true
 SplitEmptyRecord:      true
  SplitEmptyNamespace: true
BreakAfterJavaFieldAnnotations: false
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BreakBeforeConceptDeclarations: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: AfterComma
BreakStringLiterals: true
BreakConstructorInitializersBeforeComma: true
ColumnLimit: 80
CommentPragmas: ^!<|^/<|^lint
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: false
DerivePointerAlignment: false
DisableFormat: false
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: false
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
  - FOR_ALL
  - FOR_ALL_COND
IncludeBlocks: Preserve
IncludeCategories:
  - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
    Priority:        2
 SortPriority:    0
    CaseSensitive:   false
  - Regex: '^(<|"(gtest|gmock|isl|json)/)'
    Priority:        3
 SortPriority:    0
    CaseSensitive:   false
  - Regex: '.*'
    Priority:        1
    SortPriority:    0
 CaseSensitive:   false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentCaseBlocks: true
IndentCaseLabels: false
IndentExternBlock: AfterExternBlock
IndentGotoLabels: false
IndentPPDirectives: BeforeHash
IndentWidth: 4
IndentWrappedFunctionNames: true
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd:   ''
MaxEmptyLinesToKeep: 2
NamespaceIndentation: All
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: false
PenaltyBreakAssignment: 0
PenaltyBreakBeforeFirstCallParameter: 0
PenaltyBreakComment: 60
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 0
PenaltyExcessCharacter: 1000000
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Middle
ReflowComments: false
SortIncludes: Never
SortJavaStaticImport: Before
SortUsingDeclarations: Lexicographic
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: Custom
SpaceBeforeParensOptions:
  AfterControlStatements: true
  AfterForeachMacros:           true
 AfterFunctionDeclarationName: false
  AfterFunctionDefinitionName : false
  AfterIfMacros:                true
  AfterOverloadedOperator : false
  AfterRequiresInClause:        true
 AfterRequiresInExpression:    true
  BeforeNonEmptyParentheses: false
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
SpacesInSquareBrackets: false
StatementAttributeLikeMacros:
 - Q_EMIT
  - emit
StatementMacros:
  - Q_UNUSED
  - QT_REQUIRE_VERSION
TabWidth: 4
UseTab: Never
WhitespaceSensitiveMacros:
  - STRINGIZE
  - PP_STRINGIZE
 - BOOST_PP_STRINGIZE
  - NS_SWIFT_NAME
  - CF_SWIFT_NAME
AlignArrayOfStructures: Left
EmptyLineAfterAccessModifier: Never
IfMacros:
  - KJ_IF_MAYBE
IndentAccessModifiers: false
LambdaBodyIndentation: Signature
PPIndentWidth: -1
ReferenceAlignment: Pointer
ShortNamespaceLines: 1
SpacesInLineCommentPrefix:
  Minimum: 1
  Maximum: -1
PackConstructorInitializers: Never
PenaltyBreakOpenParenthesis: 100
QualifierAlignment: Leave # Setting to something other than Leave, COULD lead to incorrect code formatting
SeparateDefinitionBlocks: Always
IndentRequiresClause: true
InsertBraces: false # warning: setting to true is unstable!
RequiresClausePosition: OwnLine
BreakAfterAttributes: Always
BreakArrays: false
InsertNewlineAtEOF: true
LineEnding: LF
RemoveSemicolon: false # warning: setting to true is unstable!
RequiresExpressionIndentation: OuterScope
KeepEmptyLinesAtEOF: false
RemoveParentheses: Leave # warning: setting to != Leave is unstable!
SpacesInParens: Never # set to Custom to let SpacesInParensOptions it
SpacesInParensOptions:
 InConditionalStatements: false
  InCStyleCasts:           false
 InEmptyParentheses:      false
  Other: false

...
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Wltz4riz_zTOiyopMGRIHvJgjNlhlwAD5MzZ80IJu8HayJJXkkNyPv2_JPluk5n_XlIzuah_6m6r7zJYSnJmAE_O_dS5n93gTMVcPE2BcaKW-CjInxncBl9vjjz6ePI5kyQCQdgZqRjQiVPKL_qvkEeAFEcnLhKsnJHnDGbOwHO-DPJ_9k93FMGJMECzYL5YBQd__fzsrWaHzXbtB7vdYe9Nl4HjPgQsSxz3EbW-nHvfMtJ_hJxJhXb74B0nKQW093mSYBZp4SMv-N_N8vDsLVb2wZAzmiFnMm2yMDwnUyPN7PoF1Aon4LgPjvvouD5yXFfG_CJRDDR1XNeZzH7MwlNKkGOmmnwijiRPQMWEnX-W007hLpdLjBW8gciZ9B-QM5k5o2m_Fcz3r_ita0YJShF2logwdBdSzM63bYua7z6nWcKWJCGagh5yzh4lZxbIEKcQreBCCQOp6Us4qRrCEwJ_rE87JbJQZcJiVpxBXYQAmVGlNflXXKn3qzq-v-Rcf8GV-jzyL_rSD1n9hDN94jVYInhPIVQQ3dmVFb-g2HpRv1m1O-mk4LgT4wHuBBEmFeAI8ZNeNTZ3J_98uvibhuyJps8sa8Et8-pg7o_wXof75xLINaYt8-c6N12gq_NnHqGNLk0GCU0-kOhCtHZmCWtv0HaWxh-klnnMFEpASpAoSy1K80iAKY3UC0ccvkqKZQzyDi0USvCHBTXk4JMCYdeLJFbbWPcyTeIqBoEumpPgGSv8N09lJsvNTZZDbyAk4QwRiYYPd8M712LmGaXak07knAmsNGLhuJMEZVKLJ7KZRkt_vr29tb8sMTtn-Aw60flpahd3CrMIC-2KKHTcqeNO3UaK9sIQpHzmETkREOvTSYJJt7fjejLVR7FOgU0FDl8twBBqGF23IcwUeQPPFHx94rJUEwUMHykYReyXEhkUPpBzSFJ9dBpSJ25wtE5BYMWFyeInTCX0S54SNSdAI4PzQsGlDJJUfSxNlejdMoOQYnvgZleN1L_hGWu-16E_rk3maViuZOsY9wITSthZp5D8AJFHL_ijVJ_yi0epJ86ZAazZCt6VfsDmuRXADRY4AQVCrk-1Z21uaxwp5ZddzIWaUh6-yjXzdoSdKRTYlYnjFtbHEpb4CLSL7-Wts8ZPQucZC411upqU5bxCL04mB-VH8zOqL3FyjHATjK6xX3Ke_kBvbaupAPxqomamiwvR-m9BZYLtP9JSd-S4IzQLNtvA9_bBrJ9Bd1sHN4UTF_CcUaVdB3ZKN8-y7Q4lfA9JSrHqeP7vZYgUpaF09SIUb9HhEOIUHwkl6qO-murEENmVKWEbHL6WLtrUJKdWftkm2xD2OeVsl-LQJjs05SrOEQKH8F3gNK3nQYTMcZWO2M4ilkqxlFUK6uYhA-JMCU5LP2qHYA7LCx_6lFfhvHVgDWQwutDLFIdQA3UYrY9_-DWDGWibke2Kmjp1GL2wljo9GgXvCgQz8V8i64ysw_lYhfF1aRYU6MhomcJSbNxNefTxiYzvMaHtEENowSJgyvhB05oN1C6lRJn037JCTUyF2ULIRdSrSgVqmKrms2W0_orfsHFfjzGuqtiqKVYL2SlhWHw0ituKs6p8djeUj-xnUvGkA_A5CyFV7dBuqWqxexAd8S2grnDGqbhY6CyGKfn_PGILeUmCaxsWLAZBFGYhLIm0oWNjqomzOWpJFAhM_wvJdamNTVemxbyMbgQ-J9jIce4Dxx06I9-Z-Ob3efk7JcWR61YEh6o0d9uG_dpZt_xOImXCYlxiFWGZMcYVRJoOh8a0kT60nfqgLQebgSBvptwELMoTYk0dS95wwhQIr2h32yAidQc2L2btOq1skuz5NptC08HwMwkxtSnBbnlPQRAtB1MvU3wGCkKVJ_euinPyXp5mvbepQ7gIcBj3FB2tEw7jauHbYb7eBp7_tVqarte7fXd5vt4evOWys3Dw16u84i5YSLMIbLujddoIkCCKpi4n-1jBmQsCTdW2cIZ341fuxLiT67gPlL4lzsTXP25DZ-KbW47i521opqO53lCOQBtBuNAltcpmbpGiuFAt8qDaqOvdDpgkpgs15EYS7NHwIXd4o-pZgVTOxD8n2rITn0jqTPw_JGeFlo8_UnT0Lyh657jej-QOK-onoj-Xmxt3IZ8xYY2Tch_2-mTcR2c0d9xxqUxjx45nIoTmvhKnQ11LrxyrCuiKarvmVihYcqsMd0pzDfoLV_wTTpvNjAgI9RHUkvdXLOM6qp2X8lXdaUFU1FATxe2HkSBUfXLBres2XRZ3oSCp-pZxVQxF-K1D1sIWScpFu2v8DSCtRjlP7WPYKSzU-tR3vCaHGMIUzoS1bVORA5aX_Cb5vRK151q0BuUBWaYxezxlO-ZRagG6VSuaXMEVDzkta2GmeA2kNeg_ekOuSvUKpILI4E3f3HxaDdadMhgP2QiegrBxUHOEEmQ5tjWrITfAMFUftqmpepGRV8RUHWC5zYmQyse1afMKPE_9mvqlh2z4LEFK_V-Dhm4PyjYPhjwY9NB7BpyuOsG7rnF-jAUOc301tzZDax6IvsdEVa1fE1ONaGu2UHJ9YcVg6JbcemrzM4kimp_5Fk6UX64URp3d8rQjW2OsJpno0X4Y2sipArzCvEjCzu2ucAnvJORngdOYhDm2dCPftCE-7rhHBcmbghW_DilM8Rt8XPL2uvJbCzPXZfn5fMswNT2H0W8GJ5xRVQPn7UnplFd61xpWp1gzSvapmEOa7dd1Vs1ur-TaC641wp8DN1gA67T0HcA6Lcz26awqe8feue2fqpur66NfkeZrvmIuotsjWAtcXHJoLOoHL0598q9Mu28gKMcRlDd_V5hu4c-MCJAL5lOcySsjdAsavKcCpOwdCPPIWXFmSoA5fBWD7IwANQttMTvDFEuI5lwsOU8_t_juzwzbUe4VurFuK4sRXlb-Nj0fg_ruCt06bME8dqbdpJETfc4iYzXcvOzoiDNQhQkDUR_ZenCfP1shpLxgWpLXziWT7u6D58W-agxBD3VNDj1DwrfDy-plV1yjmZX9YRt8e1lsg8P_BNvdYr2ytD0-tuvti4Q9PrbOqcr5ZQPZI3e33y5Wvyz-L6iWNptDe7UYUHpI6Batdofd98V8f1h5z7Vlf95Zvv5ys7pkLpsX4_fdYa72iLWgrMT-9uthMT88e79Pg3oj2GTUNm51ndPqi3bkzLDWMq-Em1bHczssSyAIYCE0imReGHLzx1xUQ_myuF4fNn1Qr5dzP5zIe-3hngkjib23K8eHZ_xerBW66N7tk7uP2gHW-451CqxMGETmLYXFlZWt8XSmBzbXwDv7Vhyp2gu4_KWSijHLu2XXR_76ZTlDFHCksYSFXOjO3n46wr5I14zyI4FUJ3GoEnTVLdevNK1JigxZpdJ2j1_dPxnLG80vWLC8HZPVQ-idiEiUManwkYLjlmauC9lwSQpHKfomA6uu1Mpk0dHaYnQsdKcerW3-CsZTwXrefJrmTcpyXqiW8DfYQULCRsfwdx6zqjWtsFhnCsQu5OmVASfXufZQVr1WRao8qF9Bc9c1y2F9ihZRU_UhxrsNy_zdum1M9G8UFGpuyPsSRFQfu07X0l902uZDGlf2n62OoY5b9Fbp7lXwWgdSS4j9fnd3dxM9jaLH0SO-gafhZDh4HI_Hw-FN_DT4MoHJwB08An6YhO5gPMFwfLgfne6PYfQwwTfkyR2448HIHQzH7mAwvvtyGj9M3PtT6D5ANDmNnfEAEkzoHaVvyR0X5xsiZQZPD_ePo8kNNQO7-ViU6zY-CeO6zv3sRjyZG6RjdpbOeECJVLJipIii5iNVjY33M-Tz5EiYfYPMT9c-NnEhKkZ97ytRxEEixhW6cPGKLkBp8co9MaXiJhP0KVYqNWZ15447PxMVZ8e7kCeOOzeXX_bHbSr4HxAqx52b55aOOzeP_p8AAAD__3_3DT0">