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

Reply via email to