chromium/tools/clang/raw_ptr_plugin/tests/system/raw_ptr_system_test.h

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TOOLS_CLANG_RAW_PTR_PLUGIN_TESTS_SYSTEM_RAW_PTR_SYSTEM_TEST_H_
#define TOOLS_CLANG_RAW_PTR_PLUGIN_TESTS_SYSTEM_RAW_PTR_SYSTEM_TEST_H_
#line 7 "/src/tools/clang/plugins/tests/system/raw_ptr_system_test.h"

#define SYS_INT int
#define SYS_INTP int*
#define SYS_CONST const
#define SYS_ATTR [[fake_attribute]]
#define SYS_INTP_FIELD() int* macro_ptr
#define SYS_TYPE_WITH_SUFFIX(TYP) TYP##Suffix
#define SYS_SYMBOL(SYM) SYM
#define SYS_SYMBOL_WITH_SUFFIX(SYM) SYM##_Suffix
#define SYS_EQ =
#define SYS_NULLPTR nullptr
class SysTypSuffix;

// OK: code owner has no control over system header.
struct SysStructWithSysMacro {
  int* ptr0;                                     // OK.
  SYS_INT* ptr1;                                 // OK.
  SYS_INTP ptr2;                                 // OK.
  int* SYS_CONST ptr3;                           // OK.
  int* SYS_ATTR ptr4;                            // OK.
  SYS_INTP_FIELD();                              // OK.
  SYS_TYPE_WITH_SUFFIX(SysTyp) * ptr5;           // OK.
  int* SYS_SYMBOL(ptr6);                         // OK.
  int* SYS_SYMBOL_WITH_SUFFIX(ptr7);             // OK.
  int* ptr8 SYS_EQ nullptr;                      // OK.
  int* ptr9 = SYS_NULLPTR;                       // OK.
  int* SYS_SYMBOL_WITH_SUFFIX(ptr10) = nullptr;  // OK.
};

// OK: code owner has no control over system header and command line.
struct SysStructWithCmdMacro {
  int* ptr0;                                     // OK.
  CMD_INT* ptr1;                                 // OK.
  CMD_INTP ptr2;                                 // OK.
  int* CMD_CONST ptr3;                           // OK.
  int* CMD_ATTR ptr4;                            // OK.
  CMD_INTP_FIELD();                              // OK.
  CMD_TYPE_WITH_SUFFIX(SysTyp) * ptr5;           // OK.
  int* CMD_SYMBOL(ptr6);                         // OK.
  int* CMD_SYMBOL_WITH_SUFFIX(ptr7);             // OK.
  int* ptr8 CMD_EQ nullptr;                      // OK.
  int* ptr9 = CMD_NULLPTR;                       // OK.
  int* CMD_SYMBOL_WITH_SUFFIX(ptr10) = nullptr;  // OK.
};

// These `USR_***` macro should be defined before including this header,
// in `//tools/clang/plugins/tests/raw_ptr_fields_macro.cpp`.
struct SysStructWithUsrMacro {
  // OK: code owner has no control over system header.
  int* ptr0;
  // OK: code owner has no control over system header.
  USR_INT* ptr1;
  // OK: code owner has no control over system header.
  USR_INTP ptr2;
  // OK: code owner has no control over system header.
  int* USR_CONST ptr3;
  // OK: code owner has no control over system header.
  int* USR_ATTR ptr4;
  // Error: user has control over the macro.
  USR_INTP_FIELD();
  // OK: code owner has no control over system header.
  USR_TYPE_WITH_SUFFIX(SysTyp) * ptr5;
  // OK: code owner has no control over system header.
  int* USR_SYMBOL(ptr6);
  // OK: the source location for this field declaration will be "<scratch
  // space>" and the real file path cannot be detected.
  int* USR_SYMBOL_WITH_SUFFIX(ptr7);
  // OK: code owner has no control over system header.
  int* ptr8 USR_EQ nullptr;
  // OK: code owner has no control over system header.
  int* ptr9 = USR_NULLPTR;
  // OK: the source location for this field declaration will be "<scratch
  // space>" and the real file path cannot be detected.
  int* USR_SYMBOL_WITH_SUFFIX(ptr10) = nullptr;
};

// Same as for SysStructWithSysMacro.
struct SysStructWithThirdPartyMacro {
  int* ptr0;                                    // OK.
  TP_INT* ptr1;                                 // OK.
  TP_INTP ptr2;                                 // OK.
  int* TP_CONST ptr3;                           // OK.
  int* TP_ATTR ptr4;                            // OK.
  TP_INTP_FIELD();                              // OK.
  TP_TYPE_WITH_SUFFIX(SysTyp) * ptr5;           // OK.
  int* TP_SYMBOL(ptr6);                         // OK.
  int* TP_SYMBOL_WITH_SUFFIX(ptr7);             // OK.
  int* ptr8 TP_EQ nullptr;                      // OK.
  int* ptr9 = TP_NULLPTR;                       // OK.
  int* TP_SYMBOL_WITH_SUFFIX(ptr10) = nullptr;  // OK.
};

// Same as for SysStructWithSysMacro.
struct SysStructWithManuallyIgnoredMacro {
  int* ptr0;                                    // OK.
  IG_INT* ptr1;                                 // OK.
  IG_INTP ptr2;                                 // OK.
  int* IG_CONST ptr3;                           // OK.
  int* IG_ATTR ptr4;                            // OK.
  IG_INTP_FIELD();                              // OK.
  IG_TYPE_WITH_SUFFIX(SysTyp) * ptr5;           // OK.
  int* IG_SYMBOL(ptr6);                         // OK.
  int* IG_SYMBOL_WITH_SUFFIX(ptr7);             // OK.
  int* ptr8 IG_EQ nullptr;                      // OK.
  int* ptr9 = IG_NULLPTR;                       // OK.
  int* IG_SYMBOL_WITH_SUFFIX(ptr10) = nullptr;  // OK.
};

// Same as for SysStructWithSysMacro.
struct SysStructWithGeneratedMacro {
  int* ptr0;                                     // OK.
  GEN_INT* ptr1;                                 // OK.
  GEN_INTP ptr2;                                 // OK.
  int* GEN_CONST ptr3;                           // OK.
  int* GEN_ATTR ptr4;                            // OK.
  GEN_INTP_FIELD();                              // OK.
  GEN_TYPE_WITH_SUFFIX(SysTyp) * ptr5;           // OK.
  int* GEN_SYMBOL(ptr6);                         // OK.
  int* GEN_SYMBOL_WITH_SUFFIX(ptr7);             // OK.
  int* ptr8 GEN_EQ nullptr;                      // OK.
  int* ptr9 = GEN_NULLPTR;                       // OK.
  int* GEN_SYMBOL_WITH_SUFFIX(ptr10) = nullptr;  // OK.
};

#endif  // TOOLS_CLANG_RAW_PTR_PLUGIN_TESTS_SYSTEM_RAW_PTR_SYSTEM_TEST_H_