// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --allow-natives-syntax

// Case One: the template is already initialized before compilation.
let saved_array;
function tagged_function(a) {
  saved_array = a;
  return "something";
}

function foo(b) {
  let a = tagged_function`hello ${b}`;
  return a + " " + b;
}

%PrepareFunctionForOptimization(foo);
foo();
foo();
%OptimizeFunctionOnNextCall(foo);
foo();

// Case Two: the template hasn't been initialized at the point we
// do optimized compile.
function bar(b) {
  if (b) {
    let a = tagged_function`initialized late ${b}`;
    b = a;
  }
  return b;
}

%PrepareFunctionForOptimization(bar);
bar();
bar();
%OptimizeFunctionOnNextCall(bar);
bar(true);

let saved_array_from_optimized_call = saved_array;

// Finally, ensure that if the function is deoptimized, the tagged-template
// code still runs. This is useful to test because TurboFan doesn't cache
// the tagged template in the feedback vector if it has to create it.
%DeoptimizeFunction(bar);
bar(true);

// Furthermore, we want to ensure that the JSArray passed to the function
// is the same.
assertSame(saved_array_from_optimized_call, saved_array);