<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 26 March 2014 23:10, Karthik Bhat <span dir="ltr"><<a href="mailto:kv.bhat@samsung.com" target="_blank">kv.bhat@samsung.com</a>></span> wrote:<br><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">


Hi rsmith, nicholas, aaron.ballman,<br>
<br>
Hi All,<br>
A small patch to fix PR19169. In ActOnVarTemplateSpecialization the getAsTemplateDecl() function might return null if template name refers to a set of function templates. Handle the same by using dynamic_cast_or_null instead of dynamic_cast which will crash if the pointer being casted is null.<br>



<br>
Please let me know if i can go ahead and commit the same?<br></blockquote><div><br></div><div>Looks right to me. In particular, this is what the equivalent code in ActOnClassTemplateSpecialization does.<br></div><div><br>

</div><div>The diagnostic is a little sub-par. In real-world cases that this has shown up, the intention was not to use variable templates at all, but instead missing parentheses in a call. Such a diagnostic would be even better.</div>

<div><br></div><div>Nick</div><div> </div><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">
<br>
Thanks and Regards<br>
Karthik Bhat<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D3198" target="_blank">http://llvm-reviews.chandlerc.com/D3198</a><br>
<br>
Files:<br>
  test/SemaCXX/cxx1y-variable-templates_top_level.cpp<br>
  lib/Sema/SemaTemplate.cpp<br>
<br>
Index: test/SemaCXX/cxx1y-variable-templates_top_level.cpp<br>
===================================================================<br>
--- test/SemaCXX/cxx1y-variable-templates_top_level.cpp<br>
+++ test/SemaCXX/cxx1y-variable-templates_top_level.cpp<br>
@@ -448,3 +448,9 @@<br>
   static_assert(x<int> == 1, "");<br>
 #endif<br>
 }<br>
+<br>
+namespace PR19169 {<br>
+  template <typename T> int* f();<br>
+  template <typename T> void f();<br>
+  template<> int f<double>; // expected-error {{no variable template matches specialization}}<br>
+}<br>
Index: lib/Sema/SemaTemplate.cpp<br>
===================================================================<br>
--- lib/Sema/SemaTemplate.cpp<br>
+++ lib/Sema/SemaTemplate.cpp<br>
@@ -2375,7 +2375,7 @@<br>
<br>
   // The template-id must name a variable template.<br>
   VarTemplateDecl *VarTemplate =<br>
-      dyn_cast<VarTemplateDecl>(Name.getAsTemplateDecl());<br>
+      dyn_cast_or_null<VarTemplateDecl>(Name.getAsTemplateDecl());<br>
   if (!VarTemplate)<br>
     return Diag(D.getIdentifierLoc(), diag::err_var_spec_no_template)<br>
              << IsPartialSpecialization;<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div></div>