]> granicus.if.org Git - clang/commitdiff
Revert r218925 - "Patch to warn if 'override' is missing"
authorAlexander Potapenko <glider@google.com>
Fri, 3 Oct 2014 09:02:53 +0000 (09:02 +0000)
committerAlexander Potapenko <glider@google.com>
Fri, 3 Oct 2014 09:02:53 +0000 (09:02 +0000)
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

15 files changed:
include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Sema/Sema.h
lib/Sema/SemaDeclCXX.cpp
test/CXX/class.derived/class.virtual/p3-0x.cpp
test/FixIt/cxx11-fixit-missing-override.cpp [deleted file]
test/FixIt/fixit-cxx0x.cpp
test/Parser/MicrosoftExtensions.cpp
test/Parser/cxx0x-decl.cpp
test/Parser/cxx0x-in-cxx98.cpp
test/SemaCXX/MicrosoftExtensions.cpp
test/SemaCXX/attr-gnu.cpp
test/SemaCXX/cxx11-warn-missing-override.cpp [deleted file]
test/SemaCXX/cxx98-compat.cpp
test/SemaCXX/ms-interface.cpp

index 18f36214b0b776000cbd9f30bab4e56f7181839e..19c08d36dc275dab501d96343f8a8e57d87c5a65 100644 (file)
@@ -146,8 +146,6 @@ def CXX98CompatPedantic : DiagGroup<"c++98-compat-pedantic",
 
 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]>;
 
index 886403b574a62f3757833b9fbd97b249d6e8dbc9..5fb3af619081851abd312a9a50c3200899adb004 100644 (file)
@@ -1689,9 +1689,6 @@ def override_keyword_hides_virtual_member_function : Error<
   "%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<
index fcc4b3a17e6d6518dc8f448d0ee708d2374fd244..769c18edd963658c69ab09a2bda3344747c9be36 100644 (file)
@@ -5084,10 +5084,6 @@ public:
 
   /// 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
index ef451a97997999939f34ec70906b952f2be0908e..ed15012a1602d47af96edbfb7390afe198ce1f3b 100644 (file)
@@ -1897,31 +1897,6 @@ void Sema::CheckOverrideControl(NamedDecl *D) {
       << 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.
@@ -4705,18 +4680,13 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) {
     }
   }
 
-  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);
@@ -4735,14 +4705,6 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) {
     }
   }
 
-  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
index e3e4dd2877df79bbe762ec7b76990dc64d916198..41a5954bf8638e83009017759c4bfdc411e350d1 100644 (file)
@@ -61,7 +61,7 @@ struct D : B {
 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;
@@ -83,7 +83,7 @@ namespace PR13499 {
   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.
@@ -91,13 +91,13 @@ namespace PR13499 {
 
   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}}
 }
 
diff --git a/test/FixIt/cxx11-fixit-missing-override.cpp b/test/FixIt/cxx11-fixit-missing-override.cpp
deleted file mode 100644 (file)
index 0a35491..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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;
-};
-
-
index 7830071748ebead416e28942bb9603c21a097024..49a05ff8d1e413d24d825c1afde2ac74788503af 100644 (file)
@@ -24,7 +24,7 @@ namespace SemiCommaTypo {
   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,
@@ -33,7 +33,7 @@ namespace SemiCommaTypo {
     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}}
   };
 }
index 85ccdc5490c0e59a032859808dd9f31ab9b191a3..ee530b8669fb02143128ac7143e8fa3472a727ab 100644 (file)
@@ -208,12 +208,12 @@ extern TypenameWrongPlace<AAAA> PR16925;
 
 __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();
 };
index 9bc60bd35a1ff3501be9bf518089cb9704407c1b..2cd68252133c0bfffc7b1e701228658522145b01 100644 (file)
@@ -83,13 +83,13 @@ namespace PR5066 {
 
 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;
index 3a63f63291a9f17cef05f5a1d016ef24754dd807..724993811631b2a68101099f997c8142ed73c212 100644 (file)
@@ -10,12 +10,11 @@ struct X {
 
 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() {
index b4d092d108b0e80ef179618b0f3007a9fccce66f..6d221a409e7bcf4a0b9e358ed774a64a96510ed9 100644 (file)
@@ -372,14 +372,14 @@ struct SomeBase {
 
   // 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;
index fcc3e46db82d5de82f89df36015037b613a81fd7..b4e9f4609f675eb1f83d86295a9ef740f4becf61 100644 (file)
@@ -15,15 +15,14 @@ void g(int a[static [[]] 5]); // expected-error {{static array size is a C99 fea
 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.
 };
diff --git a/test/SemaCXX/cxx11-warn-missing-override.cpp b/test/SemaCXX/cxx11-warn-missing-override.cpp
deleted file mode 100644 (file)
index efbd360..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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 {}
-};
-
index 7c6b408b6c539df9634fbc466e51f207c4114812..029e90989628728d7c73cdb42175f3fd9c77245d 100644 (file)
@@ -120,12 +120,11 @@ struct InClassInit {
 
 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}}
index 3ce7ce2c511dad4e2d1700747e63ac71e3d84334..e7386ce5b8e7b1751552caa09082fb2f728dd99e 100644 (file)
@@ -12,7 +12,7 @@ __interface I1 {
   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}}
@@ -44,7 +44,7 @@ __interface I3 final {
 __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'}}