r258768 - [Sema] Incomplete types are OK for covariant returns
David Majnemer via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 31 05:50:08 PST 2016
On Sunday, January 31, 2016, Kim Gräsman <kim.grasman at gmail.com> wrote:
> Hi David,
>
> Should this be guarded by if(cxx14)? I think the complete type was
> required by earlier standards.
>
It is the same issue as CWG defect report 1250:
http://wg21.cmeerw.net/cwg/issue1250
I forget how to tell how far back a DR applies but I'd guess this one goes
as far back as C++11.
> - Kim
> Den 26 jan 2016 2:40 fm skrev "David Majnemer via cfe-commits" <
> cfe-commits at lists.llvm.org
> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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/5f119bce/attachment-0001.html>
More information about the cfe-commits
mailing list