Commit 0f8c38be authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r261669:

------------------------------------------------------------------------
r261669 | aaronballman | 2016-02-23 10:55:15 -0800 (Tue, 23 Feb 2016) | 1 line

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.
------------------------------------------------------------------------

llvm-svn: 261684
parent 797d25cd
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -1365,10 +1365,13 @@ Sema::CreateGenericSelectionExpr(SourceLocation KeyLoc,
  // Decay and strip qualifiers for the controlling expression type, and handle
  // placeholder type replacement. See committee discussion from WG14 DR423.
  {
    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.
+4 −0
Original line number Diff line number Diff line
@@ -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);
}