hubert.reinterpretcast added a comment.

In https://reviews.llvm.org/D33339#759125, @rsmith wrote:

> Should I assume our "misplaced ellipsis" diagnostic requires that we 
> disambiguate the ill-formed ellipsis-after-declarator-id as a declarator in 
> some cases? If so, do we have tests for that somewhere?


Tests for the diagnostics are in `clang/test/FixIt/fixit-cxx0x.cpp` and 
`clang/test/Parser/cxx11-templates.cpp`.
The `check-all` target passes even if the ellipsis-after-declarator-id 
disambiguation as a declarator is removed entirely. The disambiguation process 
is not needed involved in many cases, and when it is, can choose the 
declarative interpretation for other reasons.

I find the most interesting cases affected by the patch here to be those 
involving disambiguation between the declaration of a function template and 
that of a variable template.
The misplaced-ellipsis diagnostic will still trigger (if we accept non-trailing 
stray ellipses) on a case like

  template <typename ...T> int f(T (t) ...(int), int (x));

which, although it works, it not very motivating.

Removing the `(int)` turns it into a possibly-valid variable template 
declaration.
Removing the parentheses around `t` (whether or not the `(int)` is there) makes 
the parser decide to parse as a function declaration (and the 
misplaced-ellipsis diagnostic is triggered) regardless of the treatment of 
"stray" ellipses.
The logic implemented here does not generate the misplaced-ellipsis diagnostic 
for

  template <typename ...T> int f(T (t) ..., int x);

So, on the whole, the stray ellipsis treatment is both too complicated and not 
complicated enough.



================
Comment at: include/clang/Parse/Parser.h:2138
+  TPResult TryParseDeclarator(bool mayBeAbstract, bool mayHaveIdentifier = 
true,
+                              bool mayHaveTrailingStrayEllipsis = true);
   TPResult
----------------
rsmith wrote:
> Given that this flag is enabling parsing of things that are *not* valid 
> declarators, I think the default should be the other way around. If some 
> calling code believes it's safe to parse a trailing ellipsis as part of a 
> declarator, it should be explicitly opting into that.
Okay; will do.


================
Comment at: lib/Parse/ParseTentative.cpp:944
+        (mayHaveTrailingStrayEllipsis ||
+         !(NextToken().is(tok::r_paren) || NextToken().is(tok::comma))))
       ConsumeToken();
----------------
rsmith wrote:
> hubert.reinterpretcast wrote:
> > The check for what qualifies as "trailing" is not the strongest, but I find 
> > it to be the most straightforward change that should do the job. One 
> > alternative is to track whether an ellipsis was consumed within the current 
> > loop iteration.
> Use `!NextToken().isOneOf(tok::r_paren, tok::comma)` here.
Will do.


https://reviews.llvm.org/D33339



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to