__is_constructible return true for abstract types PR19178

Nikola Smiljanic popizdeh at gmail.com
Mon Apr 14 17:57:08 PDT 2014


I had a quick look at RequireNonAbstractType but as you said it only
provides diagnostic and completes the type which we already did.

I'll add tests for other two traits. I have commit access.

Thanks.


On Tue, Apr 15, 2014 at 10:44 AM, Richard Smith <richard at metafoo.co.uk>wrote:

> I'd like a little more test coverage (for the other two type traits that
> hit this codepath), but otherwise LGTM.
>
> It doesn't matter whether we call RequireNonAbstractType or just
> isAbstract() here, because we don't need to complete the type (we did that
> a few lines above) and we don't care about its ability to produce nice
> diagnostics. Using isAbstract() is more consistent with the
> isIncompleteType() call immediately above, so the code change seems fine as
> is.
>
> I forget, do you have commit access?
>
>
> On Mon, Apr 14, 2014 at 10:16 AM, Alp Toker <alp at nuanti.com> wrote:
>
>>
>> On 14/04/2014 11:59, Nikola Smiljanic wrote:
>>
>>> Please review.
>>>
>>> pr19178.patch
>>>
>>>
>>> diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
>>> index 8b9c0e2..2ff501f 100644
>>> --- a/lib/Sema/SemaExprCXX.cpp
>>> +++ b/lib/Sema/SemaExprCXX.cpp
>>> @@ -3656,6 +3656,12 @@ static bool evaluateTypeTrait(Sema &S, TypeTrait
>>> Kind, SourceLocation KWLoc,
>>>       if (Args[0]->getType()->isIncompleteType())
>>>         return false;
>>>   +    // Make sure the first argument is not an abstract type.
>>> +
>>> +    CXXRecordDecl *RD = Args[0]->getType()->getAsCXXRecordDecl();
>>> +    if (RD && RD->isAbstract())
>>> +      return false;
>>> +
>>>
>>
>> The fix is correct. Perhaps you could use RequireNonAbstractType()
>> instead of checking for CXXRecordDecl directly, something like this taken
>> from the counterpart in BTT_IsConvertible:
>>
>>
>> -    // Make sure the first argument is a complete type.
>> -    if (Args[0]->getType()->isIncompleteType())
>> +    // Make sure the first argument is a complete non-abstract type.
>> +    if (S.RequireCompleteType(KWLoc, Args[0]->getType(), 0) ||
>> +        S.RequireNonAbstractType(KWLoc, Args[0]->getType(), 0))
>>        return false;
>>
>> Either way looks good to me, thanks!
>>
>> Alp.
>>
>>
>>        SmallVector<OpaqueValueExpr, 2> OpaqueArgExprs;
>>>       SmallVector<Expr *, 2> ArgExprs;
>>>       ArgExprs.reserve(Args.size() - 1);
>>> diff --git a/test/SemaCXX/type-traits.cpp b/test/SemaCXX/type-traits.cpp
>>> index 28fb8dc..b8557c4 100644
>>> --- a/test/SemaCXX/type-traits.cpp
>>> +++ b/test/SemaCXX/type-traits.cpp
>>> @@ -1964,6 +1964,8 @@ void constructible_checks() {
>>>       { int arr[T(__is_constructible(NonPOD, int))]; }
>>>     { int arr[F(__is_nothrow_constructible(NonPOD, int))]; }
>>> +
>>> +  { int arr[F(__is_constructible(Abstract))]; } // PR19178
>>>   }
>>>     // Instantiation of __is_trivially_constructible
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>
>>
>> --
>> http://www.nuanti.com
>> the browser experts
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140415/3f4d0bd5/attachment.html>


More information about the cfe-commits mailing list