This revision was automatically updated to reflect the committed changes. Closed by commit rL279529: [analyzer] Fix CloneDetector crash on calling methods of class templates. (authored by dergachev).
Changed prior to commit: https://reviews.llvm.org/D23780?vs=68883&id=69007#toc Repository: rL LLVM https://reviews.llvm.org/D23780 Files: cfe/trunk/lib/Analysis/CloneDetection.cpp cfe/trunk/test/Analysis/copypaste/call.cpp Index: cfe/trunk/test/Analysis/copypaste/call.cpp =================================================================== --- cfe/trunk/test/Analysis/copypaste/call.cpp +++ cfe/trunk/test/Analysis/copypaste/call.cpp @@ -88,3 +88,15 @@ 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); +} Index: cfe/trunk/lib/Analysis/CloneDetection.cpp =================================================================== --- cfe/trunk/lib/Analysis/CloneDetection.cpp +++ cfe/trunk/lib/Analysis/CloneDetection.cpp @@ -345,10 +345,9 @@ 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
Index: cfe/trunk/test/Analysis/copypaste/call.cpp =================================================================== --- cfe/trunk/test/Analysis/copypaste/call.cpp +++ cfe/trunk/test/Analysis/copypaste/call.cpp @@ -88,3 +88,15 @@ 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); +} Index: cfe/trunk/lib/Analysis/CloneDetection.cpp =================================================================== --- cfe/trunk/lib/Analysis/CloneDetection.cpp +++ cfe/trunk/lib/Analysis/CloneDetection.cpp @@ -345,10 +345,9 @@ 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
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits