[clang] [clang-format] Don't insert a space between :: and * (PR #105043)

kadir çetinkaya via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 21 23:19:53 PDT 2024


================
@@ -4591,7 +4589,9 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
     if (!BeforeLeft)
       return false;
     if (BeforeLeft->is(tok::coloncolon)) {
-      return Left.is(tok::star) &&
+      const auto *Prev = BeforeLeft->Previous;
+      return Left.is(tok::star) && Prev &&
+             !Prev->endsSequence(tok::identifier, TT_FunctionTypeLParen) &&
----------------
kadircet wrote:

i think it's actually common enough to handle in this patch, https://github.com/search?q=lang%3Acpp+%2F%3A%3A%5Cw%2B%3A%3A%5C*%5C%29%2F&type=code.

moreover we also have cases like `(std::remove_pointer<O>::type::*)`. so it might actually be easier to match by going forward (which should also ensure we do less operations)? e.g. something like:
```
// Don't add space around function-type pointers.
// - void (*foo)(int);
// - void (::B::*foo)(int);
// - void (A<T>::B::*)(int);
auto OpeningParen = Right.MatchingParen;
if (!OpeningParen && Right.Next)
  OpeningParen = Right.Next->MatchingParen;
if (OpeningParen && OpeningParen->is(TT_FunctionTypeLParen))
  return false;

if (BeforeLeft->is(tok::coloncolon))
  return true;
```

https://github.com/llvm/llvm-project/pull/105043


More information about the cfe-commits mailing list