diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaTemplateDeduction.cpp | 10 | ||||
-rw-r--r-- | clang/test/SemaCXX/crashes.cpp | 27 |
2 files changed, 35 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 905e17e9c14..9b117b68132 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/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/clang/test/SemaCXX/crashes.cpp b/clang/test/SemaCXX/crashes.cpp index 53eecb6c14f..87bde2aa939 100644 --- a/clang/test/SemaCXX/crashes.cpp +++ b/clang/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; +} +} |