mirror of
https://github.com/intel/llvm.git
synced 2026-02-05 04:46:27 +08:00
Don't warn for the common pattern of disallowing copying:
class S {
S(const S&); // DO NOT IMPLEMENT
void operator=(const S&); // DO NOT IMPLEMENT
};
llvm-svn: 111100
This commit is contained in:
@@ -521,6 +521,24 @@ static void RemoveUsingDecls(LookupResult &R) {
|
||||
F.done();
|
||||
}
|
||||
|
||||
/// \brief Check for this common pattern:
|
||||
/// @code
|
||||
/// class S {
|
||||
/// S(const S&); // DO NOT IMPLEMENT
|
||||
/// void operator=(const S&); // DO NOT IMPLEMENT
|
||||
/// };
|
||||
/// @endcode
|
||||
static bool IsDisallowedCopyOrAssign(const CXXMethodDecl *D) {
|
||||
// FIXME: Should check for private access too but access is set after we get
|
||||
// the decl here.
|
||||
if (D->isThisDeclarationADefinition())
|
||||
return false;
|
||||
|
||||
if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(D))
|
||||
return CD->isCopyConstructor();
|
||||
return D->isCopyAssignment();
|
||||
}
|
||||
|
||||
bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const {
|
||||
assert(D);
|
||||
|
||||
@@ -536,23 +554,23 @@ bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const {
|
||||
return false;
|
||||
|
||||
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
|
||||
if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
|
||||
return false;
|
||||
if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
|
||||
return false;
|
||||
|
||||
if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
|
||||
if (MD->isVirtual())
|
||||
return false;
|
||||
} else {
|
||||
// 'static inline' functions are used in headers; don't warn.
|
||||
if (FD->getStorageClass() == FunctionDecl::Static &&
|
||||
FD->isInlineSpecified())
|
||||
return false;
|
||||
}
|
||||
if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
|
||||
if (MD->isVirtual() || IsDisallowedCopyOrAssign(MD))
|
||||
return false;
|
||||
} else {
|
||||
// 'static inline' functions are used in headers; don't warn.
|
||||
if (FD->getStorageClass() == FunctionDecl::Static &&
|
||||
FD->isInlineSpecified())
|
||||
return false;
|
||||
}
|
||||
|
||||
if (FD->isThisDeclarationADefinition())
|
||||
return !Context.DeclMustBeEmitted(FD);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
|
||||
if (VD->isStaticDataMember() &&
|
||||
|
||||
@@ -11,6 +11,8 @@ namespace {
|
||||
void m1() { } // expected-warning{{unused}}
|
||||
void m2(); // expected-warning{{unused}}
|
||||
void m3();
|
||||
S(const S&);
|
||||
void operator=(const S&);
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
||||
Reference in New Issue
Block a user