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.
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 23 11:12:16 PST 2016
On Tue, Feb 23, 2016 at 2:03 PM, Hans Wennborg <hans at chromium.org> wrote:
> Hi Aaron,
>
> I'll let it sit in the tree for a bit, and will then merge it later today.
Sounds great, thank you!
~Aaron
>
> 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