On Mon, Aug 5, 2013 at 6:03 PM, Larisse Voufo <span dir="ltr"><<a href="mailto:lvoufo@google.com" target="_blank">lvoufo@google.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: lvoufo<br>
Date: Mon Aug  5 20:03:05 2013<br>
New Revision: 187762<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=187762&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=187762&view=rev</a><br>
Log:<br>
Started implementing variable templates. Top level declarations should be fully supported, up to some limitations documented as FIXMEs or TODO. Static data member templates work very partially. Static data member templates of class templates need particular attention...<br>

<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=187762&r1=187761&r2=187762&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=187762&r1=187761&r2=187762&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Aug  5 20:03:05 2013<br>
@@ -1559,7 +1559,8 @@ Sema::BuildDeclRefExpr(ValueDecl *D, Qua<br>
 ExprResult<br>
 Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,<br>
                        const DeclarationNameInfo &NameInfo,<br>
-                       const CXXScopeSpec *SS, NamedDecl *FoundD) {<br>
+                       const CXXScopeSpec *SS, NamedDecl *FoundD,<br>
+                       const TemplateArgumentListInfo *TemplateArgs) {<br>
   if (getLangOpts().CUDA)<br>
     if (const FunctionDecl *Caller = dyn_cast<FunctionDecl>(CurContext))<br>
       if (const FunctionDecl *Callee = dyn_cast<FunctionDecl>(D)) {<br>
@@ -1578,12 +1579,24 @@ Sema::BuildDeclRefExpr(ValueDecl *D, Qua<br>
     (CurContext != D->getDeclContext() &&<br>
      D->getDeclContext()->isFunctionOrMethod());<br>
<br>
-  DeclRefExpr *E = DeclRefExpr::Create(Context,<br>
-                                       SS ? SS->getWithLocInContext(Context)<br>
-                                              : NestedNameSpecifierLoc(),<br>
-                                       SourceLocation(),<br>
-                                       D, refersToEnclosingScope,<br>
-                                       NameInfo, Ty, VK, FoundD);<br>
+  DeclRefExpr *E;<br>
+  if (isa<VarTemplateSpecializationDecl>(D)) {<br>
+    VarTemplateSpecializationDecl *VarSpec =<br>
+        cast<VarTemplateSpecializationDecl>(D);<br>
+<br>
+    E = DeclRefExpr::Create(<br>
+        Context,<br>
+        SS ? SS->getWithLocInContext(Context) : NestedNameSpecifierLoc(),<br>
+        VarSpec->getTemplateKeywordLoc(), D, refersToEnclosingScope,<br></blockquote><div><br></div><div>The getTemplateKeywordLoc() here looks wrong: this should be the location of the 'template' keyword in the expression, not in the declaration. That is, it should be this 'template':</div>
<div><br></div><div>X::template var<int></div><div>   ^~~~~~~~</div><div><br></div><div>not this one:</div><div><br></div><div>struct X {</div><div>  template<typename T> int var;</div><div>  ^~~~~~~~</div><div>
};</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+        NameInfo.getLoc(), Ty, VK, FoundD, TemplateArgs);<br>
+  } else {<br>
+    assert(!TemplateArgs && "No template arguments for non-variable"<br>
+                            " template specialization referrences");<br>
+    E = DeclRefExpr::Create(<br>
+        Context,<br>
+        SS ? SS->getWithLocInContext(Context) : NestedNameSpecifierLoc(),<br>
+        SourceLocation(), D, refersToEnclosingScope, NameInfo, Ty, VK, FoundD);<br>
+  }<br>
<br>
   MarkDeclRefReferenced(E);<br>
<br></blockquote></div>