diff options
Diffstat (limited to 'src/resolve-names.cc')
-rw-r--r-- | src/resolve-names.cc | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/resolve-names.cc b/src/resolve-names.cc index 9d24f2a7..1a6ec79f 100644 --- a/src/resolve-names.cc +++ b/src/resolve-names.cc @@ -69,6 +69,9 @@ class NameResolver : public ExprVisitor::DelegateNop { void PushLabel(const std::string& label); void PopLabel(); void CheckDuplicateBindings(const BindingHash* bindings, const char* desc); + void PrintDuplicateBindingsError(const BindingHash::value_type&, + const BindingHash::value_type&, + const char* desc); void ResolveLabelVar(Var* var); void ResolveVar(const BindingHash* bindings, Var* var, const char* desc); void ResolveFuncVar(Var* var); @@ -125,14 +128,20 @@ void NameResolver::CheckDuplicateBindings(const BindingHash* bindings, const char* desc) { bindings->FindDuplicates([this, desc](const BindingHash::value_type& a, const BindingHash::value_type& b) { - // Choose the location that is later in the file. - const Location& a_loc = a.second.loc; - const Location& b_loc = b.second.loc; - const Location& loc = a_loc.line > b_loc.line ? a_loc : b_loc; - PrintError(&loc, "redefinition of %s \"%s\"", desc, a.first.c_str()); + PrintDuplicateBindingsError(a, b, desc); }); } +void NameResolver::PrintDuplicateBindingsError(const BindingHash::value_type& a, + const BindingHash::value_type& b, + const char* desc) { + // Choose the location that is later in the file. + const Location& a_loc = a.second.loc; + const Location& b_loc = b.second.loc; + const Location& loc = a_loc.line > b_loc.line ? a_loc : b_loc; + PrintError(&loc, "redefinition of %s \"%s\"", desc, a.first.c_str()); +} + void NameResolver::ResolveLabelVar(Var* var) { if (var->is_name()) { for (int i = labels_.size() - 1; i >= 0; --i) { @@ -370,8 +379,12 @@ void NameResolver::VisitFunc(Func* func) { ResolveFuncTypeVar(&func->decl.type_var); } - CheckDuplicateBindings(&func->param_bindings, "parameter"); - CheckDuplicateBindings(&func->local_bindings, "local"); + func->bindings.FindDuplicates( + [=](const BindingHash::value_type& a, const BindingHash::value_type& b) { + const char* desc = + (a.second.index < func->GetNumParams()) ? "parameter" : "local"; + PrintDuplicateBindingsError(a, b, desc); + }); visitor_.VisitFunc(func); current_func_ = nullptr; |