diff options
| author | gingerBill <bill@gingerbill.org> | 2020-05-12 10:31:49 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-05-12 10:31:49 +0100 |
| commit | fcdfcfce19bff98a3dbfa4b8f960d7bcd64679aa (patch) | |
| tree | e6866601f15b6138a4e338a5f6acaa94c69cf7df /src/checker.cpp | |
| parent | d49ecd9009c25279adc25adce064bdd072557c74 (diff) | |
Let -vet ignore intentional declaration shadowing #637
Diffstat (limited to 'src/checker.cpp')
| -rw-r--r-- | src/checker.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/checker.cpp b/src/checker.cpp index 108eedd47..eba30e737 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -506,15 +506,30 @@ bool check_vet_shadowing(Checker *c, Entity *e, VettedEntity *ve) { return false; } // NOTE(bill): If the types differ, don't complain - if (are_types_identical(e->type, shadowed->type)) { - gb_zero_item(ve); - ve->kind = VettedEntity_Shadowed; - ve->entity = e; - ve->other = shadowed; - return true; + if (!are_types_identical(e->type, shadowed->type)) { + return false; } - return false; + // NOTE(bill): Ignore intentional redeclaration + // x := x; + // Suggested in issue #637 (2020-05-11) + if ((e->flags & EntityFlag_Using) == 0 && e->kind == Entity_Variable) { + Ast *init = unparen_expr(e->Variable.init_expr); + if (init != nullptr && init->kind == Ast_Ident) { + // TODO(bill): Which logic is better? Same name or same entity + // bool ignore = init->Ident.token.string == name; + bool ignore = init->Ident.entity == shadowed; + if (ignore) { + return false; + } + } + } + + gb_zero_item(ve); + ve->kind = VettedEntity_Shadowed; + ve->entity = e; + ve->other = shadowed; + return true; } bool check_vet_unused(Checker *c, Entity *e, VettedEntity *ve) { |