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