1*6777b538SAndroid Build Coastguard Worker# Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker# This file is meant to be included into an target to create a unittest that 6*6777b538SAndroid Build Coastguard Worker# invokes a set of no-compile tests. A no-compile test is a test that asserts 7*6777b538SAndroid Build Coastguard Worker# a particular construct will not compile. 8*6777b538SAndroid Build Coastguard Worker# 9*6777b538SAndroid Build Coastguard Worker# Usage: 10*6777b538SAndroid Build Coastguard Worker# 11*6777b538SAndroid Build Coastguard Worker# 1. Create a GN target: 12*6777b538SAndroid Build Coastguard Worker# 13*6777b538SAndroid Build Coastguard Worker# import("//build/nocompile.gni") 14*6777b538SAndroid Build Coastguard Worker# 15*6777b538SAndroid Build Coastguard Worker# nocompile_source_set("base_nocompile_tests") { 16*6777b538SAndroid Build Coastguard Worker# sources = [ 17*6777b538SAndroid Build Coastguard Worker# "functional/one_not_equal_two_nocompile.nc", 18*6777b538SAndroid Build Coastguard Worker# ] 19*6777b538SAndroid Build Coastguard Worker# deps = [ 20*6777b538SAndroid Build Coastguard Worker# ":base" 21*6777b538SAndroid Build Coastguard Worker# ] 22*6777b538SAndroid Build Coastguard Worker# } 23*6777b538SAndroid Build Coastguard Worker# 24*6777b538SAndroid Build Coastguard Worker# Note that by convention, nocompile tests use the `.nc` extension rather 25*6777b538SAndroid Build Coastguard Worker# than the standard `.cc` extension: this is because the expectation lines 26*6777b538SAndroid Build Coastguard Worker# often exceed 80 characters, which would make clang-format unhappy. 27*6777b538SAndroid Build Coastguard Worker# 28*6777b538SAndroid Build Coastguard Worker# 2. Add a dep from a related test binary to the nocompile source set: 29*6777b538SAndroid Build Coastguard Worker# 30*6777b538SAndroid Build Coastguard Worker# test("base_unittests") { 31*6777b538SAndroid Build Coastguard Worker# ... 32*6777b538SAndroid Build Coastguard Worker# deps += [ ":base_nocompile_tests" ] 33*6777b538SAndroid Build Coastguard Worker# } 34*6777b538SAndroid Build Coastguard Worker# 35*6777b538SAndroid Build Coastguard Worker# 3. Populate the .nc file with test cases. Expected compile failures should be 36*6777b538SAndroid Build Coastguard Worker# annotated with a comment of the form: 37*6777b538SAndroid Build Coastguard Worker# 38*6777b538SAndroid Build Coastguard Worker# // expected-error {{<expected error string here>}} 39*6777b538SAndroid Build Coastguard Worker# 40*6777b538SAndroid Build Coastguard Worker# For example: 41*6777b538SAndroid Build Coastguard Worker# 42*6777b538SAndroid Build Coastguard Worker# void OneDoesNotEqualTwo() { 43*6777b538SAndroid Build Coastguard Worker# static_assert(1 == 2); // expected-error {{static assertion failed due to requirement '1 == 2'}} 44*6777b538SAndroid Build Coastguard Worker# } 45*6777b538SAndroid Build Coastguard Worker# 46*6777b538SAndroid Build Coastguard Worker# The verification logic is built as part of clang; full documentation is at 47*6777b538SAndroid Build Coastguard Worker# https://clang.llvm.org/doxygen/classclang_1_1VerifyDiagnosticConsumer.html. 48*6777b538SAndroid Build Coastguard Worker# 49*6777b538SAndroid Build Coastguard Worker# Also see: 50*6777b538SAndroid Build Coastguard Worker# http://dev.chromium.org/developers/testing/no-compile-tests 51*6777b538SAndroid Build Coastguard Worker# 52*6777b538SAndroid Build Coastguard Workerimport("//build/config/clang/clang.gni") 53*6777b538SAndroid Build Coastguard Workerif (is_win) { 54*6777b538SAndroid Build Coastguard Worker import("//build/toolchain/win/win_toolchain_data.gni") 55*6777b538SAndroid Build Coastguard Worker} 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Workerdeclare_args() { 58*6777b538SAndroid Build Coastguard Worker enable_nocompile_tests = is_clang && !is_nacl 59*6777b538SAndroid Build Coastguard Worker} 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Workerif (enable_nocompile_tests) { 62*6777b538SAndroid Build Coastguard Worker template("nocompile_source_set") { 63*6777b538SAndroid Build Coastguard Worker action_foreach(target_name) { 64*6777b538SAndroid Build Coastguard Worker testonly = true 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker script = "//tools/nocompile/wrapper.py" 67*6777b538SAndroid Build Coastguard Worker sources = invoker.sources 68*6777b538SAndroid Build Coastguard Worker if (defined(invoker.deps)) { 69*6777b538SAndroid Build Coastguard Worker deps = invoker.deps 70*6777b538SAndroid Build Coastguard Worker } 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker # An action is not a compiler, so configs is empty until it is explicitly 73*6777b538SAndroid Build Coastguard Worker # set. 74*6777b538SAndroid Build Coastguard Worker configs = default_compiler_configs 75*6777b538SAndroid Build Coastguard Worker if (defined(invoker.configs)) { 76*6777b538SAndroid Build Coastguard Worker configs += invoker.configs 77*6777b538SAndroid Build Coastguard Worker } 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker # Disable the checks that the Chrome style plugin normally enforces to 80*6777b538SAndroid Build Coastguard Worker # reduce the amount of boilerplate needed in nocompile tests. 81*6777b538SAndroid Build Coastguard Worker configs -= [ "//build/config/clang:find_bad_constructs" ] 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker if (is_win) { 84*6777b538SAndroid Build Coastguard Worker result_path = 85*6777b538SAndroid Build Coastguard Worker "$target_out_dir/$target_name/{{source_name_part}}_placeholder.obj" 86*6777b538SAndroid Build Coastguard Worker } else { 87*6777b538SAndroid Build Coastguard Worker result_path = 88*6777b538SAndroid Build Coastguard Worker "$target_out_dir/$target_name/{{source_name_part}}_placeholder.o" 89*6777b538SAndroid Build Coastguard Worker } 90*6777b538SAndroid Build Coastguard Worker rebased_obj_path = rebase_path(result_path, root_build_dir) 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker depfile = "${result_path}.d" 93*6777b538SAndroid Build Coastguard Worker rebased_depfile_path = rebase_path(depfile, root_build_dir) 94*6777b538SAndroid Build Coastguard Worker outputs = [ result_path ] 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker if (is_win) { 97*6777b538SAndroid Build Coastguard Worker if (host_os == "win") { 98*6777b538SAndroid Build Coastguard Worker cxx = "clang-cl.exe" 99*6777b538SAndroid Build Coastguard Worker } else { 100*6777b538SAndroid Build Coastguard Worker cxx = "clang-cl" 101*6777b538SAndroid Build Coastguard Worker } 102*6777b538SAndroid Build Coastguard Worker } else { 103*6777b538SAndroid Build Coastguard Worker cxx = "clang++" 104*6777b538SAndroid Build Coastguard Worker } 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker args = [] 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker if (is_win) { 109*6777b538SAndroid Build Coastguard Worker # ninja normally parses /showIncludes output, but the depsformat 110*6777b538SAndroid Build Coastguard Worker # variable can only be set in compiler tools, not for custom actions. 111*6777b538SAndroid Build Coastguard Worker # Unfortunately, this means the clang wrapper needs to generate the 112*6777b538SAndroid Build Coastguard Worker # depfile itself. 113*6777b538SAndroid Build Coastguard Worker args += [ "--generate-depfile" ] 114*6777b538SAndroid Build Coastguard Worker } 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker args += [ 117*6777b538SAndroid Build Coastguard Worker rebase_path("$clang_base_path/bin/$cxx", root_build_dir), 118*6777b538SAndroid Build Coastguard Worker "{{source}}", 119*6777b538SAndroid Build Coastguard Worker rebased_obj_path, 120*6777b538SAndroid Build Coastguard Worker rebased_depfile_path, 121*6777b538SAndroid Build Coastguard Worker "--", 122*6777b538SAndroid Build Coastguard Worker "{{cflags}}", 123*6777b538SAndroid Build Coastguard Worker "{{cflags_cc}}", 124*6777b538SAndroid Build Coastguard Worker "{{defines}}", 125*6777b538SAndroid Build Coastguard Worker "{{include_dirs}}", 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker # No need to generate an object file for nocompile tests. 128*6777b538SAndroid Build Coastguard Worker "-Xclang", 129*6777b538SAndroid Build Coastguard Worker "-fsyntax-only", 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker # Enable clang's VerifyDiagnosticConsumer: 132*6777b538SAndroid Build Coastguard Worker # https://clang.llvm.org/doxygen/classclang_1_1VerifyDiagnosticConsumer.html 133*6777b538SAndroid Build Coastguard Worker "-Xclang", 134*6777b538SAndroid Build Coastguard Worker "-verify", 135*6777b538SAndroid Build Coastguard Worker 136*6777b538SAndroid Build Coastguard Worker # But don't require expected-note comments since that is not the 137*6777b538SAndroid Build Coastguard Worker # primary point of the nocompile tests. 138*6777b538SAndroid Build Coastguard Worker "-Xclang", 139*6777b538SAndroid Build Coastguard Worker "-verify-ignore-unexpected=note", 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Worker # Disable the error limit so that nocompile tests do not need to be 142*6777b538SAndroid Build Coastguard Worker # arbitrarily split up when they hit the default error limit. 143*6777b538SAndroid Build Coastguard Worker "-ferror-limit=0", 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker # So funny characters don't show up in error messages. 146*6777b538SAndroid Build Coastguard Worker "-fno-color-diagnostics", 147*6777b538SAndroid Build Coastguard Worker 148*6777b538SAndroid Build Coastguard Worker # Always treat warnings as errors. 149*6777b538SAndroid Build Coastguard Worker "-Werror", 150*6777b538SAndroid Build Coastguard Worker ] 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker if (!is_win) { 153*6777b538SAndroid Build Coastguard Worker args += [ 154*6777b538SAndroid Build Coastguard Worker # On non-Windows platforms, clang can generate the depfile. 155*6777b538SAndroid Build Coastguard Worker "-MMD", 156*6777b538SAndroid Build Coastguard Worker "-MF", 157*6777b538SAndroid Build Coastguard Worker rebased_depfile_path, 158*6777b538SAndroid Build Coastguard Worker "-MT", 159*6777b538SAndroid Build Coastguard Worker rebased_obj_path, 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker # Non-Windows clang uses file extensions to determine how to treat 162*6777b538SAndroid Build Coastguard Worker # various inputs, so explicitly tell it to treat all inputs (even 163*6777b538SAndroid Build Coastguard Worker # those with weird extensions like .nc) as C++ source files. 164*6777b538SAndroid Build Coastguard Worker "-x", 165*6777b538SAndroid Build Coastguard Worker "c++", 166*6777b538SAndroid Build Coastguard Worker ] 167*6777b538SAndroid Build Coastguard Worker } else { 168*6777b538SAndroid Build Coastguard Worker # For some reason, the Windows includes are not part of the default 169*6777b538SAndroid Build Coastguard Worker # compiler configs. Set it explicitly here, since things like libc++ 170*6777b538SAndroid Build Coastguard Worker # depend on the VC runtime. 171*6777b538SAndroid Build Coastguard Worker if (target_cpu == "x86") { 172*6777b538SAndroid Build Coastguard Worker win_toolchain_data = win_toolchain_data_x86 173*6777b538SAndroid Build Coastguard Worker } else if (target_cpu == "x64") { 174*6777b538SAndroid Build Coastguard Worker win_toolchain_data = win_toolchain_data_x64 175*6777b538SAndroid Build Coastguard Worker } else if (target_cpu == "arm64") { 176*6777b538SAndroid Build Coastguard Worker win_toolchain_data = win_toolchain_data_arm64 177*6777b538SAndroid Build Coastguard Worker } else { 178*6777b538SAndroid Build Coastguard Worker error("Unsupported target_cpu, add it to win_toolchain_data.gni") 179*6777b538SAndroid Build Coastguard Worker } 180*6777b538SAndroid Build Coastguard Worker args += win_toolchain_data.include_flags_imsvc_list 181*6777b538SAndroid Build Coastguard Worker args += [ "/showIncludes:user" ] 182*6777b538SAndroid Build Coastguard Worker } 183*6777b538SAndroid Build Coastguard Worker 184*6777b538SAndroid Build Coastguard Worker # Note: for all platforms, the depfile only lists user includes, and not 185*6777b538SAndroid Build Coastguard Worker # system includes. If system includes change, the compiler flags are 186*6777b538SAndroid Build Coastguard Worker # expected to artificially change in some way to invalidate and force the 187*6777b538SAndroid Build Coastguard Worker # nocompile tests to run again. 188*6777b538SAndroid Build Coastguard Worker } 189*6777b538SAndroid Build Coastguard Worker } 190*6777b538SAndroid Build Coastguard Worker} 191