r258768 - [Sema] Incomplete types are OK for covariant returns
Kim Gräsman via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 31 04:24:17 PST 2016
Hi David,
Should this be guarded by if(cxx14)? I think the complete type was required
by earlier standards.
- Kim
Den 26 jan 2016 2:40 fm skrev "David Majnemer via cfe-commits" <
cfe-commits at lists.llvm.org>:
> Author: majnemer
> Date: Mon Jan 25 19:37:01 2016
> New Revision: 258768
>
> URL: http://llvm.org/viewvc/llvm-project?rev=258768&view=rev
> Log:
> [Sema] Incomplete types are OK for covariant returns
>
> Per C++14 [class.virtual]p8, it is OK for the return type's class type
> to be incomplete so long as the return type is the same between the base
> and complete classes.
>
> This fixes PR26297.
>
> Modified:
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> cfe/trunk/test/SemaCXX/virtual-override.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=258768&r1=258767&r2=258768&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Jan 25 19:37:01 2016
> @@ -13020,19 +13020,20 @@ bool Sema::CheckOverridingFunctionReturn
> return true;
> }
>
> - // C++ [class.virtual]p6:
> - // If the return type of D::f differs from the return type of B::f,
> the
> - // class type in the return type of D::f shall be complete at the
> point of
> - // declaration of D::f or shall be the class type D.
> - if (const RecordType *RT = NewClassTy->getAs<RecordType>()) {
> - if (!RT->isBeingDefined() &&
> - RequireCompleteType(New->getLocation(), NewClassTy,
> - diag::err_covariant_return_incomplete,
> - New->getDeclName()))
> - return true;
> - }
> -
> if (!Context.hasSameUnqualifiedType(NewClassTy, OldClassTy)) {
> + // C++14 [class.virtual]p8:
> + // If the class type in the covariant return type of D::f differs
> from
> + // that of B::f, the class type in the return type of D::f shall be
> + // complete at the point of declaration of D::f or shall be the
> class
> + // type D.
> + if (const RecordType *RT = NewClassTy->getAs<RecordType>()) {
> + if (!RT->isBeingDefined() &&
> + RequireCompleteType(New->getLocation(), NewClassTy,
> + diag::err_covariant_return_incomplete,
> + New->getDeclName()))
> + return true;
> + }
> +
> // Check if the new class derives from the old class.
> if (!IsDerivedFrom(New->getLocation(), NewClassTy, OldClassTy)) {
> Diag(New->getLocation(), diag::err_covariant_return_not_derived)
>
> Modified: cfe/trunk/test/SemaCXX/virtual-override.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/virtual-override.cpp?rev=258768&r1=258767&r2=258768&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/virtual-override.cpp (original)
> +++ cfe/trunk/test/SemaCXX/virtual-override.cpp Mon Jan 25 19:37:01 2016
> @@ -289,3 +289,15 @@ namespace PR8168 {
> static void foo() {} // expected-error{{'static' member function
> 'foo' overrides a virtual function}}
> };
> }
> +
> +namespace PR26297 {
> +struct Incomplete;
> +
> +struct Base {
> + virtual const Incomplete *meow() = 0;
> +};
> +
> +struct Derived : Base {
> + virtual Incomplete *meow() override { return nullptr; }
> +};
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160131/98c44d5d/attachment.html>
More information about the cfe-commits
mailing list