[PATCH] D36357: Added a better diagnostic when using the delete operator with lambdas

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue May 14 16:08:54 PDT 2019


rsmith added a comment.

In D36357#1501999 <https://reviews.llvm.org/D36357#1501999>, @Rakete1111 wrote:

> In D36357#1501961 <https://reviews.llvm.org/D36357#1501961>, @rsmith wrote:
>
> > In D36357#1500949 <https://reviews.llvm.org/D36357#1500949>, @Rakete1111 wrote:
> >
> > > How should I do this? Do I just skip to the next `}`, or also take into account  any additional scopes? Also does this mean that I skip and then revert, because that seems pretty expensive?
> >
> >
> > It would be a little expensive, yes, but we'd only be doing it on codepaths where we're producing an error -- for an ill-formed program, it's OK to take more time in order to produce a better diagnostic. Skipping to the next `}` won't work, because `SkipUntil` will skip over pairs of brace-balanced tokens (so you'll skip past the `}` you're looking for), but skipping until the next `{` and then skipping to the `}` after it should work.
>
>
> Hmm wouldn't this interact badly with `{}` in initializers?
>
>   []<int = {0}> {};
>   [](int = {0}) {};
>


Ouch. The first of these two seems like it won't work, since `SkipUntil` has no idea the angles are brackets. =( Getting this right is ... really hairy. Eg:

  []<bool = a<b>{} // end of lambda here?
                  >(){} // or here?

(The answer depends on whether `a` is a template.) And the same problem shows up in the //trailing-return-type// and the //requires-clause//.

How about this: `SkipUntil` an `{` or `<`. If you find a `<` first, don't attach a `FixItHint` to the diagnostic since we can't easily tell where to suggest putting the `)`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D36357





More information about the cfe-commits mailing list