[PATCH] D37341: [Sema] Fix an assert-on-invalid by avoiding function template specialisation deduction for invalid functions with fabricated template arguments
Alex Lorenz via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 27 11:14:12 PDT 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL316778: [Sema] Fix an assert-on-invalid by avoiding function template specialisation (authored by arphaman).
Changed prior to commit:
https://reviews.llvm.org/D37341?vs=119967&id=120658#toc
Repository:
rL LLVM
https://reviews.llvm.org/D37341
Files:
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/test/SemaTemplate/deduction-crash.cpp
cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp
Index: cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp
===================================================================
--- cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp
+++ cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp
@@ -38,24 +38,20 @@
template<typename T>
template<int N>
- void Baz<T>::bar() { // expected-note {{couldn't infer template argument 'N'}}
+ void Baz<T>::bar() {
}
- // FIXME: We shouldn't try to match this against a prior declaration if
- // template parameter matching failed.
template<typename T>
- void Baz<T>::bar<0>() { // expected-error {{cannot specialize a member of an unspecialized template}} \
- // expected-error {{no function template matches}}
+ void Baz<T>::bar<0>() { // expected-error {{cannot specialize a member of an unspecialized template}}
}
}
namespace PR19340 {
template<typename T> struct Helper {
- template<int N> static void func(const T *m) {} // expected-note {{failed template argument deduction}}
+ template<int N> static void func(const T *m) {}
};
-template<typename T> void Helper<T>::func<2>() {} // expected-error {{cannot specialize a member}} \
- // expected-error {{no function template matches}}
+template<typename T> void Helper<T>::func<2>() {} // expected-error {{cannot specialize a member}}
}
namespace SpecLoc {
Index: cfe/trunk/test/SemaTemplate/deduction-crash.cpp
===================================================================
--- cfe/trunk/test/SemaTemplate/deduction-crash.cpp
+++ cfe/trunk/test/SemaTemplate/deduction-crash.cpp
@@ -144,3 +144,20 @@
template<typename T, typename U = void> int n<T *>; // expected-error +{{}} expected-note {{}}
int k = n<void *>;
}
+
+namespace deduceFunctionSpecializationForInvalidOutOfLineFunction {
+
+template <typename InputT, typename OutputT>
+struct SourceSelectionRequirement {
+ template<typename T>
+ OutputT evaluateSelectionRequirement(InputT &&Value) {
+ }
+};
+
+template <typename InputT, typename OutputT>
+OutputT SourceSelectionRequirement<InputT, OutputT>::
+evaluateSelectionRequirement<void>(InputT &&Value) { // expected-error {{cannot specialize a member of an unspecialized template}}
+ return Value;
+}
+
+}
Index: cfe/trunk/lib/Sema/SemaDecl.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp
+++ cfe/trunk/lib/Sema/SemaDecl.cpp
@@ -8962,10 +8962,10 @@
diag::ext_function_specialization_in_class :
diag::err_function_specialization_in_class)
<< NewFD->getDeclName();
- } else if (CheckFunctionTemplateSpecialization(NewFD,
- (HasExplicitTemplateArgs ? &TemplateArgs
- : nullptr),
- Previous))
+ } else if (!NewFD->isInvalidDecl() &&
+ CheckFunctionTemplateSpecialization(
+ NewFD, (HasExplicitTemplateArgs ? &TemplateArgs : nullptr),
+ Previous))
NewFD->setInvalidDecl();
// C++ [dcl.stc]p1:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37341.120658.patch
Type: text/x-patch
Size: 3224 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171027/ead3da38/attachment-0001.bin>
More information about the cfe-commits
mailing list