[clang] [clang-format] Add SpacesInParensOption for filtering repeated parens (PR #77522)

Gedare Bloom via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 20 11:30:12 PDT 2024


https://github.com/gedare updated https://github.com/llvm/llvm-project/pull/77522

>From 4a7489251b842da778dd839bd5af3db12ba0fe0b Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Mon, 17 Jul 2023 18:24:30 -0600
Subject: [PATCH 1/4] Add SpaceInParensOption ExceptDoubleParentheses

This change allows finer control over addition of spaces between a pair of
consecutive opening parentheses with a pair of closing parentheses.
---
 clang/docs/ClangFormatStyleOptions.rst     |  28 +-
 clang/docs/ReleaseNotes.rst                |   3 +
 clang/include/clang/Format/Format.h        |  40 ++-
 clang/lib/Format/Format.cpp                |   5 +-
 clang/lib/Format/TokenAnnotator.cpp        |  70 +++--
 clang/unittests/Format/ConfigParseTest.cpp |  21 +-
 clang/unittests/Format/FormatTest.cpp      | 314 +++++++++++++++++++++
 7 files changed, 441 insertions(+), 40 deletions(-)

diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst
index bb00c20922d36..d5cda03e55f26 100644
--- a/clang/docs/ClangFormatStyleOptions.rst
+++ b/clang/docs/ClangFormatStyleOptions.rst
@@ -6214,6 +6214,7 @@ the configuration (without a prefix: ``Auto``).
     # Example of usage:
     SpacesInParens: Custom
     SpacesInParensOptions:
+      ExceptDoubleParentheses: false
       InConditionalStatements: true
       InEmptyParentheses: true
 
@@ -6226,9 +6227,23 @@ the configuration (without a prefix: ``Auto``).
     # Should be declared this way:
     SpacesInParens: Custom
     SpacesInParensOptions:
+      ExceptDoubleParentheses: false
       InConditionalStatements: true
       Other: true
 
+  * ``bool ExceptDoubleParentheses`` Override any of the following options to prevent addition of space
+    between the first two parentheses in situations where a pair of
+    parentheses have been used.
+
+    .. code-block:: c++
+
+      true:
+      __attribute__(( noreturn ))
+      __decltype__(( x ))
+      if (( a = b ))
+     false:
+       Uses the applicable option.
+
   * ``bool InConditionalStatements`` Put a space in parentheses only inside conditional statements
     (``for/if/while/switch...``).
 
@@ -6242,8 +6257,9 @@ the configuration (without a prefix: ``Auto``).
 
     .. code-block:: c++
 
-       true:                                  false:
-       x = ( int32 )y                 vs.     x = (int32)y
+      true:                                  false:
+      x = ( int32 )y                  vs.    x = (int32)y
+      y = (( int (*)(int) )foo)(x);          y = ((int (*)(int))foo)(x);
 
   * ``bool InEmptyParentheses`` Insert a space in empty parentheses, i.e. ``()``.
 
@@ -6261,8 +6277,12 @@ the configuration (without a prefix: ``Auto``).
 
     .. code-block:: c++
 
-       true:                                  false:
-       t f( Deleted & ) & = delete;   vs.     t f(Deleted &) & = delete;
+      true:                                 false:
+      t f( Deleted & ) & = delete;    vs.   t f(Deleted &) & = delete;
+      decltype( ( x ) )                     decltype((x))
+      x = ( (int32)y )                      x = ((int32))y
+      y = ( (int ( * )( int ))foo )( x );   y = ((int (*)(int))foo)(x);
+       __attribute__( ( noreturn ) )        __attribute__((noreturn))
 
 
 .. _SpacesInParentheses:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 92ada517acae3..bbb24a59191fa 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -1079,6 +1079,9 @@ clang-format
 - Adds ``AllowShortCaseExpressionOnASingleLine`` option.
 - Adds ``AlignCaseArrows`` suboption to ``AlignConsecutiveShortCaseStatements``.
 - Adds ``LeftWithLastLine`` suboption to ``AlignEscapedNewlines``.
+- Add ``ExceptDoubleParentheses`` sub-option for ``SpacesInParensOptions``
+  to override addition of spaces between multiple, non-redundant parentheses
+  similar to the rules used for ``RemoveParentheses``.
 
 libclang
 --------
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index 7d257be10af42..3469cbad027c2 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -4650,10 +4650,23 @@ struct FormatStyle {
   ///   # Should be declared this way:
   ///   SpacesInParens: Custom
   ///   SpacesInParensOptions:
+  ///     ExceptDoubleParentheses: false
   ///     InConditionalStatements: true
   ///     Other: true
   /// \endcode
   struct SpacesInParensCustom {
+    /// Override any of the following options to prevent addition of space
+    /// between the first two parentheses in situations where a pair of
+    /// parentheses have been used.
+    /// \code
+    ///   true:
+    ///   __attribute__(( noreturn ))
+    ///   __decltype__(( x ))
+    ///   if (( a = b ))
+    /// \endcode
+    ///  false:
+    ///    Uses the applicable option.
+    bool ExceptDoubleParentheses;
     /// Put a space in parentheses only inside conditional statements
     /// (``for/if/while/switch...``).
     /// \code
@@ -4664,8 +4677,9 @@ struct FormatStyle {
     bool InConditionalStatements;
     /// Put a space in C style casts.
     /// \code
-    ///    true:                                  false:
-    ///    x = ( int32 )y                 vs.     x = (int32)y
+    ///   true:                                  false:
+    ///   x = ( int32 )y                  vs.    x = (int32)y
+    ///   y = (( int (*)(int) )foo)(x);          y = ((int (*)(int))foo)(x);
     /// \endcode
     bool InCStyleCasts;
     /// Insert a space in empty parentheses, i.e. ``()``.
@@ -4681,23 +4695,30 @@ struct FormatStyle {
     bool InEmptyParentheses;
     /// Put a space in parentheses not covered by preceding options.
     /// \code
-    ///    true:                                  false:
-    ///    t f( Deleted & ) & = delete;   vs.     t f(Deleted &) & = delete;
+    ///   true:                                 false:
+    ///   t f( Deleted & ) & = delete;    vs.   t f(Deleted &) & = delete;
+    ///   decltype( ( x ) )                     decltype((x))
+    ///   x = ( (int32)y )                      x = ((int32))y
+    ///   y = ( (int ( * )( int ))foo )( x );   y = ((int (*)(int))foo)(x);
+    ///    __attribute__( ( noreturn ) )        __attribute__((noreturn))
     /// \endcode
     bool Other;
 
     SpacesInParensCustom()
-        : InConditionalStatements(false), InCStyleCasts(false),
-          InEmptyParentheses(false), Other(false) {}
+        : ExceptDoubleParentheses(false), InConditionalStatements(false),
+          InCStyleCasts(false), InEmptyParentheses(false), Other(false) {}
 
-    SpacesInParensCustom(bool InConditionalStatements, bool InCStyleCasts,
+    SpacesInParensCustom(bool ExceptDoubleParentheses,
+                         bool InConditionalStatements, bool InCStyleCasts,
                          bool InEmptyParentheses, bool Other)
-        : InConditionalStatements(InConditionalStatements),
+        : ExceptDoubleParentheses(ExceptDoubleParentheses),
+          InConditionalStatements(InConditionalStatements),
           InCStyleCasts(InCStyleCasts), InEmptyParentheses(InEmptyParentheses),
           Other(Other) {}
 
     bool operator==(const SpacesInParensCustom &R) const {
-      return InConditionalStatements == R.InConditionalStatements &&
+      return ExceptDoubleParentheses == R.ExceptDoubleParentheses &&
+             InConditionalStatements == R.InConditionalStatements &&
              InCStyleCasts == R.InCStyleCasts &&
              InEmptyParentheses == R.InEmptyParentheses && Other == R.Other;
     }
@@ -4715,6 +4736,7 @@ struct FormatStyle {
   ///   # Example of usage:
   ///   SpacesInParens: Custom
   ///   SpacesInParensOptions:
+  ///     ExceptDoubleParentheses: false
   ///     InConditionalStatements: true
   ///     InEmptyParentheses: true
   /// \endcode
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index cd21fbb2221ac..e962c1689c4ed 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -721,6 +721,7 @@ template <> struct MappingTraits<FormatStyle::SpacesInLineComment> {
 
 template <> struct MappingTraits<FormatStyle::SpacesInParensCustom> {
   static void mapping(IO &IO, FormatStyle::SpacesInParensCustom &Spaces) {
+    IO.mapOptional("ExceptDoubleParentheses", Spaces.ExceptDoubleParentheses);
     IO.mapOptional("InCStyleCasts", Spaces.InCStyleCasts);
     IO.mapOptional("InConditionalStatements", Spaces.InConditionalStatements);
     IO.mapOptional("InEmptyParentheses", Spaces.InEmptyParentheses);
@@ -1175,8 +1176,8 @@ template <> struct MappingTraits<FormatStyle> {
         (SpacesInParentheses || SpaceInEmptyParentheses ||
          SpacesInConditionalStatement || SpacesInCStyleCastParentheses)) {
       if (SpacesInParentheses) {
-        // set all options except InCStyleCasts and InEmptyParentheses
-        // to true for backward compatibility.
+        // for backward compatibility.
+        Style.SpacesInParensOptions.ExceptDoubleParentheses = false;
         Style.SpacesInParensOptions.InConditionalStatements = true;
         Style.SpacesInParensOptions.InCStyleCasts =
             SpacesInCStyleCastParentheses;
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 87e3e712d6993..d931e4ba99f56 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -4346,19 +4346,6 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
        Right.is(tok::r_brace) && Right.isNot(BK_Block))) {
     return Style.SpacesInParensOptions.InEmptyParentheses;
   }
-  if (Style.SpacesInParensOptions.InConditionalStatements) {
-    const FormatToken *LeftParen = nullptr;
-    if (Left.is(tok::l_paren))
-      LeftParen = &Left;
-    else if (Right.is(tok::r_paren) && Right.MatchingParen)
-      LeftParen = Right.MatchingParen;
-    if (LeftParen) {
-      if (LeftParen->is(TT_ConditionLParen))
-        return true;
-      if (LeftParen->Previous && isKeywordWithCondition(*LeftParen->Previous))
-        return true;
-    }
-  }
 
   // trailing return type 'auto': []() -> auto {}, auto foo() -> auto {}
   if (Left.is(tok::kw_auto) && Right.isOneOf(TT_LambdaLBrace, TT_FunctionLBrace,
@@ -4385,11 +4372,60 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
   }
 
   if (Left.is(tok::l_paren) || Right.is(tok::r_paren)) {
-    return (Right.is(TT_CastRParen) ||
-            (Left.MatchingParen && Left.MatchingParen->is(TT_CastRParen)))
-               ? Style.SpacesInParensOptions.InCStyleCasts
-               : Style.SpacesInParensOptions.Other;
+    const FormatToken *LeftParen =
+        Left.is(tok::l_paren) ? &Left : Right.MatchingParen;
+    const FormatToken *RightParen =
+        LeftParen ? LeftParen->MatchingParen : nullptr;
+    const auto IsAttributeParen = [](const FormatToken *Paren) {
+      return Paren && Paren->isOneOf(TT_AttributeLParen, TT_AttributeRParen);
+    };
+    auto AddSpaceExceptInDoubleParens = [&]() {
+      const auto *RPrev = RightParen ? RightParen->Previous : nullptr;
+      const auto *LNext = LeftParen->Next;
+      const auto *LPrev = LeftParen->Previous;
+      if (!(RPrev && RPrev->is(tok::r_paren) && LNext &&
+            LNext->is(tok::l_paren))) {
+        return true;
+      }
+      auto HasEqualBeforeNextParen = [&]() {
+        auto *Tok = LNext;
+        if (!Tok || !Tok->is(tok::l_paren))
+          return false;
+        while ((Tok = Tok->Next) && !Tok->isOneOf(tok::l_paren, tok::r_paren))
+          if (Tok->is(tok::equal))
+            return true;
+        return false;
+      };
+      const bool SuppressSpace =
+          IsAttributeParen(LeftParen) ||
+          (LPrev && (LPrev->isOneOf(tok::kw___attribute, tok::kw_decltype) ||
+                     (HasEqualBeforeNextParen() &&
+                      (LPrev->isOneOf(tok::kw_if, tok::kw_while) ||
+                       LPrev->endsSequence(tok::kw_constexpr, tok::kw_if)))));
+      return !SuppressSpace;
+    };
+    const auto AddSpace = [&](bool Option) {
+      if (Style.SpacesInParensOptions.ExceptDoubleParentheses && Option)
+        return AddSpaceExceptInDoubleParens();
+      return Option;
+    };
+
+    if (LeftParen && (LeftParen->is(TT_ConditionLParen) ||
+                      (LeftParen->Previous &&
+                       isKeywordWithCondition(*LeftParen->Previous)))) {
+      return AddSpace(Style.SpacesInParensOptions.InConditionalStatements);
+    }
+    if (RightParen && RightParen->is(TT_CastRParen))
+      return AddSpace(Style.SpacesInParensOptions.InCStyleCasts);
+    if (IsAttributeParen(LeftParen) || IsAttributeParen(RightParen))
+      return AddSpace(Style.SpacesInParensOptions.Other);
+    if ((LeftParen && IsAttributeParen(LeftParen->Previous)) ||
+        (RightParen && IsAttributeParen(RightParen->Next))) {
+      return AddSpace(Style.SpacesInParensOptions.Other);
+    }
+    return AddSpace(Style.SpacesInParensOptions.Other);
   }
+
   if (Right.isOneOf(tok::semi, tok::comma))
     return false;
   if (Right.is(tok::less) && Line.Type == LT_ObjCDecl) {
diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp
index aded3ed2a6596..c0294a94ea714 100644
--- a/clang/unittests/Format/ConfigParseTest.cpp
+++ b/clang/unittests/Format/ConfigParseTest.cpp
@@ -236,6 +236,7 @@ TEST(ConfigParseTest, ParsesConfigurationBools) {
   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterOverloadedOperator);
   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterPlacementOperator);
   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, BeforeNonEmptyParentheses);
+  CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, ExceptDoubleParentheses);
   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InCStyleCasts);
   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InConditionalStatements);
   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InEmptyParentheses);
@@ -622,20 +623,24 @@ TEST(ConfigParseTest, ParsesConfiguration) {
               FormatStyle::SIPO_Custom);
   Style.SpacesInParens = FormatStyle::SIPO_Never;
   Style.SpacesInParensOptions = {};
-  CHECK_PARSE("SpacesInParentheses: true", SpacesInParensOptions,
-              FormatStyle::SpacesInParensCustom(true, false, false, true));
+  CHECK_PARSE(
+      "SpacesInParentheses: true", SpacesInParensOptions,
+      FormatStyle::SpacesInParensCustom(false, true, false, false, true));
   Style.SpacesInParens = FormatStyle::SIPO_Never;
   Style.SpacesInParensOptions = {};
-  CHECK_PARSE("SpacesInConditionalStatement: true", SpacesInParensOptions,
-              FormatStyle::SpacesInParensCustom(true, false, false, false));
+  CHECK_PARSE(
+      "SpacesInConditionalStatement: true", SpacesInParensOptions,
+      FormatStyle::SpacesInParensCustom(false, true, false, false, false));
   Style.SpacesInParens = FormatStyle::SIPO_Never;
   Style.SpacesInParensOptions = {};
-  CHECK_PARSE("SpacesInCStyleCastParentheses: true", SpacesInParensOptions,
-              FormatStyle::SpacesInParensCustom(false, true, false, false));
+  CHECK_PARSE(
+      "SpacesInCStyleCastParentheses: true", SpacesInParensOptions,
+      FormatStyle::SpacesInParensCustom(false, false, true, false, false));
   Style.SpacesInParens = FormatStyle::SIPO_Never;
   Style.SpacesInParensOptions = {};
-  CHECK_PARSE("SpaceInEmptyParentheses: true", SpacesInParensOptions,
-              FormatStyle::SpacesInParensCustom(false, false, true, false));
+  CHECK_PARSE(
+      "SpaceInEmptyParentheses: true", SpacesInParensOptions,
+      FormatStyle::SpacesInParensCustom(false, false, false, true, false));
   Style.SpacesInParens = FormatStyle::SIPO_Never;
   Style.SpacesInParensOptions = {};
 
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index db1decb20d626..fbd2256de59c8 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -17125,6 +17125,23 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces);
   verifyFormat("void __attribute__((naked)) foo(int bar)", Spaces);
   verifyFormat("void f() __attribute__((asdf));", Spaces);
+  verifyFormat("x = (int32)y;", Spaces);
+  verifyFormat("y = ((int (*)(int))foo)(x);", Spaces);
+  verifyFormat("decltype(x) y = 42;", Spaces);
+  verifyFormat("decltype((x)) y = z;", Spaces);
+  verifyFormat("decltype((foo())) a = foo();", Spaces);
+  verifyFormat("decltype((bar(10))) a = bar(11);", Spaces);
+  verifyFormat("if ((x - y) && (a ^ b))\n"
+               "  f();\n",
+               Spaces);
+  verifyFormat("for (int i = 0; i < 10; i = (i + 1))\n"
+               "  foo(i);",
+               Spaces);
+  verifyFormat("switch (x / (y + z)) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
 
   Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
   Spaces.SpacesInParensOptions = {};
@@ -17159,6 +17176,23 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("SomeType *__attribute__( ( attr ) ) *a = NULL;", Spaces);
   verifyFormat("void __attribute__( ( naked ) ) foo( int bar )", Spaces);
   verifyFormat("void f() __attribute__( ( asdf ) );", Spaces);
+  verifyFormat("x = (int32)y;", Spaces);
+  verifyFormat("y = ( (int ( * )( int ))foo )( x );", Spaces);
+  verifyFormat("decltype( x ) y = 42;", Spaces);
+  verifyFormat("decltype( ( x ) ) y = z;", Spaces);
+  verifyFormat("decltype( ( foo() ) ) a = foo();", Spaces);
+  verifyFormat("decltype( ( bar( 10 ) ) ) a = bar( 11 );", Spaces);
+  verifyFormat("if ( ( x - y ) && ( a ^ b ) )\n"
+               "  f();\n",
+               Spaces);
+  verifyFormat("for ( int i = 0; i < 10; i = ( i + 1 ) )\n"
+               "  foo( i );",
+               Spaces);
+  verifyFormat("switch ( x / ( y + z ) ) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
 
   Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
   Spaces.SpacesInParensOptions = {};
@@ -17171,6 +17205,7 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
   verifyFormat("#define x (( int )-1)", Spaces);
+  verifyFormat("y = (( int (*)(int) )foo)(x);", Spaces);
 
   // Run the first set of tests again with:
   Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
@@ -17203,6 +17238,23 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces);
   verifyFormat("void __attribute__((naked)) foo(int bar)", Spaces);
   verifyFormat("void f( ) __attribute__((asdf));", Spaces);
+  verifyFormat("x = ( int32 )y;", Spaces);
+  verifyFormat("y = (( int (*)(int) )foo)(x);", Spaces);
+  verifyFormat("decltype(x) y = 42;", Spaces);
+  verifyFormat("decltype((x)) y = z;", Spaces);
+  verifyFormat("decltype((foo( ))) a = foo( );", Spaces);
+  verifyFormat("decltype((bar(10))) a = bar(11);", Spaces);
+  verifyFormat("if ((x - y) && (a ^ b))\n"
+               "  f( );\n",
+               Spaces);
+  verifyFormat("for (int i = 0; i < 10; i = (i + 1))\n"
+               "  foo(i);",
+               Spaces);
+  verifyFormat("switch (x / (y + z)) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
 
   // Run the first set of tests again with:
   Spaces.SpaceAfterCStyleCast = true;
@@ -17310,6 +17362,268 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("size_t idx = (a->foo)(a - 1);", Spaces);
   verifyFormat("size_t idx = (*foo)(a - 1);", Spaces);
   verifyFormat("size_t idx = (*(foo))(a - 1);", Spaces);
+
+  // Check ExceptDoubleParentheses spaces
+  Spaces.IndentWidth = 2;
+  Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
+  Spaces.SpacesInParensOptions = {};
+  Spaces.SpacesInParensOptions.Other = true;
+  verifyFormat("SomeType *__attribute__( ( attr ) ) *a = NULL;", Spaces);
+  verifyFormat("void __attribute__( ( naked ) ) foo( int bar )", Spaces);
+  verifyFormat("void f() __attribute__( ( asdf ) );", Spaces);
+  verifyFormat("__attribute__( ( __aligned__( x ) ) ) z;", Spaces);
+  verifyFormat("int x __attribute__( ( aligned( 16 ) ) ) = 0;", Spaces);
+  verifyFormat("class __declspec( dllimport ) X {};", Spaces);
+  verifyFormat("class __declspec( ( dllimport ) ) X {};", Spaces);
+
+  Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
+  verifyFormat("SomeType *__attribute__(( attr )) *a = NULL;", Spaces);
+  verifyFormat("void __attribute__(( naked )) foo( int bar )", Spaces);
+  verifyFormat("void f() __attribute__(( asdf ));", Spaces);
+  verifyFormat("__attribute__(( __aligned__( x ) )) z;", Spaces);
+  verifyFormat("int x __attribute__(( aligned( 16 ) )) = 0;", Spaces);
+  verifyFormat("class __declspec( dllimport ) X {};", Spaces);
+  verifyFormat("class __declspec(( dllimport )) X {};", Spaces);
+
+  Spaces.SpacesInParensOptions.Other = false;
+  verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces);
+  verifyFormat("void __attribute__((naked)) foo(int bar)", Spaces);
+  verifyFormat("void f() __attribute__((asdf));", Spaces);
+  verifyFormat("__attribute__((__aligned__(x))) z;", Spaces);
+  verifyFormat("int x __attribute__((aligned(16))) = 0;", Spaces);
+  verifyFormat("class __declspec(dllimport) X {};", Spaces);
+  verifyFormat("class __declspec((dllimport)) X {};", Spaces);
+
+  Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
+  Spaces.SpacesInParensOptions = {};
+  Spaces.SpacesInParensOptions.InCStyleCasts = true;
+  verifyFormat("x = ( int32 )y;", Spaces);
+  verifyFormat("y = (( int (*)(int) )foo)(x);", Spaces);
+
+  Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
+  verifyFormat("x = ( int32 )y;", Spaces);
+  verifyFormat("y = (( int (*)(int) )foo)(x);", Spaces);
+
+  Spaces.SpacesInParensOptions.InCStyleCasts = false;
+  verifyFormat("x = (int32)y;", Spaces);
+  verifyFormat("y = ((int (*)(int))foo)(x);", Spaces);
+
+  Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
+  Spaces.SpacesInParensOptions = {};
+  Spaces.SpacesInParensOptions.InConditionalStatements = true;
+  verifyFormat("while ( (bool)1 )\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("while ( (i = j) )\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("for ( ;; )\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("if ( true )\n"
+               "  f();\n"
+               "else if ( true )\n"
+               "  f();",
+               Spaces);
+  verifyFormat("do {\n"
+               "  do_something((int)i);\n"
+               "} while ( something() );",
+               Spaces);
+  verifyFormat("do {\n"
+               "  do_something((int)i);\n"
+               "} while ( (i = i + 1) );",
+               Spaces);
+  verifyFormat("switch ( x ) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
+  verifyFormat("if ( (x - y) && (a ^ b) )\n"
+               "  f();\n",
+               Spaces);
+  verifyFormat("if ( (i = j) )\n"
+               "  do_something(i);",
+               Spaces);
+  verifyFormat("for ( int i = 0; i < 10; i = (i + 1) )\n"
+               "  foo(i);",
+               Spaces);
+  verifyFormat("switch ( x / (y + z) ) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
+  verifyFormat("if constexpr ( (a = b) )\n"
+               "  c;",
+               Spaces);
+  verifyFormat("if ( ({ a; }) )\n"
+               "  b;",
+               Spaces);
+
+  Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
+  verifyFormat("while ( (bool)1 )\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("while ((i = j))\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("for ( ;; )\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("if ( true )\n"
+               "  f();\n"
+               "else if ( true )\n"
+               "  f();",
+               Spaces);
+  verifyFormat("do {\n"
+               "  do_something((int)i);\n"
+               "} while ( something() );",
+               Spaces);
+  verifyFormat("do {\n"
+               "  do_something((int)i);\n"
+               "} while ((i = i + 1));",
+               Spaces);
+  verifyFormat("switch ( x ) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
+  verifyFormat("if ( (x - y) && (a ^ b) )\n"
+               "  f();\n",
+               Spaces);
+  verifyFormat("if ((i = j))\n"
+               "  do_something(i);",
+               Spaces);
+  verifyFormat("for ( int i = 0; i < 10; i = (i + 1) )\n"
+               "  foo(i);",
+               Spaces);
+  verifyFormat("switch ( x / (y + z) ) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
+  verifyFormat("if constexpr ((a = b))\n"
+               "  c;",
+               Spaces);
+
+  Spaces.SpacesInParensOptions.InConditionalStatements = false;
+  verifyFormat("while ((bool)1)\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("while ((i = j))\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("for (;;)\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("if (true)\n"
+               "  f();\n"
+               "else if (true)\n"
+               "  f();",
+               Spaces);
+  verifyFormat("do {\n"
+               "  do_something((int)i);\n"
+               "} while (something());",
+               Spaces);
+  verifyFormat("do {\n"
+               "  do_something((int)i);\n"
+               "} while ((i = i + 1));",
+               Spaces);
+  verifyFormat("switch (x) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
+  verifyFormat("if ((x - y) && (a ^ b))\n"
+               "  f();\n",
+               Spaces);
+  verifyFormat("if ((i = j))\n"
+               "  do_something(i);",
+               Spaces);
+  verifyFormat("for (int i = 0; i < 10; i = (i + 1))\n"
+               "  foo(i);",
+               Spaces);
+  verifyFormat("switch (x / (y + z)) {\n"
+               "default:\n"
+               "  break;\n"
+               "}",
+               Spaces);
+  verifyFormat("if constexpr ((a = b))\n"
+               "  c;",
+               Spaces);
+
+  Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
+  Spaces.SpacesInParensOptions = {};
+  Spaces.SpacesInParensOptions.Other = true;
+  verifyFormat("decltype( x ) y = 42;", Spaces);
+  verifyFormat("decltype( ( x ) ) y = z;", Spaces);
+  verifyFormat("decltype( ( foo() ) ) a = foo();", Spaces);
+  verifyFormat("decltype( ( bar( 10 ) ) ) a = bar( 11 );", Spaces);
+  verifyFormat("decltype( ( foo->bar ) ) baz;", Spaces);
+  verifyFormat("if (( i = j ))\n"
+               "  do_something( i );",
+               Spaces);
+  verifyFormat("if constexpr (( a = b ))\n"
+               "  c;",
+               Spaces);
+
+  Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
+  verifyFormat("decltype( x ) y = 42;", Spaces);
+  verifyFormat("decltype(( x )) y = z;", Spaces);
+  verifyFormat("decltype(( foo() )) a = foo();", Spaces);
+  verifyFormat("decltype(( bar( 10 ) )) a = bar( 11 );", Spaces);
+  verifyFormat("decltype(( foo->bar )) baz;", Spaces);
+  verifyFormat("if (( i = j ))\n"
+               "  do_something( i );",
+               Spaces);
+  verifyFormat("if constexpr (( a = b ))\n"
+               "  c;",
+               Spaces);
+
+  Spaces.SpacesInParensOptions.Other = false;
+  verifyFormat("decltype(x) y = 42;", Spaces);
+  verifyFormat("decltype((x)) y = z;", Spaces);
+  verifyFormat("decltype((foo())) a = foo();", Spaces);
+  verifyFormat("decltype((bar(10))) a = bar(11);", Spaces);
+  verifyFormat("decltype((foo->bar)) baz;", Spaces);
+  verifyFormat("if ((i = j))\n"
+               "  do_something(i);",
+               Spaces);
+  verifyFormat("if constexpr ((a = b))\n"
+               "  c;",
+               Spaces);
+
+  Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
+  Spaces.SpacesInParensOptions = {};
+  Spaces.SpacesInParensOptions.Other = true;
+  Spaces.SpacesInParensOptions.InConditionalStatements = true;
+  verifyFormat("if ( ( i = j ) )\n"
+               "  do_something( i );",
+               Spaces);
+  verifyFormat("if constexpr ( ( a = b ) )\n"
+               "  c;",
+               Spaces);
+  verifyFormat("while ( ( i = j ) )\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("do {\n"
+               "  do_something( (int)i );\n"
+               "} while ( ( i = i + 1 ) );",
+               Spaces);
+
+  Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
+  verifyFormat("if (( i = j ))\n"
+               "  do_something( i );",
+               Spaces);
+  verifyFormat("if constexpr (( a = b ))\n"
+               "  c;",
+               Spaces);
+  verifyFormat("while (( i = j ))\n"
+               "  continue;",
+               Spaces);
+  verifyFormat("do {\n"
+               "  do_something( (int)i );\n"
+               "} while (( i = i + 1 ));",
+               Spaces);
 }
 
 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {

>From 5cbcc799625c1c79af3a050f695018dc6aa269b6 Mon Sep 17 00:00:00 2001
From: Owen Pan <owenpiano at gmail.com>
Date: Mon, 27 May 2024 15:14:38 -0700
Subject: [PATCH 2/4] Improve the logic.

---
 clang/lib/Format/TokenAnnotator.cpp | 79 ++++++++++-------------------
 1 file changed, 26 insertions(+), 53 deletions(-)

diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index d931e4ba99f56..e3cd5819b13e5 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -4346,6 +4346,28 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
        Right.is(tok::r_brace) && Right.isNot(BK_Block))) {
     return Style.SpacesInParensOptions.InEmptyParentheses;
   }
+  if (Style.SpacesInParens == FormatStyle::SIPO_Custom &&
+      Style.SpacesInParensOptions.ExceptDoubleParentheses &&
+      Left.is(tok::r_paren) && Right.is(tok::r_paren)) {
+    auto *InnerLParen = Left.MatchingParen;
+    if (InnerLParen && InnerLParen->Previous == Right.MatchingParen) {
+      InnerLParen->SpacesRequiredBefore = 0;
+      return false;
+    }
+  }
+  if (Style.SpacesInParensOptions.InConditionalStatements) {
+    const FormatToken *LeftParen = nullptr;
+    if (Left.is(tok::l_paren))
+      LeftParen = &Left;
+    else if (Right.is(tok::r_paren) && Right.MatchingParen)
+      LeftParen = Right.MatchingParen;
+    if (LeftParen) {
+      if (LeftParen->is(TT_ConditionLParen))
+        return true;
+      if (LeftParen->Previous && isKeywordWithCondition(*LeftParen->Previous))
+        return true;
+    }
+  }
 
   // trailing return type 'auto': []() -> auto {}, auto foo() -> auto {}
   if (Left.is(tok::kw_auto) && Right.isOneOf(TT_LambdaLBrace, TT_FunctionLBrace,
@@ -4372,60 +4394,11 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
   }
 
   if (Left.is(tok::l_paren) || Right.is(tok::r_paren)) {
-    const FormatToken *LeftParen =
-        Left.is(tok::l_paren) ? &Left : Right.MatchingParen;
-    const FormatToken *RightParen =
-        LeftParen ? LeftParen->MatchingParen : nullptr;
-    const auto IsAttributeParen = [](const FormatToken *Paren) {
-      return Paren && Paren->isOneOf(TT_AttributeLParen, TT_AttributeRParen);
-    };
-    auto AddSpaceExceptInDoubleParens = [&]() {
-      const auto *RPrev = RightParen ? RightParen->Previous : nullptr;
-      const auto *LNext = LeftParen->Next;
-      const auto *LPrev = LeftParen->Previous;
-      if (!(RPrev && RPrev->is(tok::r_paren) && LNext &&
-            LNext->is(tok::l_paren))) {
-        return true;
-      }
-      auto HasEqualBeforeNextParen = [&]() {
-        auto *Tok = LNext;
-        if (!Tok || !Tok->is(tok::l_paren))
-          return false;
-        while ((Tok = Tok->Next) && !Tok->isOneOf(tok::l_paren, tok::r_paren))
-          if (Tok->is(tok::equal))
-            return true;
-        return false;
-      };
-      const bool SuppressSpace =
-          IsAttributeParen(LeftParen) ||
-          (LPrev && (LPrev->isOneOf(tok::kw___attribute, tok::kw_decltype) ||
-                     (HasEqualBeforeNextParen() &&
-                      (LPrev->isOneOf(tok::kw_if, tok::kw_while) ||
-                       LPrev->endsSequence(tok::kw_constexpr, tok::kw_if)))));
-      return !SuppressSpace;
-    };
-    const auto AddSpace = [&](bool Option) {
-      if (Style.SpacesInParensOptions.ExceptDoubleParentheses && Option)
-        return AddSpaceExceptInDoubleParens();
-      return Option;
-    };
-
-    if (LeftParen && (LeftParen->is(TT_ConditionLParen) ||
-                      (LeftParen->Previous &&
-                       isKeywordWithCondition(*LeftParen->Previous)))) {
-      return AddSpace(Style.SpacesInParensOptions.InConditionalStatements);
-    }
-    if (RightParen && RightParen->is(TT_CastRParen))
-      return AddSpace(Style.SpacesInParensOptions.InCStyleCasts);
-    if (IsAttributeParen(LeftParen) || IsAttributeParen(RightParen))
-      return AddSpace(Style.SpacesInParensOptions.Other);
-    if ((LeftParen && IsAttributeParen(LeftParen->Previous)) ||
-        (RightParen && IsAttributeParen(RightParen->Next))) {
-      return AddSpace(Style.SpacesInParensOptions.Other);
-    }
-    return AddSpace(Style.SpacesInParensOptions.Other);
+    return (Right.is(TT_CastRParen) ||
+            (Left.MatchingParen && Left.MatchingParen->is(TT_CastRParen)))
+               ? Style.SpacesInParensOptions.InCStyleCasts
+               : Style.SpacesInParensOptions.Other;
   }
-
   if (Right.isOneOf(tok::semi, tok::comma))
     return false;
   if (Right.is(tok::less) && Line.Type == LT_ObjCDecl) {

>From 3a1c90165c1f5aa325961dc7da3a29cb3b40f846 Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Fri, 31 May 2024 12:32:43 -0600
Subject: [PATCH 3/4] FormatTest: fix and add test cases for
 ExceptDoubleParentheses

---
 clang/unittests/Format/FormatTest.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index fbd2256de59c8..26cd77dfc8a23 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -17375,6 +17375,8 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("int x __attribute__( ( aligned( 16 ) ) ) = 0;", Spaces);
   verifyFormat("class __declspec( dllimport ) X {};", Spaces);
   verifyFormat("class __declspec( ( dllimport ) ) X {};", Spaces);
+  verifyFormat("int x = ( ( a - 1 ) * 3 );", Spaces);
+  verifyFormat("int x = ( 3 * ( a - 1 ) );", Spaces);
 
   Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
   verifyFormat("SomeType *__attribute__(( attr )) *a = NULL;", Spaces);
@@ -17384,6 +17386,8 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("int x __attribute__(( aligned( 16 ) )) = 0;", Spaces);
   verifyFormat("class __declspec( dllimport ) X {};", Spaces);
   verifyFormat("class __declspec(( dllimport )) X {};", Spaces);
+  verifyFormat("int x = ( ( a - 1 ) * 3 );", Spaces);
+  verifyFormat("int x = ( 3 * ( a - 1 ) );", Spaces);
 
   Spaces.SpacesInParensOptions.Other = false;
   verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces);
@@ -17559,10 +17563,10 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("decltype( ( foo() ) ) a = foo();", Spaces);
   verifyFormat("decltype( ( bar( 10 ) ) ) a = bar( 11 );", Spaces);
   verifyFormat("decltype( ( foo->bar ) ) baz;", Spaces);
-  verifyFormat("if (( i = j ))\n"
+  verifyFormat("if ( ( i = j ) )\n"
                "  do_something( i );",
                Spaces);
-  verifyFormat("if constexpr (( a = b ))\n"
+  verifyFormat("if constexpr ( ( a = b ) )\n"
                "  c;",
                Spaces);
 

>From 7714c5a0b043c6259df55b3aaaf8a2680dd87180 Mon Sep 17 00:00:00 2001
From: Gedare Bloom <gedare at rtems.org>
Date: Thu, 20 Jun 2024 12:19:05 -0600
Subject: [PATCH 4/4] Address review comments

---
 clang/docs/ClangFormatStyleOptions.rst |   7 +-
 clang/include/clang/Format/Format.h    |   7 +-
 clang/lib/Format/Format.cpp            |   2 +-
 clang/unittests/Format/FormatTest.cpp  | 219 +------------------------
 4 files changed, 8 insertions(+), 227 deletions(-)

diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst
index d5cda03e55f26..3c24fa6784fb5 100644
--- a/clang/docs/ClangFormatStyleOptions.rst
+++ b/clang/docs/ClangFormatStyleOptions.rst
@@ -6232,8 +6232,7 @@ the configuration (without a prefix: ``Auto``).
       Other: true
 
   * ``bool ExceptDoubleParentheses`` Override any of the following options to prevent addition of space
-    between the first two parentheses in situations where a pair of
-    parentheses have been used.
+    when both opening and closing parentheses use multiple parentheses.
 
     .. code-block:: c++
 
@@ -6279,10 +6278,6 @@ the configuration (without a prefix: ``Auto``).
 
       true:                                 false:
       t f( Deleted & ) & = delete;    vs.   t f(Deleted &) & = delete;
-      decltype( ( x ) )                     decltype((x))
-      x = ( (int32)y )                      x = ((int32))y
-      y = ( (int ( * )( int ))foo )( x );   y = ((int (*)(int))foo)(x);
-       __attribute__( ( noreturn ) )        __attribute__((noreturn))
 
 
 .. _SpacesInParentheses:
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index 3469cbad027c2..3a09ea0f0b28b 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -4656,8 +4656,7 @@ struct FormatStyle {
   /// \endcode
   struct SpacesInParensCustom {
     /// Override any of the following options to prevent addition of space
-    /// between the first two parentheses in situations where a pair of
-    /// parentheses have been used.
+    /// when both opening and closing parentheses use multiple parentheses.
     /// \code
     ///   true:
     ///   __attribute__(( noreturn ))
@@ -4697,10 +4696,6 @@ struct FormatStyle {
     /// \code
     ///   true:                                 false:
     ///   t f( Deleted & ) & = delete;    vs.   t f(Deleted &) & = delete;
-    ///   decltype( ( x ) )                     decltype((x))
-    ///   x = ( (int32)y )                      x = ((int32))y
-    ///   y = ( (int ( * )( int ))foo )( x );   y = ((int (*)(int))foo)(x);
-    ///    __attribute__( ( noreturn ) )        __attribute__((noreturn))
     /// \endcode
     bool Other;
 
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index e962c1689c4ed..e5ef71aaa6c7f 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -1176,7 +1176,7 @@ template <> struct MappingTraits<FormatStyle> {
         (SpacesInParentheses || SpaceInEmptyParentheses ||
          SpacesInConditionalStatement || SpacesInCStyleCastParentheses)) {
       if (SpacesInParentheses) {
-        // for backward compatibility.
+        // For backward compatibility.
         Style.SpacesInParensOptions.ExceptDoubleParentheses = false;
         Style.SpacesInParensOptions.InConditionalStatements = true;
         Style.SpacesInParensOptions.InCStyleCasts =
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 26cd77dfc8a23..5eba4cac1bbae 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -17368,16 +17368,6 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
   Spaces.SpacesInParensOptions = {};
   Spaces.SpacesInParensOptions.Other = true;
-  verifyFormat("SomeType *__attribute__( ( attr ) ) *a = NULL;", Spaces);
-  verifyFormat("void __attribute__( ( naked ) ) foo( int bar )", Spaces);
-  verifyFormat("void f() __attribute__( ( asdf ) );", Spaces);
-  verifyFormat("__attribute__( ( __aligned__( x ) ) ) z;", Spaces);
-  verifyFormat("int x __attribute__( ( aligned( 16 ) ) ) = 0;", Spaces);
-  verifyFormat("class __declspec( dllimport ) X {};", Spaces);
-  verifyFormat("class __declspec( ( dllimport ) ) X {};", Spaces);
-  verifyFormat("int x = ( ( a - 1 ) * 3 );", Spaces);
-  verifyFormat("int x = ( 3 * ( a - 1 ) );", Spaces);
-
   Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
   verifyFormat("SomeType *__attribute__(( attr )) *a = NULL;", Spaces);
   verifyFormat("void __attribute__(( naked )) foo( int bar )", Spaces);
@@ -17388,81 +17378,15 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("class __declspec(( dllimport )) X {};", Spaces);
   verifyFormat("int x = ( ( a - 1 ) * 3 );", Spaces);
   verifyFormat("int x = ( 3 * ( a - 1 ) );", Spaces);
-
-  Spaces.SpacesInParensOptions.Other = false;
-  verifyFormat("SomeType *__attribute__((attr)) *a = NULL;", Spaces);
-  verifyFormat("void __attribute__((naked)) foo(int bar)", Spaces);
-  verifyFormat("void f() __attribute__((asdf));", Spaces);
-  verifyFormat("__attribute__((__aligned__(x))) z;", Spaces);
-  verifyFormat("int x __attribute__((aligned(16))) = 0;", Spaces);
-  verifyFormat("class __declspec(dllimport) X {};", Spaces);
-  verifyFormat("class __declspec((dllimport)) X {};", Spaces);
-
-  Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
-  Spaces.SpacesInParensOptions = {};
-  Spaces.SpacesInParensOptions.InCStyleCasts = true;
-  verifyFormat("x = ( int32 )y;", Spaces);
-  verifyFormat("y = (( int (*)(int) )foo)(x);", Spaces);
-
-  Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
-  verifyFormat("x = ( int32 )y;", Spaces);
-  verifyFormat("y = (( int (*)(int) )foo)(x);", Spaces);
-
-  Spaces.SpacesInParensOptions.InCStyleCasts = false;
-  verifyFormat("x = (int32)y;", Spaces);
-  verifyFormat("y = ((int (*)(int))foo)(x);", Spaces);
+  verifyFormat("decltype( x ) y = 42;", Spaces);
+  verifyFormat("decltype(( bar( 10 ) )) a = bar( 11 );", Spaces);
+  verifyFormat("if (( i = j ))\n"
+               "  do_something( i );",
+               Spaces);
 
   Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
   Spaces.SpacesInParensOptions = {};
   Spaces.SpacesInParensOptions.InConditionalStatements = true;
-  verifyFormat("while ( (bool)1 )\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("while ( (i = j) )\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("for ( ;; )\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("if ( true )\n"
-               "  f();\n"
-               "else if ( true )\n"
-               "  f();",
-               Spaces);
-  verifyFormat("do {\n"
-               "  do_something((int)i);\n"
-               "} while ( something() );",
-               Spaces);
-  verifyFormat("do {\n"
-               "  do_something((int)i);\n"
-               "} while ( (i = i + 1) );",
-               Spaces);
-  verifyFormat("switch ( x ) {\n"
-               "default:\n"
-               "  break;\n"
-               "}",
-               Spaces);
-  verifyFormat("if ( (x - y) && (a ^ b) )\n"
-               "  f();\n",
-               Spaces);
-  verifyFormat("if ( (i = j) )\n"
-               "  do_something(i);",
-               Spaces);
-  verifyFormat("for ( int i = 0; i < 10; i = (i + 1) )\n"
-               "  foo(i);",
-               Spaces);
-  verifyFormat("switch ( x / (y + z) ) {\n"
-               "default:\n"
-               "  break;\n"
-               "}",
-               Spaces);
-  verifyFormat("if constexpr ( (a = b) )\n"
-               "  c;",
-               Spaces);
-  verifyFormat("if ( ({ a; }) )\n"
-               "  b;",
-               Spaces);
-
   Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
   verifyFormat("while ( (bool)1 )\n"
                "  continue;",
@@ -17470,14 +17394,6 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("while ((i = j))\n"
                "  continue;",
                Spaces);
-  verifyFormat("for ( ;; )\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("if ( true )\n"
-               "  f();\n"
-               "else if ( true )\n"
-               "  f();",
-               Spaces);
   verifyFormat("do {\n"
                "  do_something((int)i);\n"
                "} while ( something() );",
@@ -17486,11 +17402,6 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
                "  do_something((int)i);\n"
                "} while ((i = i + 1));",
                Spaces);
-  verifyFormat("switch ( x ) {\n"
-               "default:\n"
-               "  break;\n"
-               "}",
-               Spaces);
   verifyFormat("if ( (x - y) && (a ^ b) )\n"
                "  f();\n",
                Spaces);
@@ -17508,126 +17419,6 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {
   verifyFormat("if constexpr ((a = b))\n"
                "  c;",
                Spaces);
-
-  Spaces.SpacesInParensOptions.InConditionalStatements = false;
-  verifyFormat("while ((bool)1)\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("while ((i = j))\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("for (;;)\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("if (true)\n"
-               "  f();\n"
-               "else if (true)\n"
-               "  f();",
-               Spaces);
-  verifyFormat("do {\n"
-               "  do_something((int)i);\n"
-               "} while (something());",
-               Spaces);
-  verifyFormat("do {\n"
-               "  do_something((int)i);\n"
-               "} while ((i = i + 1));",
-               Spaces);
-  verifyFormat("switch (x) {\n"
-               "default:\n"
-               "  break;\n"
-               "}",
-               Spaces);
-  verifyFormat("if ((x - y) && (a ^ b))\n"
-               "  f();\n",
-               Spaces);
-  verifyFormat("if ((i = j))\n"
-               "  do_something(i);",
-               Spaces);
-  verifyFormat("for (int i = 0; i < 10; i = (i + 1))\n"
-               "  foo(i);",
-               Spaces);
-  verifyFormat("switch (x / (y + z)) {\n"
-               "default:\n"
-               "  break;\n"
-               "}",
-               Spaces);
-  verifyFormat("if constexpr ((a = b))\n"
-               "  c;",
-               Spaces);
-
-  Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
-  Spaces.SpacesInParensOptions = {};
-  Spaces.SpacesInParensOptions.Other = true;
-  verifyFormat("decltype( x ) y = 42;", Spaces);
-  verifyFormat("decltype( ( x ) ) y = z;", Spaces);
-  verifyFormat("decltype( ( foo() ) ) a = foo();", Spaces);
-  verifyFormat("decltype( ( bar( 10 ) ) ) a = bar( 11 );", Spaces);
-  verifyFormat("decltype( ( foo->bar ) ) baz;", Spaces);
-  verifyFormat("if ( ( i = j ) )\n"
-               "  do_something( i );",
-               Spaces);
-  verifyFormat("if constexpr ( ( a = b ) )\n"
-               "  c;",
-               Spaces);
-
-  Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
-  verifyFormat("decltype( x ) y = 42;", Spaces);
-  verifyFormat("decltype(( x )) y = z;", Spaces);
-  verifyFormat("decltype(( foo() )) a = foo();", Spaces);
-  verifyFormat("decltype(( bar( 10 ) )) a = bar( 11 );", Spaces);
-  verifyFormat("decltype(( foo->bar )) baz;", Spaces);
-  verifyFormat("if (( i = j ))\n"
-               "  do_something( i );",
-               Spaces);
-  verifyFormat("if constexpr (( a = b ))\n"
-               "  c;",
-               Spaces);
-
-  Spaces.SpacesInParensOptions.Other = false;
-  verifyFormat("decltype(x) y = 42;", Spaces);
-  verifyFormat("decltype((x)) y = z;", Spaces);
-  verifyFormat("decltype((foo())) a = foo();", Spaces);
-  verifyFormat("decltype((bar(10))) a = bar(11);", Spaces);
-  verifyFormat("decltype((foo->bar)) baz;", Spaces);
-  verifyFormat("if ((i = j))\n"
-               "  do_something(i);",
-               Spaces);
-  verifyFormat("if constexpr ((a = b))\n"
-               "  c;",
-               Spaces);
-
-  Spaces.SpacesInParens = FormatStyle::SIPO_Custom;
-  Spaces.SpacesInParensOptions = {};
-  Spaces.SpacesInParensOptions.Other = true;
-  Spaces.SpacesInParensOptions.InConditionalStatements = true;
-  verifyFormat("if ( ( i = j ) )\n"
-               "  do_something( i );",
-               Spaces);
-  verifyFormat("if constexpr ( ( a = b ) )\n"
-               "  c;",
-               Spaces);
-  verifyFormat("while ( ( i = j ) )\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("do {\n"
-               "  do_something( (int)i );\n"
-               "} while ( ( i = i + 1 ) );",
-               Spaces);
-
-  Spaces.SpacesInParensOptions.ExceptDoubleParentheses = true;
-  verifyFormat("if (( i = j ))\n"
-               "  do_something( i );",
-               Spaces);
-  verifyFormat("if constexpr (( a = b ))\n"
-               "  c;",
-               Spaces);
-  verifyFormat("while (( i = j ))\n"
-               "  continue;",
-               Spaces);
-  verifyFormat("do {\n"
-               "  do_something( (int)i );\n"
-               "} while (( i = i + 1 ));",
-               Spaces);
 }
 
 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {



More information about the cfe-commits mailing list