[cfe-commits] r166082 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDecl.cpp test/CXX/class.derived/class.abstract/p16.cpp
David Blaikie
dblaikie at gmail.com
Tue Oct 16 22:23:00 PDT 2012
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 <craig.topper at gmail.com> wrote:
> Fixed the bootstrap failure in r166089.
>
>
> On Tue, Oct 16, 2012 at 9:50 PM, Craig Topper <craig.topper at gmail.com>
> 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 <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
>
>
>
>
> --
> ~Craig
More information about the cfe-commits
mailing list