[PATCH] D29401: Fix MSVC Compatibility around dependent type with missing 'typename'

Eli Friedman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 16 11:06:06 PST 2017


efriedma added inline comments.


================
Comment at: lib/Parse/ParseStmt.cpp:186
     // found.
-    if (Next.isNot(tok::coloncolon)) {
+    if (Next.isNot(tok::coloncolon) && (!getLangOpts().MSVCCompat ||
+        Next.isNot(tok::less))) {
----------------
erichkeane wrote:
> efriedma wrote:
> > erichkeane wrote:
> > > Clang-tidy created this layout here that I'm not thrilled with, if OK, I'd like to move the entirety of the 2nd component to the "&&" on its own line.  Additionally, if anyone has a better way to do this logic, I'm all ears!
> > Why is this checking for MSVCCompat?  I think we want to detect constructs like your testcase in all modes so we can generate a good error message.
> We get a good error message here ("typename missing") in normal mode.  The issue here is that the examples below work in MSVC's relaxed 'typename' situation, thus this should only be accepting code in MSVC mode, right?  Or am I missing something.
This is what I see for the testcase in your commit message on trunk:

```
<stdin>:7:4: error: expected ';' after expression
  S<TMP>::TD varname =0;
   ^
   ;
<stdin>:7:14: error: use of undeclared identifier 'varname'
  S<TMP>::TD varname =0;
             ^
<stdin>:7:3: error: missing 'typename' prior to dependent type name 'S<int>::TD'
  S<TMP>::TD varname =0;
  ^~~~~~~~~~
<stdin>:11:3: note: in instantiation of function template specialization 'foo<int>' requested here
  foo<int>();
  ^
3 errors generated.
```

Technically speaking, we do get the "missing typename" message, but I still wouldn't call this result "a good error message".


https://reviews.llvm.org/D29401





More information about the cfe-commits mailing list