Quuxplusone accepted this revision.
Quuxplusone added a comment.
This revision is now accepted and ready to land.

LGTM % comments. I agree with all the formatting decisions shown in the new 
tests.



================
Comment at: clang/docs/ReleaseNotes.rst:270
 
+- Improved Coroutinues support.
+
----------------
s/nues/nes/
In fact, you might just say `- Improved support for C++20 Modules and 
Coroutines.`


================
Comment at: clang/lib/Format/TokenAnnotator.cpp:2957
 
+  // Coroutines
+  if (Right.is(tok::l_paren) && Left.is(tok::kw_co_await) && Left.Previous &&
----------------
The comment style on line 2953 seems strictly more useful to me. Is it correct 
to say
```
// co_await (x), co_yield (x), co_return (x)
```
and before line 2961,
```
// co_return;
```
FYI, `co_await;` and `co_yield;` are not currently valid C++; but I agree with 
the formatting you've chosen here. Please add a test for `"co_await;"` and 
`"co_yield;"` just to make sure it doesn't regress (even though it's invalid 
C++20).
Aside: I could even see `co_yield;` one day becoming valid C++ ("yielding void" 
to its awaiter).


================
Comment at: clang/unittests/Format/FormatTest.cpp:22713
 
+TEST_F(FormatTest, CoRoutineawaitForRangeCpp11) {
+  FormatStyle Style = getLLVMStyle();
----------------
s/CoRoutine/Coroutine/g
Nits:
- I'd just call this function `CoroutineForCoawait`
- Why `"for co_await (auto x : range())\n  ;"` as one string on line 22715, but 
then split strings on lines 22716-22718 and 22719-22721? Wouldn't it look 
simpler to use e.g. `"for co_await (auto i : arr) {\n}"` on line 22719?
- Line 22716 is not using `co_await` — is this deliberate or accidental?
- It might make sense to put all `for`-related tests close together in the test 
file — `for`, `for co_await`, `for constexpr`, `template for`, whatever else we 
come up with. I don't know if there are any tests for anything but vanilla 
`for` at the moment.


================
Comment at: clang/unittests/Format/FormatTest.cpp:22727
+
+TEST_F(FormatTest, CoRoutineawait) {
+  verifyFormat("int x = co_await foo();");
----------------



================
Comment at: clang/unittests/Format/FormatTest.cpp:22731
+  verifyFormat("co_await (42);");
+  verifyFormat("void operator co_await(int);");
+  verifyFormat("co_await a;");
----------------
just to make sure the name `int` isn't being treated as magic by clang-format


================
Comment at: clang/unittests/Format/FormatTest.cpp:22756
+  verifyFormat("co_yield 42;");
+  verifyFormat("co_yield n++;");
+}
----------------
IIRC, before we lexed `co_yield` as a keyword, we used to do `co_yield++ n;`. I 
don't see any way for `co_yield n++;` to get misformatted, though: 
`co_yieldn++;` would obviously never happen.


================
Comment at: clang/unittests/Format/FormatTest.cpp:22748-22749
+TEST_F(FormatTest, CoRoutinereturn) {
+  verifyFormat("int x = co_return foo();");
+  verifyFormat("int x = (co_return foo());");
+  verifyFormat("co_return (42);");
----------------
ChuanqiXu wrote:
> MyDeveloperDay wrote:
> > ChuanqiXu wrote:
> > > These two statements looks invalid.
> > do you mean these two?
> > 
> > ```
> > verifyFormat("int x = co_return foo();");
> > verifyFormat("int x = (co_return foo());");
> > ```
> > 
> > I lifted these from {D34225}
> yeah, since it is meaningless to me since we couldn't evaluate the value of 
> `co_return` expression.
I agree with @ChuanqiXu: `int x = co_return foo();` is invalid and unrealistic 
syntax. As usual, I'm ambivalent on whether it makes sense to test invalid 
inputs (since we still don't want to //crash// on them).


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

https://reviews.llvm.org/D114859

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

Reply via email to