Author: dergachev Date: Tue Aug 23 11:42:00 2016 New Revision: 279529 URL: http://llvm.org/viewvc/llvm-project?rev=279529&view=rev Log: [analyzer] Fix CloneDetector crash on calling methods of class templates.
If a call expression represents a method call of a class template, and the method itself isn't templated, then the method may be considered to be a template instantiation without template specialization arguments. No longer crash when we could not find template specialization arguments. Patch by Raphael Isemann! Differential Revision: https://reviews.llvm.org/D23780 Modified: cfe/trunk/lib/Analysis/CloneDetection.cpp cfe/trunk/test/Analysis/copypaste/call.cpp Modified: cfe/trunk/lib/Analysis/CloneDetection.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CloneDetection.cpp?rev=279529&r1=279528&r2=279529&view=diff ============================================================================== --- cfe/trunk/lib/Analysis/CloneDetection.cpp (original) +++ cfe/trunk/lib/Analysis/CloneDetection.cpp Tue Aug 23 11:42:00 2016 @@ -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 Modified: cfe/trunk/test/Analysis/copypaste/call.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/copypaste/call.cpp?rev=279529&r1=279528&r2=279529&view=diff ============================================================================== --- cfe/trunk/test/Analysis/copypaste/call.cpp (original) +++ cfe/trunk/test/Analysis/copypaste/call.cpp Tue Aug 23 11:42:00 2016 @@ -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); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits