From d0e69cf6b21f1ecc3e2a957d9d53c271c7b8b897 Mon Sep 17 00:00:00 2001 From: Artem Dergachev <artem.dergachev@gmail.com> Date: Tue, 23 Aug 2016 16:42:00 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@279529 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/CloneDetection.cpp | 7 +++---- test/Analysis/copypaste/call.cpp | 12 ++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/Analysis/CloneDetection.cpp b/lib/Analysis/CloneDetection.cpp index 9d11dabf964..a91ccaa4d2c 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 46df02280ee..8e95f7cb304 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); +} -- GitLab