https://github.com/owenca updated https://github.com/llvm/llvm-project/pull/79796
>From d40f2ed71e72c9cee266e63abbae4b9aac1de47c Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Mon, 29 Jan 2024 00:43:19 -0800 Subject: [PATCH 1/2] [clang-format] Simplify the AfterPlacementOperator option Change AfterPlacementOperator to a boolean. Also add SBPO_None for never inserting a space before a left parenthesis and deprecate SBPO_Never, which meant never inserting a space except when after new/delete. Fixes #78892. --- clang/docs/ClangFormatStyleOptions.rst | 37 +++++++--------------- clang/include/clang/Format/Format.h | 36 ++++++++------------- clang/lib/Format/Format.cpp | 32 +++++-------------- clang/lib/Format/TokenAnnotator.cpp | 13 ++------ clang/unittests/Format/ConfigParseTest.cpp | 27 ++++------------ clang/unittests/Format/FormatTest.cpp | 32 ++++++++----------- 6 files changed, 56 insertions(+), 121 deletions(-) diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst index 4dc0de3a90f26..ce4bf867b2619 100644 --- a/clang/docs/ClangFormatStyleOptions.rst +++ b/clang/docs/ClangFormatStyleOptions.rst @@ -5276,7 +5276,7 @@ the configuration (without a prefix: ``Auto``). Possible values: - * ``SBPO_Never`` (in configuration: ``Never``) + * ``SBPO_None`` (in configuration: ``None``) Never put a space before opening parentheses. .. code-block:: c++ @@ -5287,6 +5287,11 @@ the configuration (without a prefix: ``Auto``). } } + * ``SBPO_Never`` (in configuration: ``Never``) + This is **deprecated** and replaced by ``Custom`` below, with all + ``SpaceBeforeParensOptions`` but ``AfterPlacementOperator`` set to + ``false``. + * ``SBPO_ControlStatements`` (in configuration: ``ControlStatements``) Put a space before opening parentheses only after control statement keywords (``for/if/while...``). @@ -5425,32 +5430,14 @@ the configuration (without a prefix: ``Auto``). void operator++ (int a); vs. void operator++(int a); object.operator++ (10); object.operator++(10); - * ``AfterPlacementOperatorStyle AfterPlacementOperator`` :versionbadge:`clang-format 18` - - Defines in which cases to put a space between ``new/delete`` operators - and opening parentheses. + * ``bool AfterPlacementOperator`` If ``true``, put a space between operator ``new``/``delete`` and opening + parenthesis. - Possible values: - - * ``APO_Never`` (in configuration: ``Never``) - Remove space after ``new/delete`` operators and before ``(``. - - .. code-block:: c++ - - new(buf) T; - delete(buf) T; - - * ``APO_Always`` (in configuration: ``Always``) - Always add space after ``new/delete`` operators and before ``(``. - - .. code-block:: c++ - - new (buf) T; - delete (buf) T; - - * ``APO_Leave`` (in configuration: ``Leave``) - Leave placement ``new/delete`` expressions as they are. + .. code-block:: c++ + true: false: + new (buf) T; vs. new(buf) T; + delete (buf) T; delete(buf) T; * ``bool AfterRequiresInClause`` If ``true``, put space between requires keyword in a requires clause and opening parentheses, if there is one. diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index bc9eecd42f9eb..5c536bc3f381f 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -4165,6 +4165,10 @@ struct FormatStyle { /// } /// } /// \endcode + SBPO_None, + /// This is **deprecated** and replaced by ``Custom`` below, with all + /// ``SpaceBeforeParensOptions`` but ``AfterPlacementOperator`` set to + /// ``false``. SBPO_Never, /// Put a space before opening parentheses only after control statement /// keywords (``for/if/while...``). @@ -4273,28 +4277,14 @@ struct FormatStyle { /// object.operator++ (10); object.operator++(10); /// \endcode bool AfterOverloadedOperator; - /// Styles for adding spacing between ``new/delete`` operators and opening - /// parentheses. - enum AfterPlacementOperatorStyle : int8_t { - /// Remove space after ``new/delete`` operators and before ``(``. - /// \code - /// new(buf) T; - /// delete(buf) T; - /// \endcode - APO_Never, - /// Always add space after ``new/delete`` operators and before ``(``. - /// \code - /// new (buf) T; - /// delete (buf) T; - /// \endcode - APO_Always, - /// Leave placement ``new/delete`` expressions as they are. - APO_Leave, - }; - /// Defines in which cases to put a space between ``new/delete`` operators - /// and opening parentheses. - /// \version 18 - AfterPlacementOperatorStyle AfterPlacementOperator; + /// If ``true``, put a space between operator ``new``/``delete`` and opening + /// parenthesis. + /// \code + /// true: false: + /// new (buf) T; vs. new(buf) T; + /// delete (buf) T; delete(buf) T; + /// \endcode + bool AfterPlacementOperator; /// If ``true``, put space between requires keyword in a requires clause and /// opening parentheses, if there is one. /// \code @@ -4327,7 +4317,7 @@ struct FormatStyle { : AfterControlStatements(false), AfterForeachMacros(false), AfterFunctionDeclarationName(false), AfterFunctionDefinitionName(false), AfterIfMacros(false), - AfterOverloadedOperator(false), AfterPlacementOperator(APO_Leave), + AfterOverloadedOperator(false), AfterPlacementOperator(true), AfterRequiresInClause(false), AfterRequiresInExpression(false), BeforeNonEmptyParentheses(false) {} diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index ff326dc784783..98dac2387bbef 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -504,22 +504,6 @@ struct ScalarEnumerationTraits<FormatStyle::QualifierAlignmentStyle> { } }; -template <> -struct MappingTraits< - FormatStyle::SpaceBeforeParensCustom::AfterPlacementOperatorStyle> { - static void - mapping(IO &IO, - FormatStyle::SpaceBeforeParensCustom::AfterPlacementOperatorStyle - &Value) { - IO.enumCase(Value, "Always", - FormatStyle::SpaceBeforeParensCustom::APO_Always); - IO.enumCase(Value, "Never", - FormatStyle::SpaceBeforeParensCustom::APO_Never); - IO.enumCase(Value, "Leave", - FormatStyle::SpaceBeforeParensCustom::APO_Leave); - } -}; - template <> struct MappingTraits<FormatStyle::RawStringFormat> { static void mapping(IO &IO, FormatStyle::RawStringFormat &Format) { IO.mapOptional("Language", Format.Language); @@ -707,7 +691,8 @@ template <> struct MappingTraits<FormatStyle::SpaceBeforeParensCustom> { template <> struct ScalarEnumerationTraits<FormatStyle::SpaceBeforeParensStyle> { static void enumeration(IO &IO, FormatStyle::SpaceBeforeParensStyle &Value) { - IO.enumCase(Value, "Never", FormatStyle::SBPO_Never); + IO.enumCase(Value, "None", FormatStyle::SBPO_None); + IO.enumCase(Value, "Never", FormatStyle::SBPO_Custom); IO.enumCase(Value, "ControlStatements", FormatStyle::SBPO_ControlStatements); IO.enumCase(Value, "ControlStatementsExceptControlMacros", @@ -718,7 +703,7 @@ struct ScalarEnumerationTraits<FormatStyle::SpaceBeforeParensStyle> { IO.enumCase(Value, "Custom", FormatStyle::SBPO_Custom); // For backward compatibility. - IO.enumCase(Value, "false", FormatStyle::SBPO_Never); + IO.enumCase(Value, "false", FormatStyle::SBPO_Custom); IO.enumCase(Value, "true", FormatStyle::SBPO_ControlStatements); IO.enumCase(Value, "ControlStatementsExceptForEachMacros", FormatStyle::SBPO_ControlStatementsExceptControlMacros); @@ -1389,11 +1374,12 @@ static void expandPresetsSpaceBeforeParens(FormatStyle &Expanded) { // Reset all flags Expanded.SpaceBeforeParensOptions = {}; + if (Expanded.SpaceBeforeParens == FormatStyle::SBPO_None) + return; + + Expanded.SpaceBeforeParensOptions.AfterPlacementOperator = true; + switch (Expanded.SpaceBeforeParens) { - case FormatStyle::SBPO_Never: - Expanded.SpaceBeforeParensOptions.AfterPlacementOperator = - FormatStyle::SpaceBeforeParensCustom::APO_Never; - break; case FormatStyle::SBPO_ControlStatements: Expanded.SpaceBeforeParensOptions.AfterControlStatements = true; Expanded.SpaceBeforeParensOptions.AfterForeachMacros = true; @@ -1405,8 +1391,6 @@ static void expandPresetsSpaceBeforeParens(FormatStyle &Expanded) { case FormatStyle::SBPO_NonEmptyParentheses: Expanded.SpaceBeforeParensOptions.BeforeNonEmptyParentheses = true; break; - case FormatStyle::SBPO_Always: - break; default: break; } diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index df1c5bc19de1e..36025d03b0553 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -4274,14 +4274,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, Left.isOneOf(tok::kw_new, tok::kw_delete) && Right.isNot(TT_OverloadedOperatorLParen) && !(Line.MightBeFunctionDecl && Left.is(TT_FunctionDeclarationName))) { - if (Style.SpaceBeforeParensOptions.AfterPlacementOperator == - FormatStyle::SpaceBeforeParensCustom::APO_Always || - (Style.SpaceBeforeParensOptions.AfterPlacementOperator == - FormatStyle::SpaceBeforeParensCustom::APO_Leave && - Right.hasWhitespaceBefore())) { - return true; - } - return false; + return Style.SpaceBeforeParensOptions.AfterPlacementOperator; } if (Line.Type == LT_ObjCDecl) return true; @@ -4322,14 +4315,14 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, } if (Left.isOneOf(tok::kw_new, tok::kw_delete)) { return ((!Line.MightBeFunctionDecl || !Left.Previous) && - Style.SpaceBeforeParens != FormatStyle::SBPO_Never) || + Style.SpaceBeforeParens > FormatStyle::SBPO_Never) || spaceRequiredBeforeParens(Right); } if (Left.is(tok::r_square) && Left.MatchingParen && Left.MatchingParen->Previous && Left.MatchingParen->Previous->is(tok::kw_delete)) { - return (Style.SpaceBeforeParens != FormatStyle::SBPO_Never) || + return (Style.SpaceBeforeParens > FormatStyle::SBPO_Never) || spaceRequiredBeforeParens(Right); } } diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp index 2a8d79359a49b..5d9ff43e28e05 100644 --- a/clang/unittests/Format/ConfigParseTest.cpp +++ b/clang/unittests/Format/ConfigParseTest.cpp @@ -231,6 +231,7 @@ TEST(ConfigParseTest, ParsesConfigurationBools) { AfterFunctionDefinitionName); CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterIfMacros); CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterOverloadedOperator); + CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterPlacementOperator); CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, BeforeNonEmptyParentheses); CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InCStyleCasts); CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InConditionalStatements); @@ -587,8 +588,10 @@ TEST(ConfigParseTest, ParsesConfiguration) { SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both); Style.SpaceBeforeParens = FormatStyle::SBPO_Always; + CHECK_PARSE("SpaceBeforeParens: None", SpaceBeforeParens, + FormatStyle::SBPO_None); CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, - FormatStyle::SBPO_Never); + FormatStyle::SBPO_Custom); CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, FormatStyle::SBPO_Always); CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, @@ -601,32 +604,14 @@ TEST(ConfigParseTest, ParsesConfiguration) { CHECK_PARSE("SpaceBeforeParens: Custom", SpaceBeforeParens, FormatStyle::SBPO_Custom); // For backward compatibility: - CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, - FormatStyle::SBPO_Never); CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, FormatStyle::SBPO_ControlStatements); + CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, + FormatStyle::SBPO_Custom); CHECK_PARSE("SpaceBeforeParens: ControlStatementsExceptForEachMacros", SpaceBeforeParens, FormatStyle::SBPO_ControlStatementsExceptControlMacros); - Style.SpaceBeforeParens = FormatStyle::SBPO_Custom; - Style.SpaceBeforeParensOptions.AfterPlacementOperator = - FormatStyle::SpaceBeforeParensCustom::APO_Always; - CHECK_PARSE("SpaceBeforeParensOptions:\n" - " AfterPlacementOperator: Never", - SpaceBeforeParensOptions.AfterPlacementOperator, - FormatStyle::SpaceBeforeParensCustom::APO_Never); - - CHECK_PARSE("SpaceBeforeParensOptions:\n" - " AfterPlacementOperator: Always", - SpaceBeforeParensOptions.AfterPlacementOperator, - FormatStyle::SpaceBeforeParensCustom::APO_Always); - - CHECK_PARSE("SpaceBeforeParensOptions:\n" - " AfterPlacementOperator: Leave", - SpaceBeforeParensOptions.AfterPlacementOperator, - FormatStyle::SpaceBeforeParensCustom::APO_Leave); - // For backward compatibility: Style.SpacesInParens = FormatStyle::SIPO_Never; Style.SpacesInParensOptions = {}; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index e5e763edf5b5b..a471e36f8d682 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -11347,35 +11347,31 @@ TEST_F(FormatTest, UnderstandsNewAndDelete) { FormatStyle AfterPlacementOperator = getLLVMStyle(); AfterPlacementOperator.SpaceBeforeParens = FormatStyle::SBPO_Custom; - EXPECT_EQ( - AfterPlacementOperator.SpaceBeforeParensOptions.AfterPlacementOperator, - FormatStyle::SpaceBeforeParensCustom::APO_Leave); + EXPECT_TRUE( + AfterPlacementOperator.SpaceBeforeParensOptions.AfterPlacementOperator); verifyFormat("new (buf) int;", AfterPlacementOperator); - verifyFormat("new(buf) int;", AfterPlacementOperator); - - AfterPlacementOperator.SpaceBeforeParensOptions.AfterPlacementOperator = - FormatStyle::SpaceBeforeParensCustom::APO_Never; verifyFormat("struct A {\n" " int *a;\n" - " A(int *p) : a(new(p) int) {\n" - " new(p) int;\n" - " int *b = new(p) int;\n" - " int *c = new(p) int(3);\n" - " delete(b);\n" + " A(int *p) : a(new (p) int) {\n" + " new (p) int;\n" + " int *b = new (p) int;\n" + " int *c = new (p) int(3);\n" + " delete (b);\n" " }\n" "};", AfterPlacementOperator); verifyFormat("void operator new(void *foo) ATTRIB;", AfterPlacementOperator); AfterPlacementOperator.SpaceBeforeParensOptions.AfterPlacementOperator = - FormatStyle::SpaceBeforeParensCustom::APO_Always; + false; + verifyFormat("new(buf) int;", AfterPlacementOperator); verifyFormat("struct A {\n" " int *a;\n" - " A(int *p) : a(new (p) int) {\n" - " new (p) int;\n" - " int *b = new (p) int;\n" - " int *c = new (p) int(3);\n" - " delete (b);\n" + " A(int *p) : a(new(p) int) {\n" + " new(p) int;\n" + " int *b = new(p) int;\n" + " int *c = new(p) int(3);\n" + " delete(b);\n" " }\n" "};", AfterPlacementOperator); >From 3c11c037563ac17add5862342dc0e12d7214f009 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Tue, 30 Jan 2024 00:41:07 -0800 Subject: [PATCH 2/2] Don't add SBPO_None. Don't map Never to SBPO_Custom as SBPO_Never goes through expandPresetsSpaceBeforeParens() but SBPO_Custom doesn't. --- clang/docs/ClangFormatStyleOptions.rst | 11 ----------- clang/include/clang/Format/Format.h | 9 --------- clang/lib/Format/Format.cpp | 9 ++------- clang/lib/Format/TokenAnnotator.cpp | 4 ++-- clang/unittests/Format/ConfigParseTest.cpp | 8 +++----- 5 files changed, 7 insertions(+), 34 deletions(-) diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst index ce4bf867b2619..0b887288fe2cb 100644 --- a/clang/docs/ClangFormatStyleOptions.rst +++ b/clang/docs/ClangFormatStyleOptions.rst @@ -5276,17 +5276,6 @@ the configuration (without a prefix: ``Auto``). Possible values: - * ``SBPO_None`` (in configuration: ``None``) - Never put a space before opening parentheses. - - .. code-block:: c++ - - void f() { - if(true) { - f(); - } - } - * ``SBPO_Never`` (in configuration: ``Never``) This is **deprecated** and replaced by ``Custom`` below, with all ``SpaceBeforeParensOptions`` but ``AfterPlacementOperator`` set to diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index 5c536bc3f381f..efcb4e1d87ea4 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -4157,15 +4157,6 @@ struct FormatStyle { /// Different ways to put a space before opening parentheses. enum SpaceBeforeParensStyle : int8_t { - /// Never put a space before opening parentheses. - /// \code - /// void f() { - /// if(true) { - /// f(); - /// } - /// } - /// \endcode - SBPO_None, /// This is **deprecated** and replaced by ``Custom`` below, with all /// ``SpaceBeforeParensOptions`` but ``AfterPlacementOperator`` set to /// ``false``. diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 98dac2387bbef..10fe35c79a4f2 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -691,8 +691,7 @@ template <> struct MappingTraits<FormatStyle::SpaceBeforeParensCustom> { template <> struct ScalarEnumerationTraits<FormatStyle::SpaceBeforeParensStyle> { static void enumeration(IO &IO, FormatStyle::SpaceBeforeParensStyle &Value) { - IO.enumCase(Value, "None", FormatStyle::SBPO_None); - IO.enumCase(Value, "Never", FormatStyle::SBPO_Custom); + IO.enumCase(Value, "Never", FormatStyle::SBPO_Never); IO.enumCase(Value, "ControlStatements", FormatStyle::SBPO_ControlStatements); IO.enumCase(Value, "ControlStatementsExceptControlMacros", @@ -703,7 +702,7 @@ struct ScalarEnumerationTraits<FormatStyle::SpaceBeforeParensStyle> { IO.enumCase(Value, "Custom", FormatStyle::SBPO_Custom); // For backward compatibility. - IO.enumCase(Value, "false", FormatStyle::SBPO_Custom); + IO.enumCase(Value, "false", FormatStyle::SBPO_Never); IO.enumCase(Value, "true", FormatStyle::SBPO_ControlStatements); IO.enumCase(Value, "ControlStatementsExceptForEachMacros", FormatStyle::SBPO_ControlStatementsExceptControlMacros); @@ -1373,10 +1372,6 @@ static void expandPresetsSpaceBeforeParens(FormatStyle &Expanded) { return; // Reset all flags Expanded.SpaceBeforeParensOptions = {}; - - if (Expanded.SpaceBeforeParens == FormatStyle::SBPO_None) - return; - Expanded.SpaceBeforeParensOptions.AfterPlacementOperator = true; switch (Expanded.SpaceBeforeParens) { diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 36025d03b0553..d0c4273cfc7e5 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -4315,14 +4315,14 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, } if (Left.isOneOf(tok::kw_new, tok::kw_delete)) { return ((!Line.MightBeFunctionDecl || !Left.Previous) && - Style.SpaceBeforeParens > FormatStyle::SBPO_Never) || + Style.SpaceBeforeParens != FormatStyle::SBPO_Never) || spaceRequiredBeforeParens(Right); } if (Left.is(tok::r_square) && Left.MatchingParen && Left.MatchingParen->Previous && Left.MatchingParen->Previous->is(tok::kw_delete)) { - return (Style.SpaceBeforeParens > FormatStyle::SBPO_Never) || + return (Style.SpaceBeforeParens != FormatStyle::SBPO_Never) || spaceRequiredBeforeParens(Right); } } diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp index 5d9ff43e28e05..6436581ddae5a 100644 --- a/clang/unittests/Format/ConfigParseTest.cpp +++ b/clang/unittests/Format/ConfigParseTest.cpp @@ -588,10 +588,8 @@ TEST(ConfigParseTest, ParsesConfiguration) { SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both); Style.SpaceBeforeParens = FormatStyle::SBPO_Always; - CHECK_PARSE("SpaceBeforeParens: None", SpaceBeforeParens, - FormatStyle::SBPO_None); CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, - FormatStyle::SBPO_Custom); + FormatStyle::SBPO_Never); CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens, FormatStyle::SBPO_Always); CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens, @@ -604,10 +602,10 @@ TEST(ConfigParseTest, ParsesConfiguration) { CHECK_PARSE("SpaceBeforeParens: Custom", SpaceBeforeParens, FormatStyle::SBPO_Custom); // For backward compatibility: + CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, + FormatStyle::SBPO_Never); CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens, FormatStyle::SBPO_ControlStatements); - CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens, - FormatStyle::SBPO_Custom); CHECK_PARSE("SpaceBeforeParens: ControlStatementsExceptForEachMacros", SpaceBeforeParens, FormatStyle::SBPO_ControlStatementsExceptControlMacros); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits