[clang-tidy] bug fix: Don't warn on partial template specialization in `misc-definitions-in-headers` check.

Reviewers: alexfh

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D16578

llvm-svn: 259643
This commit is contained in:
Haojian Wu 2016-02-03 12:10:27 +00:00
parent 5f496fb941
commit 29634fe676
2 changed files with 29 additions and 1 deletions

View File

@ -91,9 +91,12 @@ void DefinitionsInHeadersCheck::check(const MatchFinder::MatchResult &Result) {
if (const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
const auto *DC = MD->getDeclContext();
while (DC->isRecord()) {
if (const auto *RD = dyn_cast<CXXRecordDecl>(DC))
if (const auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
if (isa<ClassTemplatePartialSpecializationDecl>(RD))
return;
if (RD->getDescribedClassTemplate())
return;
}
DC = DC->getParent();
}
}

View File

@ -133,3 +133,28 @@ const char* const g = "foo"; // OK: internal linkage variable definition.
static int h = 1; // OK: internal linkage variable definition.
const int i = 1; // OK: internal linkage variable definition.
extern int j; // OK: internal linkage variable definition.
template <typename T, typename U>
struct CD {
int f();
};
template <typename T>
struct CD<T, int> {
int f();
};
template <>
struct CD<int, int> {
int f();
};
int CD<int, int>::f() {
// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: function 'f' defined in a header file;
return 0;
}
template <typename T>
int CD<T, int>::f() { // OK: partial template specialization.
return 0;
}