llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: layta (cIamor) <details> <summary>Changes</summary> RHS first --- Full diff: https://github.com/llvm/llvm-project/pull/101834.diff 1 Files Affected: - (modified) clang/lib/AST/Interp/Compiler.cpp (+12-4) ``````````diff diff --git a/clang/lib/AST/Interp/Compiler.cpp b/clang/lib/AST/Interp/Compiler.cpp index ada22b569b2b0..d9db1c788314c 100644 --- a/clang/lib/AST/Interp/Compiler.cpp +++ b/clang/lib/AST/Interp/Compiler.cpp @@ -733,8 +733,8 @@ bool Compiler<Emitter>::VisitBinaryOperator(const BinaryOperator *BO) { } // Typecheck the args. - std::optional<PrimType> LT = classify(LHS->getType()); - std::optional<PrimType> RT = classify(RHS->getType()); + std::optional<PrimType> LT = classify(LHS); + std::optional<PrimType> RT = classify(RHS); std::optional<PrimType> T = classify(BO->getType()); // Special case for C++'s three-way/spaceship operator <=>, which @@ -769,8 +769,16 @@ bool Compiler<Emitter>::VisitBinaryOperator(const BinaryOperator *BO) { return this->VisitPointerArithBinOp(BO); } - if (!visit(LHS) || !visit(RHS)) - return false; + // Assignmentes require us to evalute the RHS first. + if (BO->getOpcode() == BO_Assign) { + if (!visit(RHS) || !visit(LHS)) + return false; + if (!this->emitFlip(*LT, *RT, BO)) + return false; + } else { + if (!visit(LHS) || !visit(RHS)) + return false; + } // For languages such as C, cast the result of one // of our comparision opcodes to T (which is usually int). `````````` </details> https://github.com/llvm/llvm-project/pull/101834 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits