refactor(tvix): remove signedness conversions by using std::optional

The different signedness of level and withLevel was causing implicit conversions. Use a nullopt instead of a -1 sentinel value.

third_party/nix/src/libexpr/nixexpr.cc:242:21: warning: narrowing conversion from 'unsigned int' to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]

Change-Id: I7c2cadb6fd6bbff6c5b84028651ad4ebba423297
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2157
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
Reviewed-by: glittershark <grfn@gws.fyi>
This commit is contained in:
Kane York 2020-11-26 17:39:47 -08:00 committed by kanepyork
parent 5fb58e23de
commit 0c8c1227f1

View file

@ -234,11 +234,11 @@ void ExprVar::bindVars(const StaticEnv& env) {
set its level and displacement. */
const StaticEnv* curEnv;
unsigned int level;
int withLevel = -1;
std::optional<unsigned int> withLevel = std::nullopt;
for (curEnv = &env, level = 0; curEnv != nullptr;
curEnv = curEnv->up, level++) {
if (curEnv->isWith) {
if (withLevel == -1) {
if (!withLevel.has_value()) {
withLevel = level;
}
} else {
@ -255,13 +255,13 @@ void ExprVar::bindVars(const StaticEnv& env) {
/* Otherwise, the variable must be obtained from the nearest
enclosing `with'. If there is no `with', then we can issue an
"undefined variable" error now. */
if (withLevel == -1) {
if (!withLevel.has_value()) {
throw UndefinedVarError(format("undefined variable '%1%' at %2%") % name %
pos);
}
fromWith = true;
this->level = withLevel;
this->level = withLevel.value();
}
void ExprSelect::bindVars(const StaticEnv& env) {