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



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

Reply via email to