//===- VariadicMacroSupport.h - state machines and scope guards -*- 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 defines support types to help with preprocessing variadic macro // (i.e. macros that use: ellipses __VA_ARGS__ ) definitions and // expansions. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LEX_VARIADICMACROSUPPORT_H #define LLVM_CLANG_LEX_VARIADICMACROSUPPORT_H #include "clang/Lex/Preprocessor.h" #include "llvm/ADT/SmallVector.h" namespace clang { class Preprocessor; /// An RAII class that tracks when the Preprocessor starts and stops lexing /// the definition of a (ISO C/C++) variadic macro. As an example, this is /// useful for unpoisoning and repoisoning certain identifiers (such as /// __VA_ARGS__) that are only allowed in this context. Also, being a friend /// of the Preprocessor class allows it to access PP's cached identifiers /// directly (as opposed to performing a lookup each time). class VariadicMacroScopeGuard { … }; /// A class for tracking whether we're inside a VA_OPT during a /// traversal of the tokens of a variadic macro definition. class VAOptDefinitionContext { … }; /// A class for tracking whether we're inside a VA_OPT during a /// traversal of the tokens of a macro during macro expansion. class VAOptExpansionContext : VAOptDefinitionContext { … }; } // end namespace clang #endif