Improve error messages for opUnary (#20801)

This commit is contained in:
Dennis 2025-01-30 12:44:05 +01:00 committed by GitHub
parent 06e0096aca
commit 06d0cfe2ba
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 192 additions and 173 deletions

View file

@ -8857,9 +8857,8 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
result = exp.incompatibleTypes();
return;
}
if (exp.e1.checkNoBool())
return setError();
if (exp.e1.checkArithmetic(exp.op) ||
if (exp.e1.checkNoBool() ||
exp.e1.checkArithmetic(exp.op) ||
exp.e1.checkSharedAccess(sc))
return setError();
@ -8885,11 +8884,10 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
result = exp.incompatibleTypes();
return;
}
if (exp.e1.checkNoBool())
return setError();
if (exp.e1.checkArithmetic(exp.op))
return setError();
if (exp.e1.checkSharedAccess(sc))
if (exp.e1.checkNoBool() ||
exp.e1.checkArithmetic(exp.op) ||
exp.e1.checkSharedAccess(sc))
return setError();
result = exp.e1;
@ -8922,9 +8920,8 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
result = exp.incompatibleTypes();
return;
}
if (exp.e1.checkNoBool())
return setError();
if (exp.e1.checkIntegral() ||
if (exp.e1.checkNoBool() ||
exp.e1.checkIntegral() ||
exp.e1.checkSharedAccess(sc))
return setError();

View file

@ -293,6 +293,16 @@ Expression opOverloadUnary(UnaExp e, Scope* sc)
}
break;
}
// For ++ and --, rewrites to += and -= are also tried, so don't error yet
if (!e.isPreExp())
{
error(e.loc, "operator `%s` is not defined for `%s`", EXPtoString(e.op).ptr, ad.toChars());
errorSupplemental(ad.loc, "perhaps overload the operator with `auto opUnary(string op : \"%s\")() {}`",
EXPtoString(e.op).ptr);
return ErrorExp.get();
}
break;
}
return result;