r218925 - Patch to warn if 'override' is missing

Alexander Potapenko glider at google.com
Fri Oct 3 01:12:34 PDT 2014


I'm going to revert this patch because it broke bootstraping on both
Linux and Mac.

On Fri, Oct 3, 2014 at 11:26 AM, Evgeniy Stepanov
<eugeni.stepanov at gmail.com> wrote:
> On Fri, Oct 3, 2014 at 4:24 AM, Richard Smith <richard at metafoo.co.uk> wrote:
>> On Thu, Oct 2, 2014 at 4:13 PM, Fariborz Jahanian <fjahanian at apple.com>
>> wrote:
>>>
>>> Author: fjahanian
>>> Date: Thu Oct  2 18:13:51 2014
>>> New Revision: 218925
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=218925&view=rev
>>> Log:
>>> Patch to warn if 'override' is missing
>>> for an overriding method if class has at least one
>>> 'override' specified on one of its methods.
>>> Reviewed by Doug Gregor. rdar://18295240
>>> (I have already checked in all llvm files with missing 'override'
>>>  methods and Bob Wilson has fixed a TableGen of FastISel so
>>>  no warnings are expected from build of llvm after this patch.
>>>  I have already verified this).
>>>
>>> Added:
>>>     cfe/trunk/test/FixIt/cxx11-fixit-missing-override.cpp
>>>     cfe/trunk/test/SemaCXX/cxx11-warn-missing-override.cpp
>>> Modified:
>>>     cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>>     cfe/trunk/include/clang/Sema/Sema.h
>>>     cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>>     cfe/trunk/test/CXX/class.derived/class.virtual/p3-0x.cpp
>>>     cfe/trunk/test/FixIt/fixit-cxx0x.cpp
>>>     cfe/trunk/test/Parser/MicrosoftExtensions.cpp
>>>     cfe/trunk/test/Parser/cxx0x-decl.cpp
>>>     cfe/trunk/test/Parser/cxx0x-in-cxx98.cpp
>>>     cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp
>>>     cfe/trunk/test/SemaCXX/attr-gnu.cpp
>>>     cfe/trunk/test/SemaCXX/cxx98-compat.cpp
>>>     cfe/trunk/test/SemaCXX/ms-interface.cpp
>>>
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Thu Oct  2 18:13:51
>>> 2014
>>> @@ -146,6 +146,8 @@ def CXX98CompatPedantic : DiagGroup<"c++
>>>
>>>  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]>;
>>>
>>>
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Oct  2
>>> 18:13:51 2014
>>> @@ -1689,6 +1689,9 @@ def override_keyword_hides_virtual_membe
>>>    "%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<
>>>
>>> Modified: cfe/trunk/include/clang/Sema/Sema.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Sema/Sema.h (original)
>>> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Oct  2 18:13:51 2014
>>> @@ -5084,6 +5084,10 @@ 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.
>>
>>
>> Something weird has happened to this comment.
>>
>>>
>>> +  void DiagnoseAbsenseOfOverrideControl(NamedDecl *D);
>>>
>>>    /// CheckForFunctionMarkedFinal - Checks whether a virtual member
>>> function
>>>    /// overrides a virtual member function marked 'final', according to
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Oct  2 18:13:51 2014
>>> @@ -1897,6 +1897,31 @@ void Sema::CheckOverrideControl(NamedDec
>>>        << 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;
>>
>>
>> Why do you skip destructors?
>>
>>> +  bool HasOverriddenMethods =
>>> +    MD->begin_overridden_methods() != MD->end_overridden_methods();
>>> +  if (HasOverriddenMethods) {
>>> +    SourceLocation EndLocation =
>>> +      (MD->isPure() || MD->hasAttr<FinalAttr>())
>>
>>
>> We should not warn if the function (or the class) has the 'final' attribute.
>
> And it breaks bootstrap:
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/13183/steps/bootstrap%20clang/logs/stdio
>
> If we choose to warn about missing override on final methods, we
> should at least fix all such cases in LLVM code.
>
>>>
>>> +        ? SourceLocation() : MD->getSourceRange().getEnd();
>>> +    Diag(MD->getLocation(),
>>> diag::warn_function_marked_not_override_overriding)
>>> +      << MD->getDeclName()
>>> +      << FixItHint::CreateReplacement(EndLocation, ") override");
>>
>>
>> This fixit is not correct. The EndLocation isn't necessarily the location of
>> the `)`, and the `override` does not necessarily go after the `)`. (Consider
>> cv-qualifiers and ref-qualifiers, or functions whose return type includes
>> trailing declarator chunks, or functions with trailing return types.)
>>
>>>
>>> +    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.
>>> @@ -4680,13 +4705,18 @@ void Sema::CheckCompletedCXXClass(CXXRec
>>>      }
>>>    }
>>>
>>> +  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())
>>
>>
>> Maybe just use M->size_overridden_methods() here.
>>
>>>
>>> +        HasOverridingMethodWithoutOverrideControl = true;
>>>        // Check whether the explicitly-defaulted special members are
>>> valid.
>>>        if (!M->isInvalidDecl() && M->isExplicitlyDefaulted())
>>>          CheckExplicitlyDefaultedSpecialMember(M);
>>> @@ -4705,6 +4735,14 @@ void Sema::CheckCompletedCXXClass(CXXRec
>>>      }
>>>    }
>>>
>>> +  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
>>>
>>> Modified: cfe/trunk/test/CXX/class.derived/class.virtual/p3-0x.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class.derived/class.virtual/p3-0x.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/CXX/class.derived/class.virtual/p3-0x.cpp (original)
>>> +++ cfe/trunk/test/CXX/class.derived/class.virtual/p3-0x.cpp Thu Oct  2
>>> 18:13:51 2014
>>> @@ -61,7 +61,7 @@ struct D : B {
>>>  namespace PR13499 {
>>>    struct X {
>>>      virtual void f();
>>> -    virtual void h();
>>> +    virtual void h(); // expected-note 2 {{overridden virtual function is
>>> here}}
>>>    };
>>>    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;
>>> +    void h(T...) final; // expected-warning {{'h' overrides a member
>>> function but is not marked 'override'}}
>>
>>
>> This warning is bogus; it makes no sense to require both 'override' and
>> '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;
>>> +    void h() final; // expected-warning {{'h' overrides a member function
>>> but is not marked 'override'}}
>>
>>
>> ... likewise.
>>
>>>
>>>    };
>>>    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;
>>> +  Y<X> y; // expected-note {{in instantiation of}}
>>>    Z<X> z; // expected-note {{in instantiation of}}
>>>  }
>>>
>>>
>>> Added: cfe/trunk/test/FixIt/cxx11-fixit-missing-override.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/cxx11-fixit-missing-override.cpp?rev=218925&view=auto
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/FixIt/cxx11-fixit-missing-override.cpp (added)
>>> +++ cfe/trunk/test/FixIt/cxx11-fixit-missing-override.cpp Thu Oct  2
>>> 18:13:51 2014
>>> @@ -0,0 +1,33 @@
>>> +// 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;
>>> +};
>>> +
>>> +
>>>
>>> Modified: cfe/trunk/test/FixIt/fixit-cxx0x.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/fixit-cxx0x.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/FixIt/fixit-cxx0x.cpp (original)
>>> +++ cfe/trunk/test/FixIt/fixit-cxx0x.cpp Thu Oct  2 18:13:51 2014
>>> @@ -24,7 +24,7 @@ namespace SemiCommaTypo {
>>>    int o;
>>>
>>>    struct Base {
>>> -    virtual void f2(), f3();
>>> +    virtual void f2(), f3(); // expected-note {{overridden virtual
>>> function is here}}
>>>    };
>>>    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,
>>> +      f2 final, // expected-warning {{'f2' overrides a member function
>>> but is not marked 'override'}}
>>>        f3 override, // expected-error {{expected ';' at end of
>>> declaration}}
>>>    };
>>>  }
>>>
>>> Modified: cfe/trunk/test/Parser/MicrosoftExtensions.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/MicrosoftExtensions.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/Parser/MicrosoftExtensions.cpp (original)
>>> +++ cfe/trunk/test/Parser/MicrosoftExtensions.cpp Thu Oct  2 18:13:51 2014
>>> @@ -208,12 +208,12 @@ extern TypenameWrongPlace<AAAA> PR16925;
>>>
>>>  __interface MicrosoftInterface;
>>>  __interface MicrosoftInterface {
>>> -   void foo1() = 0;
>>> +   void foo1() = 0; // expected-note {{overridden virtual function is
>>> here}}
>>>     virtual void foo2() = 0;
>>>  };
>>>
>>>  __interface MicrosoftDerivedInterface : public MicrosoftInterface {
>>> -  void foo1();
>>> +  void foo1(); // expected-warning {{'foo1' overrides a member function
>>> but is not marked 'override'}}
>>>    void foo2() override;
>>>    void foo3();
>>>  };
>>>
>>> Modified: cfe/trunk/test/Parser/cxx0x-decl.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-decl.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/Parser/cxx0x-decl.cpp (original)
>>> +++ cfe/trunk/test/Parser/cxx0x-decl.cpp Thu Oct  2 18:13:51 2014
>>> @@ -83,13 +83,13 @@ namespace PR5066 {
>>>
>>>  namespace FinalOverride {
>>>    struct Base {
>>> -    virtual void *f();
>>> +    virtual void *f(); // expected-note {{overridden virtual function is
>>> here}}
>>>      virtual void *g();
>>>      virtual void *h();
>>>      virtual void *i();
>>>    };
>>>    struct Derived : Base {
>>> -    virtual auto f() -> void *final;
>>> +    virtual auto f() -> void *final; // expected-warning {{'f' overrides
>>> a member function but is not marked 'override'}}
>>>      virtual auto g() -> void *override;
>>>      virtual auto h() -> void *final override;
>>>      virtual auto i() -> void *override final;
>>>
>>> Modified: cfe/trunk/test/Parser/cxx0x-in-cxx98.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-in-cxx98.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/Parser/cxx0x-in-cxx98.cpp (original)
>>> +++ cfe/trunk/test/Parser/cxx0x-in-cxx98.cpp Thu Oct  2 18:13:51 2014
>>> @@ -10,11 +10,12 @@ struct X {
>>>
>>>  struct B {
>>>    virtual void f();
>>> -  virtual void g();
>>> +  virtual void g(); // expected-note {{overridden virtual function is
>>> here}}
>>>  };
>>>  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}}
>>> +  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'}}
>>>  };
>>>
>>>  void NewBracedInitList() {
>>>
>>> Modified: cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp (original)
>>> +++ cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp Thu Oct  2 18:13:51
>>> 2014
>>> @@ -372,14 +372,14 @@ struct SomeBase {
>>>
>>>    // expected-note at +2 {{overridden virtual function is here}}
>>>    // expected-warning at +1 {{'sealed' keyword is a Microsoft extension}}
>>> -  virtual void SealedFunction() sealed;
>>> +  virtual void SealedFunction() sealed; // expected-note {{overridden
>>> virtual function is here}}
>>>  };
>>>
>>>  // expected-note at +2 {{'SealedType' declared here}}
>>>  // expected-warning at +1 {{'sealed' keyword is a Microsoft extension}}
>>>  struct SealedType sealed : SomeBase {
>>>    // expected-error at +1 {{declaration of 'SealedFunction' overrides a
>>> 'sealed' function}}
>>> -  virtual void SealedFunction();
>>> +  virtual void SealedFunction(); // expected-warning {{'SealedFunction'
>>> overrides a member function but is not marked 'override'}}
>>>
>>>    // expected-warning at +1 {{'override' keyword is a C++11 extension}}
>>>    virtual void OverrideMe() override;
>>>
>>> Modified: cfe/trunk/test/SemaCXX/attr-gnu.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-gnu.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/SemaCXX/attr-gnu.cpp (original)
>>> +++ cfe/trunk/test/SemaCXX/attr-gnu.cpp Thu Oct  2 18:13:51 2014
>>> @@ -15,14 +15,15 @@ void g(int a[static [[]] 5]); // expecte
>>>  namespace {
>>>  class B {
>>>  public:
>>> -  virtual void test() {}
>>> +  virtual void test() {} // expected-note {{overridden virtual function
>>> is here}}
>>>    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}}
>>> +  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 test2() [[]] override {} // Ok
>>>    void test3() __attribute__((cf_unknown_transfer)) override {} // Ok,
>>> not known to GCC.
>>>  };
>>>
>>> Added: cfe/trunk/test/SemaCXX/cxx11-warn-missing-override.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx11-warn-missing-override.cpp?rev=218925&view=auto
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/SemaCXX/cxx11-warn-missing-override.cpp (added)
>>> +++ cfe/trunk/test/SemaCXX/cxx11-warn-missing-override.cpp Thu Oct  2
>>> 18:13:51 2014
>>> @@ -0,0 +1,21 @@
>>> +// 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 {}
>>> +};
>>> +
>>>
>>> Modified: cfe/trunk/test/SemaCXX/cxx98-compat.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx98-compat.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/SemaCXX/cxx98-compat.cpp (original)
>>> +++ cfe/trunk/test/SemaCXX/cxx98-compat.cpp Thu Oct  2 18:13:51 2014
>>> @@ -120,11 +120,12 @@ struct InClassInit {
>>>
>>>  struct OverrideControlBase {
>>>    virtual void f();
>>> -  virtual void g();
>>> +  virtual void g(); // expected-note {{overridden virtual function is
>>> here}}
>>>  };
>>>  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}}
>>> +  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'}}
>>>  };
>>>
>>>  using AliasDecl = int; // expected-warning {{alias declarations are
>>> incompatible with C++98}}
>>>
>>> Modified: cfe/trunk/test/SemaCXX/ms-interface.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ms-interface.cpp?rev=218925&r1=218924&r2=218925&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/SemaCXX/ms-interface.cpp (original)
>>> +++ cfe/trunk/test/SemaCXX/ms-interface.cpp Thu Oct  2 18:13:51 2014
>>> @@ -12,7 +12,7 @@ __interface I1 {
>>>    operator int();
>>>    // expected-error at +1 {{nested class I1::(anonymous) is not permitted
>>> within an interface type}}
>>>    struct { int a; };
>>> -  void fn2() {
>>> +  void fn2() { // expected-note {{overridden virtual function is here}}
>>>      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 at +1 {{'final' keyword not permitted with interface
>>> types}}
>>> -  void fn2() final;
>>> +  void fn2() final; // expected-warning {{'fn2' overrides a member
>>> function but is not marked 'override'}}
>>>  };
>>>
>>>  // expected-error at +1 {{interface type cannot inherit from non-public
>>> 'interface I1'}}
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



-- 
Alexander Potapenko
Software Engineer
Google Moscow



More information about the cfe-commits mailing list