summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-24 18:54:39 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-24 18:54:39 +0000
commita5f6f9c7a1bbd289eebae65c789544e8943ac1cc (patch)
tree692095a59cb61d498657ea98dbc5623568245e9e
parent0f124e1987c22d1801c23c93628d202d21bdff10 (diff)
downloadbcm5719-llvm-a5f6f9c7a1bbd289eebae65c789544e8943ac1cc.tar.gz
bcm5719-llvm-a5f6f9c7a1bbd289eebae65c789544e8943ac1cc.zip
Disallow function template partial specializations, from Hans
Wennborg! Fixes PR8295. llvm-svn: 124135
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaDecl.cpp6
-rw-r--r--clang/test/SemaTemplate/function-template-specialization.cpp5
3 files changed, 11 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index ce1359df22a..0d26ac18162 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -1683,6 +1683,8 @@ def err_function_template_spec_ambiguous : Error<
"arguments to identify a particular function template">;
def note_function_template_spec_matched : Note<
"function template matches specialization %0">;
+def err_function_template_partial_spec : Error<
+ "function template partial specialization is not allowed">;
// C++ Template Instantiation
def err_template_recursion_depth_exceeded : Error<
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 4d8179738a0..39d198be392 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -3836,8 +3836,10 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
HasExplicitTemplateArgs = true;
if (FunctionTemplate) {
- // FIXME: Diagnose function template with explicit template
- // arguments.
+ // Function template with explicit template arguments.
+ Diag(D.getIdentifierLoc(), diag::err_function_template_partial_spec)
+ << SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc);
+
HasExplicitTemplateArgs = false;
} else if (!isFunctionTemplateSpecialization &&
!D.getDeclSpec().isFriendSpecified()) {
diff --git a/clang/test/SemaTemplate/function-template-specialization.cpp b/clang/test/SemaTemplate/function-template-specialization.cpp
index 9afc99fe7d5..a0d41b20534 100644
--- a/clang/test/SemaTemplate/function-template-specialization.cpp
+++ b/clang/test/SemaTemplate/function-template-specialization.cpp
@@ -41,3 +41,8 @@ namespace PR5833 {
}
template <> bool PR5833::f0<float>(float &t1) {}
+// PR8295
+namespace PR8295 {
+ template <typename T> void f(T t) {}
+ template <typename T> void f<T*>(T* t) {} // expected-error{{function template partial specialization is not allowed}}
+}
OpenPOWER on IntegriCloud