CompileFlags:
  Add:
    - "-std=c++17"
    - "-stdlib=libstdc++"

    # 定义 NPU 架构宏(用于条件编译)
    # 可选值: 2201(Atlas A2/A3 系列), 3510(Ascend 950PR/Ascend 950DT)
    - "-D__NPU_ARCH__=2201"

    # 注入AscendC头文件路径(自行替换cann包路径)
    # asc/ 根目录必须在列表中:CANN 头文件内部大量使用 #include "impl/..." 相对路径
    - "-isystem"
    - "/usr/local/Ascend/cann/asc"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/adv_api/matmul"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/aicpu_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/basic_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/c_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/interface"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/simt_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/tiling"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/utils"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/include/utils/debug"

    - "-isystem"
    - "/usr/local/Ascend/cann/asc/impl"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/impl/adv_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/impl/basic_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/impl/c_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/impl/simt_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/asc/impl/utils"
    - "-isystem"
    - "/usr/local/Ascend/cann/include"

    # CPU 调试模式的 stub 定义(half, bfloat16_t, threadIdx 等类型均在此处)
    # CANN 头文件在 ASCENDC_CPU_DEBUG=1 时会 #include "stub_def.h",须确保可达
    - "-isystem"
    - "/usr/local/Ascend/cann/tools/cpudebug/lib/include"

    # 高级 API(lib/matmul_intf.h, kernel_tiling/ 等)和 host 侧 tiling API
    - "-isystem"
    - "/usr/local/Ascend/cann/include/ascendc/highlevel_api"
    - "-isystem"
    - "/usr/local/Ascend/cann/include/ascendc/host_api"

    # 启用 CPU 调试模式(仅供 IDE 诊断),使 CANN 头文件走 CPU 仿真分支
    - "-DASCENDC_CPU_DEBUG=1"

    # stub_def.h 未覆盖的关键字,须手动定义
    - "-D__device__="
    - "-D__launch_bounds__(x)="

    # .aicpu未 #include "stub_def.h",需手动添加
    - "-D__global__="
    - "-D__aicpu__="

    # 抑制未知属性和其他不相关的警告
    - "-Wno-unknown-attributes"
    - "-Wno-ignored-attributes"
    - "-Wno-gnu-zero-variadic-macro-arguments"
    - "-Wno-nested-anon-types"

Diagnostics:
  UnusedIncludes: None
  MissingIncludes: None
  Suppress:
    - "pp_file_not_found"       # 构建生成的头文件(*_op_resource.h, aclnn_*.h 等)
    - "unknown-warning-option"  # 自定义 -Wno-* 可能不被 clangd 内置 clang 识别
    - "macro-redefined"         # CANN 头文件内部重复定义 __BLOCK_LOCAL__ 等
---
If:
  PathMatch: ".*\\.(asc|aicpu)$"
CompileFlags:
  # .asc/.aicpu 常缺少可用编译数据库,使用本文件内 flags 以稳定解析 AscendC 语法
  CompilationDatabase: None
  Add:
    - "-x"
    - "c++"

# .asc/.aicpu 文件使用 <<<blocks, tiling, stream>>> kernel launch 语法,
# clangd 无法解析,会产生级联误报,以下 suppress 项均为此兜底
Diagnostics:
  Suppress:
    - "attributes_not_allowed"
    - "decomp_decl_template"
    - "ignored_attributes"
    - "unknown_type_name"
    - "undeclared_var_use"
    - "invalid_token_after_toplevel_declarator"
    - "missing_type_specifier"
    - "typename_nested_not_found"
    - "redefinition"            # 限制在 AscendC 文件内,减少来自 CANN 头文件的重复定义诊断干扰