Skip to content

Commit 59a4fe7

Browse files
committed
Disable for functions that were already virtual
1 parent dcff453 commit 59a4fe7

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7196,15 +7196,14 @@ void Sema::CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record) {
71967196

71977197
if (M->hasAttr<OverrideAttr>()) {
71987198
HasMethodWithOverrideControl = true;
7199+
} else if (M->size_overridden_methods() > 0) {
7200+
HasOverridingMethodWithoutOverrideControl = true;
71997201
} else {
7200-
if (M->size_overridden_methods() > 0)
7201-
HasOverridingMethodWithoutOverrideControl = true;
7202-
7203-
// Warn on virtual methods in final classes, unless they're also
7204-
// marked `override`.
7205-
if (M->isVirtualAsWritten() && Record->isEffectivelyFinal())
7202+
// Warn on newly-declared virtual methods in `final` classes
7203+
if (M->isVirtualAsWritten() && Record->isEffectivelyFinal()) {
72067204
Diag(M->getLocation(), diag::warn_unnecessary_virtual_specifier)
72077205
<< M;
7206+
}
72087207
}
72097208
}
72107209

clang/test/SemaCXX/unnecessary-virtual-specifier.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clang_cc1 -fsyntax-only -verify -Wunnecessary-virtual-specifier %s
1+
// RUN: %clang_cc1 -fsyntax-only -verify -Wunnecessary-virtual-specifier -Wno-inconsistent-missing-override %s
22

33
struct Foo final {
44
Foo() = default;
@@ -15,15 +15,17 @@ struct Foo final {
1515
struct BarBase {
1616
virtual ~BarBase() = delete;
1717
virtual void virt() {}
18-
virtual int virt(int);
18+
virtual int virt2(int);
19+
virtual bool virt3(bool);
1920
int nonvirt();
2021
};
2122

2223
struct Bar final : BarBase {
2324
~Bar() override = delete;
24-
void virt() override {};
25-
// `virtual ... override;` is a common pattern, so don't warn
26-
virtual int virt(int) override;
27-
virtual int virt(bool); // expected-warning {{virtual method}}
25+
void virt() override {};
26+
virtual int virt2(int) override; // `virtual ... override;` is a common pattern, so don't warn
27+
virtual bool virt3(bool); // Already virtual in the base class; triggers
28+
// -Winconsistent-missing-override or -Wsuggest-override instead
29+
virtual int new_virt(bool); // expected-warning {{virtual method}}
2830
int nonvirt();
2931
};

0 commit comments

Comments
 (0)