r261669 - Amends r252104 to evaluate the controlling expression in an unevaluated context. This eliminates false-positive diagnostics about null pointer dereferences (etc) in the controlling expression.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 23 11:03:03 PST 2016


Hi Aaron,

I'll let it sit in the tree for a bit, and will then merge it later today.

Many thanks,
Hans

On Tue, Feb 23, 2016 at 11:01 AM, Aaron Ballman <aaron at aaronballman.com> wrote:
> Hans, this should be safe to merge into 3.8 (as Richard had mentioned
> in the review thread). Can you do the merge magic on my behalf?
>
> Thanks!
>
> ~Aaron
>
> On Tue, Feb 23, 2016 at 1:55 PM, Aaron Ballman via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>> Author: aaronballman
>> Date: Tue Feb 23 12:55:15 2016
>> New Revision: 261669
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=261669&view=rev
>> Log:
>> Amends r252104 to evaluate the controlling expression in an unevaluated context. This eliminates false-positive diagnostics about null pointer dereferences (etc) in the controlling expression.
>>
>> Modified:
>>     cfe/trunk/lib/Sema/SemaExpr.cpp
>>     cfe/trunk/test/Sema/generic-selection.c
>>
>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=261669&r1=261668&r2=261669&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Feb 23 12:55:15 2016
>> @@ -1373,10 +1373,13 @@ Sema::CreateGenericSelectionExpr(SourceL
>>
>>    // Decay and strip qualifiers for the controlling expression type, and handle
>>    // placeholder type replacement. See committee discussion from WG14 DR423.
>> -  ExprResult R = DefaultFunctionArrayLvalueConversion(ControllingExpr);
>> -  if (R.isInvalid())
>> -    return ExprError();
>> -  ControllingExpr = R.get();
>> +  {
>> +    EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated);
>> +    ExprResult R = DefaultFunctionArrayLvalueConversion(ControllingExpr);
>> +    if (R.isInvalid())
>> +      return ExprError();
>> +    ControllingExpr = R.get();
>> +  }
>>
>>    // The controlling expression is an unevaluated operand, so side effects are
>>    // likely unintended.
>>
>> Modified: cfe/trunk/test/Sema/generic-selection.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/generic-selection.c?rev=261669&r1=261668&r2=261669&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/Sema/generic-selection.c (original)
>> +++ cfe/trunk/test/Sema/generic-selection.c Tue Feb 23 12:55:15 2016
>> @@ -31,4 +31,8 @@ void foo(int n) {
>>
>>    const int i = 12;
>>    int a9[_Generic(i, int: 1, default: 2) == 1 ? 1 : -1];
>> +
>> +  // This is expected to not trigger any diagnostics because the controlling
>> +  // expression is not evaluated.
>> +  (void)_Generic(*(int *)0, int: 1);
>>  }
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list