Revert committed in r218969. On Fri, Oct 3, 2014 at 12:12 PM, Alexander Potapenko <[email protected]> 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 > <[email protected]> wrote: >> On Fri, Oct 3, 2014 at 4:24 AM, Richard Smith <[email protected]> wrote: >>> On Thu, Oct 2, 2014 at 4:13 PM, Fariborz Jahanian <[email protected]> >>> 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@+2 {{overridden virtual function is here}} >>>> // expected-warning@+1 {{'sealed' keyword is a Microsoft extension}} >>>> - virtual void SealedFunction() sealed; >>>> + virtual void SealedFunction() sealed; // expected-note {{overridden >>>> virtual function is here}} >>>> }; >>>> >>>> // 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(); >>>> + virtual void SealedFunction(); // expected-warning {{'SealedFunction' >>>> overrides a member function but is not marked 'override'}} >>>> >>>> // expected-warning@+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@+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@+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@+1 {{interface type cannot inherit from non-public >>>> 'interface I1'}} >>>> >>>> >>>> _______________________________________________ >>>> cfe-commits mailing list >>>> [email protected] >>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>> >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> [email protected] >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > > > -- > Alexander Potapenko > Software Engineer > Google Moscow
-- Alexander Potapenko Software Engineer Google Moscow _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
