ASTContext.h revision 7ed05071969757ef84d7fd43168a82cb46d610fd
125e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//===--- ASTContext.h - Context to hold long-lived AST nodes ----*- C++ -*-===//
225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//
325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//                     The LLVM Compiler Infrastructure
425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//
525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// This file was developed by Chris Lattner and is distributed under
625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// the University of Illinois Open Source License. See LICENSE.TXT for details.
725e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//
825e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//===----------------------------------------------------------------------===//
9e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner//
10e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner//  This file defines the ASTContext interface.
11e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner//
12e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner//===----------------------------------------------------------------------===//
1325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar
1425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#ifndef LLVM_CLANG_AST_ASTCONTEXT_H
1525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#define LLVM_CLANG_AST_ASTCONTEXT_H
1625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar
17255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "clang/AST/Builtins.h"
18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "clang/AST/Expr.h"
1977afbdce53aa740777486b0cc4e9df151ae65468Jack Carter#include "clang/AST/RecordLayout.h"
20a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner#include "clang/AST/Type.h"
2189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola#include "llvm/ADT/DenseMap.h"
220855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis#include "llvm/ADT/StringMap.h"
23255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/FoldingSet.h"
24cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar#include <vector>
2584a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar
2625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbarnamespace clang {
27baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  class TargetInfo;
28baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  class IdentifierTable;
29baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
30baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// ASTContext - This class holds long-lived AST nodes (such as types and
31baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// decls) that can be referred to throughout the semantic analysis of a file.
32baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass ASTContext {
33baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  std::vector<Type*> Types;
34320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  llvm::FoldingSet<ComplexType> ComplexTypes;
35baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  llvm::FoldingSet<PointerType> PointerTypes;
36baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  llvm::FoldingSet<ReferenceType> ReferenceTypes;
37baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  llvm::FoldingSet<ConstantArrayType> ArrayTypes;
38baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  llvm::FoldingSet<VariableArrayType> IncompleteVariableArrayTypes;
39baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  llvm::FoldingSet<VectorType> VectorTypes;
40baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  llvm::FoldingSet<FunctionTypeNoProto> FunctionTypeNoProtos;
41baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  llvm::FoldingSet<FunctionTypeProto> FunctionTypeProtos;
42baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  llvm::FoldingSet<ObjcQualifiedInterfaceType> ObjcQualifiedInterfaceTypes;
43320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  llvm::DenseMap<const RecordDecl*, const RecordLayout*> RecordLayoutInfo;
44320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
45320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// BuiltinVaListType - built-in va list type.
46320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// This is initially null and set by Sema::LazilyCreateBuiltin when
47320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// a builtin that takes a valist is encountered.
48320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType BuiltinVaListType;
49320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
50320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// ObjcIdType - a psuedo built-in typedef type (set by Sema).
51320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType ObjcIdType;
52320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  const RecordType *IdStructType;
53320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
54320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// ObjcSelType - another psuedo built-in typedef type (set by Sema).
55320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType ObjcSelType;
56320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  const RecordType *SelStructType;
57320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
58320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// ObjcProtoType - another psuedo built-in typedef type (set by Sema).
59320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType ObjcProtoType;
60320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  const RecordType *ProtoStructType;
61320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
62320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType ObjcConstantStringType;
63320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  RecordDecl *CFConstantStringTypeDecl;
64320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolapublic:
65320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
66320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  SourceManager &SourceMgr;
67320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  TargetInfo &Target;
68320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  IdentifierTable &Idents;
69320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  SelectorTable &Selectors;
70320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  Builtin::Context BuiltinInfo;
71320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
72320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  // Builtin Types.
73320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType VoidTy;
74320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType BoolTy;
75320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType CharTy;
76320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType SignedCharTy, ShortTy, IntTy, LongTy, LongLongTy;
77320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType UnsignedCharTy, UnsignedShortTy, UnsignedIntTy, UnsignedLongTy;
78320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType UnsignedLongLongTy;
79320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType FloatTy, DoubleTy, LongDoubleTy;
80320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType FloatComplexTy, DoubleComplexTy, LongDoubleComplexTy;
81320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType VoidPtrTy;
82320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
83320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  ASTContext(SourceManager &SM, TargetInfo &t, IdentifierTable &idents,
84320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola             SelectorTable &sels) :
85320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    CFConstantStringTypeDecl(0), SourceMgr(SM), Target(t),
86320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    Idents(idents), Selectors(sels) {
87320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    InitBuiltinTypes();
88320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    BuiltinInfo.InitializeBuiltins(idents, Target);
89320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  }
90320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  ~ASTContext();
91320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
92baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void PrintStats() const;
93baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
94baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //===--------------------------------------------------------------------===//
95baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //                           Type Constructors
96baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //===--------------------------------------------------------------------===//
97baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
98baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getComplexType - Return the uniqued reference to the type for a complex
99baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// number with the specified element type.
100baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getComplexType(QualType T);
101baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
102baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getPointerType - Return the uniqued reference to the type for a pointer to
103320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// the specified type.
10489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola  QualType getPointerType(QualType T);
105baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
106baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getReferenceType - Return the uniqued reference to the type for a
107dda1bdc962a314bf4fca86f4cd4802ff6c55b172Bill Wendling  /// reference to the specified type.
108baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getReferenceType(QualType T);
109baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
11038ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis  /// getVariableArrayType - Returns a non-unique reference to the type for a
111baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// variable array of the specified element type.
112baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getVariableArrayType(QualType EltTy, Expr *NumElts,
113baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling                                ArrayType::ArraySizeModifier ASM,
114baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling                                unsigned EltTypeQuals);
11538ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis
116baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getConstantArrayType - Return the unique reference to the type for a
117baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// constant array of the specified element type.
118baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize,
119baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling                                ArrayType::ArraySizeModifier ASM,
12084a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar                                unsigned EltTypeQuals);
121baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
1227768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola  /// getVectorType - Return the unique reference to a vector type of
1235cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  /// the specified element type and size. VectorType must be a built-in type.
1245cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  QualType getVectorType(QualType VectorType, unsigned NumElts);
1255cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
1265cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  /// getOCUVectorType - Return the unique reference to an OCU vector type of
127baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// the specified element type and size. VectorType must be a built-in type.
128baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getOCUVectorType(QualType VectorType, unsigned NumElts);
129baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
1307768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola  /// getFunctionTypeNoProto - Return a K&R style C function type like 'int()'.
131baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  ///
132df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  QualType getFunctionTypeNoProto(QualType ResultTy);
133baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
134320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// getFunctionType - Return a normal function type with a typed argument
135df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  /// list.  isVariadic indicates whether the argument list includes '...'.
136baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getFunctionType(QualType ResultTy, QualType *ArgArray,
137baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling                           unsigned NumArgs, bool isVariadic);
1381674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer
139baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getTypedefType - Return the unique reference to the type for the
1400dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach  /// specified typename decl.
141baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getTypedefType(TypedefDecl *Decl);
142baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getObjcInterfaceType(ObjcInterfaceDecl *Decl);
143baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
144baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getObjcQualifiedInterfaceType - Return a
145da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling  /// ObjcQualifiedInterfaceType type for the given interface decl and
146410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis  /// the conforming protocol list.
147baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getObjcQualifiedInterfaceType(ObjcInterfaceDecl *Decl,
148baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling             ObjcProtocolDecl **ProtocolList, unsigned NumProtocols);
149baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
150baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getTypeOfType - GCC extension.
15107f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames  QualType getTypeOfExpr(Expr *e);
152baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getTypeOfType(QualType t);
153baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
154baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getTagDeclType - Return the unique reference to the type for the
155baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// specified TagDecl (struct/union/class/enum) decl.
156baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getTagDeclType(TagDecl *Decl);
157baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
158baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getSizeType - Return the unique type for "size_t" (C99 7.17), defined
159baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// in <stddef.h>. The sizeof operator requires this (C99 6.5.3.4p4).
160baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getSizeType() const;
161320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
162320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// getPointerDiffType - Return the unique type for "ptrdiff_t" (ref?)
163320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  /// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
164320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  QualType getPointerDiffType() const;
165320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
166baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  // getCFConstantStringType - Return the type used for constant CFStrings.
167baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  // CURRENTLY UNUSED (10/15/07). ObjCStringLiteral now uses the hook below.
168baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getCFConstantStringType();
169baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
170baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  // This setter/getter represents the ObjC type for an NSConstantString.
171baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void setObjcConstantStringInterface(ObjcInterfaceDecl *Decl);
172baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getObjcConstantStringInterface() const {
173baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling    return ObjcConstantStringType;
174baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  }
175baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
176baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  // Return the ObjC type encoding for a given type.
17707f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames  void getObjcEncodingForType(QualType t, std::string &S) const;
178da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling
179c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling  /// getObjcEncodingForMethodDecl - Return the encoded type for this method
180baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// declaration.
181baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void getObjcEncodingForMethodDecl(ObjcMethodDecl *Decl, std::string &S);
182baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
183baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getObjcEncodingTypeSize returns size of type for objective-c encoding
184baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// purpose.
185baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  int getObjcEncodingTypeSize(QualType t);
186baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
187baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  // This setter/getter repreents the ObjC 'id' type. It is setup lazily, by
188baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  // Sema.
189baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void setObjcIdType(TypedefDecl *Decl);
190baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getObjcIdType() const { return ObjcIdType; }
191baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
192baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void setObjcSelType(TypedefDecl *Decl);
193baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getObjcSelType() const { return ObjcSelType; }
194baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
195baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void setObjcProtoType(TypedefDecl *Decl);
196baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getObjcProtoType() const { return ObjcProtoType; }
197baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
198baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void setBuiltinVaListType(QualType T);
199baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getBuiltinVaListType() const { return BuiltinVaListType; }
200baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
201baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //===--------------------------------------------------------------------===//
202baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //                         Type Sizing and Analysis
203baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //===--------------------------------------------------------------------===//
204baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
205baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getTypeInfo - Get the size and alignment of the specified complete type in
206baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// bits.
207baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  std::pair<uint64_t, unsigned> getTypeInfo(QualType T, SourceLocation L);
208baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
209baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getTypeSize - Return the size of the specified type, in bits.  This method
210baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// does not work on incomplete types.
211baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  uint64_t getTypeSize(QualType T, SourceLocation L) {
212baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling    return getTypeInfo(T, L).first;
213baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  }
214baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
215baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getTypeAlign - Return the alignment of the specified type, in bits.  This
216baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// method does not work on incomplete types.
217baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  unsigned getTypeAlign(QualType T, SourceLocation L) {
218baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling    return getTypeInfo(T, L).second;
219baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  }
220baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
221baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getRecordLayout - Get or compute information about the layout of the
222baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// specified record (struct/union/class), which indicates its size and field
223baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// position information.
224baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  const RecordLayout &getRecordLayout(const RecordDecl *D, SourceLocation L);
225baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
226baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //===--------------------------------------------------------------------===//
227baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //                            Type Operators
228baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //===--------------------------------------------------------------------===//
2295cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
2305cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  /// maxIntegerType - Returns the highest ranked integer type. Handles 3
2315cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  /// different type combos: unsigned/unsigned, signed/signed, signed/unsigned.
2325cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  static QualType maxIntegerType(QualType lhs, QualType rhs);
2335cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
2345cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  /// compareFloatingType - Handles 3 different combos:
235baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// float/float, float/complex, complex/complex.
236baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// If lt > rt, return 1. If lt == rt, return 0. If lt < rt, return -1.
237baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  static int compareFloatingType(QualType lt, QualType rt);
238baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
239baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// getFloatingTypeOfSizeWithinDomain - Returns a real floating
240baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// point or a complex type (based on typeDomain/typeSize).
241baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// 'typeDomain' is a real floating point or complex type.
242baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// 'typeSize' is a real floating point or complex type.
243baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  QualType getFloatingTypeOfSizeWithinDomain(QualType typeSize,
244baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling                                             QualType typeDomain) const;
245baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
246baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //===--------------------------------------------------------------------===//
247baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //                    Type Compatibility Predicates
248baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  //===--------------------------------------------------------------------===//
249baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
250baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// Compatibility predicates used to check assignment expressions.
251baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool typesAreCompatible(QualType, QualType); // C99 6.2.7p1
252baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool tagTypesAreCompatible(QualType, QualType); // C99 6.2.7p1
253baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool pointerTypesAreCompatible(QualType, QualType);  // C99 6.7.5.1p2
254baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool referenceTypesAreCompatible(QualType, QualType); // C++ 5.17p6
255baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool functionTypesAreCompatible(QualType, QualType); // C99 6.7.5.3p15
256baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool arrayTypesAreCompatible(QualType, QualType); // C99 6.7.5.2p6
257baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool builtinTypesAreCompatible(QualType, QualType);
258baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
259baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  /// Objective-C specific type checking.
260baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool interfaceTypesAreCompatible(QualType, QualType);
261baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool objcTypesAreCompatible(QualType, QualType);
262baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  bool isObjcIdType(QualType T) const {
263baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling    assert(IdStructType && "isObjcIdType used before 'id' type is built");
264baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling    return T->getAsStructureType() == IdStructType;
265baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  }
266baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingprivate:
267baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  ASTContext(const ASTContext&); // DO NOT IMPLEMENT
268baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void operator=(const ASTContext&); // DO NOT IMPLEMENT
269baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
270baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void InitBuiltinTypes();
271baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling  void InitBuiltinType(QualType &R, BuiltinType::Kind K);
272baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling};
273baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
274baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling}  // end namespace clang
275baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling
276baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling#endif
277baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling