Author: arphaman Date: Fri Oct 27 11:13:31 2017 New Revision: 316778 URL: http://llvm.org/viewvc/llvm-project?rev=316778&view=rev Log: [Sema] Fix an assert-on-invalid by avoiding function template specialisation deduction for invalid functions
The fabricated template parameters cause an assertion because their depth is invalid. rdar://34109988 Differential Revision: https://reviews.llvm.org/D37341 Modified: cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/SemaTemplate/deduction-crash.cpp cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=316778&r1=316777&r2=316778&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Oct 27 11:13:31 2017 @@ -8962,10 +8962,10 @@ Sema::ActOnFunctionDeclarator(Scope *S, 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: Modified: cfe/trunk/test/SemaTemplate/deduction-crash.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/deduction-crash.cpp?rev=316778&r1=316777&r2=316778&view=diff ============================================================================== --- cfe/trunk/test/SemaTemplate/deduction-crash.cpp (original) +++ cfe/trunk/test/SemaTemplate/deduction-crash.cpp Fri Oct 27 11:13:31 2017 @@ -144,3 +144,20 @@ namespace var_template_partial_spec_inco 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; +} + +} Modified: cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp?rev=316778&r1=316777&r2=316778&view=diff ============================================================================== --- cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp (original) +++ cfe/trunk/test/SemaTemplate/explicit-specialization-member.cpp Fri Oct 27 11:13:31 2017 @@ -38,24 +38,20 @@ namespace PR18246 { 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 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits