:- module stack_var_out_of_range.

:- interface.

:- import_module io.
:- pred main(io::di, io::uo) is det.

:- implementation.

:- import_module store, int.

:- pred loop(generic_mutvar(int, S)::in, S::di, S::uo) is det <= store(S).
loop(Var, !Store) :-
    store.get_mutvar(Var, X, !Store).

:- some [S] pred new_counter(generic_mutvar(int, S)::out, S::uo) is det => store(S).
new_counter(Var, Store) :- 
    store.init(Store0),
    store.new_mutvar(0, Var, Store0, Store).

main(!IO) :-
    new_counter(Var, Store0),
    loop(Var, Store0, _).

/*
$ uname -a
Linux acer 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1+deb7u1 x86_64 GNU/Linux

$ mmc --version
Mercury Compiler, version 13.05.2, configured for x86_64-unknown-linux-gnu
Copyright (C) 1993-2013 The University of Melbourne

$ mmc stack_var_out_of_range.m -E
Uncaught Mercury exception:
Software Error: ll_backend.llds_out.llds_out_data: predicate `ll_backend.llds_out.llds_out_data.output_lval'/4: Unexpected: stack var out of range
Stack dump not available in this grade.

Checked other optimization options. Summary:

Doesn't work:
	-O0 through -O6
	--opt-space, --optimize-space
	--no-read-opt-files-transitively
	--intermodule-analysis

Works:
	--intermod-opt
	--trans-intermod-opt

Not checked:
	--analysis-repeat <n>

*/