<div dir="ltr">On Thu, Aug 15, 2013 at 4:59 PM, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com" target="_blank">eli.friedman@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: efriedma<br>
Date: Thu Aug 15 18:59:20 2013<br>
New Revision: 188510<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=188510&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=188510&view=rev</a><br>
Log:<br>
Fix for dependent contexts in alias templates.<br>
<br>
When we are parsing a type for an alias template, we are not entering<br>
the context, so we can't look into dependent classes.  Make sure the<br>
parser handles this correctly.<br>
<br>
PR16904.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Parse/ParseDecl.cpp<br>
    cfe/trunk/test/SemaTemplate/alias-templates.cpp<br>
<br>
Modified: cfe/trunk/lib/Parse/ParseDecl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=188510&r1=188509&r2=188510&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=188510&r1=188509&r2=188510&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)<br>
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Thu Aug 15 18:59:20 2013<br>
@@ -2436,7 +2436,7 @@ void Parser::ParseDeclarationSpecifiers(<br>
<br>
     case tok::coloncolon: // ::foo::bar<br>
       // C++ scope specifier.  Annotate and loop, or bail out on error.<br>
-      if (TryAnnotateCXXScopeToken(true)) {<br>
+      if (TryAnnotateCXXScopeToken(EnteringContext)) {<br>
         if (!DS.hasTypeSpecifier())<br>
           DS.SetTypeSpecError();<br>
         goto DoneWithDeclSpec;<br>
@@ -2632,7 +2632,7 @@ void Parser::ParseDeclarationSpecifiers(<br>
       // In C++, check to see if this is a scope specifier like foo::bar::, if<br>
       // so handle it as such.  This is important for ctor parsing.<br>
       if (getLangOpts().CPlusPlus) {<br>
-        if (TryAnnotateCXXScopeToken(true)) {<br>
+        if (TryAnnotateCXXScopeToken(EnteringContext)) {<br>
           if (!DS.hasTypeSpecifier())<br>
             DS.SetTypeSpecError();<br>
           goto DoneWithDeclSpec;<br><br></blockquote><div><br></div><div> </div></div>Ugh... I just spent some more time thinking about this; while this fix doesn't break anything as far as I know, it isn't really complete.  Consider the following testcase:</div>
<div class="gmail_extra"><br></div><div class="gmail_extra"><p style="margin:0px;font-size:11px;font-family:Menlo">template <typename,typename></p>
<p style="margin:0px;font-size:11px;font-family:Menlo">struct base {</p>
<p style="margin:0px;font-size:11px;font-family:Menlo">  template <typename> struct derived;</p>
<p style="margin:0px;font-size:11px;font-family:Menlo">};</p>
<p style="margin:0px;font-size:11px;font-family:Menlo">template <typename T, typename U, typename V> base<T, U>::derived<V> foo();</p><div><br></div><div>There's a missing typename keyword, but clang fails to detect this.  Any suggestions?</div>
<div><br></div><div>-Eli</div></div></div>