Author: rsmith Date: Thu May 2 16:21:28 2019 New Revision: 359844 URL: http://llvm.org/viewvc/llvm-project?rev=359844&view=rev Log: Fix -Wunsequenced false-positives in code controlled by a branch on __builtin_constant_p.
If the operand of __builtin_constant_p is not constant and has side-effects, then code controlled by a branch on it is unreachable and we should not emit runtime behavior warnings in such code. Modified: cfe/trunk/lib/AST/ExprConstant.cpp cfe/trunk/test/Sema/warn-unsequenced.c Modified: cfe/trunk/lib/AST/ExprConstant.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=359844&r1=359843&r2=359844&view=diff ============================================================================== --- cfe/trunk/lib/AST/ExprConstant.cpp (original) +++ cfe/trunk/lib/AST/ExprConstant.cpp Thu May 2 16:21:28 2019 @@ -8269,11 +8269,14 @@ bool IntExprEvaluator::VisitBuiltinCallE case Builtin::BI__builtin_constant_p: { const Expr *Arg = E->getArg(0); - if (EvaluateBuiltinConstantP(Info, Arg)) + if (EvaluateBuiltinConstantP(Info, Arg)) { return Success(true, E); - else if (Info.InConstantContext) + } else if (Info.InConstantContext || Arg->HasSideEffects(Info.Ctx)) { + // Outside a constant context, eagerly evaluate to false in the presence + // of side-effects in order to avoid -Wunsequenced false-positives in + // a branch on __builtin_constant_p(expr). return Success(false, E); - else { + } else { Info.FFDiag(E, diag::note_invalid_subexpr_in_const_expr); return false; } Modified: cfe/trunk/test/Sema/warn-unsequenced.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-unsequenced.c?rev=359844&r1=359843&r2=359844&view=diff ============================================================================== --- cfe/trunk/test/Sema/warn-unsequenced.c (original) +++ cfe/trunk/test/Sema/warn-unsequenced.c Thu May 2 16:21:28 2019 @@ -93,4 +93,6 @@ void test() { _Generic(++a, default: 0) + ++a; // ok sizeof(++a) + ++a; // ok _Alignof(++a) + ++a; // expected-warning {{extension}} + + __builtin_constant_p(f(++a, 0)) ? f(f(++a, 0), f(++a, 0)) : 0; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits