diff --git a/clang/tools/clang-format/ClangFormat.cpp b/clang/tools/clang-format/ClangFormat.cpp --- a/clang/tools/clang-format/ClangFormat.cpp +++ b/clang/tools/clang-format/ClangFormat.cpp @@ -106,9 +106,9 @@ cl::cat(ClangFormatCategory)); static cl::opt QualifierAlignment( - "qualifier-aligment", + "qualifier-alignment", cl::desc( - "If set, overrides the cvqualifier style behavior determined by the " + "If set, overrides the qualifier alignment style determined by the " "QualifierAlignment style flag"), cl::init(""), cl::cat(ClangFormatCategory)); @@ -410,14 +410,27 @@ return true; } - StringRef ConstAlignment = QualifierAlignment; + StringRef QualifierAlignmentOrder = QualifierAlignment; FormatStyle->QualifierAlignment = - StringSwitch(ConstAlignment.lower()) + StringSwitch( + QualifierAlignmentOrder.lower()) .Case("right", FormatStyle::QAS_Right) .Case("left", FormatStyle::QAS_Left) .Default(FormatStyle->QualifierAlignment); + if (FormatStyle->QualifierAlignment == FormatStyle::QAS_Left) + FormatStyle->QualifierOrder = {"const", "volatile", "type"}; + else if (FormatStyle->QualifierAlignment == FormatStyle::QAS_Right) + FormatStyle->QualifierOrder = {"type", "const", "volatile"}; + else if (QualifierAlignmentOrder.contains("type")) { + FormatStyle->QualifierAlignment = FormatStyle::QAS_Custom; + SmallVector Qualifiers; + QualifierAlignmentOrder.split(Qualifiers, " ", /*MaxSplit=*/-1, + /*KeepEmpty=*/false); + FormatStyle->QualifierOrder = {Qualifiers.begin(), Qualifiers.end()}; + } + if (SortIncludes.getNumOccurrences() != 0) { if (SortIncludes) FormatStyle->SortIncludes = FormatStyle::SI_CaseSensitive;