[cfe-commits] r166082 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDecl.cpp test/CXX/class.derived/class.abstract/p16.cpp
Craig Topper
craig.topper at gmail.com
Tue Oct 16 21:50:58 PDT 2012
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 <dblaikie at gmail.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
--
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121016/6801d319/attachment.html>
More information about the cfe-commits
mailing list