@@ -761,8 +761,13 @@ bool isLvalue(Expression _this)
761761 * Determine if copy elision is allowed when copying an expression to
762762 * a typed storage. This basically elides a restricted subset of so-called
763763 * "pure" rvalues, i.e. expressions with no reference semantics.
764+ *
765+ * Note: Please avoid using `checkMod` parameter because `canElideCopy()`
766+ * essentially defines a value category and should eventually be merged with
767+ * `isLvalue()` to return [isLvalue, allowEmplacement].
768+ * Checking type compatibility here is only a stopgap measure.
764769 */
765- bool canElideCopy(Expression e, Type to, bool checkMod = true )
770+ bool canElideCopy(Expression e, Type to, bool checkMod = false )
766771{
767772 if (checkMod && !MODimplicitConv(e.type.mod, to.mod))
768773 return false;
@@ -791,7 +796,7 @@ bool canElideCopy(Expression e, Type to, bool checkMod = true)
791796 return false;
792797
793798 // If an aggregate can be elided, so are its fields
794- return canElideCopy(e.e1, e.e1.type, false );
799+ return canElideCopy(e.e1, e.e1.type);
795800 }
796801
797802 switch (e.op)
@@ -1920,7 +1925,7 @@ extern (D) Expression doCopyOrMove(Scope* sc, Expression e, Type t, bool nrvo, b
19201925 {
19211926 e = callCpCtor(sc, e, t, nrvo);
19221927 }
1923- else if (move && sd && sd.hasMoveCtor && !canElideCopy(e, t ? t : e.type, false ))
1928+ else if (move && sd && sd.hasMoveCtor && !canElideCopy(e, t ? t : e.type))
19241929 {
19251930 // #move
19261931 /* Rewrite as:
0 commit comments