Out of interest, which headers do you need this for?<br><br><div class="gmail_quote">On Wed, May 2, 2012 at 6:54 AM, William Wilson <span dir="ltr"><<a href="mailto:will@indefiant.com" target="_blank">will@indefiant.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi All,<br>
<br>
This patch follows on from <a href="http://llvm.org/bugs/show_bug.cgi?id=12715" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=12715</a><br>
and includes a test case for validation. Local testing shows no<br>
regression.<br>
<br>
Original outline of issue from bug report:<br>
<br>
----<br>
<br>
I've run into a issue parsing headers where the following constructs are<br>
(frequently) used and successfully compiled by the MSVC compilers:<br>
<br>
template <typename T><br>
class Foo<br>
{<br>
  typedef typename T* pT;<br>
};<br>
<br>
The additional typename qualification is unnecessary and causes the following<br>
warning to be emitted from Parser::TryAnnotateTypeOrScopeToken():<br>
<br>
warning: expected a qualified name after 'typename'<br>
        typedef typename T* pT;<br>
<br>
Which is fine and expected, however the parsing quickly fails with:<br>
<br>
error: expected ';' at end of declaration list<br>
        typedef typename T* pT;<br>
<br>
This appears to be due the return true (error occurred) from<br>
TryAnnotateTypeOrScopeToken() even though the occurrence is treated as a<br>
warning.<br>
<br>
Interestingly the original commit that introduced the warning (r130088 by<br>
fpichet) states the following:<br>
<br>
"Must "return true;" even if it is a warning because the rest of the code path<br>
assumes that SS is set to something. The parser will get back on its feet and<br>
continue parsing the rest of the declaration correctly so it is not a problem."<br>
<br>
It's true that the rest of the code expects SS to be valid, but unfortunately<br>
the assumption that the "parser will get back on its feet" is not true with the<br>
current implementation.<br>
<br>
I tried a naive return false (no error) in the event of the<br>
diag::warn_expected_qualified_after_typename instance and the parser appeared<br>
to recover successfully, but being unfamiliar with the logic in question I<br>
wonder if that is the correct approach for recovery in this case?<br>
<br>
----<br>
<br>
Other concerns:<br>
<br>
Do I need to annotate the typename token before the return false?<br>
<br>
Additionally, this recovery state seems more applicable to<br>
ms-compatibility rather than ms-extensions, but as r130088 uses<br>
MicrosoftExt I chose to leave it as is. Any thoughts?<br>
<br>
All the best,<br>
Will.<br>
<br>
PS. Many thanks for all the excellent work. It's probably the finest<br>
large-scale code base I've had the pleasure to work with.<br>
<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br>