// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#define UNSAFE_FN [[clang::unsafe_buffer_usage]]
// clang-format off
#define UNSAFE_BUFFERS(...) \
_Pragma("clang unsafe_buffer_usage begin") \
__VA_ARGS__ \
_Pragma("clang unsafe_buffer_usage end")
// clang-format on
#include "unsafe_buffers_not_clean_dir/clean_header.h"
#include "unsafe_buffers_not_clean_dir/not_clean_header.h"
#include "unsafe_buffers_not_clean_dir/still_not_clean_dir_1/not_clean_header.h"
#include "unsafe_buffers_not_clean_dir/still_not_clean_dir_2/not_clean_header.h"
// This is in a known-bad cc file, so no error is emitted.
DO_UNSAFE_THING_FROM_CHECKED_HEADER(UncheckedCpp, N, i, s); // No error.
DO_UNSAFE_THING_FROM_UNCHECKED_HEADER(UncheckedCpp, N, i, s); // No error.
inline int allowed_bad_stuff_in_cpp(int* i, unsigned s) {
auto x = [&]() { return i; };
// This is in a known-bad cc file, so no error is emitted.
return MACRO_CALL_FUNCTION_FROM_CHECKED_HEADER(x)[s] + // No error.
MACRO_CALL_FUNCTION_FROM_UNCHECKED_HEADER(x)[s] + // No error.
i[s]; // No error.
}
int main() {
int i;
allowed_bad_stuff_in_cpp(&i, 1u);
auto a = UncheckStructThingTryToMakeScratchBufferUncheckedCpp();
auto b = CheckStructThingTryToMakeScratchBufferUncheckedCpp
();
}