[cfe-dev] Can't use sizeof ( typeof ( <vla> ))

Friedman, Eli via cfe-dev cfe-dev at lists.llvm.org
Mon Dec 5 10:30:43 PST 2016


On 12/5/2016 4:12 AM, Paulo Matos wrote:
>
> On 01/12/16 19:39, Friedman, Eli wrote:
>> On 12/1/2016 2:13 AM, Paulo Matos wrote:
>>> On 22/11/16 21:44, Friedman, Eli wrote:
>>>> The way it should work is that there are three calls to
>>>> TransformToPotentiallyEvaluated: the first time, we're calling on the
>>>> typeof, and it's unevaluated.  The second time, we're calling it on the
>>>> sizeof(), and it's potentially evaluated.  The third time is a recursive
>>>> call: in the process of transforming the sizeof(), we make a new
>>>> typeof() expression, and call TransformToPotentiallyEvaluated on that;
>>>> at that point, it should be potentially-evaluated.  (Yes, this is
>>>> terribly inefficient, but it's a rare situation anyway.)
>>>>
>>> Apologies, only just managed to get back on this. I assume you're
>>> suggesting a solution, not how it's implemented.
>> This is what's already implemented for sizeof() on a expression.  We
>> just don't do it properly for sizeof() on a type, I think.  There are
>> two functions named Sema::CreateUnaryExprOrTypeTraitExpr; compare the
>> version which takes a type to the version which takes an expression.
>>
> I see what you mean but it doesn't seem to be that straightforward. I
> implemented the following patch which fixes the issue I was seeing but
> crashes loads of other examples.
>
> diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
> index dbaa04e..ff04a64 100644
> --- a/lib/Sema/SemaExpr.cpp
> +++ b/lib/Sema/SemaExpr.cpp
> @@ -3780,8 +3780,18 @@
> Sema::CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
>       return ExprError();
>
>     // C99 6.5.3.4p4: the type (an unsigned integer type) is size_t.
> -  return new (Context) UnaryExprOrTypeTraitExpr(
> +  Expr *E = new (Context) UnaryExprOrTypeTraitExpr(
>         ExprKind, TInfo, Context.getSizeType(), OpLoc, R.getEnd());
> +
> +  if (isUnevaluatedContext() &&
> +      ExprKind == UETT_SizeOf &&
> +      TInfo->getType()->isVariablyModifiedType()) {
> +    ExprResult PE = TransformToPotentiallyEvaluated(E);

I think you might need to add an overload of 
TransformToPotentiallyEvaluated: you should be transforming TInfo, not 
E.  (Not 100% sure this matters in practice, but I think you could end 
up with infinite recursion.)

-Eli

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project




More information about the cfe-dev mailing list