/*
 *  The order of checks and coercions for a property access are defined
 *  by the property accessor evaluation rules in E5 Section 11.2.1,
 *  GetValue() in E5 Section 8.7.1, and finally [[Get]].
 *
 *  In short:
 *
 *  - CheckObjectCoercible for base reference.  TypeError for null and
 *    undefined.  (E5 Section 11.2.1 step 5)
 *
 *  - ToString for property name.  This may have side effects and thus
 *    order matters.  (E5 Section 11.2.1 step 6).
 *
 *  - ToObject for base reference.  (E5 Section 8.7.1, special [[Get]],
 *    step 1)
 *
 */

var t = {}
t.toString = function() { print("toString() called"); return "foo"; };

/*===
TypeError
===*/

// CheckObjectCoercible fails, toString() doesn't get called
try {
    null[t] = 'bar';
} catch (e) {
    print(e.name);
}

/*===
toString() called
bar
===*/

// CheckObjectCoercible succeeds, toString() gets called

try {
    var o = {};
    o[t] = 'bar';
    print(o.foo);
} catch (e) {
    print(e.name);
}

