aboutsummaryrefslogtreecommitdiff
path: root/gcc/d/dmd/expressionsem.d
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/d/dmd/expressionsem.d')
-rw-r--r--gcc/d/dmd/expressionsem.d59
1 files changed, 37 insertions, 22 deletions
diff --git a/gcc/d/dmd/expressionsem.d b/gcc/d/dmd/expressionsem.d
index 7ae7f40..3502a1c 100644
--- a/gcc/d/dmd/expressionsem.d
+++ b/gcc/d/dmd/expressionsem.d
@@ -3222,7 +3222,7 @@ private bool functionParameters(const ref Loc loc, Scope* sc,
/* Argument value can be assigned to firstArg.
* Check arg to see if it matters.
*/
- err |= checkParamArgumentReturn(sc, firstArg, arg, p, false);
+ err |= checkParamArgumentReturn(*sc, firstArg, arg, p, false);
}
// Allow 'lazy' to imply 'scope' - lazy parameters can be passed along
// as lazy parameters to the next function, but that isn't escaping.
@@ -3236,7 +3236,7 @@ private bool functionParameters(const ref Loc loc, Scope* sc,
* Check arg to see if it matters.
*/
VarDeclaration vPar = fd ? (fd.parameters ? (*fd.parameters)[i] : null) : null;
- err |= checkParamArgumentEscape(sc, fd, p.ident, vPar, cast(STC) pStc, arg, false, false);
+ err |= checkParamArgumentEscape(*sc, fd, p.ident, vPar, cast(STC) pStc, arg, false, false);
}
// Turning heap allocations into stack allocations is dangerous without dip1000, since `scope` inference
@@ -3375,7 +3375,7 @@ private bool functionParameters(const ref Loc loc, Scope* sc,
}
err |= arg.checkValue();
err |= arg.checkSharedAccess(sc);
- err |= checkParamArgumentEscape(sc, fd, Id.dotdotdot, null, cast(STC) tf.parameterList.stc, arg, false, false);
+ err |= checkParamArgumentEscape(*sc, fd, Id.dotdotdot, null, cast(STC) tf.parameterList.stc, arg, false, false);
arg = arg.optimize(WANTvalue);
}
(*arguments)[i] = arg;
@@ -3575,7 +3575,7 @@ private bool functionParameters(const ref Loc loc, Scope* sc,
*/
if (global.params.useDIP1021 && (tf.trust == TRUST.safe || tf.trust == TRUST.default_) ||
tf.islive)
- err |= checkMutableArguments(sc, fd, tf, ethis, arguments, false);
+ err |= checkMutableArguments(*sc, fd, tf, ethis, arguments, false);
// If D linkage and variadic, add _arguments[] as first argument
if (tf.isDstyleVariadic())
@@ -4466,7 +4466,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
semanticTypeInfo(sc, e.type);
- if (checkAssocArrayLiteralEscape(sc, e, false))
+ if (checkAssocArrayLiteralEscape(*sc, e, false))
return setError();
result = e;
@@ -5206,7 +5206,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
*/
foreach (arg; *exp.arguments)
{
- if (arg && checkNewEscape(sc, arg, false))
+ if (arg && checkNewEscape(*sc, arg, false))
return setError();
}
}
@@ -5335,7 +5335,8 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
lowering = new DotIdExp(exp.loc, lowering, Id.object);
auto tbn = exp.type.nextOf();
- while (tbn.ty == Tarray)
+ size_t i = nargs;
+ while (tbn.ty == Tarray && --i)
tbn = tbn.nextOf();
auto unqualTbn = tbn.unqualify(MODFlags.wild | MODFlags.const_ |
MODFlags.immutable_ | MODFlags.shared_);
@@ -6316,7 +6317,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
tthis = ue.e1.type;
if (!(exp.f.type.ty == Tfunction && (cast(TypeFunction)exp.f.type).isScopeQual))
{
- if (checkParamArgumentEscape(sc, exp.f, Id.This, exp.f.vthis, STC.undefined_, ethis, false, false))
+ if (checkParamArgumentEscape(*sc, exp.f, Id.This, exp.f.vthis, STC.undefined_, ethis, false, false))
return setError();
}
}
@@ -8046,7 +8047,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
exp.msg = resolveProperties(sc, exp.msg);
exp.msg = exp.msg.implicitCastTo(sc, Type.tchar.constOf().arrayOf());
exp.msg = exp.msg.optimize(WANTvalue);
- checkParamArgumentEscape(sc, null, null, null, STC.undefined_, exp.msg, true, false);
+ checkParamArgumentEscape(*sc, null, null, null, STC.undefined_, exp.msg, true, false);
}
if (exp.msg && exp.msg.op == EXP.error)
@@ -10054,7 +10055,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
}
semanticTypeInfo(sc, taa);
- checkNewEscape(sc, exp.e2, false);
+ checkNewEscape(*sc, exp.e2, false);
exp.type = taa.next;
break;
@@ -10088,7 +10089,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
if (length <= index)
{
- error(exp.loc, "array index `[%llu]` is outside array bounds `[0 .. %llu]`", index, cast(ulong)length);
+ error(exp.loc, "sequence index `[%llu]` is outside bounds `[0 .. %llu]`", index, cast(ulong)length);
return setError();
}
Expression e;
@@ -10750,7 +10751,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
dvx.e1 = e1x;
auto cx = cast(CallExp)ce.copy();
cx.e1 = dvx;
- if (checkConstructorEscape(sc, cx, false))
+ if (checkConstructorEscape(*sc, cx, false))
return setError();
Expression e0;
@@ -11511,9 +11512,9 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
* `checkAssignExp` expects only AssignExps.
*/
if (res == exp) // no `AA[k] = v` rewrite was performed
- checkAssignEscape(sc, res, false, false);
+ checkAssignEscape(*sc, res, false, false);
else
- checkNewEscape(sc, assignElem, false); // assigning to AA puts it on heap
+ checkNewEscape(*sc, assignElem, false); // assigning to AA puts it on heap
if (auto ae = res.isConstructExp())
{
@@ -11861,10 +11862,14 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
if (tb2.checkPostblit(exp.e2.loc, sc))
return setError();
- if (checkNewEscape(sc, exp.e2, false))
+ if (checkNewEscape(*sc, exp.e2, false))
return setError();
- exp = new CatElemAssignExp(exp.loc, exp.type, exp.e1, exp.e2.castTo(sc, tb1next));
+ auto ecast = exp.e2.castTo(sc, tb1next);
+ if (auto ce = ecast.isCastExp())
+ ce.trusted = true;
+
+ exp = new CatElemAssignExp(exp.loc, exp.type, exp.e1, ecast);
exp.e2 = doCopyOrMove(sc, exp.e2);
}
else if (tb1.ty == Tarray &&
@@ -11938,9 +11943,9 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
auto assignElem = exp.e2;
auto res = exp.reorderSettingAAElem(sc);
if (res != exp) // `AA[k] = v` rewrite was performed
- checkNewEscape(sc, assignElem, false);
+ checkNewEscape(*sc, assignElem, false);
else if (exp.op == EXP.concatenateElemAssign || exp.op == EXP.concatenateDcharAssign)
- checkAssignEscape(sc, res, false, false);
+ checkAssignEscape(*sc, res, false, false);
result = res;
@@ -12511,7 +12516,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
exp.e2 = exp.e2.implicitCastTo(sc, tb1next);
exp.type = tb1next.arrayOf();
L2elem:
- if (checkNewEscape(sc, exp.e2, false))
+ if (checkNewEscape(*sc, exp.e2, false))
return setError();
result = exp.optimize(WANTvalue);
trySetCatExpLowering(result);
@@ -12545,7 +12550,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
exp.e1 = exp.e1.implicitCastTo(sc, tb2next);
exp.type = tb2next.arrayOf();
L1elem:
- if (checkNewEscape(sc, exp.e1, false))
+ if (checkNewEscape(*sc, exp.e1, false))
return setError();
result = exp.optimize(WANTvalue);
trySetCatExpLowering(result);
@@ -15331,8 +15336,10 @@ Expression resolveLoc(Expression exp, const ref Loc loc, Scope* sc)
Expression visitSlice(SliceExp exp)
{
exp.e1 = exp.e1.resolveLoc(loc, sc);
- exp.lwr = exp.lwr.resolveLoc(loc, sc);
- exp.upr = exp.upr.resolveLoc(loc, sc);
+ if (exp.lwr)
+ exp.lwr = exp.lwr.resolveLoc(loc, sc);
+ if (exp.upr)
+ exp.upr = exp.upr.resolveLoc(loc, sc);
return exp;
}
@@ -15732,7 +15739,15 @@ private Expression toLvalueImpl(Expression _this, Scope* sc, const(char)* action
return visit(_this);
}
if (_this.isLvalue())
+ {
+ with (_this)
+ if (!trusted && !e1.type.pointerTo().implicitConvTo(to.pointerTo()))
+ sc.setUnsafePreview(FeatureState.default_, false, loc,
+ "cast from `%s` to `%s` cannot be used as an lvalue in @safe code",
+ e1.type, to);
+
return _this;
+ }
return visit(_this);
}