[PATCH] D129573: [Clang] add a diagnostic note 'while loop outside functions' at global scope
YingChi Long via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 18 17:42:24 PDT 2022
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
More information about the cfe-commits
mailing list