diff --git a/src/machine/dispatch.rs b/src/machine/dispatch.rs index f77f7f0f..635de289 100644 --- a/src/machine/dispatch.rs +++ b/src/machine/dispatch.rs @@ -4812,11 +4812,11 @@ impl Machine { step_or_fail!(self, self.machine_st.p = self.machine_st.cp); } &Instruction::CallLoadContextModule => { - self.load_context_module(self.machine_st.registers[1]); + self.load_context_module(self.deref_register(1)); step_or_fail!(self, self.machine_st.p += 1); } &Instruction::ExecuteLoadContextModule => { - self.load_context_module(self.machine_st.registers[1]); + self.load_context_module(self.deref_register(1)); step_or_fail!(self, self.machine_st.p = self.machine_st.cp); } &Instruction::CallLoadContextStream => { diff --git a/tests-pl/load-context-unreachable.pl b/tests-pl/load-context-unreachable.pl new file mode 100644 index 00000000..5a0f2782 --- /dev/null +++ b/tests-pl/load-context-unreachable.pl @@ -0,0 +1 @@ +:- initialization((M = user, loader:load_context(M))). diff --git a/tests/scryer/issues.rs b/tests/scryer/issues.rs index de318708..207c4909 100644 --- a/tests/scryer/issues.rs +++ b/tests/scryer/issues.rs @@ -25,3 +25,11 @@ fn issue2588_load_html() { fn call_qualification() { load_module_test("tests-pl/issue2361-call-qualified.pl", ""); } + +// PR #2756: ensures that calling load_context with a bound variable doesn't trigger unreachable!() +#[serial] +#[test] +#[cfg_attr(miri, ignore = "it takes too long to run")] +fn load_context_unreachable() { + load_module_test("tests-pl/load-context-unreachable.pl", ""); +}