[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