diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-11-05 23:25:18 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-11-05 23:25:18 +0000 |
commit | 2c4792c731690dbbcbe69dd0625977adffc2961a (patch) | |
tree | 7b1dba8b2b9359aed0adf946c8d9cdf4d789f5ac | |
parent | a43064c7b721a51ab2c0d0ccdc4f84064aa7cecc (diff) |
When determining which template partial specialization is more specialized,
make sure to setup the instantiation stack. Fixes rdar://8620775 & http://llvm.org/PR8234
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118314 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaTemplateDeduction.cpp | 10 | ||||
-rw-r--r-- | test/SemaCXX/crashes.cpp | 27 |
2 files changed, 35 insertions, 2 deletions
diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index 905e17e9c1..9b117b6813 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -2485,10 +2485,13 @@ Sema::getMoreSpecializedPartialSpecialization( Info, Deduced, 0); - if (Better1) + if (Better1) { + InstantiatingTemplate Inst(*this, PS2->getLocation(), PS2, + Deduced.data(), Deduced.size(), Info); Better1 = !::FinishTemplateArgumentDeduction(*this, PS2, PS1->getTemplateArgs(), Deduced, Info); + } // Determine whether PS2 is at least as specialized as PS1 Deduced.clear(); @@ -2500,10 +2503,13 @@ Sema::getMoreSpecializedPartialSpecialization( Info, Deduced, 0); - if (Better2) + if (Better2) { + InstantiatingTemplate Inst(*this, PS1->getLocation(), PS1, + Deduced.data(), Deduced.size(), Info); Better2 = !::FinishTemplateArgumentDeduction(*this, PS1, PS2->getTemplateArgs(), Deduced, Info); + } if (Better1 == Better2) return 0; diff --git a/test/SemaCXX/crashes.cpp b/test/SemaCXX/crashes.cpp index 53eecb6c14..87bde2aa93 100644 --- a/test/SemaCXX/crashes.cpp +++ b/test/SemaCXX/crashes.cpp @@ -41,3 +41,30 @@ struct { new Y // expected-error{{no viable conversion}} }; } + +// http://llvm.org/PR8234 +namespace PR8234 { +template<typename Signature> +class callback +{ +}; + +template<typename R , typename ARG_TYPE0> +class callback<R( ARG_TYPE0)> +{ + public: + callback() {} +}; + +template< typename ARG_TYPE0> +class callback<void( ARG_TYPE0)> +{ + public: + callback() {} +}; + +void f() +{ + callback<void(const int&)> op; +} +} |