# Copyright 2011 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This file is meant to be included into an target to create a unittest that
# invokes a set of no-compile tests.  A no-compile test is a test that asserts
# a particular construct will not compile.
#
# Also see:
#   http://dev.chromium.org/developers/testing/no-compile-tests
#
# To use this, create a gyp target with the following form:
#
# import("//build/nocompile.gni")
# nocompile_test("my_module_nc_unittests") {
#   sources = [
#     'nc_testset_1.nc',
#     'nc_testset_2.nc',
#   ]
#
#   # optional extra include dirs:
#   include_dirs = [ ... ]
# }
#
# The .nc files are C++ files that contain code we wish to assert will not
# compile.  Each individual test case in the file should be put in its own
# #ifdef section.  The expected output should be appended with a C++-style
# comment that has a python list of regular expressions.  This will likely
# be greater than 80-characters. Giving a solid expected output test is
# important so that random compile failures do not cause the test to pass.
#
# Example .nc file:
#
#   #if defined(TEST_NEEDS_SEMICOLON)  // [r"expected ',' or ';' at end of input"]
#
#   int a = 1
#
#   #elif defined(TEST_NEEDS_CAST)  // [r"invalid conversion from 'void*' to 'char*'"]
#
#   void* a = NULL;
#   char* b = a;
#
#   #endif
#
# If we needed disable TEST_NEEDS_SEMICOLON, then change the define to:
#
#   DISABLE_TEST_NEEDS_SEMICOLON
#   TEST_NEEDS_CAST
#
# The lines above are parsed by a regexp so avoid getting creative with the
# formatting or ifdef logic; it will likely just not work.
#
# Implementation notes:
# The .nc files are actually processed by a python script which executes the
# compiler and generates a .cc file that is empty on success, or will have a
# series of #error lines on failure, and a set of trivially passing gunit
# TEST() functions on success. This allows us to fail at the compile step when
# something goes wrong, and know during the unittest run that the test was at
# least processed when things go right.

import("//build/config/clang/clang.gni")
import("//build/config/python.gni")
import("//build/toolchain/toolchain.gni")
import("//testing/test.gni")

if (is_mac) {
  import("//build/config/mac/mac_sdk.gni")
}

declare_args() {
  # TODO(crbug.com/105388): make sure no-compile test is not flaky.
  enable_nocompile_tests = (is_linux || is_chromeos || is_apple) && is_clang &&
                           host_cpu == target_cpu
}

if (enable_nocompile_tests) {
  import("//build/config/c++/c++.gni")
  import("//build/config/sysroot.gni")
  template("nocompile_test") {
    nocompile_target = target_name + "_run_nocompile"

    action_foreach(nocompile_target) {
      testonly = true
      script = "//tools/nocompile_driver.py"
      sources = invoker.sources
      deps = invoker.deps
      if (defined(invoker.public_deps)) {
        public_deps = invoker.public_deps
      }

      result_path = "$target_gen_dir/{{source_name_part}}_nc.cc"
      depfile = "${result_path}.d"
      outputs = [ result_path ]
      args = [
        rebase_path("$clang_base_path/bin/clang++", root_build_dir),
        "4",  # number of compilers to invoke in parallel.
        "{{source}}",
        rebase_path(result_path, root_build_dir),
        "--",
        "-nostdinc++",
        "-isystem" + rebase_path("$libcxx_prefix/include", root_build_dir),
        "-isystem" + rebase_path("$libcxxabi_prefix/include", root_build_dir),
        "-std=c++17",
        "-Wall",
        "-Werror",
        "-Wfatal-errors",
        "-Wthread-safety",
        "-I" + rebase_path("//", root_build_dir),
        "-I" + rebase_path("//third_party/abseil-cpp/", root_build_dir),
        "-I" + rebase_path("//buildtools/third_party/libc++/", root_build_dir),
        "-I" + rebase_path(root_gen_dir, root_build_dir),

        # TODO(https://crbug.com/989932): Track build/config/compiler/BUILD.gn
        "-Wno-implicit-int-float-conversion",
      ]

      if (is_mac && host_os != "mac") {
        args += [
          "--target=x86_64-apple-macos",
          "-mmacos-version-min=$mac_deployment_target",
        ]
      }

      # Iterate over any extra include dirs and append them to the command line.
      if (defined(invoker.include_dirs)) {
        foreach(include_dir, invoker.include_dirs) {
          args += [ "-I" + rebase_path(include_dir, root_build_dir) ]
        }
      }

      if (sysroot != "") {
        args += [
          "--sysroot",
          rebase_path(sysroot, root_build_dir),
        ]
      }

      if (!is_nacl) {
        args += [
          # TODO(crbug.com/1343975) Evaluate and possibly enable.
          "-Wno-deprecated-builtins",
        ]
      }
    }

    test(target_name) {
      deps = invoker.deps + [ ":$nocompile_target" ]
      sources = get_target_outputs(":$nocompile_target")
    }
  }
}
