[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

llvm-svn: 279529
This commit is contained in:
Artem Dergachev 2016-08-23 16:42:00 +00:00
parent 036b94dad3
commit 5f94b089e9
2 changed files with 15 additions and 4 deletions

View File

@ -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

View File

@ -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);
}