//======- ParsedAttr.h - Parsed attribute sets ------------------*- 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 the ParsedAttr class, which is used to collect // parsed attributes. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_SEMA_PARSEDATTR_H #define LLVM_CLANG_SEMA_PARSEDATTR_H #include "clang/Basic/AttrSubjectMatchRules.h" #include "clang/Basic/AttributeCommonInfo.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/ParsedAttrInfo.h" #include "clang/Basic/SourceLocation.h" #include "clang/Sema/Ownership.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/VersionTuple.h" #include <bitset> #include <cassert> #include <cstddef> #include <cstring> #include <utility> namespace clang { class ASTContext; class Decl; class Expr; class IdentifierInfo; class LangOptions; class Sema; class Stmt; class TargetInfo; struct IdentifierLoc; /// Represents information about a change in availability for /// an entity, which is part of the encoding of the 'availability' /// attribute. struct AvailabilityChange { … }; namespace detail { enum AvailabilitySlot { … }; /// Describes the trailing object for Availability attribute in ParsedAttr. struct AvailabilityData { … }; struct TypeTagForDatatypeData { … }; struct PropertyData { … }; } // namespace detail /// Wraps an identifier and optional source location for the identifier. struct IdentifierLoc { … }; /// A union of the various pointer types that can be passed to an /// ParsedAttr as an argument. ArgsUnion; ArgsVector; /// ParsedAttr - Represents a syntactic attribute. /// /// For a GNU attribute, there are four forms of this construct: /// /// 1: __attribute__(( const )). ParmName/Args/NumArgs will all be unused. /// 2: __attribute__(( mode(byte) )). ParmName used, Args/NumArgs unused. /// 3: __attribute__(( format(printf, 1, 2) )). ParmName/Args/NumArgs all used. /// 4: __attribute__(( aligned(16) )). ParmName is unused, Args/Num used. /// class ParsedAttr final : public AttributeCommonInfo, private llvm::TrailingObjects< ParsedAttr, ArgsUnion, detail::AvailabilityData, detail::TypeTagForDatatypeData, ParsedType, detail::PropertyData> { … }; class AttributePool; /// A factory, from which one makes pools, from which one creates /// individual attributes which are deallocated with the pool. /// /// Note that it's tolerably cheap to create and destroy one of /// these as long as you don't actually allocate anything in it. class AttributeFactory { … }; class ParsedAttributesView; class AttributePool { … }; class ParsedAttributesView { … }; struct ParsedAttributeArgumentsProperties { … }; /// ParsedAttributes - A collection of parsed attributes. Currently /// we don't differentiate between the various attribute syntaxes, /// which is basically silly. /// /// Right now this is a very lightweight container, but the expectation /// is that this will become significantly more serious. class ParsedAttributes : public ParsedAttributesView { … }; /// Consumes the attributes from `First` and `Second` and concatenates them into /// `Result`. Sets `Result.Range` to the combined range of `First` and `Second`. void takeAndConcatenateAttrs(ParsedAttributes &First, ParsedAttributes &Second, ParsedAttributes &Result); /// These constants match the enumerated choices of /// err_attribute_argument_n_type and err_attribute_argument_type. enum AttributeArgumentNType { … }; /// These constants match the enumerated choices of /// warn_attribute_wrong_decl_type and err_attribute_wrong_decl_type. enum AttributeDeclKind { … }; inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB, const ParsedAttr &At) { … } inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB, const ParsedAttr *At) { … } /// AttributeCommonInfo has a non-explicit constructor which takes an /// SourceRange as its only argument, this constructor has many uses so making /// it explicit is hard. This constructor causes ambiguity with /// DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, SourceRange R). /// We use SFINAE to disable any conversion and remove any ambiguity. template < typename ACI, std::enable_if_t<std::is_same<ACI, AttributeCommonInfo>::value, int> = 0> inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB, const ACI &CI) { … } template < typename ACI, std::enable_if_t<std::is_same<ACI, AttributeCommonInfo>::value, int> = 0> inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB, const ACI *CI) { … } } // namespace clang #endif // LLVM_CLANG_SEMA_PARSEDATTR_H