// This file was procedurally generated from the following sources:
// - src/function-forms/forbidden-ext-indirect-access-own-prop-caller-get.case
// - src/function-forms/forbidden-extensions/bullet-two/func-decl.template
/*---
description: Forbidden extension, o.caller (function declaration)
esid: sec-definitions-runtime-semantics-instantiatefunctionobject
flags: [generated, noStrict]
info: |
    FunctionDeclaration :
        function BindingIdentifier ( FormalParameters ) { FunctionBody }

    If an implementation extends any function object with an own property named "caller" the value of
    that property, as observed using [[Get]] or [[GetOwnProperty]], must not be a strict function
    object. If it is an accessor property, the function that is the value of the property's [[Get]]
    attribute must never return a strict function when called.

---*/
var CALLER_OWN_PROPERTY_DOES_NOT_EXIST = Symbol();
function inner() {
  // This property may exist, but is forbidden from having a value that is a strict function object
  return inner.hasOwnProperty("caller")
    ? inner.caller
    : CALLER_OWN_PROPERTY_DOES_NOT_EXIST;
}

var callCount = 0;
function f() {
  "use strict";
  // This and the following conditional value is set in the test's .case file.
  // For every test that has a "true" value here, there is a
  // corresponding test that has a "false" value here.
  // They are generated from two different case files, which use
  // the same templates.
  let descriptor = Object.getOwnPropertyDescriptor(inner, "caller");
  if (descriptor && descriptor.configurable && true) {
    Object.defineProperty(inner, "caller", {get(){return 1}});
  }
  var result = inner();
  if (descriptor && descriptor.configurable && true) {
    assert.sameValue(result, 1, 'If this test defined an own "caller" property on the inner function, then it should be accessible and should return the value it was set to.');
  }

  // "CALLER_OWN_PROPERTY_DOES_NOT_EXIST" is from
  // forbidden-ext-indirect-access-prop-caller.case
  //
  // If the function object "inner" has an own property
  // named "caller", then its value will be returned.
  //
  // If the function object "inner" DOES NOT have an
  // own property named "caller", then the symbol
  // CALLER_OWN_PROPERTY_DOES_NOT_EXIST will be returned.
  if (result !== CALLER_OWN_PROPERTY_DOES_NOT_EXIST) {
    assert.notSameValue(result, f);
  }

  callCount++;
}
f();
assert.sameValue(callCount, 1, 'body evaluated');
