Skip to content

Commit a31174e

Browse files
committed
Fix -Wunused-private-field to fire regardless of which implicit special members have been implicitly declared.
llvm-svn: 317076
1 parent 057a942 commit a31174e

File tree

4 files changed

+23
-3
lines changed

4 files changed

+23
-3
lines changed

clang/lib/Sema/Sema.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,8 @@ static bool MethodsAndNestedClassesComplete(const CXXRecordDecl *RD,
737737
E = RD->decls_end();
738738
I != E && Complete; ++I) {
739739
if (const CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(*I))
740-
Complete = M->isDefined() || (M->isPure() && !isa<CXXDestructorDecl>(M));
740+
Complete = M->isDefined() || M->isDefaulted() ||
741+
(M->isPure() && !isa<CXXDestructorDecl>(M));
741742
else if (const FunctionTemplateDecl *F = dyn_cast<FunctionTemplateDecl>(*I))
742743
// If the template function is marked as late template parsed at this
743744
// point, it has not been instantiated and therefore we have not

clang/lib/Sema/SemaExprMember.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1791,7 +1791,9 @@ Sema::BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
17911791
MemberType = Context.getQualifiedType(MemberType, Combined);
17921792
}
17931793

1794-
UnusedPrivateFields.remove(Field);
1794+
auto *CurMethod = dyn_cast<CXXMethodDecl>(CurContext);
1795+
if (!(CurMethod && CurMethod->isDefaulted()))
1796+
UnusedPrivateFields.remove(Field);
17951797

17961798
ExprResult Base = PerformObjectMemberConversion(BaseExpr, SS.getScopeRep(),
17971799
FoundDecl, Field);

clang/test/SemaCXX/unused.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// PR4103 : Make sure we don't get a bogus unused expression warning
77
namespace PR4103 {
88
class APInt {
9-
char foo;
9+
char foo; // expected-warning {{private field 'foo' is not used}}
1010
};
1111
class APSInt : public APInt {
1212
char bar; // expected-warning {{private field 'bar' is not used}}

clang/test/SemaCXX/warn-unused-private-field.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %clang_cc1 -fsyntax-only -Wunused-private-field -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++11 %s
2+
// RUN: %clang_cc1 -fsyntax-only -Wunused-private-field -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++17 %s
23

34
class NotFullyDefined {
45
public:
@@ -246,3 +247,19 @@ namespace pr13543 {
246247
X x[4]; // no-warning
247248
};
248249
}
250+
251+
class implicit_special_member {
252+
public:
253+
static implicit_special_member make() { return implicit_special_member(); }
254+
255+
private:
256+
int n; // expected-warning{{private field 'n' is not used}}
257+
};
258+
259+
class defaulted_special_member {
260+
public:
261+
defaulted_special_member(const defaulted_special_member&) = default;
262+
263+
private:
264+
int n; // expected-warning{{private field 'n' is not used}}
265+
};

0 commit comments

Comments
 (0)