Files
carbon-lang/testing/file_test/BUILD
T
Dana Jansens 9a6c74f0cd Introduce FindIfOrNull() FindIfOrNone() and Contains() (#5322)
`FindIfOrNull` returns a pointer to the element in the range if it's
found, and nullptr otherwise. `FindIfOrNone` returns a copy of the
element in the range if it's found, and `T::None` (for a range of
elements of type `T`) otherwise. `Contains` returns a bool indicating
whether the element in the range is found.

These functions replace `llvm::find()` and `llvm::find_if()` when you
want a single answer back instead of an iterator. This avoids the need
to check against `end()`, allowing the return condition to be tested as
a standard bool.

We replace uses of `find()` and `find_if()` that did not require an
iterator with these new helpers.

Note that the return type of `FindIfOrNull` is a pointer since we can
not write `optional<T&>`, which must be tested for null. If the null
check is omitted, UB occurs and the resulting code may end up with an
incorrect pointer (https://crbug.com/40153300) into the range (or
elsewhere), rather than a null dereference. And this would be very
confusing to debug. Hopefully debug builds and sanitizers keep this from
being an issue we sink a bunch of time into debugging.
2025-04-18 14:17:48 +00:00

87 lines
2.1 KiB
Python

# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
load("//bazel/cc_rules:defs.bzl", "cc_library")
load("rules.bzl", "file_test")
package(default_visibility = ["//visibility:public"])
cc_library(
name = "autoupdate",
testonly = 1,
srcs = ["autoupdate.cpp"],
hdrs = [
"autoupdate.h",
"line.h",
],
deps = [
"//common:check",
"//common:ostream",
"//common:raw_string_ostream",
"@abseil-cpp//absl/strings",
"@abseil-cpp//absl/strings:string_view",
"@llvm-project//llvm:Support",
"@re2",
],
)
cc_library(
name = "file_test_base",
testonly = 1,
srcs = [
"file_test_base.cpp",
"run_test.cpp",
"run_test.h",
"test_file.cpp",
"test_file.h",
],
hdrs = ["file_test_base.h"],
deps = [
":autoupdate",
":manifest",
"//common:check",
"//common:error",
"//common:exe_path",
"//common:find",
"//common:init_llvm",
"//common:ostream",
"//common:raw_string_ostream",
"//testing/base:file_helpers",
"@abseil-cpp//absl/flags:flag",
"@abseil-cpp//absl/flags:parse",
"@abseil-cpp//absl/strings",
"@googletest//:gtest",
"@llvm-project//llvm:Support",
],
)
file_test(
name = "file_test_base_test",
size = "small",
srcs = ["file_test_base_test.cpp"],
tests = glob(["testdata/**"]),
deps = [
":file_test_base",
"//common:ostream",
"@googletest//:gtest",
"@llvm-project//llvm:Support",
],
)
# Note this is separate from the implementation; see the .h file.
cc_library(
name = "manifest",
testonly = 1,
hdrs = ["manifest.h"],
deps = ["@llvm-project//llvm:Support"],
)
# Used through `file_test` in rules.bzl.
cc_library(
name = "manifest_impl",
testonly = 1,
srcs = ["manifest.cpp"],
deps = [":manifest"],
)