[PATCH] Fix PR19169:Crash on invalid attempting to specialize a template method as a template variable

Karthik Bhat kv.bhat at samsung.com
Thu Mar 27 02:13:42 PDT 2014


  Hi Nick,
  Modified the diagnostics in this case to make it more intutive as per your comments. Does this seems reasonable?
  Thanks and Regards
  Karthik Bhat

Hi rsmith, nicholas, aaron.ballman,

http://llvm-reviews.chandlerc.com/D3198

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D3198?vs=8154&id=8156#toc

Files:
  lib/Sema/SemaTemplate.cpp
  test/SemaCXX/cxx1y-variable-templates_top_level.cpp
  include/clang/Basic/DiagnosticSemaKinds.td

Index: lib/Sema/SemaTemplate.cpp
===================================================================
--- lib/Sema/SemaTemplate.cpp
+++ lib/Sema/SemaTemplate.cpp
@@ -2375,10 +2375,20 @@
 
   // The template-id must name a variable template.
   VarTemplateDecl *VarTemplate =
-      dyn_cast<VarTemplateDecl>(Name.getAsTemplateDecl());
-  if (!VarTemplate)
+      dyn_cast_or_null<VarTemplateDecl>(Name.getAsTemplateDecl());
+  if (!VarTemplate) {
+    if (OverloadedTemplateStorage *OST = Name.getAsOverloadedTemplate()) {
+      OverloadedTemplateStorage::iterator I = OST->begin();
+      OverloadedTemplateStorage::iterator IEnd = OST->end();
+      if (I != IEnd) {
+        return Diag(D.getIdentifierLoc(), diag::err_var_spec_no_template_but_method)
+                 << IsPartialSpecialization
+                 << (*I)->getDeclName();
+      }
+    }
     return Diag(D.getIdentifierLoc(), diag::err_var_spec_no_template)
              << IsPartialSpecialization;
+  }
 
   // Check for unexpanded parameter packs in any of the template arguments.
   for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
Index: test/SemaCXX/cxx1y-variable-templates_top_level.cpp
===================================================================
--- test/SemaCXX/cxx1y-variable-templates_top_level.cpp
+++ test/SemaCXX/cxx1y-variable-templates_top_level.cpp
@@ -448,3 +448,9 @@
   static_assert(x<int> == 1, "");
 #endif
 }
+
+namespace PR19169 {
+  template <typename T> int* f();
+  template <typename T> void f();
+  template<> int f<double>; // expected-error {{no variable template matches specialization; did you mean to use 'f' as function template instead}}
+}
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td
+++ include/clang/Basic/DiagnosticSemaKinds.td
@@ -3295,6 +3295,9 @@
   "previous declaration of variable template partial specialization is here">;
 def err_var_spec_no_template : Error<
   "no variable template matches%select{| partial}0 specialization">;
+def err_var_spec_no_template_but_method : Error<
+  "no variable template matches%select{| partial}0 specialization; "
+  "did you mean to use %1 as function template instead">;
   
 // C++ Function template specializations
 def err_function_template_spec_no_match : Error<
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D3198.2.patch
Type: text/x-patch
Size: 2365 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140327/ac49ab96/attachment.bin>


More information about the llvm-commits mailing list