//==- AnnexKDetection.cpp - Annex K availability detection -------*- C++ -*-==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains the implementation of utilities for detecting C11 Annex K // (Bounds-checking interfaces) availability. // //===----------------------------------------------------------------------===// #include "clang/Analysis/AnnexKDetection.h" #include "clang/Basic/LangOptions.h" #include "clang/Lex/Preprocessor.h" namespace clang::analysis { [[nodiscard]] bool isAnnexKAvailable(Preprocessor *PP, const LangOptions &LO) { if (!LO.C11) return false; assert(PP && "No Preprocessor registered."); if (!PP->isMacroDefined("__STDC_LIB_EXT1__") || !PP->isMacroDefined("__STDC_WANT_LIB_EXT1__")) return false; const auto *MI = PP->getMacroInfo(PP->getIdentifierInfo("__STDC_WANT_LIB_EXT1__")); if (!MI || MI->tokens_empty()) return false; const Token &T = MI->tokens().back(); if (!T.isLiteral() || !T.getLiteralData()) return false; return StringRef(T.getLiteralData(), T.getLength()) == "1"; } } // namespace clang::analysis