LCOV - code coverage report
Current view: top level - clang/AST - Attr.h (source / functions) Hit Total Coverage
Test: clang.info Lines: 0 1 0.0 %
Date: 2016-01-31 12:01:00 Functions: 0 1 0.0 %

          Line data    Source code
       1             : //===--- Attr.h - Classes for representing attributes ----------*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : //  This file defines the Attr interface and subclasses.
      11             : //
      12             : //===----------------------------------------------------------------------===//
      13             : 
      14             : #ifndef LLVM_CLANG_AST_ATTR_H
      15             : #define LLVM_CLANG_AST_ATTR_H
      16             : 
      17             : #include "clang/AST/AttrIterator.h"
      18             : #include "clang/AST/Decl.h"
      19             : #include "clang/AST/Expr.h"
      20             : #include "clang/AST/Type.h"
      21             : #include "clang/Basic/AttrKinds.h"
      22             : #include "clang/Basic/LLVM.h"
      23             : #include "clang/Basic/Sanitizers.h"
      24             : #include "clang/Basic/SourceLocation.h"
      25             : #include "clang/Basic/VersionTuple.h"
      26             : #include "llvm/ADT/SmallVector.h"
      27             : #include "llvm/ADT/StringRef.h"
      28             : #include "llvm/ADT/StringSwitch.h"
      29             : #include "llvm/Support/ErrorHandling.h"
      30             : #include "llvm/Support/raw_ostream.h"
      31             : #include <algorithm>
      32             : #include <cassert>
      33             : 
      34             : namespace clang {
      35             :   class ASTContext;
      36             :   class IdentifierInfo;
      37             :   class ObjCInterfaceDecl;
      38             :   class Expr;
      39             :   class QualType;
      40             :   class FunctionDecl;
      41             :   class TypeSourceInfo;
      42             : 
      43             : /// Attr - This represents one attribute.
      44             : class Attr {
      45             : private:
      46             :   SourceRange Range;
      47             :   unsigned AttrKind : 16;
      48             : 
      49             : protected:
      50             :   /// An index into the spelling list of an
      51             :   /// attribute defined in Attr.td file.
      52             :   unsigned SpellingListIndex : 4;
      53             :   bool Inherited : 1;
      54             :   bool IsPackExpansion : 1;
      55             :   bool Implicit : 1;
      56             :   bool IsLateParsed : 1;
      57             :   bool DuplicatesAllowed : 1;
      58             : 
      59             :   void* operator new(size_t bytes) throw() {
      60             :     llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
      61             :   }
      62             :   void operator delete(void* data) throw() {
      63             :     llvm_unreachable("Attrs cannot be released with regular 'delete'.");
      64             :   }
      65             : 
      66             : public:
      67             :   // Forward so that the regular new and delete do not hide global ones.
      68             :   void* operator new(size_t Bytes, ASTContext &C,
      69             :                      size_t Alignment = 8) throw() {
      70             :     return ::operator new(Bytes, C, Alignment);
      71             :   }
      72             :   void operator delete(void *Ptr, ASTContext &C,
      73             :                        size_t Alignment) throw() {
      74             :     return ::operator delete(Ptr, C, Alignment);
      75             :   }
      76             : 
      77             : protected:
      78             :   Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
      79             :        bool IsLateParsed, bool DuplicatesAllowed)
      80             :     : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex),
      81             :       Inherited(false), IsPackExpansion(false), Implicit(false),
      82             :       IsLateParsed(IsLateParsed), DuplicatesAllowed(DuplicatesAllowed) {}
      83             : 
      84             : public:
      85             : 
      86             :   attr::Kind getKind() const {
      87           0 :     return static_cast<attr::Kind>(AttrKind);
      88             :   }
      89             :   
      90             :   unsigned getSpellingListIndex() const { return SpellingListIndex; }
      91             :   const char *getSpelling() const;
      92             : 
      93             :   SourceLocation getLocation() const { return Range.getBegin(); }
      94             :   SourceRange getRange() const { return Range; }
      95             :   void setRange(SourceRange R) { Range = R; }
      96             : 
      97             :   bool isInherited() const { return Inherited; }
      98             : 
      99             :   /// \brief Returns true if the attribute has been implicitly created instead
     100             :   /// of explicitly written by the user.
     101             :   bool isImplicit() const { return Implicit; }
     102             :   void setImplicit(bool I) { Implicit = I; }
     103             : 
     104             :   void setPackExpansion(bool PE) { IsPackExpansion = PE; }
     105             :   bool isPackExpansion() const { return IsPackExpansion; }
     106             : 
     107             :   // Clone this attribute.
     108             :   Attr *clone(ASTContext &C) const;
     109             : 
     110             :   bool isLateParsed() const { return IsLateParsed; }
     111             : 
     112             :   // Pretty print this attribute.
     113             :   void printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const;
     114             : 
     115             :   /// \brief By default, attributes cannot be duplicated when being merged;
     116             :   /// however, an attribute can override this. Returns true if the attribute
     117             :   /// can be duplicated when merging.
     118             :   bool duplicatesAllowed() const { return DuplicatesAllowed; }
     119             : };
     120             : 
     121             : class InheritableAttr : public Attr {
     122             : protected:
     123             :   InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
     124             :                   bool IsLateParsed, bool DuplicatesAllowed)
     125             :       : Attr(AK, R, SpellingListIndex, IsLateParsed, DuplicatesAllowed) {}
     126             : 
     127             : public:
     128             :   void setInherited(bool I) { Inherited = I; }
     129             : 
     130             :   // Implement isa/cast/dyncast/etc.
     131             :   static bool classof(const Attr *A) {
     132             :     return A->getKind() <= attr::LAST_INHERITABLE;
     133             :   }
     134             : };
     135             : 
     136             : class InheritableParamAttr : public InheritableAttr {
     137             : protected:
     138             :   InheritableParamAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
     139             :                        bool IsLateParsed, bool DuplicatesAllowed)
     140             :       : InheritableAttr(AK, R, SpellingListIndex, IsLateParsed,
     141             :                         DuplicatesAllowed) {}
     142             : 
     143             : public:
     144             :   // Implement isa/cast/dyncast/etc.
     145             :   static bool classof(const Attr *A) {
     146             :     // Relies on relative order of enum emission with respect to MS inheritance
     147             :     // attrs.
     148             :     return A->getKind() <= attr::LAST_INHERITABLE_PARAM;
     149             :   }
     150             : };
     151             : 
     152             : #include "clang/AST/Attrs.inc"
     153             : 
     154             : inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
     155             :                                            const Attr *At) {
     156             :   DB.AddTaggedVal(reinterpret_cast<intptr_t>(At),
     157             :                   DiagnosticsEngine::ak_attr);
     158             :   return DB;
     159             : }
     160             : 
     161             : inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
     162             :                                            const Attr *At) {
     163             :   PD.AddTaggedVal(reinterpret_cast<intptr_t>(At),
     164             :                   DiagnosticsEngine::ak_attr);
     165             :   return PD;
     166             : }
     167             : }  // end namespace clang
     168             : 
     169             : #endif

Generated by: LCOV version 1.11