This CL has caused bootstrap failures on Linux and OSX buildbots running with -Werror.
Example report from http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/13183/steps/bootstrap%20clang/logs/stdio:
================================================================
[ 91%] Building CXX object tools/clang/tools/diagtool/CMakeFiles/diagtool.dir/ShowEnabledWarnings.cpp.o
In file included from /home/dtoolsbot/build/sanitizer-x86_64-linux/build/llvm/lib/Target/R600/AMDGPUISelDAGToDAG.cpp:20:
In file included from /home/dtoolsbot/build/sanitizer-x86_64-linux/build/llvm/lib/Target/R600/SIISelLowering.h:19:
/home/dtoolsbot/build/sanitizer-x86_64-linux/build/llvm/lib/Target/R600/SIInstrInfo.h:71:8: error: 'getLdStBaseRegImmOfs' overrides a member function but is not marked 'override' [-Werror,-Winconsistent-missing-override]
bool getLdStBaseRegImmOfs(MachineInstr *LdSt,
^
/home/dtoolsbot/build/sanitizer-x86_64-linux/build/llvm/include/llvm/Target/TargetInstrInfo.h:815:16: note: overridden virtual function is here
virtual bool getLdStBaseRegImmOfs(MachineInstr *LdSt,
^
================================================================
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218969
91177308-0d34-0410-b5e6-
96231b3b80d8
def CXX11Narrowing : DiagGroup<"c++11-narrowing">;
-def CXX11WarnOverrideMethod : DiagGroup<"inconsistent-missing-override">;
-
// Original name of this warning in Clang
def : DiagGroup<"c++0x-narrowing", [CXX11Narrowing]>;
"%select{function|functions}1">;
def err_function_marked_override_not_overriding : Error<
"%0 marked 'override' but does not override any member functions">;
-def warn_function_marked_not_override_overriding : Warning <
- "%0 overrides a member function but is not marked 'override'">,
- InGroup<CXX11WarnOverrideMethod>;
def err_class_marked_final_used_as_base : Error<
"base %0 is marked '%select{final|sealed}1'">;
def warn_abstract_final_class : Warning<
/// CheckOverrideControl - Check C++11 override control semantics.
void CheckOverrideControl(NamedDecl *D);
-
- /// DiagnoseAbsenseOfOverrideControl - Diagnose if override control was
- /// not used in the; otherwise, overriding method.
- void DiagnoseAbsenseOfOverrideControl(NamedDecl *D);
/// CheckForFunctionMarkedFinal - Checks whether a virtual member function
/// overrides a virtual member function marked 'final', according to
<< MD->getDeclName();
}
-void Sema::DiagnoseAbsenseOfOverrideControl(NamedDecl *D) {
- if (D->isInvalidDecl())
- return;
- CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D);
- if (!MD || MD->isImplicit() || isa<CXXDestructorDecl>(MD))
- return;
-
- bool HasOverriddenMethods =
- MD->begin_overridden_methods() != MD->end_overridden_methods();
- if (HasOverriddenMethods) {
- SourceLocation EndLocation =
- (MD->isPure() || MD->hasAttr<FinalAttr>())
- ? SourceLocation() : MD->getSourceRange().getEnd();
- Diag(MD->getLocation(), diag::warn_function_marked_not_override_overriding)
- << MD->getDeclName()
- << FixItHint::CreateReplacement(EndLocation, ") override");
- for (CXXMethodDecl::method_iterator I = MD->begin_overridden_methods(),
- E = MD->end_overridden_methods(); I != E; ++I) {
- const CXXMethodDecl *OMD = *I;
- Diag(OMD->getLocation(), diag::note_overridden_virtual_function);
- break;
- }
- }
-}
-
/// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
/// function overrides a virtual member function marked 'final', according to
/// C++11 [class.virtual]p4.
}
}
- bool HasMethodWithOverrideControl = false,
- HasOverridingMethodWithoutOverrideControl = false;
if (!Record->isDependentType()) {
for (auto *M : Record->methods()) {
// See if a method overloads virtual methods in a base
// class without overriding any.
if (!M->isStatic())
DiagnoseHiddenVirtualMethods(M);
- if (M->hasAttr<OverrideAttr>())
- HasMethodWithOverrideControl = true;
- else if (M->begin_overridden_methods() != M->end_overridden_methods())
- HasOverridingMethodWithoutOverrideControl = true;
+
// Check whether the explicitly-defaulted special members are valid.
if (!M->isInvalidDecl() && M->isExplicitlyDefaulted())
CheckExplicitlyDefaultedSpecialMember(M);
}
}
- if (HasMethodWithOverrideControl
- && HasOverridingMethodWithoutOverrideControl) {
- // At least one method has the 'override' control declared.
- // Diagnose all other overridden methods which do not have 'override' specified on them.
- for (auto *M : Record->methods())
- if (!M->hasAttr<OverrideAttr>())
- DiagnoseAbsenseOfOverrideControl(M);
- }
// C++11 [dcl.constexpr]p8: A constexpr specifier for a non-static member
// function that is not a constructor declares that member function to be
// const. [...] The class of which that function is a member shall be
namespace PR13499 {
struct X {
virtual void f();
- virtual void h(); // expected-note 2 {{overridden virtual function is here}}
+ virtual void h();
};
template<typename T> struct A : X {
void f() override;
template<typename...T> struct E : X {
void f(T...) override;
void g(T...) override; // expected-error {{only virtual member functions can be marked 'override'}}
- void h(T...) final; // expected-warning {{'h' overrides a member function but is not marked 'override'}}
+ void h(T...) final;
void i(T...) final; // expected-error {{only virtual member functions can be marked 'final'}}
};
// FIXME: Diagnose these in the template definition, not in the instantiation.
template<typename T> struct Y : T {
void f() override;
- void h() final; // expected-warning {{'h' overrides a member function but is not marked 'override'}}
+ void h() final;
};
template<typename T> struct Z : T {
void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
};
- Y<X> y; // expected-note {{in instantiation of}}
+ Y<X> y;
Z<X> z; // expected-note {{in instantiation of}}
}
+++ /dev/null
-// RUN: cp %s %t
-// RUN: %clang_cc1 -x c++ -std=c++11 -Winconsistent-missing-override -fixit %t
-// RUN: %clang_cc1 -x c++ -std=c++11 -Winconsistent-missing-override -Werror %t
-
-struct A
-{
- virtual void foo();
- virtual void bar(); // expected-note {{overridden virtual function is here}}
- virtual void gorf() {}
- virtual void g() = 0; // expected-note {{overridden virtual function is here}}
-};
-
-struct B : A
-{
- void foo() override;
- void bar(); // expected-warning {{'bar' overrides a member function but is not marked 'override'}}
-};
-
-struct C : B
-{
- virtual void g() override = 0; // expected-warning {{'g' overrides a member function but is not marked 'override'}}
- virtual void gorf() override {}
- void foo() {}
-};
-
-struct D : C {
- virtual void g()override ;
- virtual void foo(){
- }
- void bar() override;
-};
-
-
int o;
struct Base {
- virtual void f2(), f3(); // expected-note {{overridden virtual function is here}}
+ virtual void f2(), f3();
};
struct MemberDeclarator : Base {
int k : 4,
char c, // expected-error {{expected ';' at end of declaration}}
typedef void F(), // expected-error {{expected ';' at end of declaration}}
F f1,
- f2 final, // expected-warning {{'f2' overrides a member function but is not marked 'override'}}
+ f2 final,
f3 override, // expected-error {{expected ';' at end of declaration}}
};
}
__interface MicrosoftInterface;
__interface MicrosoftInterface {
- void foo1() = 0; // expected-note {{overridden virtual function is here}}
+ void foo1() = 0;
virtual void foo2() = 0;
};
__interface MicrosoftDerivedInterface : public MicrosoftInterface {
- void foo1(); // expected-warning {{'foo1' overrides a member function but is not marked 'override'}}
+ void foo1();
void foo2() override;
void foo3();
};
namespace FinalOverride {
struct Base {
- virtual void *f(); // expected-note {{overridden virtual function is here}}
+ virtual void *f();
virtual void *g();
virtual void *h();
virtual void *i();
};
struct Derived : Base {
- virtual auto f() -> void *final; // expected-warning {{'f' overrides a member function but is not marked 'override'}}
+ virtual auto f() -> void *final;
virtual auto g() -> void *override;
virtual auto h() -> void *final override;
virtual auto i() -> void *override final;
struct B {
virtual void f();
- virtual void g(); // expected-note {{overridden virtual function is here}}
+ virtual void g();
};
struct D final : B { // expected-warning {{'final' keyword is a C++11 extension}}
virtual void f() override; // expected-warning {{'override' keyword is a C++11 extension}}
- virtual void g() final; // expected-warning {{'final' keyword is a C++11 extension}} \
- // expected-warning {{'g' overrides a member function but is not marked 'override'}}
+ virtual void g() final; // expected-warning {{'final' keyword is a C++11 extension}}
};
void NewBracedInitList() {
// expected-note@+2 {{overridden virtual function is here}}
// expected-warning@+1 {{'sealed' keyword is a Microsoft extension}}
- virtual void SealedFunction() sealed; // expected-note {{overridden virtual function is here}}
+ virtual void SealedFunction() sealed;
};
// expected-note@+2 {{'SealedType' declared here}}
// expected-warning@+1 {{'sealed' keyword is a Microsoft extension}}
struct SealedType sealed : SomeBase {
// expected-error@+1 {{declaration of 'SealedFunction' overrides a 'sealed' function}}
- virtual void SealedFunction(); // expected-warning {{'SealedFunction' overrides a member function but is not marked 'override'}}
+ virtual void SealedFunction();
// expected-warning@+1 {{'override' keyword is a C++11 extension}}
virtual void OverrideMe() override;
namespace {
class B {
public:
- virtual void test() {} // expected-note {{overridden virtual function is here}}
+ virtual void test() {}
virtual void test2() {}
virtual void test3() {}
};
class D : public B {
public:
- void test() __attribute__((deprecated)) final {} // expected-warning {{GCC does not allow an attribute in this position on a function declaration}} \
- // expected-warning {{'test' overrides a member function but is not marked 'override'}}
+ void test() __attribute__((deprecated)) final {} // expected-warning {{GCC does not allow an attribute in this position on a function declaration}}
void test2() [[]] override {} // Ok
void test3() __attribute__((cf_unknown_transfer)) override {} // Ok, not known to GCC.
};
+++ /dev/null
-// RUN: %clang_cc1 -fsyntax-only -Winconsistent-missing-override -verify -std=c++11 %s
-struct A
-{
- virtual void foo();
- virtual void bar(); // expected-note {{overridden virtual function is here}}
- virtual void gorf() {}
- virtual void g() = 0; // expected-note {{overridden virtual function is here}}
-};
-
-struct B : A
-{
- void foo() override;
- void bar(); // expected-warning {{'bar' overrides a member function but is not marked 'override'}}
-};
-
-struct C : B
-{
- virtual void g() = 0; // expected-warning {{'g' overrides a member function but is not marked 'override'}}
- virtual void gorf() override {}
-};
-
struct OverrideControlBase {
virtual void f();
- virtual void g(); // expected-note {{overridden virtual function is here}}
+ virtual void g();
};
struct OverrideControl final : OverrideControlBase { // expected-warning {{'final' keyword is incompatible with C++98}}
virtual void f() override; // expected-warning {{'override' keyword is incompatible with C++98}}
- virtual void g() final; // expected-warning {{'final' keyword is incompatible with C++98}} \
- // expected-warning {{'g' overrides a member function but is not marked 'override'}}
+ virtual void g() final; // expected-warning {{'final' keyword is incompatible with C++98}}
};
using AliasDecl = int; // expected-warning {{alias declarations are incompatible with C++98}}
operator int();
// expected-error@+1 {{nested class I1::(anonymous) is not permitted within an interface type}}
struct { int a; };
- void fn2() { // expected-note {{overridden virtual function is here}}
+ void fn2() {
struct A { }; // should be ignored: not a nested class
}
protected: // expected-error {{interface types cannot specify 'protected' access}}
__interface I4 : I1, I2 {
void fn1() const override;
// expected-error@+1 {{'final' keyword not permitted with interface types}}
- void fn2() final; // expected-warning {{'fn2' overrides a member function but is not marked 'override'}}
+ void fn2() final;
};
// expected-error@+1 {{interface type cannot inherit from non-public 'interface I1'}}