The attached patch fixes PR11358:<div><br></div><div><div>pr11358.cc:11:5: error: missing 'typename' prior to dependent type name</div><div>      'Container::iterator'</div><div>    Container::iterator i = c.begin();</div>

<div>    ^~~~~~~~~~~~~~~~~~~</div><div>    typename </div></div><div><br></div><div>It works by teaching Parser::isCXXDeclarationSpecifier() to, in the event of a cxxscope annotation followed by an identifier, ("Container::" and "iterator" in the above example), look at the next token. Yes, this means doing two-tokens of look-ahead. If that next token is an identifier or cvr-qualifier, we conclude that this can't possibly be an expression and return a parse error.</div>

<div><br></div><div>This is pretty important because some developers don't seem to understand the rule for where they need to put typename, and Clang has exacerbated this by teaching them that they only need to put typename where the compiler tells them to put typename. Consequently, when we don't tell them to put typename there, that isn't one of the things they'll try any more.</div>

<div><br></div><div>The condition under which we'll do an extra token of look-ahead is when we see a dependent nested-name-specifier followed by an identifier while doing the tentative parse to determine whether the statement is a declaration or an expression. This is reasonably rare. Here's some build times of boost:</div>

<div><br></div><div>run of "bootstrap"</div><div>with patch: 0m26.460s 0m26.530s</div><div>without patch: 0m25.510s 0m26.110s</div><div>run of "b2"</div><div><div>with patch: 13m12.050s 12m58.670s</div>

</div><div>without patch: 12m26.260s 13m9.030s</div><div><br></div><div>So we conclude that my testing machine is crazy noisy, but at least the patch doesn't cause a horrible performance regression. To give you another statistic, the number of times we need to look ahead by one more token is slightly less than 250,000 times across all translation units in an llvm+clang build. I haven't checked how many of those are unique.</div>

<div><br></div><div>Please review!</div><div><br></div><div>Nick</div><div><br></div>