LocInfoType.h revision 555f57e3549fb5cc963a2ce38180c4f3643a6f95
1//===--- LocInfoType.h - Parsed Type with Location Information---*- 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 LocInfoType class, which holds a type and its
11// source-location information.
12//
13//===----------------------------------------------------------------------===//
14#ifndef LLVM_CLANG_SEMA_LOCINFOTYPE_H
15#define LLVM_CLANG_SEMA_LOCINFOTYPE_H
16
17#include "clang/AST/Type.h"
18
19namespace clang {
20
21class TypeSourceInfo;
22
23/// \brief Holds a QualType and a TypeSourceInfo* that came out of a declarator
24/// parsing.
25///
26/// LocInfoType is a "transient" type, only needed for passing to/from Parser
27/// and Sema, when we want to preserve type source info for a parsed type.
28/// It will not participate in the type system semantics in any way.
29class LocInfoType : public Type {
30  enum {
31    // The last number that can fit in Type's TC.
32    // Avoids conflict with an existing Type class.
33    LocInfo = Type::TypeLast + 1
34  };
35
36  TypeSourceInfo *DeclInfo;
37
38  LocInfoType(QualType ty, TypeSourceInfo *TInfo)
39    : Type((TypeClass)LocInfo, ty, ty->isDependentType(),
40           ty->isVariablyModifiedType(),
41           ty->containsUnexpandedParameterPack()),
42    DeclInfo(TInfo) {
43      assert(getTypeClass() == (TypeClass)LocInfo && "LocInfo didn't fit in TC?");
44    }
45  friend class Sema;
46
47 public:
48  QualType getType() const { return getCanonicalTypeInternal(); }
49  TypeSourceInfo *getTypeSourceInfo() const { return DeclInfo; }
50
51  void getAsStringInternal(std::string &Str,
52                           const PrintingPolicy &Policy) const;
53
54  static bool classof(const Type *T) {
55    return T->getTypeClass() == (TypeClass)LocInfo;
56  }
57  static bool classof(const LocInfoType *) { return true; }
58};
59
60} // end namespace clang
61
62#endif // LLVM_CLANG_SEMA_LOCINFOTYPE_H
63