diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -12920,6 +12920,9 @@ } bool FixedPointExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { + if (E->isPtrMemOp() || E->isAssignmentOp() || E->getOpcode() == BO_Comma) + return ExprEvaluatorBaseTy::VisitBinaryOperator(E); + const Expr *LHS = E->getLHS(); const Expr *RHS = E->getRHS(); FixedPointSemantics ResultFXSema = diff --git a/clang/test/Frontend/fixed_point_crash.c b/clang/test/Frontend/fixed_point_crash.c new file mode 100644 --- /dev/null +++ b/clang/test/Frontend/fixed_point_crash.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -verify -ffixed-point %s + +union a { + _Accum x; + int i; +}; + +int fn1() { + union a m; + m.x = 5.6k; + return m.i; +} + +int fn2() { + union a m; + m.x = 7, 5.6k; // expected-warning {{expression result unused}} + return m.x, m.i; // expected-warning {{expression result unused}} +} + +_Accum acc = (0.5r, 6.9k); // expected-warning {{expression result unused}}