This adds a new error for missing parentheses around lambdas in delete operators.
int main() {
delete []() { return new int(); }();
}This will result in:
test.cpp:2:3: error: '[]' after delete interpreted as 'delete[]'
delete []() { return new int(); }();
^~~~~~~~~
test.cpp:2:9: note: add parentheses around the lambda
delete []() { return new int(); }();
^
( )
This seems error-prone. Given:
for (item *p = first, *oldp = p; p; p = p->next, delete [] oldp, oldp = p) { /*...*/; }... we'll decide the delete-expression is followed by a lambda. Likewise for cases like:
delete [] f->getPtr([] { return blah; });Our goal here should be a fast heuristic (don't use lookahead except when you're already confident you have a lambda) and zero false positives. How about these heuristics instead:
Assume that the delete [] is actually delete followed by a lambda if either:
This should have no false positives, and only has false negatives if a lambda has an unnamed parameter or a parameter with a non-trivial parameter type. (For the last condition, we could try to tentatively parse an entire parameter and see if it has a name, which would handle all cases except an expression/declaration ambiguity in the parameter declaration, but that seems like overkill to me. This is already performing more lookahead than I'd like, but delete [] expressions are rare enough that using two lookahead tokens for an improved error message seems OK.)