1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 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 #include "base/compiler_specific.h" 6*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h" 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker namespace { 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker template <int A = 0, int B = 0> uses_pointer_as_array(int * i)11*6777b538SAndroid Build Coastguard WorkerUNSAFE_BUFFER_USAGE int uses_pointer_as_array(int* i) { 12*6777b538SAndroid Build Coastguard Worker return UNSAFE_BUFFERS(i[1]); 13*6777b538SAndroid Build Coastguard Worker } 14*6777b538SAndroid Build Coastguard Worker TEST(UnsafeBuffers,Macro)15*6777b538SAndroid Build Coastguard WorkerTEST(UnsafeBuffers, Macro) { 16*6777b538SAndroid Build Coastguard Worker int arr[] = {1, 2}; 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker // Should compile even with -Wunsafe-buffer-usage. 19*6777b538SAndroid Build Coastguard Worker int x = UNSAFE_BUFFERS(uses_pointer_as_array(arr)); 20*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(x, 2); 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // Should compile even with -Wunsafe-buffer-usage. 23*6777b538SAndroid Build Coastguard Worker UNSAFE_BUFFERS({ 24*6777b538SAndroid Build Coastguard Worker uses_pointer_as_array(arr); 25*6777b538SAndroid Build Coastguard Worker uses_pointer_as_array(arr); 26*6777b538SAndroid Build Coastguard Worker }); 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker // Commas don't break things. This comma is not wrapped in `()` which verifies 29*6777b538SAndroid Build Coastguard Worker // the macro handles the comma correctly. `()` would hide the comma from the 30*6777b538SAndroid Build Coastguard Worker // macro. 31*6777b538SAndroid Build Coastguard Worker int y = UNSAFE_BUFFERS(uses_pointer_as_array<1, 1>(arr)); 32*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(y, 2); 33*6777b538SAndroid Build Coastguard Worker } 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker } // namespace 36