MyDeveloperDay marked 2 inline comments as done.
MyDeveloperDay added inline comments.


================
Comment at: clang/lib/Format/TokenAnnotator.cpp:2090
         continue;
+      if (Next->isOneOf(tok::star, tok::arrow))
+        continue;
----------------
sammccall wrote:
> MyDeveloperDay wrote:
> > sammccall wrote:
> > > This seems like it's supposed to be handled by the token annotator, and 
> > > the same cause will result in bugs in other places - why aren't these 
> > > tokens being marked as TT_OverloadedOperator?
> > > 
> > > I'd guess the deeper fix is in the `kw_operator` case in consumeToken(). 
> > > The way it's written looks suspect, though I'm not an expert on any of 
> > > this.
> > The * from *() is already labelled as a TT_PointerOrRefernce so can't also 
> > be marked as an Overloaded operator so use that in the loop.
> Right, the fact that it's incorrectly labeled as a PointerOrReference is a 
> bug, is it not possible to fix that instead of working around it here?
> 
> In the consumeToken loop, it seems the `*` in `operator *`  is labeled as 
> PointerOrReference by logic that's trying to handle e.g. `StringRef::operator 
> char*()`. However when the `*` is _immediately_ preceded by `operator`, it's 
> always an overloaded operator name rather than a pointer, I think?
Treating `*` and `->` as an TT_OverloadedOperator is probably ok, although this 
breaks unit test I highlight below, which I almost think is incorrect anyway.

I'm looking into a related issue https://bugs.llvm.org/show_bug.cgi?id=43783, 
which is changing this code again, I may roll both changes into the same fix

However this is made much more complex to deal with it just by using the 
`TT_OverloadedOperator` when the operator consists of 2 tokens say like `[` and 
`]` unless I combine them into a single token.

```
operator void*()
operator char*()
operator []()
```

hence the need for code to handle in this loop for handling.

```
operator new[]()
operator delete[]()
```


================
Comment at: clang/lib/Format/TokenAnnotator.cpp:955
             CurrentToken->Previous->isOneOf(TT_BinaryOperator, 
TT_UnaryOperator,
-                                            tok::comma))
+                                            tok::comma, tok::star, tok::arrow))
           CurrentToken->Previous->Type = TT_OverloadedOperator;
----------------
sammccall wrote:
> I'm confused about this: ISTM that where we were previously always treating 
> star as a pointer, now we're always treating it as an operator name.
> Whereas it's sometimes an operator name (immediately after the `operator` 
> keyword) and sometimes a pointer (following a type name).
> 
> Maybe we should shift the OverloadedOperator labelling outside the loop 
> (since AFAICT it should only apply to the first token) and then keep the loop 
> to mark stars/amps elsewhere in the operator name as PointerOrReference?
Let me take another look..


================
Comment at: clang/unittests/Format/FormatTest.cpp:6989
   verifyFormat("operator int();");
-  verifyFormat("operator void *();");
+  verifyFormat("operator void*();");
   verifyFormat("operator SomeType<int>();");
----------------
sammccall wrote:
> this looks like a regression at first glance, in LLVM style there's a space 
> between type and *
yes, I was a little concerned about this change too, it's hard to know if 
`operator void *` was intended as it falls off the bottom of the spacesBetween 
function with a return true; but if you are concerned then perhaps its better 
to change it back.


================
Comment at: clang/unittests/Format/FormatTest.cpp:6962
   verifyFormat("operator int();");
   verifyFormat("operator void *();");
   verifyFormat("operator SomeType<int>();");
----------------
Treating * as TT_OverloadedOperator will break this test, which perhaps is 
already wrong!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D69573/new/

https://reviews.llvm.org/D69573



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to