diff --git a/lib/Analysis/CloneDetection.cpp b/lib/Analysis/CloneDetection.cpp index 9d11dabf9640f4d3cf8d416a02279e92e95e33d2..a91ccaa4d2cd28f0050c29a1a575bc8b657a332e 100644 --- a/lib/Analysis/CloneDetection.cpp +++ b/lib/Analysis/CloneDetection.cpp @@ -345,10 +345,9 @@ public: DEF_ADD_DATA(CallExpr, { // Function pointers don't have a callee and we just skip hashing it. if (const FunctionDecl *D = S->getDirectCallee()) { - // If the function is a template instantiation, we also need to handle - // the template arguments as they are no included in the qualified name. - if (D->isTemplateInstantiation()) { - auto Args = D->getTemplateSpecializationArgs(); + // If the function is a template specialization, we also need to handle + // the template arguments as they are not included in the qualified name. + if (auto Args = D->getTemplateSpecializationArgs()) { std::string ArgString; // Print all template arguments into ArgString diff --git a/test/Analysis/copypaste/call.cpp b/test/Analysis/copypaste/call.cpp index 46df02280ee1e19e55cb71e4aa76741d967395d7..8e95f7cb304a71cf4bf30485650cc23a888573c3 100644 --- a/test/Analysis/copypaste/call.cpp +++ b/test/Analysis/copypaste/call.cpp @@ -88,3 +88,15 @@ bool fooTemplatePadding2(int x) { return templatePaddingFunc<XX, X>(); return true; } + +// Test that we don't crash on member functions of template instantiations. + +template<typename T> +struct A { + void foo(T t) {} +}; + +void fooTestInstantiation() { + A<int> a; + a.foo(1); +}