34 lines
1.3 KiB
Plaintext
34 lines
1.3 KiB
Plaintext
// Copyright 2020 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// This is a "No Compile Test" suite.
|
|
// https://dev.chromium.org/developers/testing/no-compile-tests
|
|
|
|
#include "base/containers/contains.h"
|
|
|
|
#include <set>
|
|
|
|
#include "base/strings/string_piece.h"
|
|
|
|
namespace base {
|
|
|
|
// The following code would perform a linear search through the set which is
|
|
// likely unexpected and not intended. This is because the expression
|
|
// `set.find(kFoo)` is ill-formed, since there is no implimit conversion from
|
|
// StringPiece to `std::string`. This means Contains would fall back to the
|
|
// general purpose `base::ranges::find(set, kFoo)` linear search.
|
|
// To fix this clients can either use a more generic comparator like std::less<>
|
|
// (in this case `set.find()` accepts any type that is comparable to a
|
|
// std::string), or pass an explicit projection parameter to Contains, at which
|
|
// point it will always perform a linear search.
|
|
#if defined(NCTEST_CONTAINS_UNEXPECTED_LINEAR_SEARCH) // [r"Error: About to perform linear search on an associative container."]
|
|
void WontCompile() {
|
|
constexpr StringPiece kFoo = "foo";
|
|
std::set<std::string> set = {"foo", "bar", "baz"};
|
|
Contains(set, kFoo);
|
|
}
|
|
#endif
|
|
|
|
} // namespace base
|