r218925 - Patch to warn if 'override' is missing
Alexander Potapenko
glider at google.com
Fri Oct 3 02:13:08 PDT 2014
Revert committed in r218969.
On Fri, Oct 3, 2014 at 12:12 PM, Alexander Potapenko <glider at google.com> wrote:
> 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
--
Alexander Potapenko
Software Engineer
Google Moscow
More information about the cfe-commits
mailing list