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:01:00 PST 2016


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