inclyc added inline comments.
================ Comment at: clang/test/Parser/while-loop-outside-function.c:8 + +void some_fn(); + ---------------- mizvekov wrote: > Can you add a few more test cases showing how error recovery is performing > here? > > Have we parsed this function declaration at all, or were we skipping until > the next ';'? > > What happens if there are (multiple) statements in the loop's block? > > How do we handle a `do ... while()` loop instead? > > Does it make a difference if the loop contains a block or a (possibly empty) > single statement? For this occasion, ``` // RUN: %clang_cc1 -fsyntax-only -verify %s while(true) {}; // expected-error {{while loop outside of function}} // without semicolon while(true) {} // expected-error {{while loop outside of function}} while(true) { // some statements int some_var = 3; some_var += 2; } while(true) { // some statements int some_var = 3; some_var += 2; } do { int some_var = 1; some_var += 3; } while(true); void someFunction() { while(true) {}; } class SomeClass { public: while(true) {} void some_fn() { while(true) {} } }; ``` ``` ./clang/test/Parser/while-loop-outside-function.cpp:3:1: error: while loop outside of function while(true) {}; // expected-error {{while loop outside of function}} ^ ./clang/test/Parser/while-loop-outside-function.cpp:6:1: error: while loop outside of function while(true) {} // expected-error {{while loop outside of function}} ^ ./clang/test/Parser/while-loop-outside-function.cpp:9:1: error: while loop outside of function while(true) { ^ ./clang/test/Parser/while-loop-outside-function.cpp:15:1: error: while loop outside of function while(true) ^ ./clang/test/Parser/while-loop-outside-function.cpp:22:1: error: expected unqualified-id do { ^ ./clang/test/Parser/while-loop-outside-function.cpp:26:1: error: while loop outside of function while(true); ^ ./clang/test/Parser/while-loop-outside-function.cpp:34:5: error: expected member name or ';' after declaration specifiers while(true) {} ^ 7 errors generated. ``` The parser generates the newly added error for every "top-level" declarator. For `do ... while(...)` loops it generates two errors. I think ideally only one error should be reported, only generating an error at the latter while token, without generating a "noise" at the preceding `do`. And, this patch doesn't seem to produce good results where classes, structs, etc. are also not part of the function body. At first, when I solved this issue, I thought he only needed to report the appearance of the top-level while loop, without considering do-while, in a class, or in a structure. So the current code is only in Parser, this error is reported when the `while` token is encountered parsing declarators. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D129573/new/ https://reviews.llvm.org/D129573 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits