Fix silent error in set_mangled_name

This commit is contained in:
Danila Fedorin 2020-09-18 12:02:37 -07:00
parent 430768eac5
commit 97eb4b6e3e
2 changed files with 9 additions and 12 deletions

View File

@ -34,12 +34,13 @@ bool type_env::is_global(const std::string& name) const {
void type_env::set_mangled_name(const std::string& name, const std::string& mangled) {
auto it = names.find(name);
if(it != names.end()) {
// Local names shouldn't need mangling.
assert(it->second.vis == visibility::global);
it->second.mangled_name = mangled;
}
// Can't set mangled name for non-existent variable.
assert(it != names.end());
// Local names shouldn't need mangling.
assert(it->second.vis == visibility::global);
it->second.mangled_name = mangled;
}
const std::string& type_env::get_mangled_name(const std::string& name) const {

View File

@ -535,7 +535,7 @@ In general, this change is also rather mechanical, but, to
maintain a balance between exceptions and assertions, here
are a couple more assertions from `type_env`:
{{< codelines "C++" "compiler/13/type_env.cpp" 76 77 >}}
{{< codelines "C++" "compiler/13/type_env.cpp" 77 78 >}}
Once again, it should not be possible for the compiler
to try generalize the type of a variable that doesn't
@ -621,7 +621,7 @@ Now that we've started using assertions, I also think it's worth
to put our new invariant -- "only global definitions have mangled
names" -- into code:
{{< codelines "C++" "compiler/13/type_env.cpp" 35 43 >}}
{{< codelines "C++" "compiler/13/type_env.cpp" 35 44 >}}
Furthermore, we'll _require_ that a global definition
has a mangled name. This way, we can be more confident
@ -635,7 +635,7 @@ we add another assertion: if an environment scope doesn't
contain a mangled name for a variable, then it _must_
have a parent. We end up with the following:
{{< codelines "C++" "compiler/13/type_env.cpp" 45 51 >}}
{{< codelines "C++" "compiler/13/type_env.cpp" 46 52 >}}
Since looking up a mangled name for non-global variable
will now result in an assertion failure, we have to change
@ -866,7 +866,3 @@ name with `f_`, much like `create_custom_function`:
I think that's enough. If we chose to turn more compiler
data structures into classes, I think we would've quickly drowned
in one-line getter and setter methods.
{{< todo >}}
Assertion failure on `set_mangled_name` on non-existent function,
too. {{< /todo >}}