// Check gating of shared memory features in asm.js (bug 1171540,
// bug 1231624, bug 1231338).
//
// In asm.js, importing any atomic is a signal that shared memory is
// being used.  If an atomic is imported, and if shared memory is
// disabled in the build or in the run then a type error should be
// signaled for the module at the end of the declaration section and
// the module should not be an asm.js module.

// Do not guard on the presence of SharedArrayBuffer, we test that later.

if (!isAsmJSCompilationAvailable())
    quit(0);

// This code is not run, we only care whether it compiles as asm.js.

function module_a(stdlib, foreign, heap) {
    "use asm";

    var i32a = new stdlib.Int32Array(heap);
    var ld = stdlib.Atomics.load;

    // There should be a type error around this line if shared memory
    // is not enabled.

    function do_load() {
	var v = 0;
	v = ld(i32a, 0)|0;	// It's not actually necessary to use the atomic op
	return v|0;
    }

    return { load: do_load };
}

assertEq(isAsmJSModule(module_a), !!this.SharedArrayBuffer);
