[cfe-commits] r154849 - in /cfe/trunk: lib/AST/ExprConstant.cpp test/Sema/const-eval.c

Eli Friedman eli.friedman at gmail.com
Mon Apr 16 16:08:58 PDT 2012


On Mon, Apr 16, 2012 at 12:48 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Mon, Apr 16, 2012 at 12:23 PM, Eli Friedman <eli.friedman at gmail.com>
> wrote:
>>
>> Author: efriedma
>> Date: Mon Apr 16 14:23:57 2012
>> New Revision: 154849
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=154849&view=rev
>> Log:
>> Per Richard's comments on r154794, add the checks necessary to handle
>> constant-folding relational comparisons safely in case the user is using
>> -fwrapv or equivalent.
>>
>>
>> Modified:
>>    cfe/trunk/lib/AST/ExprConstant.cpp
>>    cfe/trunk/test/Sema/const-eval.c
>>
>> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=154849&r1=154848&r2=154849&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
>> +++ cfe/trunk/lib/AST/ExprConstant.cpp Mon Apr 16 14:23:57 2012
>> @@ -5090,8 +5090,6 @@
>>
>>       // The comparison here must be unsigned, and performed with the same
>>       // width as the pointer.
>> -      // FIXME: Knowing the base is the same for the LHS and RHS isn't
>> enough
>> -      // for relational operators.
>>       unsigned PtrSize = Info.Ctx.getTypeSize(LHSTy);
>>       uint64_t CompareLHS = LHSOffset.getQuantity();
>>       uint64_t CompareRHS = RHSOffset.getQuantity();
>> @@ -5100,6 +5098,19 @@
>>       CompareLHS &= Mask;
>>       CompareRHS &= Mask;
>>
>> +      // If there is a base and this is a relational operator, we can
>> only
>> +      // compare pointers within the object in question; otherwise, the
>> result
>> +      // depends on where the object is located in memory.
>> +      if (!LHSValue.Base.isNull() && E->isRelationalOp()) {
>> +        QualType BaseTy = getType(LHSValue.Base);
>> +        if (BaseTy->isIncompleteType())
>> +          return Error(E);
>
>
> Can we treat incomplete types as having size 0? AFAICS this is legal in
> C++11:
>
> struct S a;
> constexpr bool b = &a < &a;

I don't think we'll ever hit this codepath in a way that impacts
conformance... but sure, I can do that, I guess.

-Eli




More information about the cfe-commits mailing list