Thanks for the quick fix, Craig - sorry for the break. I do wonder what GCC's doing such that it's missing those cases...
(do we have a bootstrapping -Werror buildbot somewhere? I saw a few buildbreak emails this afternoon but a cursory inspection didn't seem to look like my fault) On Tue, Oct 16, 2012 at 10:18 PM, Craig Topper <[email protected]> wrote: > Fixed the bootstrap failure in r166089. > > > On Tue, Oct 16, 2012 at 9:50 PM, Craig Topper <[email protected]> > wrote: >> >> FYI, this breaks bootstrap builds of llvm. I'll commit a fix in few >> minutes. Apparently the equivalent check in gcc doesn't work on templates or >> something. >> >> >> On Tue, Oct 16, 2012 at 5:47 PM, David Blaikie <[email protected]> wrote: >>> >>> Author: dblaikie >>> Date: Tue Oct 16 19:47:58 2012 >>> New Revision: 166082 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=166082&view=rev >>> Log: >>> Implement C++ 10.3p16 - overrides involving deleted functions must match. >>> >>> Only deleted functions may override deleted functions and non-deleted >>> functions >>> may only override non-deleted functions. >>> >>> Added: >>> cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp >>> Modified: >>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >>> cfe/trunk/lib/Sema/SemaDecl.cpp >>> >>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=166082&r1=166081&r2=166082&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) >>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Oct 16 >>> 19:47:58 2012 >>> @@ -865,6 +865,12 @@ >>> def err_deleted_decl_not_first : Error< >>> "deleted definition must be first declaration">; >>> >>> +def err_deleted_override : Error< >>> + "deleted function %0 cannot override a non-deleted function">; >>> + >>> +def err_non_deleted_override : Error< >>> + "non-deleted function %0 cannot override a deleted function">; >>> + >>> def warn_weak_vtable : Warning< >>> "%0 has no out-of-line virtual method definitions; its vtable will be >>> " >>> "emitted in every translation unit">, >>> >>> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=166082&r1=166081&r2=166082&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) >>> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Oct 16 19:47:58 2012 >>> @@ -4733,6 +4733,31 @@ >>> return false; >>> } >>> >>> +namespace { >>> + enum OverrideErrorKind { OEK_All, OEK_NonDeleted, OEK_Deleted }; >>> +} >>> +/// \brief Report an error regarding overriding, along with any relevant >>> +/// overriden methods. >>> +/// >>> +/// \param DiagID the primary error to report. >>> +/// \param MD the overriding method. >>> +/// \param OEK which overrides to include as notes. >>> +static void ReportOverrides(Sema& S, unsigned DiagID, const >>> CXXMethodDecl *MD, >>> + OverrideErrorKind OEK = OEK_All) { >>> + S.Diag(MD->getLocation(), DiagID) << MD->getDeclName(); >>> + for (CXXMethodDecl::method_iterator I = >>> MD->begin_overridden_methods(), >>> + E = MD->end_overridden_methods(); >>> + I != E; ++I) { >>> + // This check (& the OEK parameter) could be replaced by a >>> predicate, but >>> + // without lambdas that would be overkill. This is still nicer than >>> writing >>> + // out the diag loop 3 times. >>> + if ((OEK == OEK_All) || >>> + (OEK == OEK_NonDeleted && !(*I)->isDeleted()) || >>> + (OEK == OEK_Deleted && (*I)->isDeleted())) >>> + S.Diag((*I)->getLocation(), >>> diag::note_overridden_virtual_function); >>> + } >>> +} >>> + >>> /// AddOverriddenMethods - See if a method overrides any in the base >>> classes, >>> /// and if so, check that it's a valid override and remember it. >>> bool Sema::AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD) { >>> @@ -4741,6 +4766,8 @@ >>> FindOverriddenMethodData Data; >>> Data.Method = MD; >>> Data.S = this; >>> + bool hasDeletedOverridenMethods = false; >>> + bool hasNonDeletedOverridenMethods = false; >>> bool AddedAny = false; >>> if (DC->lookupInBases(&FindOverriddenMethod, &Data, Paths)) { >>> for (CXXBasePaths::decl_iterator I = Paths.found_decls_begin(), >>> @@ -4750,12 +4777,21 @@ >>> if (!CheckOverridingFunctionReturnType(MD, OldMD) && >>> !CheckOverridingFunctionExceptionSpec(MD, OldMD) && >>> !CheckIfOverriddenFunctionIsMarkedFinal(MD, OldMD)) { >>> + hasDeletedOverridenMethods |= OldMD->isDeleted(); >>> + hasNonDeletedOverridenMethods |= !OldMD->isDeleted(); >>> AddedAny = true; >>> } >>> } >>> } >>> } >>> - >>> + >>> + if (hasDeletedOverridenMethods && !MD->isDeleted()) { >>> + ReportOverrides(*this, diag::err_non_deleted_override, MD, >>> OEK_Deleted); >>> + } >>> + if (hasNonDeletedOverridenMethods && MD->isDeleted()) { >>> + ReportOverrides(*this, diag::err_deleted_override, MD, >>> OEK_NonDeleted); >>> + } >>> + >>> return AddedAny; >>> } >>> >>> @@ -6068,16 +6104,7 @@ >>> if (AddOverriddenMethods(Method->getParent(), Method)) { >>> // If the function was marked as "static", we have a problem. >>> if (NewFD->getStorageClass() == SC_Static) { >>> - Diag(NewFD->getLocation(), >>> diag::err_static_overrides_virtual) >>> - << NewFD->getDeclName(); >>> - for (CXXMethodDecl::method_iterator >>> - Overridden = Method->begin_overridden_methods(), >>> - OverriddenEnd = Method->end_overridden_methods(); >>> - Overridden != OverriddenEnd; >>> - ++Overridden) { >>> - Diag((*Overridden)->getLocation(), >>> - diag::note_overridden_virtual_function); >>> - } >>> + ReportOverrides(*this, diag::err_static_overrides_virtual, >>> Method); >>> } >>> } >>> } >>> >>> Added: cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp?rev=166082&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp (added) >>> +++ cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp Tue Oct 16 >>> 19:47:58 2012 >>> @@ -0,0 +1,16 @@ >>> +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s >>> + >>> +struct A { >>> + virtual void a(); // expected-note{{overridden virtual function is >>> here}} >>> + virtual void b() = delete; // expected-note{{overridden virtual >>> function is here}} >>> +}; >>> + >>> +struct B: A { >>> + virtual void a() = delete; // expected-error{{deleted function 'a' >>> cannot override a non-deleted function}} >>> + virtual void b(); // expected-error{{non-deleted function 'b' cannot >>> override a deleted function}} >>> +}; >>> + >>> +struct C: A { >>> + virtual void a(); >>> + virtual void b() = delete; >>> +}; >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> [email protected] >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> >> >> >> >> -- >> ~Craig > > > > > -- > ~Craig _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
