ASTContext.cpp revision ac9590effa90406767a544005ed1de52e258306b
1//===--- ASTContext.cpp - Context to hold long-lived AST nodes ------------===//
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 implements the ASTContext interface.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/ASTContext.h"
15#include "clang/AST/CharUnits.h"
16#include "clang/AST/DeclCXX.h"
17#include "clang/AST/DeclObjC.h"
18#include "clang/AST/DeclTemplate.h"
19#include "clang/AST/TypeLoc.h"
20#include "clang/AST/Expr.h"
21#include "clang/AST/ExternalASTSource.h"
22#include "clang/AST/RecordLayout.h"
23#include "clang/Basic/Builtins.h"
24#include "clang/Basic/SourceManager.h"
25#include "clang/Basic/TargetInfo.h"
26#include "llvm/ADT/SmallString.h"
27#include "llvm/ADT/StringExtras.h"
28#include "llvm/Support/MathExtras.h"
29#include "llvm/Support/raw_ostream.h"
30#include "RecordLayoutBuilder.h"
31
32using namespace clang;
33
34enum FloatingRank {
35  FloatRank, DoubleRank, LongDoubleRank
36};
37
38ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM,
39                       const TargetInfo &t,
40                       IdentifierTable &idents, SelectorTable &sels,
41                       Builtin::Context &builtins,
42                       bool FreeMem, unsigned size_reserve) :
43  GlobalNestedNameSpecifier(0), CFConstantStringTypeDecl(0),
44  NSConstantStringTypeDecl(0),
45  ObjCFastEnumerationStateTypeDecl(0), FILEDecl(0), jmp_bufDecl(0),
46  sigjmp_bufDecl(0), BlockDescriptorType(0), BlockDescriptorExtendedType(0),
47  SourceMgr(SM), LangOpts(LOpts), FreeMemory(FreeMem), Target(t),
48  Idents(idents), Selectors(sels),
49  BuiltinInfo(builtins),
50  DeclarationNames(*this),
51  ExternalSource(0), PrintingPolicy(LOpts),
52  LastSDM(0, 0) {
53  ObjCIdRedefinitionType = QualType();
54  ObjCClassRedefinitionType = QualType();
55  ObjCSelRedefinitionType = QualType();
56  if (size_reserve > 0) Types.reserve(size_reserve);
57  TUDecl = TranslationUnitDecl::Create(*this);
58  InitBuiltinTypes();
59}
60
61ASTContext::~ASTContext() {
62  // Release the DenseMaps associated with DeclContext objects.
63  // FIXME: Is this the ideal solution?
64  ReleaseDeclContextMaps();
65
66  // Release all of the memory associated with overridden C++ methods.
67  for (llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::iterator
68         OM = OverriddenMethods.begin(), OMEnd = OverriddenMethods.end();
69       OM != OMEnd; ++OM)
70    OM->second.Destroy();
71
72  if (FreeMemory) {
73    // Deallocate all the types.
74    while (!Types.empty()) {
75      Types.back()->Destroy(*this);
76      Types.pop_back();
77    }
78
79    for (llvm::FoldingSet<ExtQuals>::iterator
80         I = ExtQualNodes.begin(), E = ExtQualNodes.end(); I != E; ) {
81      // Increment in loop to prevent using deallocated memory.
82      Deallocate(&*I++);
83    }
84
85    for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
86         I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
87      // Increment in loop to prevent using deallocated memory.
88      if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
89        R->Destroy(*this);
90    }
91
92    for (llvm::DenseMap<const ObjCContainerDecl*,
93         const ASTRecordLayout*>::iterator
94         I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) {
95      // Increment in loop to prevent using deallocated memory.
96      if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
97        R->Destroy(*this);
98    }
99  }
100
101  // Destroy nested-name-specifiers.
102  for (llvm::FoldingSet<NestedNameSpecifier>::iterator
103         NNS = NestedNameSpecifiers.begin(),
104         NNSEnd = NestedNameSpecifiers.end();
105       NNS != NNSEnd; ) {
106    // Increment in loop to prevent using deallocated memory.
107    (*NNS++).Destroy(*this);
108  }
109
110  if (GlobalNestedNameSpecifier)
111    GlobalNestedNameSpecifier->Destroy(*this);
112
113  // Deallocate the memory associated with the DeclarationNameTable.
114  DeclarationNames.DoDestroy(*this);
115
116  TUDecl->Destroy(*this);
117}
118
119void
120ASTContext::setExternalSource(llvm::OwningPtr<ExternalASTSource> &Source) {
121  ExternalSource.reset(Source.take());
122}
123
124void ASTContext::PrintStats() const {
125  fprintf(stderr, "*** AST Context Stats:\n");
126  fprintf(stderr, "  %d types total.\n", (int)Types.size());
127
128  unsigned counts[] = {
129#define TYPE(Name, Parent) 0,
130#define ABSTRACT_TYPE(Name, Parent)
131#include "clang/AST/TypeNodes.def"
132    0 // Extra
133  };
134
135  for (unsigned i = 0, e = Types.size(); i != e; ++i) {
136    Type *T = Types[i];
137    counts[(unsigned)T->getTypeClass()]++;
138  }
139
140  unsigned Idx = 0;
141  unsigned TotalBytes = 0;
142#define TYPE(Name, Parent)                                              \
143  if (counts[Idx])                                                      \
144    fprintf(stderr, "    %d %s types\n", (int)counts[Idx], #Name);      \
145  TotalBytes += counts[Idx] * sizeof(Name##Type);                       \
146  ++Idx;
147#define ABSTRACT_TYPE(Name, Parent)
148#include "clang/AST/TypeNodes.def"
149
150  fprintf(stderr, "Total bytes = %d\n", int(TotalBytes));
151
152  if (ExternalSource.get()) {
153    fprintf(stderr, "\n");
154    ExternalSource->PrintStats();
155  }
156}
157
158
159void ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) {
160  BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K);
161  R = CanQualType::CreateUnsafe(QualType(Ty, 0));
162  Types.push_back(Ty);
163}
164
165void ASTContext::InitBuiltinTypes() {
166  assert(VoidTy.isNull() && "Context reinitialized?");
167
168  // C99 6.2.5p19.
169  InitBuiltinType(VoidTy,              BuiltinType::Void);
170
171  // C99 6.2.5p2.
172  InitBuiltinType(BoolTy,              BuiltinType::Bool);
173  // C99 6.2.5p3.
174  if (LangOpts.CharIsSigned)
175    InitBuiltinType(CharTy,            BuiltinType::Char_S);
176  else
177    InitBuiltinType(CharTy,            BuiltinType::Char_U);
178  // C99 6.2.5p4.
179  InitBuiltinType(SignedCharTy,        BuiltinType::SChar);
180  InitBuiltinType(ShortTy,             BuiltinType::Short);
181  InitBuiltinType(IntTy,               BuiltinType::Int);
182  InitBuiltinType(LongTy,              BuiltinType::Long);
183  InitBuiltinType(LongLongTy,          BuiltinType::LongLong);
184
185  // C99 6.2.5p6.
186  InitBuiltinType(UnsignedCharTy,      BuiltinType::UChar);
187  InitBuiltinType(UnsignedShortTy,     BuiltinType::UShort);
188  InitBuiltinType(UnsignedIntTy,       BuiltinType::UInt);
189  InitBuiltinType(UnsignedLongTy,      BuiltinType::ULong);
190  InitBuiltinType(UnsignedLongLongTy,  BuiltinType::ULongLong);
191
192  // C99 6.2.5p10.
193  InitBuiltinType(FloatTy,             BuiltinType::Float);
194  InitBuiltinType(DoubleTy,            BuiltinType::Double);
195  InitBuiltinType(LongDoubleTy,        BuiltinType::LongDouble);
196
197  // GNU extension, 128-bit integers.
198  InitBuiltinType(Int128Ty,            BuiltinType::Int128);
199  InitBuiltinType(UnsignedInt128Ty,    BuiltinType::UInt128);
200
201  if (LangOpts.CPlusPlus) // C++ 3.9.1p5
202    InitBuiltinType(WCharTy,           BuiltinType::WChar);
203  else // C99
204    WCharTy = getFromTargetType(Target.getWCharType());
205
206  if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
207    InitBuiltinType(Char16Ty,           BuiltinType::Char16);
208  else // C99
209    Char16Ty = getFromTargetType(Target.getChar16Type());
210
211  if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
212    InitBuiltinType(Char32Ty,           BuiltinType::Char32);
213  else // C99
214    Char32Ty = getFromTargetType(Target.getChar32Type());
215
216  // Placeholder type for functions.
217  InitBuiltinType(OverloadTy,          BuiltinType::Overload);
218
219  // Placeholder type for type-dependent expressions whose type is
220  // completely unknown. No code should ever check a type against
221  // DependentTy and users should never see it; however, it is here to
222  // help diagnose failures to properly check for type-dependent
223  // expressions.
224  InitBuiltinType(DependentTy,         BuiltinType::Dependent);
225
226  // Placeholder type for C++0x auto declarations whose real type has
227  // not yet been deduced.
228  InitBuiltinType(UndeducedAutoTy, BuiltinType::UndeducedAuto);
229
230  // C99 6.2.5p11.
231  FloatComplexTy      = getComplexType(FloatTy);
232  DoubleComplexTy     = getComplexType(DoubleTy);
233  LongDoubleComplexTy = getComplexType(LongDoubleTy);
234
235  BuiltinVaListType = QualType();
236
237  // "Builtin" typedefs set by Sema::ActOnTranslationUnitScope().
238  ObjCIdTypedefType = QualType();
239  ObjCClassTypedefType = QualType();
240  ObjCSelTypedefType = QualType();
241
242  // Builtin types for 'id', 'Class', and 'SEL'.
243  InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId);
244  InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
245  InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
246
247  ObjCConstantStringType = QualType();
248
249  // void * type
250  VoidPtrTy = getPointerType(VoidTy);
251
252  // nullptr type (C++0x 2.14.7)
253  InitBuiltinType(NullPtrTy,           BuiltinType::NullPtr);
254}
255
256MemberSpecializationInfo *
257ASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) {
258  assert(Var->isStaticDataMember() && "Not a static data member");
259  llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos
260    = InstantiatedFromStaticDataMember.find(Var);
261  if (Pos == InstantiatedFromStaticDataMember.end())
262    return 0;
263
264  return Pos->second;
265}
266
267void
268ASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl,
269                                                TemplateSpecializationKind TSK) {
270  assert(Inst->isStaticDataMember() && "Not a static data member");
271  assert(Tmpl->isStaticDataMember() && "Not a static data member");
272  assert(!InstantiatedFromStaticDataMember[Inst] &&
273         "Already noted what static data member was instantiated from");
274  InstantiatedFromStaticDataMember[Inst]
275    = new (*this) MemberSpecializationInfo(Tmpl, TSK);
276}
277
278NamedDecl *
279ASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) {
280  llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos
281    = InstantiatedFromUsingDecl.find(UUD);
282  if (Pos == InstantiatedFromUsingDecl.end())
283    return 0;
284
285  return Pos->second;
286}
287
288void
289ASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) {
290  assert((isa<UsingDecl>(Pattern) ||
291          isa<UnresolvedUsingValueDecl>(Pattern) ||
292          isa<UnresolvedUsingTypenameDecl>(Pattern)) &&
293         "pattern decl is not a using decl");
294  assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists");
295  InstantiatedFromUsingDecl[Inst] = Pattern;
296}
297
298UsingShadowDecl *
299ASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) {
300  llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos
301    = InstantiatedFromUsingShadowDecl.find(Inst);
302  if (Pos == InstantiatedFromUsingShadowDecl.end())
303    return 0;
304
305  return Pos->second;
306}
307
308void
309ASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst,
310                                               UsingShadowDecl *Pattern) {
311  assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists");
312  InstantiatedFromUsingShadowDecl[Inst] = Pattern;
313}
314
315FieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) {
316  llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos
317    = InstantiatedFromUnnamedFieldDecl.find(Field);
318  if (Pos == InstantiatedFromUnnamedFieldDecl.end())
319    return 0;
320
321  return Pos->second;
322}
323
324void ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst,
325                                                     FieldDecl *Tmpl) {
326  assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed");
327  assert(!Tmpl->getDeclName() && "Template field decl is not unnamed");
328  assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
329         "Already noted what unnamed field was instantiated from");
330
331  InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
332}
333
334ASTContext::overridden_cxx_method_iterator
335ASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const {
336  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
337    = OverriddenMethods.find(Method);
338  if (Pos == OverriddenMethods.end())
339    return 0;
340
341  return Pos->second.begin();
342}
343
344ASTContext::overridden_cxx_method_iterator
345ASTContext::overridden_methods_end(const CXXMethodDecl *Method) const {
346  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
347    = OverriddenMethods.find(Method);
348  if (Pos == OverriddenMethods.end())
349    return 0;
350
351  return Pos->second.end();
352}
353
354void ASTContext::addOverriddenMethod(const CXXMethodDecl *Method,
355                                     const CXXMethodDecl *Overridden) {
356  OverriddenMethods[Method].push_back(Overridden);
357}
358
359namespace {
360  class BeforeInTranslationUnit
361    : std::binary_function<SourceRange, SourceRange, bool> {
362    SourceManager *SourceMgr;
363
364  public:
365    explicit BeforeInTranslationUnit(SourceManager *SM) : SourceMgr(SM) { }
366
367    bool operator()(SourceRange X, SourceRange Y) {
368      return SourceMgr->isBeforeInTranslationUnit(X.getBegin(), Y.getBegin());
369    }
370  };
371}
372
373//===----------------------------------------------------------------------===//
374//                         Type Sizing and Analysis
375//===----------------------------------------------------------------------===//
376
377/// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified
378/// scalar floating point type.
379const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
380  const BuiltinType *BT = T->getAs<BuiltinType>();
381  assert(BT && "Not a floating point type!");
382  switch (BT->getKind()) {
383  default: assert(0 && "Not a floating point type!");
384  case BuiltinType::Float:      return Target.getFloatFormat();
385  case BuiltinType::Double:     return Target.getDoubleFormat();
386  case BuiltinType::LongDouble: return Target.getLongDoubleFormat();
387  }
388}
389
390/// getDeclAlign - Return a conservative estimate of the alignment of the
391/// specified decl.  Note that bitfields do not have a valid alignment, so
392/// this method will assert on them.
393/// If @p RefAsPointee, references are treated like their underlying type
394/// (for alignof), else they're treated like pointers (for CodeGen).
395CharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) {
396  unsigned Align = Target.getCharWidth();
397
398  if (const AlignedAttr* AA = D->getAttr<AlignedAttr>())
399    Align = std::max(Align, AA->getMaxAlignment());
400
401  if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
402    QualType T = VD->getType();
403    if (const ReferenceType* RT = T->getAs<ReferenceType>()) {
404      if (RefAsPointee)
405        T = RT->getPointeeType();
406      else
407        T = getPointerType(RT->getPointeeType());
408    }
409    if (!T->isIncompleteType() && !T->isFunctionType()) {
410      // Incomplete or function types default to 1.
411      while (isa<VariableArrayType>(T) || isa<IncompleteArrayType>(T))
412        T = cast<ArrayType>(T)->getElementType();
413
414      Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr()));
415    }
416    if (const FieldDecl *FD = dyn_cast<FieldDecl>(VD)) {
417      // In the case of a field in a packed struct, we want the minimum
418      // of the alignment of the field and the alignment of the struct.
419      Align = std::min(Align,
420        getPreferredTypeAlign(FD->getParent()->getTypeForDecl()));
421    }
422  }
423
424  return CharUnits::fromQuantity(Align / Target.getCharWidth());
425}
426
427/// getTypeSize - Return the size of the specified type, in bits.  This method
428/// does not work on incomplete types.
429///
430/// FIXME: Pointers into different addr spaces could have different sizes and
431/// alignment requirements: getPointerInfo should take an AddrSpace, this
432/// should take a QualType, &c.
433std::pair<uint64_t, unsigned>
434ASTContext::getTypeInfo(const Type *T) {
435  uint64_t Width=0;
436  unsigned Align=8;
437  switch (T->getTypeClass()) {
438#define TYPE(Class, Base)
439#define ABSTRACT_TYPE(Class, Base)
440#define NON_CANONICAL_TYPE(Class, Base)
441#define DEPENDENT_TYPE(Class, Base) case Type::Class:
442#include "clang/AST/TypeNodes.def"
443    assert(false && "Should not see dependent types");
444    break;
445
446  case Type::FunctionNoProto:
447  case Type::FunctionProto:
448    // GCC extension: alignof(function) = 32 bits
449    Width = 0;
450    Align = 32;
451    break;
452
453  case Type::IncompleteArray:
454  case Type::VariableArray:
455    Width = 0;
456    Align = getTypeAlign(cast<ArrayType>(T)->getElementType());
457    break;
458
459  case Type::ConstantArray: {
460    const ConstantArrayType *CAT = cast<ConstantArrayType>(T);
461
462    std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType());
463    Width = EltInfo.first*CAT->getSize().getZExtValue();
464    Align = EltInfo.second;
465    break;
466  }
467  case Type::ExtVector:
468  case Type::Vector: {
469    const VectorType *VT = cast<VectorType>(T);
470    std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType());
471    Width = EltInfo.first*VT->getNumElements();
472    Align = Width;
473    // If the alignment is not a power of 2, round up to the next power of 2.
474    // This happens for non-power-of-2 length vectors.
475    if (Align & (Align-1)) {
476      Align = llvm::NextPowerOf2(Align);
477      Width = llvm::RoundUpToAlignment(Width, Align);
478    }
479    break;
480  }
481
482  case Type::Builtin:
483    switch (cast<BuiltinType>(T)->getKind()) {
484    default: assert(0 && "Unknown builtin type!");
485    case BuiltinType::Void:
486      // GCC extension: alignof(void) = 8 bits.
487      Width = 0;
488      Align = 8;
489      break;
490
491    case BuiltinType::Bool:
492      Width = Target.getBoolWidth();
493      Align = Target.getBoolAlign();
494      break;
495    case BuiltinType::Char_S:
496    case BuiltinType::Char_U:
497    case BuiltinType::UChar:
498    case BuiltinType::SChar:
499      Width = Target.getCharWidth();
500      Align = Target.getCharAlign();
501      break;
502    case BuiltinType::WChar:
503      Width = Target.getWCharWidth();
504      Align = Target.getWCharAlign();
505      break;
506    case BuiltinType::Char16:
507      Width = Target.getChar16Width();
508      Align = Target.getChar16Align();
509      break;
510    case BuiltinType::Char32:
511      Width = Target.getChar32Width();
512      Align = Target.getChar32Align();
513      break;
514    case BuiltinType::UShort:
515    case BuiltinType::Short:
516      Width = Target.getShortWidth();
517      Align = Target.getShortAlign();
518      break;
519    case BuiltinType::UInt:
520    case BuiltinType::Int:
521      Width = Target.getIntWidth();
522      Align = Target.getIntAlign();
523      break;
524    case BuiltinType::ULong:
525    case BuiltinType::Long:
526      Width = Target.getLongWidth();
527      Align = Target.getLongAlign();
528      break;
529    case BuiltinType::ULongLong:
530    case BuiltinType::LongLong:
531      Width = Target.getLongLongWidth();
532      Align = Target.getLongLongAlign();
533      break;
534    case BuiltinType::Int128:
535    case BuiltinType::UInt128:
536      Width = 128;
537      Align = 128; // int128_t is 128-bit aligned on all targets.
538      break;
539    case BuiltinType::Float:
540      Width = Target.getFloatWidth();
541      Align = Target.getFloatAlign();
542      break;
543    case BuiltinType::Double:
544      Width = Target.getDoubleWidth();
545      Align = Target.getDoubleAlign();
546      break;
547    case BuiltinType::LongDouble:
548      Width = Target.getLongDoubleWidth();
549      Align = Target.getLongDoubleAlign();
550      break;
551    case BuiltinType::NullPtr:
552      Width = Target.getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t)
553      Align = Target.getPointerAlign(0); //   == sizeof(void*)
554      break;
555    }
556    break;
557  case Type::ObjCObjectPointer:
558    Width = Target.getPointerWidth(0);
559    Align = Target.getPointerAlign(0);
560    break;
561  case Type::BlockPointer: {
562    unsigned AS = cast<BlockPointerType>(T)->getPointeeType().getAddressSpace();
563    Width = Target.getPointerWidth(AS);
564    Align = Target.getPointerAlign(AS);
565    break;
566  }
567  case Type::LValueReference:
568  case Type::RValueReference: {
569    // alignof and sizeof should never enter this code path here, so we go
570    // the pointer route.
571    unsigned AS = cast<ReferenceType>(T)->getPointeeType().getAddressSpace();
572    Width = Target.getPointerWidth(AS);
573    Align = Target.getPointerAlign(AS);
574    break;
575  }
576  case Type::Pointer: {
577    unsigned AS = cast<PointerType>(T)->getPointeeType().getAddressSpace();
578    Width = Target.getPointerWidth(AS);
579    Align = Target.getPointerAlign(AS);
580    break;
581  }
582  case Type::MemberPointer: {
583    QualType Pointee = cast<MemberPointerType>(T)->getPointeeType();
584    std::pair<uint64_t, unsigned> PtrDiffInfo =
585      getTypeInfo(getPointerDiffType());
586    Width = PtrDiffInfo.first;
587    if (Pointee->isFunctionType())
588      Width *= 2;
589    Align = PtrDiffInfo.second;
590    break;
591  }
592  case Type::Complex: {
593    // Complex types have the same alignment as their elements, but twice the
594    // size.
595    std::pair<uint64_t, unsigned> EltInfo =
596      getTypeInfo(cast<ComplexType>(T)->getElementType());
597    Width = EltInfo.first*2;
598    Align = EltInfo.second;
599    break;
600  }
601  case Type::ObjCInterface: {
602    const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
603    const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
604    Width = Layout.getSize();
605    Align = Layout.getAlignment();
606    break;
607  }
608  case Type::Record:
609  case Type::Enum: {
610    const TagType *TT = cast<TagType>(T);
611
612    if (TT->getDecl()->isInvalidDecl()) {
613      Width = 1;
614      Align = 1;
615      break;
616    }
617
618    if (const EnumType *ET = dyn_cast<EnumType>(TT))
619      return getTypeInfo(ET->getDecl()->getIntegerType());
620
621    const RecordType *RT = cast<RecordType>(TT);
622    const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
623    Width = Layout.getSize();
624    Align = Layout.getAlignment();
625    break;
626  }
627
628  case Type::SubstTemplateTypeParm:
629    return getTypeInfo(cast<SubstTemplateTypeParmType>(T)->
630                       getReplacementType().getTypePtr());
631
632  case Type::Elaborated:
633    return getTypeInfo(cast<ElaboratedType>(T)->getUnderlyingType()
634                         .getTypePtr());
635
636  case Type::Typedef: {
637    const TypedefDecl *Typedef = cast<TypedefType>(T)->getDecl();
638    if (const AlignedAttr *Aligned = Typedef->getAttr<AlignedAttr>()) {
639      Align = std::max(Aligned->getMaxAlignment(),
640                       getTypeAlign(Typedef->getUnderlyingType().getTypePtr()));
641      Width = getTypeSize(Typedef->getUnderlyingType().getTypePtr());
642    } else
643      return getTypeInfo(Typedef->getUnderlyingType().getTypePtr());
644    break;
645  }
646
647  case Type::TypeOfExpr:
648    return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType()
649                         .getTypePtr());
650
651  case Type::TypeOf:
652    return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr());
653
654  case Type::Decltype:
655    return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType()
656                        .getTypePtr());
657
658  case Type::QualifiedName:
659    return getTypeInfo(cast<QualifiedNameType>(T)->getNamedType().getTypePtr());
660
661  case Type::TemplateSpecialization:
662    assert(getCanonicalType(T) != T &&
663           "Cannot request the size of a dependent type");
664    // FIXME: this is likely to be wrong once we support template
665    // aliases, since a template alias could refer to a typedef that
666    // has an __aligned__ attribute on it.
667    return getTypeInfo(getCanonicalType(T));
668  }
669
670  assert(Align && (Align & (Align-1)) == 0 && "Alignment must be power of 2");
671  return std::make_pair(Width, Align);
672}
673
674/// getTypeSizeInChars - Return the size of the specified type, in characters.
675/// This method does not work on incomplete types.
676CharUnits ASTContext::getTypeSizeInChars(QualType T) {
677  return CharUnits::fromQuantity(getTypeSize(T) / getCharWidth());
678}
679CharUnits ASTContext::getTypeSizeInChars(const Type *T) {
680  return CharUnits::fromQuantity(getTypeSize(T) / getCharWidth());
681}
682
683/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in
684/// characters. This method does not work on incomplete types.
685CharUnits ASTContext::getTypeAlignInChars(QualType T) {
686  return CharUnits::fromQuantity(getTypeAlign(T) / getCharWidth());
687}
688CharUnits ASTContext::getTypeAlignInChars(const Type *T) {
689  return CharUnits::fromQuantity(getTypeAlign(T) / getCharWidth());
690}
691
692/// getPreferredTypeAlign - Return the "preferred" alignment of the specified
693/// type for the current target in bits.  This can be different than the ABI
694/// alignment in cases where it is beneficial for performance to overalign
695/// a data type.
696unsigned ASTContext::getPreferredTypeAlign(const Type *T) {
697  unsigned ABIAlign = getTypeAlign(T);
698
699  // Double and long long should be naturally aligned if possible.
700  if (const ComplexType* CT = T->getAs<ComplexType>())
701    T = CT->getElementType().getTypePtr();
702  if (T->isSpecificBuiltinType(BuiltinType::Double) ||
703      T->isSpecificBuiltinType(BuiltinType::LongLong))
704    return std::max(ABIAlign, (unsigned)getTypeSize(T));
705
706  return ABIAlign;
707}
708
709static void CollectLocalObjCIvars(ASTContext *Ctx,
710                                  const ObjCInterfaceDecl *OI,
711                                  llvm::SmallVectorImpl<FieldDecl*> &Fields) {
712  for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(),
713       E = OI->ivar_end(); I != E; ++I) {
714    ObjCIvarDecl *IVDecl = *I;
715    if (!IVDecl->isInvalidDecl())
716      Fields.push_back(cast<FieldDecl>(IVDecl));
717  }
718}
719
720void ASTContext::CollectObjCIvars(const ObjCInterfaceDecl *OI,
721                             llvm::SmallVectorImpl<FieldDecl*> &Fields) {
722  if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass())
723    CollectObjCIvars(SuperClass, Fields);
724  CollectLocalObjCIvars(this, OI, Fields);
725}
726
727/// ShallowCollectObjCIvars -
728/// Collect all ivars, including those synthesized, in the current class.
729///
730void ASTContext::ShallowCollectObjCIvars(const ObjCInterfaceDecl *OI,
731                                 llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) {
732  for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(),
733         E = OI->ivar_end(); I != E; ++I) {
734     Ivars.push_back(*I);
735  }
736
737  CollectNonClassIvars(OI, Ivars);
738}
739
740/// CollectNonClassIvars -
741/// This routine collects all other ivars which are not declared in the class.
742/// This includes synthesized ivars (via @synthesize) and those in
743//  class's @implementation.
744///
745void ASTContext::CollectNonClassIvars(const ObjCInterfaceDecl *OI,
746                                llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) {
747  // Find ivars declared in class extension.
748  if (const ObjCCategoryDecl *CDecl = OI->getClassExtension()) {
749    for (ObjCCategoryDecl::ivar_iterator I = CDecl->ivar_begin(),
750         E = CDecl->ivar_end(); I != E; ++I) {
751      Ivars.push_back(*I);
752    }
753  }
754
755  // Also add any ivar defined in this class's implementation.  This
756  // includes synthesized ivars.
757  if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) {
758    for (ObjCImplementationDecl::ivar_iterator I = ImplDecl->ivar_begin(),
759         E = ImplDecl->ivar_end(); I != E; ++I)
760      Ivars.push_back(*I);
761  }
762}
763
764/// CollectInheritedProtocols - Collect all protocols in current class and
765/// those inherited by it.
766void ASTContext::CollectInheritedProtocols(const Decl *CDecl,
767                          llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) {
768  if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
769    for (ObjCInterfaceDecl::protocol_iterator P = OI->protocol_begin(),
770         PE = OI->protocol_end(); P != PE; ++P) {
771      ObjCProtocolDecl *Proto = (*P);
772      Protocols.insert(Proto);
773      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
774           PE = Proto->protocol_end(); P != PE; ++P) {
775        Protocols.insert(*P);
776        CollectInheritedProtocols(*P, Protocols);
777      }
778    }
779
780    // Categories of this Interface.
781    for (const ObjCCategoryDecl *CDeclChain = OI->getCategoryList();
782         CDeclChain; CDeclChain = CDeclChain->getNextClassCategory())
783      CollectInheritedProtocols(CDeclChain, Protocols);
784    if (ObjCInterfaceDecl *SD = OI->getSuperClass())
785      while (SD) {
786        CollectInheritedProtocols(SD, Protocols);
787        SD = SD->getSuperClass();
788      }
789  } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
790    for (ObjCInterfaceDecl::protocol_iterator P = OC->protocol_begin(),
791         PE = OC->protocol_end(); P != PE; ++P) {
792      ObjCProtocolDecl *Proto = (*P);
793      Protocols.insert(Proto);
794      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
795           PE = Proto->protocol_end(); P != PE; ++P)
796        CollectInheritedProtocols(*P, Protocols);
797    }
798  } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
799    for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(),
800         PE = OP->protocol_end(); P != PE; ++P) {
801      ObjCProtocolDecl *Proto = (*P);
802      Protocols.insert(Proto);
803      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
804           PE = Proto->protocol_end(); P != PE; ++P)
805        CollectInheritedProtocols(*P, Protocols);
806    }
807  }
808}
809
810unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) {
811  unsigned count = 0;
812  // Count ivars declared in class extension.
813  if (const ObjCCategoryDecl *CDecl = OI->getClassExtension())
814    count += CDecl->ivar_size();
815
816  // Count ivar defined in this class's implementation.  This
817  // includes synthesized ivars.
818  if (ObjCImplementationDecl *ImplDecl = OI->getImplementation())
819    count += ImplDecl->ivar_size();
820
821  return count;
822}
823
824/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists.
825ObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) {
826  llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
827    I = ObjCImpls.find(D);
828  if (I != ObjCImpls.end())
829    return cast<ObjCImplementationDecl>(I->second);
830  return 0;
831}
832/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists.
833ObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) {
834  llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
835    I = ObjCImpls.find(D);
836  if (I != ObjCImpls.end())
837    return cast<ObjCCategoryImplDecl>(I->second);
838  return 0;
839}
840
841/// \brief Set the implementation of ObjCInterfaceDecl.
842void ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD,
843                           ObjCImplementationDecl *ImplD) {
844  assert(IFaceD && ImplD && "Passed null params");
845  ObjCImpls[IFaceD] = ImplD;
846}
847/// \brief Set the implementation of ObjCCategoryDecl.
848void ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD,
849                           ObjCCategoryImplDecl *ImplD) {
850  assert(CatD && ImplD && "Passed null params");
851  ObjCImpls[CatD] = ImplD;
852}
853
854/// \brief Allocate an uninitialized TypeSourceInfo.
855///
856/// The caller should initialize the memory held by TypeSourceInfo using
857/// the TypeLoc wrappers.
858///
859/// \param T the type that will be the basis for type source info. This type
860/// should refer to how the declarator was written in source code, not to
861/// what type semantic analysis resolved the declarator to.
862TypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T,
863                                                 unsigned DataSize) {
864  if (!DataSize)
865    DataSize = TypeLoc::getFullDataSizeForType(T);
866  else
867    assert(DataSize == TypeLoc::getFullDataSizeForType(T) &&
868           "incorrect data size provided to CreateTypeSourceInfo!");
869
870  TypeSourceInfo *TInfo =
871    (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8);
872  new (TInfo) TypeSourceInfo(T);
873  return TInfo;
874}
875
876TypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T,
877                                                     SourceLocation L) {
878  TypeSourceInfo *DI = CreateTypeSourceInfo(T);
879  DI->getTypeLoc().initialize(L);
880  return DI;
881}
882
883/// getInterfaceLayoutImpl - Get or compute information about the
884/// layout of the given interface.
885///
886/// \param Impl - If given, also include the layout of the interface's
887/// implementation. This may differ by including synthesized ivars.
888const ASTRecordLayout &
889ASTContext::getObjCLayout(const ObjCInterfaceDecl *D,
890                          const ObjCImplementationDecl *Impl) {
891  assert(!D->isForwardDecl() && "Invalid interface decl!");
892
893  // Look up this layout, if already laid out, return what we have.
894  ObjCContainerDecl *Key =
895    Impl ? (ObjCContainerDecl*) Impl : (ObjCContainerDecl*) D;
896  if (const ASTRecordLayout *Entry = ObjCLayouts[Key])
897    return *Entry;
898
899  // Add in synthesized ivar count if laying out an implementation.
900  if (Impl) {
901    unsigned SynthCount = CountNonClassIvars(D);
902    // If there aren't any sythesized ivars then reuse the interface
903    // entry. Note we can't cache this because we simply free all
904    // entries later; however we shouldn't look up implementations
905    // frequently.
906    if (SynthCount == 0)
907      return getObjCLayout(D, 0);
908  }
909
910  const ASTRecordLayout *NewEntry =
911    ASTRecordLayoutBuilder::ComputeLayout(*this, D, Impl);
912  ObjCLayouts[Key] = NewEntry;
913
914  return *NewEntry;
915}
916
917const ASTRecordLayout &
918ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) {
919  return getObjCLayout(D, 0);
920}
921
922const ASTRecordLayout &
923ASTContext::getASTObjCImplementationLayout(const ObjCImplementationDecl *D) {
924  return getObjCLayout(D->getClassInterface(), D);
925}
926
927/// getASTRecordLayout - Get or compute information about the layout of the
928/// specified record (struct/union/class), which indicates its size and field
929/// position information.
930const ASTRecordLayout &ASTContext::getASTRecordLayout(const RecordDecl *D) {
931  D = D->getDefinition();
932  assert(D && "Cannot get layout of forward declarations!");
933
934  // Look up this layout, if already laid out, return what we have.
935  // Note that we can't save a reference to the entry because this function
936  // is recursive.
937  const ASTRecordLayout *Entry = ASTRecordLayouts[D];
938  if (Entry) return *Entry;
939
940  const ASTRecordLayout *NewEntry =
941    ASTRecordLayoutBuilder::ComputeLayout(*this, D);
942  ASTRecordLayouts[D] = NewEntry;
943
944  if (getLangOptions().DumpRecordLayouts) {
945    llvm::errs() << "\n*** Dumping AST Record Layout\n";
946    DumpRecordLayout(D, llvm::errs());
947  }
948
949  return *NewEntry;
950}
951
952const CXXMethodDecl *ASTContext::getKeyFunction(const CXXRecordDecl *RD) {
953  RD = cast<CXXRecordDecl>(RD->getDefinition());
954  assert(RD && "Cannot get key function for forward declarations!");
955
956  const CXXMethodDecl *&Entry = KeyFunctions[RD];
957  if (!Entry)
958    Entry = ASTRecordLayoutBuilder::ComputeKeyFunction(RD);
959  else
960    assert(Entry == ASTRecordLayoutBuilder::ComputeKeyFunction(RD) &&
961           "Key function changed!");
962
963  return Entry;
964}
965
966//===----------------------------------------------------------------------===//
967//                   Type creation/memoization methods
968//===----------------------------------------------------------------------===//
969
970QualType ASTContext::getExtQualType(const Type *TypeNode, Qualifiers Quals) {
971  unsigned Fast = Quals.getFastQualifiers();
972  Quals.removeFastQualifiers();
973
974  // Check if we've already instantiated this type.
975  llvm::FoldingSetNodeID ID;
976  ExtQuals::Profile(ID, TypeNode, Quals);
977  void *InsertPos = 0;
978  if (ExtQuals *EQ = ExtQualNodes.FindNodeOrInsertPos(ID, InsertPos)) {
979    assert(EQ->getQualifiers() == Quals);
980    QualType T = QualType(EQ, Fast);
981    return T;
982  }
983
984  ExtQuals *New = new (*this, TypeAlignment) ExtQuals(*this, TypeNode, Quals);
985  ExtQualNodes.InsertNode(New, InsertPos);
986  QualType T = QualType(New, Fast);
987  return T;
988}
989
990QualType ASTContext::getVolatileType(QualType T) {
991  QualType CanT = getCanonicalType(T);
992  if (CanT.isVolatileQualified()) return T;
993
994  QualifierCollector Quals;
995  const Type *TypeNode = Quals.strip(T);
996  Quals.addVolatile();
997
998  return getExtQualType(TypeNode, Quals);
999}
1000
1001QualType ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) {
1002  QualType CanT = getCanonicalType(T);
1003  if (CanT.getAddressSpace() == AddressSpace)
1004    return T;
1005
1006  // If we are composing extended qualifiers together, merge together
1007  // into one ExtQuals node.
1008  QualifierCollector Quals;
1009  const Type *TypeNode = Quals.strip(T);
1010
1011  // If this type already has an address space specified, it cannot get
1012  // another one.
1013  assert(!Quals.hasAddressSpace() &&
1014         "Type cannot be in multiple addr spaces!");
1015  Quals.addAddressSpace(AddressSpace);
1016
1017  return getExtQualType(TypeNode, Quals);
1018}
1019
1020QualType ASTContext::getObjCGCQualType(QualType T,
1021                                       Qualifiers::GC GCAttr) {
1022  QualType CanT = getCanonicalType(T);
1023  if (CanT.getObjCGCAttr() == GCAttr)
1024    return T;
1025
1026  if (T->isPointerType()) {
1027    QualType Pointee = T->getAs<PointerType>()->getPointeeType();
1028    if (Pointee->isAnyPointerType()) {
1029      QualType ResultType = getObjCGCQualType(Pointee, GCAttr);
1030      return getPointerType(ResultType);
1031    }
1032  }
1033
1034  // If we are composing extended qualifiers together, merge together
1035  // into one ExtQuals node.
1036  QualifierCollector Quals;
1037  const Type *TypeNode = Quals.strip(T);
1038
1039  // If this type already has an ObjCGC specified, it cannot get
1040  // another one.
1041  assert(!Quals.hasObjCGCAttr() &&
1042         "Type cannot have multiple ObjCGCs!");
1043  Quals.addObjCGCAttr(GCAttr);
1044
1045  return getExtQualType(TypeNode, Quals);
1046}
1047
1048static QualType getExtFunctionType(ASTContext& Context, QualType T,
1049                                        const FunctionType::ExtInfo &Info) {
1050  QualType ResultType;
1051  if (const PointerType *Pointer = T->getAs<PointerType>()) {
1052    QualType Pointee = Pointer->getPointeeType();
1053    ResultType = getExtFunctionType(Context, Pointee, Info);
1054    if (ResultType == Pointee)
1055      return T;
1056
1057    ResultType = Context.getPointerType(ResultType);
1058  } else if (const BlockPointerType *BlockPointer
1059                                              = T->getAs<BlockPointerType>()) {
1060    QualType Pointee = BlockPointer->getPointeeType();
1061    ResultType = getExtFunctionType(Context, Pointee, Info);
1062    if (ResultType == Pointee)
1063      return T;
1064
1065    ResultType = Context.getBlockPointerType(ResultType);
1066   } else if (const FunctionType *F = T->getAs<FunctionType>()) {
1067    if (F->getExtInfo() == Info)
1068      return T;
1069
1070    if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(F)) {
1071      ResultType = Context.getFunctionNoProtoType(FNPT->getResultType(),
1072                                                  Info);
1073    } else {
1074      const FunctionProtoType *FPT = cast<FunctionProtoType>(F);
1075      ResultType
1076        = Context.getFunctionType(FPT->getResultType(), FPT->arg_type_begin(),
1077                                  FPT->getNumArgs(), FPT->isVariadic(),
1078                                  FPT->getTypeQuals(),
1079                                  FPT->hasExceptionSpec(),
1080                                  FPT->hasAnyExceptionSpec(),
1081                                  FPT->getNumExceptions(),
1082                                  FPT->exception_begin(),
1083                                  Info);
1084    }
1085  } else
1086    return T;
1087
1088  return Context.getQualifiedType(ResultType, T.getLocalQualifiers());
1089}
1090
1091QualType ASTContext::getNoReturnType(QualType T, bool AddNoReturn) {
1092  FunctionType::ExtInfo Info = getFunctionExtInfo(T);
1093  return getExtFunctionType(*this, T,
1094                                 Info.withNoReturn(AddNoReturn));
1095}
1096
1097QualType ASTContext::getCallConvType(QualType T, CallingConv CallConv) {
1098  FunctionType::ExtInfo Info = getFunctionExtInfo(T);
1099  return getExtFunctionType(*this, T,
1100                            Info.withCallingConv(CallConv));
1101}
1102
1103QualType ASTContext::getRegParmType(QualType T, unsigned RegParm) {
1104  FunctionType::ExtInfo Info = getFunctionExtInfo(T);
1105  return getExtFunctionType(*this, T,
1106                                 Info.withRegParm(RegParm));
1107}
1108
1109/// getComplexType - Return the uniqued reference to the type for a complex
1110/// number with the specified element type.
1111QualType ASTContext::getComplexType(QualType T) {
1112  // Unique pointers, to guarantee there is only one pointer of a particular
1113  // structure.
1114  llvm::FoldingSetNodeID ID;
1115  ComplexType::Profile(ID, T);
1116
1117  void *InsertPos = 0;
1118  if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
1119    return QualType(CT, 0);
1120
1121  // If the pointee type isn't canonical, this won't be a canonical type either,
1122  // so fill in the canonical type field.
1123  QualType Canonical;
1124  if (!T.isCanonical()) {
1125    Canonical = getComplexType(getCanonicalType(T));
1126
1127    // Get the new insert position for the node we care about.
1128    ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
1129    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1130  }
1131  ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical);
1132  Types.push_back(New);
1133  ComplexTypes.InsertNode(New, InsertPos);
1134  return QualType(New, 0);
1135}
1136
1137/// getPointerType - Return the uniqued reference to the type for a pointer to
1138/// the specified type.
1139QualType ASTContext::getPointerType(QualType T) {
1140  // Unique pointers, to guarantee there is only one pointer of a particular
1141  // structure.
1142  llvm::FoldingSetNodeID ID;
1143  PointerType::Profile(ID, T);
1144
1145  void *InsertPos = 0;
1146  if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
1147    return QualType(PT, 0);
1148
1149  // If the pointee type isn't canonical, this won't be a canonical type either,
1150  // so fill in the canonical type field.
1151  QualType Canonical;
1152  if (!T.isCanonical()) {
1153    Canonical = getPointerType(getCanonicalType(T));
1154
1155    // Get the new insert position for the node we care about.
1156    PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
1157    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1158  }
1159  PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical);
1160  Types.push_back(New);
1161  PointerTypes.InsertNode(New, InsertPos);
1162  return QualType(New, 0);
1163}
1164
1165/// getBlockPointerType - Return the uniqued reference to the type for
1166/// a pointer to the specified block.
1167QualType ASTContext::getBlockPointerType(QualType T) {
1168  assert(T->isFunctionType() && "block of function types only");
1169  // Unique pointers, to guarantee there is only one block of a particular
1170  // structure.
1171  llvm::FoldingSetNodeID ID;
1172  BlockPointerType::Profile(ID, T);
1173
1174  void *InsertPos = 0;
1175  if (BlockPointerType *PT =
1176        BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
1177    return QualType(PT, 0);
1178
1179  // If the block pointee type isn't canonical, this won't be a canonical
1180  // type either so fill in the canonical type field.
1181  QualType Canonical;
1182  if (!T.isCanonical()) {
1183    Canonical = getBlockPointerType(getCanonicalType(T));
1184
1185    // Get the new insert position for the node we care about.
1186    BlockPointerType *NewIP =
1187      BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
1188    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1189  }
1190  BlockPointerType *New
1191    = new (*this, TypeAlignment) BlockPointerType(T, Canonical);
1192  Types.push_back(New);
1193  BlockPointerTypes.InsertNode(New, InsertPos);
1194  return QualType(New, 0);
1195}
1196
1197/// getLValueReferenceType - Return the uniqued reference to the type for an
1198/// lvalue reference to the specified type.
1199QualType ASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) {
1200  // Unique pointers, to guarantee there is only one pointer of a particular
1201  // structure.
1202  llvm::FoldingSetNodeID ID;
1203  ReferenceType::Profile(ID, T, SpelledAsLValue);
1204
1205  void *InsertPos = 0;
1206  if (LValueReferenceType *RT =
1207        LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
1208    return QualType(RT, 0);
1209
1210  const ReferenceType *InnerRef = T->getAs<ReferenceType>();
1211
1212  // If the referencee type isn't canonical, this won't be a canonical type
1213  // either, so fill in the canonical type field.
1214  QualType Canonical;
1215  if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
1216    QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
1217    Canonical = getLValueReferenceType(getCanonicalType(PointeeType));
1218
1219    // Get the new insert position for the node we care about.
1220    LValueReferenceType *NewIP =
1221      LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
1222    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1223  }
1224
1225  LValueReferenceType *New
1226    = new (*this, TypeAlignment) LValueReferenceType(T, Canonical,
1227                                                     SpelledAsLValue);
1228  Types.push_back(New);
1229  LValueReferenceTypes.InsertNode(New, InsertPos);
1230
1231  return QualType(New, 0);
1232}
1233
1234/// getRValueReferenceType - Return the uniqued reference to the type for an
1235/// rvalue reference to the specified type.
1236QualType ASTContext::getRValueReferenceType(QualType T) {
1237  // Unique pointers, to guarantee there is only one pointer of a particular
1238  // structure.
1239  llvm::FoldingSetNodeID ID;
1240  ReferenceType::Profile(ID, T, false);
1241
1242  void *InsertPos = 0;
1243  if (RValueReferenceType *RT =
1244        RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
1245    return QualType(RT, 0);
1246
1247  const ReferenceType *InnerRef = T->getAs<ReferenceType>();
1248
1249  // If the referencee type isn't canonical, this won't be a canonical type
1250  // either, so fill in the canonical type field.
1251  QualType Canonical;
1252  if (InnerRef || !T.isCanonical()) {
1253    QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
1254    Canonical = getRValueReferenceType(getCanonicalType(PointeeType));
1255
1256    // Get the new insert position for the node we care about.
1257    RValueReferenceType *NewIP =
1258      RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
1259    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1260  }
1261
1262  RValueReferenceType *New
1263    = new (*this, TypeAlignment) RValueReferenceType(T, Canonical);
1264  Types.push_back(New);
1265  RValueReferenceTypes.InsertNode(New, InsertPos);
1266  return QualType(New, 0);
1267}
1268
1269/// getMemberPointerType - Return the uniqued reference to the type for a
1270/// member pointer to the specified type, in the specified class.
1271QualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) {
1272  // Unique pointers, to guarantee there is only one pointer of a particular
1273  // structure.
1274  llvm::FoldingSetNodeID ID;
1275  MemberPointerType::Profile(ID, T, Cls);
1276
1277  void *InsertPos = 0;
1278  if (MemberPointerType *PT =
1279      MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
1280    return QualType(PT, 0);
1281
1282  // If the pointee or class type isn't canonical, this won't be a canonical
1283  // type either, so fill in the canonical type field.
1284  QualType Canonical;
1285  if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) {
1286    Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls));
1287
1288    // Get the new insert position for the node we care about.
1289    MemberPointerType *NewIP =
1290      MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
1291    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1292  }
1293  MemberPointerType *New
1294    = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical);
1295  Types.push_back(New);
1296  MemberPointerTypes.InsertNode(New, InsertPos);
1297  return QualType(New, 0);
1298}
1299
1300/// getConstantArrayType - Return the unique reference to the type for an
1301/// array of the specified element type.
1302QualType ASTContext::getConstantArrayType(QualType EltTy,
1303                                          const llvm::APInt &ArySizeIn,
1304                                          ArrayType::ArraySizeModifier ASM,
1305                                          unsigned EltTypeQuals) {
1306  assert((EltTy->isDependentType() ||
1307          EltTy->isIncompleteType() || EltTy->isConstantSizeType()) &&
1308         "Constant array of VLAs is illegal!");
1309
1310  // Convert the array size into a canonical width matching the pointer size for
1311  // the target.
1312  llvm::APInt ArySize(ArySizeIn);
1313  ArySize.zextOrTrunc(Target.getPointerWidth(EltTy.getAddressSpace()));
1314
1315  llvm::FoldingSetNodeID ID;
1316  ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, EltTypeQuals);
1317
1318  void *InsertPos = 0;
1319  if (ConstantArrayType *ATP =
1320      ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
1321    return QualType(ATP, 0);
1322
1323  // If the element type isn't canonical, this won't be a canonical type either,
1324  // so fill in the canonical type field.
1325  QualType Canonical;
1326  if (!EltTy.isCanonical()) {
1327    Canonical = getConstantArrayType(getCanonicalType(EltTy), ArySize,
1328                                     ASM, EltTypeQuals);
1329    // Get the new insert position for the node we care about.
1330    ConstantArrayType *NewIP =
1331      ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
1332    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1333  }
1334
1335  ConstantArrayType *New = new(*this,TypeAlignment)
1336    ConstantArrayType(EltTy, Canonical, ArySize, ASM, EltTypeQuals);
1337  ConstantArrayTypes.InsertNode(New, InsertPos);
1338  Types.push_back(New);
1339  return QualType(New, 0);
1340}
1341
1342/// getVariableArrayType - Returns a non-unique reference to the type for a
1343/// variable array of the specified element type.
1344QualType ASTContext::getVariableArrayType(QualType EltTy,
1345                                          Expr *NumElts,
1346                                          ArrayType::ArraySizeModifier ASM,
1347                                          unsigned EltTypeQuals,
1348                                          SourceRange Brackets) {
1349  // Since we don't unique expressions, it isn't possible to unique VLA's
1350  // that have an expression provided for their size.
1351
1352  VariableArrayType *New = new(*this, TypeAlignment)
1353    VariableArrayType(EltTy, QualType(), NumElts, ASM, EltTypeQuals, Brackets);
1354
1355  VariableArrayTypes.push_back(New);
1356  Types.push_back(New);
1357  return QualType(New, 0);
1358}
1359
1360/// getDependentSizedArrayType - Returns a non-unique reference to
1361/// the type for a dependently-sized array of the specified element
1362/// type.
1363QualType ASTContext::getDependentSizedArrayType(QualType EltTy,
1364                                                Expr *NumElts,
1365                                                ArrayType::ArraySizeModifier ASM,
1366                                                unsigned EltTypeQuals,
1367                                                SourceRange Brackets) {
1368  assert((!NumElts || NumElts->isTypeDependent() ||
1369          NumElts->isValueDependent()) &&
1370         "Size must be type- or value-dependent!");
1371
1372  void *InsertPos = 0;
1373  DependentSizedArrayType *Canon = 0;
1374  llvm::FoldingSetNodeID ID;
1375
1376  if (NumElts) {
1377    // Dependently-sized array types that do not have a specified
1378    // number of elements will have their sizes deduced from an
1379    // initializer.
1380    DependentSizedArrayType::Profile(ID, *this, getCanonicalType(EltTy), ASM,
1381                                     EltTypeQuals, NumElts);
1382
1383    Canon = DependentSizedArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
1384  }
1385
1386  DependentSizedArrayType *New;
1387  if (Canon) {
1388    // We already have a canonical version of this array type; use it as
1389    // the canonical type for a newly-built type.
1390    New = new (*this, TypeAlignment)
1391      DependentSizedArrayType(*this, EltTy, QualType(Canon, 0),
1392                              NumElts, ASM, EltTypeQuals, Brackets);
1393  } else {
1394    QualType CanonEltTy = getCanonicalType(EltTy);
1395    if (CanonEltTy == EltTy) {
1396      New = new (*this, TypeAlignment)
1397        DependentSizedArrayType(*this, EltTy, QualType(),
1398                                NumElts, ASM, EltTypeQuals, Brackets);
1399
1400      if (NumElts) {
1401        DependentSizedArrayType *CanonCheck
1402          = DependentSizedArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
1403        assert(!CanonCheck && "Dependent-sized canonical array type broken");
1404        (void)CanonCheck;
1405        DependentSizedArrayTypes.InsertNode(New, InsertPos);
1406      }
1407    } else {
1408      QualType Canon = getDependentSizedArrayType(CanonEltTy, NumElts,
1409                                                  ASM, EltTypeQuals,
1410                                                  SourceRange());
1411      New = new (*this, TypeAlignment)
1412        DependentSizedArrayType(*this, EltTy, Canon,
1413                                NumElts, ASM, EltTypeQuals, Brackets);
1414    }
1415  }
1416
1417  Types.push_back(New);
1418  return QualType(New, 0);
1419}
1420
1421QualType ASTContext::getIncompleteArrayType(QualType EltTy,
1422                                            ArrayType::ArraySizeModifier ASM,
1423                                            unsigned EltTypeQuals) {
1424  llvm::FoldingSetNodeID ID;
1425  IncompleteArrayType::Profile(ID, EltTy, ASM, EltTypeQuals);
1426
1427  void *InsertPos = 0;
1428  if (IncompleteArrayType *ATP =
1429       IncompleteArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
1430    return QualType(ATP, 0);
1431
1432  // If the element type isn't canonical, this won't be a canonical type
1433  // either, so fill in the canonical type field.
1434  QualType Canonical;
1435
1436  if (!EltTy.isCanonical()) {
1437    Canonical = getIncompleteArrayType(getCanonicalType(EltTy),
1438                                       ASM, EltTypeQuals);
1439
1440    // Get the new insert position for the node we care about.
1441    IncompleteArrayType *NewIP =
1442      IncompleteArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
1443    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1444  }
1445
1446  IncompleteArrayType *New = new (*this, TypeAlignment)
1447    IncompleteArrayType(EltTy, Canonical, ASM, EltTypeQuals);
1448
1449  IncompleteArrayTypes.InsertNode(New, InsertPos);
1450  Types.push_back(New);
1451  return QualType(New, 0);
1452}
1453
1454/// getVectorType - Return the unique reference to a vector type of
1455/// the specified element type and size. VectorType must be a built-in type.
1456QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
1457                                   bool IsAltiVec, bool IsPixel) {
1458  BuiltinType *baseType;
1459
1460  baseType = dyn_cast<BuiltinType>(getCanonicalType(vecType).getTypePtr());
1461  assert(baseType != 0 && "getVectorType(): Expecting a built-in type");
1462
1463  // Check if we've already instantiated a vector of this type.
1464  llvm::FoldingSetNodeID ID;
1465  VectorType::Profile(ID, vecType, NumElts, Type::Vector,
1466    IsAltiVec, IsPixel);
1467  void *InsertPos = 0;
1468  if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
1469    return QualType(VTP, 0);
1470
1471  // If the element type isn't canonical, this won't be a canonical type either,
1472  // so fill in the canonical type field.
1473  QualType Canonical;
1474  if (!vecType.isCanonical() || IsAltiVec || IsPixel) {
1475    Canonical = getVectorType(getCanonicalType(vecType),
1476      NumElts, false, false);
1477
1478    // Get the new insert position for the node we care about.
1479    VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
1480    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1481  }
1482  VectorType *New = new (*this, TypeAlignment)
1483    VectorType(vecType, NumElts, Canonical, IsAltiVec, IsPixel);
1484  VectorTypes.InsertNode(New, InsertPos);
1485  Types.push_back(New);
1486  return QualType(New, 0);
1487}
1488
1489/// getExtVectorType - Return the unique reference to an extended vector type of
1490/// the specified element type and size. VectorType must be a built-in type.
1491QualType ASTContext::getExtVectorType(QualType vecType, unsigned NumElts) {
1492  BuiltinType *baseType;
1493
1494  baseType = dyn_cast<BuiltinType>(getCanonicalType(vecType).getTypePtr());
1495  assert(baseType != 0 && "getExtVectorType(): Expecting a built-in type");
1496
1497  // Check if we've already instantiated a vector of this type.
1498  llvm::FoldingSetNodeID ID;
1499  VectorType::Profile(ID, vecType, NumElts, Type::ExtVector, false, false);
1500  void *InsertPos = 0;
1501  if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
1502    return QualType(VTP, 0);
1503
1504  // If the element type isn't canonical, this won't be a canonical type either,
1505  // so fill in the canonical type field.
1506  QualType Canonical;
1507  if (!vecType.isCanonical()) {
1508    Canonical = getExtVectorType(getCanonicalType(vecType), NumElts);
1509
1510    // Get the new insert position for the node we care about.
1511    VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
1512    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1513  }
1514  ExtVectorType *New = new (*this, TypeAlignment)
1515    ExtVectorType(vecType, NumElts, Canonical);
1516  VectorTypes.InsertNode(New, InsertPos);
1517  Types.push_back(New);
1518  return QualType(New, 0);
1519}
1520
1521QualType ASTContext::getDependentSizedExtVectorType(QualType vecType,
1522                                                    Expr *SizeExpr,
1523                                                    SourceLocation AttrLoc) {
1524  llvm::FoldingSetNodeID ID;
1525  DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType),
1526                                       SizeExpr);
1527
1528  void *InsertPos = 0;
1529  DependentSizedExtVectorType *Canon
1530    = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
1531  DependentSizedExtVectorType *New;
1532  if (Canon) {
1533    // We already have a canonical version of this array type; use it as
1534    // the canonical type for a newly-built type.
1535    New = new (*this, TypeAlignment)
1536      DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0),
1537                                  SizeExpr, AttrLoc);
1538  } else {
1539    QualType CanonVecTy = getCanonicalType(vecType);
1540    if (CanonVecTy == vecType) {
1541      New = new (*this, TypeAlignment)
1542        DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr,
1543                                    AttrLoc);
1544
1545      DependentSizedExtVectorType *CanonCheck
1546        = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
1547      assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken");
1548      (void)CanonCheck;
1549      DependentSizedExtVectorTypes.InsertNode(New, InsertPos);
1550    } else {
1551      QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr,
1552                                                      SourceLocation());
1553      New = new (*this, TypeAlignment)
1554        DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc);
1555    }
1556  }
1557
1558  Types.push_back(New);
1559  return QualType(New, 0);
1560}
1561
1562/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'.
1563///
1564QualType ASTContext::getFunctionNoProtoType(QualType ResultTy,
1565                                            const FunctionType::ExtInfo &Info) {
1566  const CallingConv CallConv = Info.getCC();
1567  // Unique functions, to guarantee there is only one function of a particular
1568  // structure.
1569  llvm::FoldingSetNodeID ID;
1570  FunctionNoProtoType::Profile(ID, ResultTy, Info);
1571
1572  void *InsertPos = 0;
1573  if (FunctionNoProtoType *FT =
1574        FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
1575    return QualType(FT, 0);
1576
1577  QualType Canonical;
1578  if (!ResultTy.isCanonical() ||
1579      getCanonicalCallConv(CallConv) != CallConv) {
1580    Canonical =
1581      getFunctionNoProtoType(getCanonicalType(ResultTy),
1582                     Info.withCallingConv(getCanonicalCallConv(CallConv)));
1583
1584    // Get the new insert position for the node we care about.
1585    FunctionNoProtoType *NewIP =
1586      FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
1587    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1588  }
1589
1590  FunctionNoProtoType *New = new (*this, TypeAlignment)
1591    FunctionNoProtoType(ResultTy, Canonical, Info);
1592  Types.push_back(New);
1593  FunctionNoProtoTypes.InsertNode(New, InsertPos);
1594  return QualType(New, 0);
1595}
1596
1597/// getFunctionType - Return a normal function type with a typed argument
1598/// list.  isVariadic indicates whether the argument list includes '...'.
1599QualType ASTContext::getFunctionType(QualType ResultTy,const QualType *ArgArray,
1600                                     unsigned NumArgs, bool isVariadic,
1601                                     unsigned TypeQuals, bool hasExceptionSpec,
1602                                     bool hasAnyExceptionSpec, unsigned NumExs,
1603                                     const QualType *ExArray,
1604                                     const FunctionType::ExtInfo &Info) {
1605  const CallingConv CallConv= Info.getCC();
1606  // Unique functions, to guarantee there is only one function of a particular
1607  // structure.
1608  llvm::FoldingSetNodeID ID;
1609  FunctionProtoType::Profile(ID, ResultTy, ArgArray, NumArgs, isVariadic,
1610                             TypeQuals, hasExceptionSpec, hasAnyExceptionSpec,
1611                             NumExs, ExArray, Info);
1612
1613  void *InsertPos = 0;
1614  if (FunctionProtoType *FTP =
1615        FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
1616    return QualType(FTP, 0);
1617
1618  // Determine whether the type being created is already canonical or not.
1619  bool isCanonical = !hasExceptionSpec && ResultTy.isCanonical();
1620  for (unsigned i = 0; i != NumArgs && isCanonical; ++i)
1621    if (!ArgArray[i].isCanonicalAsParam())
1622      isCanonical = false;
1623
1624  // If this type isn't canonical, get the canonical version of it.
1625  // The exception spec is not part of the canonical type.
1626  QualType Canonical;
1627  if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) {
1628    llvm::SmallVector<QualType, 16> CanonicalArgs;
1629    CanonicalArgs.reserve(NumArgs);
1630    for (unsigned i = 0; i != NumArgs; ++i)
1631      CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i]));
1632
1633    Canonical = getFunctionType(getCanonicalType(ResultTy),
1634                                CanonicalArgs.data(), NumArgs,
1635                                isVariadic, TypeQuals, false,
1636                                false, 0, 0,
1637                     Info.withCallingConv(getCanonicalCallConv(CallConv)));
1638
1639    // Get the new insert position for the node we care about.
1640    FunctionProtoType *NewIP =
1641      FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
1642    assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
1643  }
1644
1645  // FunctionProtoType objects are allocated with extra bytes after them
1646  // for two variable size arrays (for parameter and exception types) at the
1647  // end of them.
1648  FunctionProtoType *FTP =
1649    (FunctionProtoType*)Allocate(sizeof(FunctionProtoType) +
1650                                 NumArgs*sizeof(QualType) +
1651                                 NumExs*sizeof(QualType), TypeAlignment);
1652  new (FTP) FunctionProtoType(ResultTy, ArgArray, NumArgs, isVariadic,
1653                              TypeQuals, hasExceptionSpec, hasAnyExceptionSpec,
1654                              ExArray, NumExs, Canonical, Info);
1655  Types.push_back(FTP);
1656  FunctionProtoTypes.InsertNode(FTP, InsertPos);
1657  return QualType(FTP, 0);
1658}
1659
1660#ifndef NDEBUG
1661static bool NeedsInjectedClassNameType(const RecordDecl *D) {
1662  if (!isa<CXXRecordDecl>(D)) return false;
1663  const CXXRecordDecl *RD = cast<CXXRecordDecl>(D);
1664  if (isa<ClassTemplatePartialSpecializationDecl>(RD))
1665    return true;
1666  if (RD->getDescribedClassTemplate() &&
1667      !isa<ClassTemplateSpecializationDecl>(RD))
1668    return true;
1669  return false;
1670}
1671#endif
1672
1673/// getInjectedClassNameType - Return the unique reference to the
1674/// injected class name type for the specified templated declaration.
1675QualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl,
1676                                              QualType TST) {
1677  assert(NeedsInjectedClassNameType(Decl));
1678  if (Decl->TypeForDecl) {
1679    assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
1680  } else if (CXXRecordDecl *PrevDecl
1681               = cast_or_null<CXXRecordDecl>(Decl->getPreviousDeclaration())) {
1682    assert(PrevDecl->TypeForDecl && "previous declaration has no type");
1683    Decl->TypeForDecl = PrevDecl->TypeForDecl;
1684    assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
1685  } else {
1686    Decl->TypeForDecl =
1687      new (*this, TypeAlignment) InjectedClassNameType(Decl, TST);
1688    Types.push_back(Decl->TypeForDecl);
1689  }
1690  return QualType(Decl->TypeForDecl, 0);
1691}
1692
1693/// getTypeDeclType - Return the unique reference to the type for the
1694/// specified type declaration.
1695QualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) {
1696  assert(Decl && "Passed null for Decl param");
1697  assert(!Decl->TypeForDecl && "TypeForDecl present in slow case");
1698
1699  if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(Decl))
1700    return getTypedefType(Typedef);
1701
1702  if (const ObjCInterfaceDecl *ObjCInterface
1703               = dyn_cast<ObjCInterfaceDecl>(Decl))
1704    return getObjCInterfaceType(ObjCInterface);
1705
1706  assert(!isa<TemplateTypeParmDecl>(Decl) &&
1707         "Template type parameter types are always available.");
1708
1709  if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) {
1710    assert(!Record->getPreviousDeclaration() &&
1711           "struct/union has previous declaration");
1712    assert(!NeedsInjectedClassNameType(Record));
1713    Decl->TypeForDecl = new (*this, TypeAlignment) RecordType(Record);
1714  } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) {
1715    assert(!Enum->getPreviousDeclaration() &&
1716           "enum has previous declaration");
1717    Decl->TypeForDecl = new (*this, TypeAlignment) EnumType(Enum);
1718  } else if (const UnresolvedUsingTypenameDecl *Using =
1719               dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) {
1720    Decl->TypeForDecl = new (*this, TypeAlignment) UnresolvedUsingType(Using);
1721  } else
1722    llvm_unreachable("TypeDecl without a type?");
1723
1724  Types.push_back(Decl->TypeForDecl);
1725  return QualType(Decl->TypeForDecl, 0);
1726}
1727
1728/// getTypedefType - Return the unique reference to the type for the
1729/// specified typename decl.
1730QualType ASTContext::getTypedefType(const TypedefDecl *Decl) {
1731  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
1732
1733  QualType Canonical = getCanonicalType(Decl->getUnderlyingType());
1734  Decl->TypeForDecl = new(*this, TypeAlignment)
1735    TypedefType(Type::Typedef, Decl, Canonical);
1736  Types.push_back(Decl->TypeForDecl);
1737  return QualType(Decl->TypeForDecl, 0);
1738}
1739
1740/// \brief Retrieve a substitution-result type.
1741QualType
1742ASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,
1743                                         QualType Replacement) {
1744  assert(Replacement.isCanonical()
1745         && "replacement types must always be canonical");
1746
1747  llvm::FoldingSetNodeID ID;
1748  SubstTemplateTypeParmType::Profile(ID, Parm, Replacement);
1749  void *InsertPos = 0;
1750  SubstTemplateTypeParmType *SubstParm
1751    = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
1752
1753  if (!SubstParm) {
1754    SubstParm = new (*this, TypeAlignment)
1755      SubstTemplateTypeParmType(Parm, Replacement);
1756    Types.push_back(SubstParm);
1757    SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
1758  }
1759
1760  return QualType(SubstParm, 0);
1761}
1762
1763/// \brief Retrieve the template type parameter type for a template
1764/// parameter or parameter pack with the given depth, index, and (optionally)
1765/// name.
1766QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
1767                                             bool ParameterPack,
1768                                             IdentifierInfo *Name) {
1769  llvm::FoldingSetNodeID ID;
1770  TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, Name);
1771  void *InsertPos = 0;
1772  TemplateTypeParmType *TypeParm
1773    = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
1774
1775  if (TypeParm)
1776    return QualType(TypeParm, 0);
1777
1778  if (Name) {
1779    QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
1780    TypeParm = new (*this, TypeAlignment)
1781      TemplateTypeParmType(Depth, Index, ParameterPack, Name, Canon);
1782
1783    TemplateTypeParmType *TypeCheck
1784      = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
1785    assert(!TypeCheck && "Template type parameter canonical type broken");
1786    (void)TypeCheck;
1787  } else
1788    TypeParm = new (*this, TypeAlignment)
1789      TemplateTypeParmType(Depth, Index, ParameterPack);
1790
1791  Types.push_back(TypeParm);
1792  TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
1793
1794  return QualType(TypeParm, 0);
1795}
1796
1797TypeSourceInfo *
1798ASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
1799                                              SourceLocation NameLoc,
1800                                        const TemplateArgumentListInfo &Args,
1801                                              QualType CanonType) {
1802  QualType TST = getTemplateSpecializationType(Name, Args, CanonType);
1803
1804  TypeSourceInfo *DI = CreateTypeSourceInfo(TST);
1805  TemplateSpecializationTypeLoc TL
1806    = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc());
1807  TL.setTemplateNameLoc(NameLoc);
1808  TL.setLAngleLoc(Args.getLAngleLoc());
1809  TL.setRAngleLoc(Args.getRAngleLoc());
1810  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
1811    TL.setArgLocInfo(i, Args[i].getLocInfo());
1812  return DI;
1813}
1814
1815QualType
1816ASTContext::getTemplateSpecializationType(TemplateName Template,
1817                                          const TemplateArgumentListInfo &Args,
1818                                          QualType Canon,
1819                                          bool IsCurrentInstantiation) {
1820  unsigned NumArgs = Args.size();
1821
1822  llvm::SmallVector<TemplateArgument, 4> ArgVec;
1823  ArgVec.reserve(NumArgs);
1824  for (unsigned i = 0; i != NumArgs; ++i)
1825    ArgVec.push_back(Args[i].getArgument());
1826
1827  return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs,
1828                                       Canon, IsCurrentInstantiation);
1829}
1830
1831QualType
1832ASTContext::getTemplateSpecializationType(TemplateName Template,
1833                                          const TemplateArgument *Args,
1834                                          unsigned NumArgs,
1835                                          QualType Canon,
1836                                          bool IsCurrentInstantiation) {
1837  if (!Canon.isNull())
1838    Canon = getCanonicalType(Canon);
1839  else {
1840    assert(!IsCurrentInstantiation &&
1841           "current-instantiation specializations should always "
1842           "have a canonical type");
1843
1844    // Build the canonical template specialization type.
1845    TemplateName CanonTemplate = getCanonicalTemplateName(Template);
1846    llvm::SmallVector<TemplateArgument, 4> CanonArgs;
1847    CanonArgs.reserve(NumArgs);
1848    for (unsigned I = 0; I != NumArgs; ++I)
1849      CanonArgs.push_back(getCanonicalTemplateArgument(Args[I]));
1850
1851    // Determine whether this canonical template specialization type already
1852    // exists.
1853    llvm::FoldingSetNodeID ID;
1854    TemplateSpecializationType::Profile(ID, CanonTemplate, false,
1855                                        CanonArgs.data(), NumArgs, *this);
1856
1857    void *InsertPos = 0;
1858    TemplateSpecializationType *Spec
1859      = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
1860
1861    if (!Spec) {
1862      // Allocate a new canonical template specialization type.
1863      void *Mem = Allocate((sizeof(TemplateSpecializationType) +
1864                            sizeof(TemplateArgument) * NumArgs),
1865                           TypeAlignment);
1866      Spec = new (Mem) TemplateSpecializationType(*this, CanonTemplate, false,
1867                                                  CanonArgs.data(), NumArgs,
1868                                                  Canon);
1869      Types.push_back(Spec);
1870      TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
1871    }
1872
1873    if (Canon.isNull())
1874      Canon = QualType(Spec, 0);
1875    assert(Canon->isDependentType() &&
1876           "Non-dependent template-id type must have a canonical type");
1877  }
1878
1879  // Allocate the (non-canonical) template specialization type, but don't
1880  // try to unique it: these types typically have location information that
1881  // we don't unique and don't want to lose.
1882  void *Mem = Allocate((sizeof(TemplateSpecializationType) +
1883                        sizeof(TemplateArgument) * NumArgs),
1884                       TypeAlignment);
1885  TemplateSpecializationType *Spec
1886    = new (Mem) TemplateSpecializationType(*this, Template,
1887                                           IsCurrentInstantiation,
1888                                           Args, NumArgs,
1889                                           Canon);
1890
1891  Types.push_back(Spec);
1892  return QualType(Spec, 0);
1893}
1894
1895QualType
1896ASTContext::getQualifiedNameType(NestedNameSpecifier *NNS,
1897                                 QualType NamedType) {
1898  llvm::FoldingSetNodeID ID;
1899  QualifiedNameType::Profile(ID, NNS, NamedType);
1900
1901  void *InsertPos = 0;
1902  QualifiedNameType *T
1903    = QualifiedNameTypes.FindNodeOrInsertPos(ID, InsertPos);
1904  if (T)
1905    return QualType(T, 0);
1906
1907  QualType Canon = NamedType;
1908  if (!Canon.isCanonical()) {
1909    Canon = getCanonicalType(NamedType);
1910    QualifiedNameType *CheckT
1911      = QualifiedNameTypes.FindNodeOrInsertPos(ID, InsertPos);
1912    assert(!CheckT && "Qualified name canonical type broken");
1913    (void)CheckT;
1914  }
1915
1916  T = new (*this) QualifiedNameType(NNS, NamedType, Canon);
1917  Types.push_back(T);
1918  QualifiedNameTypes.InsertNode(T, InsertPos);
1919  return QualType(T, 0);
1920}
1921
1922QualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword,
1923                                          NestedNameSpecifier *NNS,
1924                                          const IdentifierInfo *Name,
1925                                          QualType Canon) {
1926  assert(NNS->isDependent() && "nested-name-specifier must be dependent");
1927
1928  if (Canon.isNull()) {
1929    NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
1930    ElaboratedTypeKeyword CanonKeyword = Keyword;
1931    if (Keyword == ETK_None)
1932      CanonKeyword = ETK_Typename;
1933
1934    if (CanonNNS != NNS || CanonKeyword != Keyword)
1935      Canon = getDependentNameType(CanonKeyword, CanonNNS, Name);
1936  }
1937
1938  llvm::FoldingSetNodeID ID;
1939  DependentNameType::Profile(ID, Keyword, NNS, Name);
1940
1941  void *InsertPos = 0;
1942  DependentNameType *T
1943    = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
1944  if (T)
1945    return QualType(T, 0);
1946
1947  T = new (*this) DependentNameType(Keyword, NNS, Name, Canon);
1948  Types.push_back(T);
1949  DependentNameTypes.InsertNode(T, InsertPos);
1950  return QualType(T, 0);
1951}
1952
1953QualType
1954ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword,
1955                                 NestedNameSpecifier *NNS,
1956                                 const TemplateSpecializationType *TemplateId,
1957                                 QualType Canon) {
1958  assert(NNS->isDependent() && "nested-name-specifier must be dependent");
1959
1960  llvm::FoldingSetNodeID ID;
1961  DependentNameType::Profile(ID, Keyword, NNS, TemplateId);
1962
1963  void *InsertPos = 0;
1964  DependentNameType *T
1965    = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
1966  if (T)
1967    return QualType(T, 0);
1968
1969  if (Canon.isNull()) {
1970    NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
1971    QualType CanonType = getCanonicalType(QualType(TemplateId, 0));
1972    ElaboratedTypeKeyword CanonKeyword = Keyword;
1973    if (Keyword == ETK_None)
1974      CanonKeyword = ETK_Typename;
1975    if (CanonNNS != NNS || CanonKeyword != Keyword ||
1976        CanonType != QualType(TemplateId, 0)) {
1977      const TemplateSpecializationType *CanonTemplateId
1978        = CanonType->getAs<TemplateSpecializationType>();
1979      assert(CanonTemplateId &&
1980             "Canonical type must also be a template specialization type");
1981      Canon = getDependentNameType(CanonKeyword, CanonNNS, CanonTemplateId);
1982    }
1983
1984    DependentNameType *CheckT
1985      = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
1986    assert(!CheckT && "Typename canonical type is broken"); (void)CheckT;
1987  }
1988
1989  T = new (*this) DependentNameType(Keyword, NNS, TemplateId, Canon);
1990  Types.push_back(T);
1991  DependentNameTypes.InsertNode(T, InsertPos);
1992  return QualType(T, 0);
1993}
1994
1995QualType
1996ASTContext::getElaboratedType(QualType UnderlyingType,
1997                              ElaboratedType::TagKind Tag) {
1998  llvm::FoldingSetNodeID ID;
1999  ElaboratedType::Profile(ID, UnderlyingType, Tag);
2000
2001  void *InsertPos = 0;
2002  ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
2003  if (T)
2004    return QualType(T, 0);
2005
2006  QualType Canon = UnderlyingType;
2007  if (!Canon.isCanonical()) {
2008    Canon = getCanonicalType(Canon);
2009    ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
2010    assert(!CheckT && "Elaborated canonical type is broken"); (void)CheckT;
2011  }
2012
2013  T = new (*this) ElaboratedType(UnderlyingType, Tag, Canon);
2014  Types.push_back(T);
2015  ElaboratedTypes.InsertNode(T, InsertPos);
2016  return QualType(T, 0);
2017}
2018
2019/// CmpProtocolNames - Comparison predicate for sorting protocols
2020/// alphabetically.
2021static bool CmpProtocolNames(const ObjCProtocolDecl *LHS,
2022                            const ObjCProtocolDecl *RHS) {
2023  return LHS->getDeclName() < RHS->getDeclName();
2024}
2025
2026static bool areSortedAndUniqued(ObjCProtocolDecl **Protocols,
2027                                unsigned NumProtocols) {
2028  if (NumProtocols == 0) return true;
2029
2030  for (unsigned i = 1; i != NumProtocols; ++i)
2031    if (!CmpProtocolNames(Protocols[i-1], Protocols[i]))
2032      return false;
2033  return true;
2034}
2035
2036static void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols,
2037                                   unsigned &NumProtocols) {
2038  ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols;
2039
2040  // Sort protocols, keyed by name.
2041  std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames);
2042
2043  // Remove duplicates.
2044  ProtocolsEnd = std::unique(Protocols, ProtocolsEnd);
2045  NumProtocols = ProtocolsEnd-Protocols;
2046}
2047
2048/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for
2049/// the given interface decl and the conforming protocol list.
2050QualType ASTContext::getObjCObjectPointerType(QualType InterfaceT,
2051                                              ObjCProtocolDecl **Protocols,
2052                                              unsigned NumProtocols,
2053                                              unsigned Quals) {
2054  llvm::FoldingSetNodeID ID;
2055  ObjCObjectPointerType::Profile(ID, InterfaceT, Protocols, NumProtocols);
2056  Qualifiers Qs = Qualifiers::fromCVRMask(Quals);
2057
2058  void *InsertPos = 0;
2059  if (ObjCObjectPointerType *QT =
2060              ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
2061    return getQualifiedType(QualType(QT, 0), Qs);
2062
2063  // Sort the protocol list alphabetically to canonicalize it.
2064  QualType Canonical;
2065  if (!InterfaceT.isCanonical() ||
2066      !areSortedAndUniqued(Protocols, NumProtocols)) {
2067    if (!areSortedAndUniqued(Protocols, NumProtocols)) {
2068      llvm::SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols,
2069                                                     Protocols + NumProtocols);
2070      unsigned UniqueCount = NumProtocols;
2071
2072      SortAndUniqueProtocols(&Sorted[0], UniqueCount);
2073
2074      Canonical = getObjCObjectPointerType(getCanonicalType(InterfaceT),
2075                                           &Sorted[0], UniqueCount);
2076    } else {
2077      Canonical = getObjCObjectPointerType(getCanonicalType(InterfaceT),
2078                                           Protocols, NumProtocols);
2079    }
2080
2081    // Regenerate InsertPos.
2082    ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2083  }
2084
2085  // No match.
2086  unsigned Size = sizeof(ObjCObjectPointerType)
2087                + NumProtocols * sizeof(ObjCProtocolDecl *);
2088  void *Mem = Allocate(Size, TypeAlignment);
2089  ObjCObjectPointerType *QType = new (Mem) ObjCObjectPointerType(Canonical,
2090                                                                 InterfaceT,
2091                                                                 Protocols,
2092                                                                 NumProtocols);
2093
2094  Types.push_back(QType);
2095  ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
2096  return getQualifiedType(QualType(QType, 0), Qs);
2097}
2098
2099/// getObjCInterfaceType - Return the unique reference to the type for the
2100/// specified ObjC interface decl. The list of protocols is optional.
2101QualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl,
2102                       ObjCProtocolDecl **Protocols, unsigned NumProtocols) {
2103  llvm::FoldingSetNodeID ID;
2104  ObjCInterfaceType::Profile(ID, Decl, Protocols, NumProtocols);
2105
2106  void *InsertPos = 0;
2107  if (ObjCInterfaceType *QT =
2108      ObjCInterfaceTypes.FindNodeOrInsertPos(ID, InsertPos))
2109    return QualType(QT, 0);
2110
2111  // Sort the protocol list alphabetically to canonicalize it.
2112  QualType Canonical;
2113  if (NumProtocols && !areSortedAndUniqued(Protocols, NumProtocols)) {
2114    llvm::SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols,
2115                                                   Protocols + NumProtocols);
2116
2117    unsigned UniqueCount = NumProtocols;
2118    SortAndUniqueProtocols(&Sorted[0], UniqueCount);
2119
2120    Canonical = getObjCInterfaceType(Decl, &Sorted[0], UniqueCount);
2121
2122    ObjCInterfaceTypes.FindNodeOrInsertPos(ID, InsertPos);
2123  }
2124
2125  unsigned Size = sizeof(ObjCInterfaceType)
2126    + NumProtocols * sizeof(ObjCProtocolDecl *);
2127  void *Mem = Allocate(Size, TypeAlignment);
2128  ObjCInterfaceType *QType = new (Mem) ObjCInterfaceType(Canonical,
2129                                        const_cast<ObjCInterfaceDecl*>(Decl),
2130                                                         Protocols,
2131                                                         NumProtocols);
2132
2133  Types.push_back(QType);
2134  ObjCInterfaceTypes.InsertNode(QType, InsertPos);
2135  return QualType(QType, 0);
2136}
2137
2138/// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique
2139/// TypeOfExprType AST's (since expression's are never shared). For example,
2140/// multiple declarations that refer to "typeof(x)" all contain different
2141/// DeclRefExpr's. This doesn't effect the type checker, since it operates
2142/// on canonical type's (which are always unique).
2143QualType ASTContext::getTypeOfExprType(Expr *tofExpr) {
2144  TypeOfExprType *toe;
2145  if (tofExpr->isTypeDependent()) {
2146    llvm::FoldingSetNodeID ID;
2147    DependentTypeOfExprType::Profile(ID, *this, tofExpr);
2148
2149    void *InsertPos = 0;
2150    DependentTypeOfExprType *Canon
2151      = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
2152    if (Canon) {
2153      // We already have a "canonical" version of an identical, dependent
2154      // typeof(expr) type. Use that as our canonical type.
2155      toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr,
2156                                          QualType((TypeOfExprType*)Canon, 0));
2157    }
2158    else {
2159      // Build a new, canonical typeof(expr) type.
2160      Canon
2161        = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr);
2162      DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
2163      toe = Canon;
2164    }
2165  } else {
2166    QualType Canonical = getCanonicalType(tofExpr->getType());
2167    toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical);
2168  }
2169  Types.push_back(toe);
2170  return QualType(toe, 0);
2171}
2172
2173/// getTypeOfType -  Unlike many "get<Type>" functions, we don't unique
2174/// TypeOfType AST's. The only motivation to unique these nodes would be
2175/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be
2176/// an issue. This doesn't effect the type checker, since it operates
2177/// on canonical type's (which are always unique).
2178QualType ASTContext::getTypeOfType(QualType tofType) {
2179  QualType Canonical = getCanonicalType(tofType);
2180  TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical);
2181  Types.push_back(tot);
2182  return QualType(tot, 0);
2183}
2184
2185/// getDecltypeForExpr - Given an expr, will return the decltype for that
2186/// expression, according to the rules in C++0x [dcl.type.simple]p4
2187static QualType getDecltypeForExpr(const Expr *e, ASTContext &Context) {
2188  if (e->isTypeDependent())
2189    return Context.DependentTy;
2190
2191  // If e is an id expression or a class member access, decltype(e) is defined
2192  // as the type of the entity named by e.
2193  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(e)) {
2194    if (const ValueDecl *VD = dyn_cast<ValueDecl>(DRE->getDecl()))
2195      return VD->getType();
2196  }
2197  if (const MemberExpr *ME = dyn_cast<MemberExpr>(e)) {
2198    if (const FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl()))
2199      return FD->getType();
2200  }
2201  // If e is a function call or an invocation of an overloaded operator,
2202  // (parentheses around e are ignored), decltype(e) is defined as the
2203  // return type of that function.
2204  if (const CallExpr *CE = dyn_cast<CallExpr>(e->IgnoreParens()))
2205    return CE->getCallReturnType();
2206
2207  QualType T = e->getType();
2208
2209  // Otherwise, where T is the type of e, if e is an lvalue, decltype(e) is
2210  // defined as T&, otherwise decltype(e) is defined as T.
2211  if (e->isLvalue(Context) == Expr::LV_Valid)
2212    T = Context.getLValueReferenceType(T);
2213
2214  return T;
2215}
2216
2217/// getDecltypeType -  Unlike many "get<Type>" functions, we don't unique
2218/// DecltypeType AST's. The only motivation to unique these nodes would be
2219/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be
2220/// an issue. This doesn't effect the type checker, since it operates
2221/// on canonical type's (which are always unique).
2222QualType ASTContext::getDecltypeType(Expr *e) {
2223  DecltypeType *dt;
2224  if (e->isTypeDependent()) {
2225    llvm::FoldingSetNodeID ID;
2226    DependentDecltypeType::Profile(ID, *this, e);
2227
2228    void *InsertPos = 0;
2229    DependentDecltypeType *Canon
2230      = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos);
2231    if (Canon) {
2232      // We already have a "canonical" version of an equivalent, dependent
2233      // decltype type. Use that as our canonical type.
2234      dt = new (*this, TypeAlignment) DecltypeType(e, DependentTy,
2235                                       QualType((DecltypeType*)Canon, 0));
2236    }
2237    else {
2238      // Build a new, canonical typeof(expr) type.
2239      Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e);
2240      DependentDecltypeTypes.InsertNode(Canon, InsertPos);
2241      dt = Canon;
2242    }
2243  } else {
2244    QualType T = getDecltypeForExpr(e, *this);
2245    dt = new (*this, TypeAlignment) DecltypeType(e, T, getCanonicalType(T));
2246  }
2247  Types.push_back(dt);
2248  return QualType(dt, 0);
2249}
2250
2251/// getTagDeclType - Return the unique reference to the type for the
2252/// specified TagDecl (struct/union/class/enum) decl.
2253QualType ASTContext::getTagDeclType(const TagDecl *Decl) {
2254  assert (Decl);
2255  // FIXME: What is the design on getTagDeclType when it requires casting
2256  // away const?  mutable?
2257  return getTypeDeclType(const_cast<TagDecl*>(Decl));
2258}
2259
2260/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result
2261/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and
2262/// needs to agree with the definition in <stddef.h>.
2263CanQualType ASTContext::getSizeType() const {
2264  return getFromTargetType(Target.getSizeType());
2265}
2266
2267/// getSignedWCharType - Return the type of "signed wchar_t".
2268/// Used when in C++, as a GCC extension.
2269QualType ASTContext::getSignedWCharType() const {
2270  // FIXME: derive from "Target" ?
2271  return WCharTy;
2272}
2273
2274/// getUnsignedWCharType - Return the type of "unsigned wchar_t".
2275/// Used when in C++, as a GCC extension.
2276QualType ASTContext::getUnsignedWCharType() const {
2277  // FIXME: derive from "Target" ?
2278  return UnsignedIntTy;
2279}
2280
2281/// getPointerDiffType - Return the unique type for "ptrdiff_t" (ref?)
2282/// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
2283QualType ASTContext::getPointerDiffType() const {
2284  return getFromTargetType(Target.getPtrDiffType(0));
2285}
2286
2287//===----------------------------------------------------------------------===//
2288//                              Type Operators
2289//===----------------------------------------------------------------------===//
2290
2291CanQualType ASTContext::getCanonicalParamType(QualType T) {
2292  // Push qualifiers into arrays, and then discard any remaining
2293  // qualifiers.
2294  T = getCanonicalType(T);
2295  const Type *Ty = T.getTypePtr();
2296
2297  QualType Result;
2298  if (isa<ArrayType>(Ty)) {
2299    Result = getArrayDecayedType(QualType(Ty,0));
2300  } else if (isa<FunctionType>(Ty)) {
2301    Result = getPointerType(QualType(Ty, 0));
2302  } else {
2303    Result = QualType(Ty, 0);
2304  }
2305
2306  return CanQualType::CreateUnsafe(Result);
2307}
2308
2309/// getCanonicalType - Return the canonical (structural) type corresponding to
2310/// the specified potentially non-canonical type.  The non-canonical version
2311/// of a type may have many "decorated" versions of types.  Decorators can
2312/// include typedefs, 'typeof' operators, etc. The returned type is guaranteed
2313/// to be free of any of these, allowing two canonical types to be compared
2314/// for exact equality with a simple pointer comparison.
2315CanQualType ASTContext::getCanonicalType(QualType T) {
2316  QualifierCollector Quals;
2317  const Type *Ptr = Quals.strip(T);
2318  QualType CanType = Ptr->getCanonicalTypeInternal();
2319
2320  // The canonical internal type will be the canonical type *except*
2321  // that we push type qualifiers down through array types.
2322
2323  // If there are no new qualifiers to push down, stop here.
2324  if (!Quals.hasQualifiers())
2325    return CanQualType::CreateUnsafe(CanType);
2326
2327  // If the type qualifiers are on an array type, get the canonical
2328  // type of the array with the qualifiers applied to the element
2329  // type.
2330  ArrayType *AT = dyn_cast<ArrayType>(CanType);
2331  if (!AT)
2332    return CanQualType::CreateUnsafe(getQualifiedType(CanType, Quals));
2333
2334  // Get the canonical version of the element with the extra qualifiers on it.
2335  // This can recursively sink qualifiers through multiple levels of arrays.
2336  QualType NewEltTy = getQualifiedType(AT->getElementType(), Quals);
2337  NewEltTy = getCanonicalType(NewEltTy);
2338
2339  if (ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT))
2340    return CanQualType::CreateUnsafe(
2341             getConstantArrayType(NewEltTy, CAT->getSize(),
2342                                  CAT->getSizeModifier(),
2343                                  CAT->getIndexTypeCVRQualifiers()));
2344  if (IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT))
2345    return CanQualType::CreateUnsafe(
2346             getIncompleteArrayType(NewEltTy, IAT->getSizeModifier(),
2347                                    IAT->getIndexTypeCVRQualifiers()));
2348
2349  if (DependentSizedArrayType *DSAT = dyn_cast<DependentSizedArrayType>(AT))
2350    return CanQualType::CreateUnsafe(
2351             getDependentSizedArrayType(NewEltTy,
2352                                        DSAT->getSizeExpr() ?
2353                                          DSAT->getSizeExpr()->Retain() : 0,
2354                                        DSAT->getSizeModifier(),
2355                                        DSAT->getIndexTypeCVRQualifiers(),
2356                        DSAT->getBracketsRange())->getCanonicalTypeInternal());
2357
2358  VariableArrayType *VAT = cast<VariableArrayType>(AT);
2359  return CanQualType::CreateUnsafe(getVariableArrayType(NewEltTy,
2360                                                        VAT->getSizeExpr() ?
2361                                              VAT->getSizeExpr()->Retain() : 0,
2362                                                        VAT->getSizeModifier(),
2363                                              VAT->getIndexTypeCVRQualifiers(),
2364                                                     VAT->getBracketsRange()));
2365}
2366
2367QualType ASTContext::getUnqualifiedArrayType(QualType T,
2368                                             Qualifiers &Quals) {
2369  Quals = T.getQualifiers();
2370  if (!isa<ArrayType>(T)) {
2371    return T.getUnqualifiedType();
2372  }
2373
2374  const ArrayType *AT = cast<ArrayType>(T);
2375  QualType Elt = AT->getElementType();
2376  QualType UnqualElt = getUnqualifiedArrayType(Elt, Quals);
2377  if (Elt == UnqualElt)
2378    return T;
2379
2380  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(T)) {
2381    return getConstantArrayType(UnqualElt, CAT->getSize(),
2382                                CAT->getSizeModifier(), 0);
2383  }
2384
2385  if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(T)) {
2386    return getIncompleteArrayType(UnqualElt, IAT->getSizeModifier(), 0);
2387  }
2388
2389  const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(T);
2390  return getDependentSizedArrayType(UnqualElt, DSAT->getSizeExpr()->Retain(),
2391                                    DSAT->getSizeModifier(), 0,
2392                                    SourceRange());
2393}
2394
2395DeclarationName ASTContext::getNameForTemplate(TemplateName Name) {
2396  if (TemplateDecl *TD = Name.getAsTemplateDecl())
2397    return TD->getDeclName();
2398
2399  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
2400    if (DTN->isIdentifier()) {
2401      return DeclarationNames.getIdentifier(DTN->getIdentifier());
2402    } else {
2403      return DeclarationNames.getCXXOperatorName(DTN->getOperator());
2404    }
2405  }
2406
2407  OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate();
2408  assert(Storage);
2409  return (*Storage->begin())->getDeclName();
2410}
2411
2412TemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) {
2413  // If this template name refers to a template, the canonical
2414  // template name merely stores the template itself.
2415  if (TemplateDecl *Template = Name.getAsTemplateDecl())
2416    return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl()));
2417
2418  assert(!Name.getAsOverloadedTemplate());
2419
2420  DependentTemplateName *DTN = Name.getAsDependentTemplateName();
2421  assert(DTN && "Non-dependent template names must refer to template decls.");
2422  return DTN->CanonicalTemplateName;
2423}
2424
2425bool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) {
2426  X = getCanonicalTemplateName(X);
2427  Y = getCanonicalTemplateName(Y);
2428  return X.getAsVoidPointer() == Y.getAsVoidPointer();
2429}
2430
2431TemplateArgument
2432ASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) {
2433  switch (Arg.getKind()) {
2434    case TemplateArgument::Null:
2435      return Arg;
2436
2437    case TemplateArgument::Expression:
2438      return Arg;
2439
2440    case TemplateArgument::Declaration:
2441      return TemplateArgument(Arg.getAsDecl()->getCanonicalDecl());
2442
2443    case TemplateArgument::Template:
2444      return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate()));
2445
2446    case TemplateArgument::Integral:
2447      return TemplateArgument(*Arg.getAsIntegral(),
2448                              getCanonicalType(Arg.getIntegralType()));
2449
2450    case TemplateArgument::Type:
2451      return TemplateArgument(getCanonicalType(Arg.getAsType()));
2452
2453    case TemplateArgument::Pack: {
2454      // FIXME: Allocate in ASTContext
2455      TemplateArgument *CanonArgs = new TemplateArgument[Arg.pack_size()];
2456      unsigned Idx = 0;
2457      for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2458                                        AEnd = Arg.pack_end();
2459           A != AEnd; (void)++A, ++Idx)
2460        CanonArgs[Idx] = getCanonicalTemplateArgument(*A);
2461
2462      TemplateArgument Result;
2463      Result.setArgumentPack(CanonArgs, Arg.pack_size(), false);
2464      return Result;
2465    }
2466  }
2467
2468  // Silence GCC warning
2469  assert(false && "Unhandled template argument kind");
2470  return TemplateArgument();
2471}
2472
2473NestedNameSpecifier *
2474ASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) {
2475  if (!NNS)
2476    return 0;
2477
2478  switch (NNS->getKind()) {
2479  case NestedNameSpecifier::Identifier:
2480    // Canonicalize the prefix but keep the identifier the same.
2481    return NestedNameSpecifier::Create(*this,
2482                         getCanonicalNestedNameSpecifier(NNS->getPrefix()),
2483                                       NNS->getAsIdentifier());
2484
2485  case NestedNameSpecifier::Namespace:
2486    // A namespace is canonical; build a nested-name-specifier with
2487    // this namespace and no prefix.
2488    return NestedNameSpecifier::Create(*this, 0, NNS->getAsNamespace());
2489
2490  case NestedNameSpecifier::TypeSpec:
2491  case NestedNameSpecifier::TypeSpecWithTemplate: {
2492    QualType T = getCanonicalType(QualType(NNS->getAsType(), 0));
2493    return NestedNameSpecifier::Create(*this, 0,
2494                 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2495                                       T.getTypePtr());
2496  }
2497
2498  case NestedNameSpecifier::Global:
2499    // The global specifier is canonical and unique.
2500    return NNS;
2501  }
2502
2503  // Required to silence a GCC warning
2504  return 0;
2505}
2506
2507
2508const ArrayType *ASTContext::getAsArrayType(QualType T) {
2509  // Handle the non-qualified case efficiently.
2510  if (!T.hasLocalQualifiers()) {
2511    // Handle the common positive case fast.
2512    if (const ArrayType *AT = dyn_cast<ArrayType>(T))
2513      return AT;
2514  }
2515
2516  // Handle the common negative case fast.
2517  QualType CType = T->getCanonicalTypeInternal();
2518  if (!isa<ArrayType>(CType))
2519    return 0;
2520
2521  // Apply any qualifiers from the array type to the element type.  This
2522  // implements C99 6.7.3p8: "If the specification of an array type includes
2523  // any type qualifiers, the element type is so qualified, not the array type."
2524
2525  // If we get here, we either have type qualifiers on the type, or we have
2526  // sugar such as a typedef in the way.  If we have type qualifiers on the type
2527  // we must propagate them down into the element type.
2528
2529  QualifierCollector Qs;
2530  const Type *Ty = Qs.strip(T.getDesugaredType());
2531
2532  // If we have a simple case, just return now.
2533  const ArrayType *ATy = dyn_cast<ArrayType>(Ty);
2534  if (ATy == 0 || Qs.empty())
2535    return ATy;
2536
2537  // Otherwise, we have an array and we have qualifiers on it.  Push the
2538  // qualifiers into the array element type and return a new array type.
2539  // Get the canonical version of the element with the extra qualifiers on it.
2540  // This can recursively sink qualifiers through multiple levels of arrays.
2541  QualType NewEltTy = getQualifiedType(ATy->getElementType(), Qs);
2542
2543  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy))
2544    return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(),
2545                                                CAT->getSizeModifier(),
2546                                           CAT->getIndexTypeCVRQualifiers()));
2547  if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy))
2548    return cast<ArrayType>(getIncompleteArrayType(NewEltTy,
2549                                                  IAT->getSizeModifier(),
2550                                           IAT->getIndexTypeCVRQualifiers()));
2551
2552  if (const DependentSizedArrayType *DSAT
2553        = dyn_cast<DependentSizedArrayType>(ATy))
2554    return cast<ArrayType>(
2555                     getDependentSizedArrayType(NewEltTy,
2556                                                DSAT->getSizeExpr() ?
2557                                              DSAT->getSizeExpr()->Retain() : 0,
2558                                                DSAT->getSizeModifier(),
2559                                              DSAT->getIndexTypeCVRQualifiers(),
2560                                                DSAT->getBracketsRange()));
2561
2562  const VariableArrayType *VAT = cast<VariableArrayType>(ATy);
2563  return cast<ArrayType>(getVariableArrayType(NewEltTy,
2564                                              VAT->getSizeExpr() ?
2565                                              VAT->getSizeExpr()->Retain() : 0,
2566                                              VAT->getSizeModifier(),
2567                                              VAT->getIndexTypeCVRQualifiers(),
2568                                              VAT->getBracketsRange()));
2569}
2570
2571
2572/// getArrayDecayedType - Return the properly qualified result of decaying the
2573/// specified array type to a pointer.  This operation is non-trivial when
2574/// handling typedefs etc.  The canonical type of "T" must be an array type,
2575/// this returns a pointer to a properly qualified element of the array.
2576///
2577/// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
2578QualType ASTContext::getArrayDecayedType(QualType Ty) {
2579  // Get the element type with 'getAsArrayType' so that we don't lose any
2580  // typedefs in the element type of the array.  This also handles propagation
2581  // of type qualifiers from the array type into the element type if present
2582  // (C99 6.7.3p8).
2583  const ArrayType *PrettyArrayType = getAsArrayType(Ty);
2584  assert(PrettyArrayType && "Not an array type!");
2585
2586  QualType PtrTy = getPointerType(PrettyArrayType->getElementType());
2587
2588  // int x[restrict 4] ->  int *restrict
2589  return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers());
2590}
2591
2592QualType ASTContext::getBaseElementType(QualType QT) {
2593  QualifierCollector Qs;
2594  while (const ArrayType *AT = getAsArrayType(QualType(Qs.strip(QT), 0)))
2595    QT = AT->getElementType();
2596  return Qs.apply(QT);
2597}
2598
2599QualType ASTContext::getBaseElementType(const ArrayType *AT) {
2600  QualType ElemTy = AT->getElementType();
2601
2602  if (const ArrayType *AT = getAsArrayType(ElemTy))
2603    return getBaseElementType(AT);
2604
2605  return ElemTy;
2606}
2607
2608/// getConstantArrayElementCount - Returns number of constant array elements.
2609uint64_t
2610ASTContext::getConstantArrayElementCount(const ConstantArrayType *CA)  const {
2611  uint64_t ElementCount = 1;
2612  do {
2613    ElementCount *= CA->getSize().getZExtValue();
2614    CA = dyn_cast<ConstantArrayType>(CA->getElementType());
2615  } while (CA);
2616  return ElementCount;
2617}
2618
2619/// getFloatingRank - Return a relative rank for floating point types.
2620/// This routine will assert if passed a built-in type that isn't a float.
2621static FloatingRank getFloatingRank(QualType T) {
2622  if (const ComplexType *CT = T->getAs<ComplexType>())
2623    return getFloatingRank(CT->getElementType());
2624
2625  assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type");
2626  switch (T->getAs<BuiltinType>()->getKind()) {
2627  default: assert(0 && "getFloatingRank(): not a floating type");
2628  case BuiltinType::Float:      return FloatRank;
2629  case BuiltinType::Double:     return DoubleRank;
2630  case BuiltinType::LongDouble: return LongDoubleRank;
2631  }
2632}
2633
2634/// getFloatingTypeOfSizeWithinDomain - Returns a real floating
2635/// point or a complex type (based on typeDomain/typeSize).
2636/// 'typeDomain' is a real floating point or complex type.
2637/// 'typeSize' is a real floating point or complex type.
2638QualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size,
2639                                                       QualType Domain) const {
2640  FloatingRank EltRank = getFloatingRank(Size);
2641  if (Domain->isComplexType()) {
2642    switch (EltRank) {
2643    default: assert(0 && "getFloatingRank(): illegal value for rank");
2644    case FloatRank:      return FloatComplexTy;
2645    case DoubleRank:     return DoubleComplexTy;
2646    case LongDoubleRank: return LongDoubleComplexTy;
2647    }
2648  }
2649
2650  assert(Domain->isRealFloatingType() && "Unknown domain!");
2651  switch (EltRank) {
2652  default: assert(0 && "getFloatingRank(): illegal value for rank");
2653  case FloatRank:      return FloatTy;
2654  case DoubleRank:     return DoubleTy;
2655  case LongDoubleRank: return LongDoubleTy;
2656  }
2657}
2658
2659/// getFloatingTypeOrder - Compare the rank of the two specified floating
2660/// point types, ignoring the domain of the type (i.e. 'double' ==
2661/// '_Complex double').  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
2662/// LHS < RHS, return -1.
2663int ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) {
2664  FloatingRank LHSR = getFloatingRank(LHS);
2665  FloatingRank RHSR = getFloatingRank(RHS);
2666
2667  if (LHSR == RHSR)
2668    return 0;
2669  if (LHSR > RHSR)
2670    return 1;
2671  return -1;
2672}
2673
2674/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This
2675/// routine will assert if passed a built-in type that isn't an integer or enum,
2676/// or if it is not canonicalized.
2677unsigned ASTContext::getIntegerRank(Type *T) {
2678  assert(T->isCanonicalUnqualified() && "T should be canonicalized");
2679  if (EnumType* ET = dyn_cast<EnumType>(T))
2680    T = ET->getDecl()->getPromotionType().getTypePtr();
2681
2682  if (T->isSpecificBuiltinType(BuiltinType::WChar))
2683    T = getFromTargetType(Target.getWCharType()).getTypePtr();
2684
2685  if (T->isSpecificBuiltinType(BuiltinType::Char16))
2686    T = getFromTargetType(Target.getChar16Type()).getTypePtr();
2687
2688  if (T->isSpecificBuiltinType(BuiltinType::Char32))
2689    T = getFromTargetType(Target.getChar32Type()).getTypePtr();
2690
2691  switch (cast<BuiltinType>(T)->getKind()) {
2692  default: assert(0 && "getIntegerRank(): not a built-in integer");
2693  case BuiltinType::Bool:
2694    return 1 + (getIntWidth(BoolTy) << 3);
2695  case BuiltinType::Char_S:
2696  case BuiltinType::Char_U:
2697  case BuiltinType::SChar:
2698  case BuiltinType::UChar:
2699    return 2 + (getIntWidth(CharTy) << 3);
2700  case BuiltinType::Short:
2701  case BuiltinType::UShort:
2702    return 3 + (getIntWidth(ShortTy) << 3);
2703  case BuiltinType::Int:
2704  case BuiltinType::UInt:
2705    return 4 + (getIntWidth(IntTy) << 3);
2706  case BuiltinType::Long:
2707  case BuiltinType::ULong:
2708    return 5 + (getIntWidth(LongTy) << 3);
2709  case BuiltinType::LongLong:
2710  case BuiltinType::ULongLong:
2711    return 6 + (getIntWidth(LongLongTy) << 3);
2712  case BuiltinType::Int128:
2713  case BuiltinType::UInt128:
2714    return 7 + (getIntWidth(Int128Ty) << 3);
2715  }
2716}
2717
2718/// \brief Whether this is a promotable bitfield reference according
2719/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
2720///
2721/// \returns the type this bit-field will promote to, or NULL if no
2722/// promotion occurs.
2723QualType ASTContext::isPromotableBitField(Expr *E) {
2724  FieldDecl *Field = E->getBitField();
2725  if (!Field)
2726    return QualType();
2727
2728  QualType FT = Field->getType();
2729
2730  llvm::APSInt BitWidthAP = Field->getBitWidth()->EvaluateAsInt(*this);
2731  uint64_t BitWidth = BitWidthAP.getZExtValue();
2732  uint64_t IntSize = getTypeSize(IntTy);
2733  // GCC extension compatibility: if the bit-field size is less than or equal
2734  // to the size of int, it gets promoted no matter what its type is.
2735  // For instance, unsigned long bf : 4 gets promoted to signed int.
2736  if (BitWidth < IntSize)
2737    return IntTy;
2738
2739  if (BitWidth == IntSize)
2740    return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy;
2741
2742  // Types bigger than int are not subject to promotions, and therefore act
2743  // like the base type.
2744  // FIXME: This doesn't quite match what gcc does, but what gcc does here
2745  // is ridiculous.
2746  return QualType();
2747}
2748
2749/// getPromotedIntegerType - Returns the type that Promotable will
2750/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable
2751/// integer type.
2752QualType ASTContext::getPromotedIntegerType(QualType Promotable) {
2753  assert(!Promotable.isNull());
2754  assert(Promotable->isPromotableIntegerType());
2755  if (const EnumType *ET = Promotable->getAs<EnumType>())
2756    return ET->getDecl()->getPromotionType();
2757  if (Promotable->isSignedIntegerType())
2758    return IntTy;
2759  uint64_t PromotableSize = getTypeSize(Promotable);
2760  uint64_t IntSize = getTypeSize(IntTy);
2761  assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize);
2762  return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy;
2763}
2764
2765/// getIntegerTypeOrder - Returns the highest ranked integer type:
2766/// C99 6.3.1.8p1.  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
2767/// LHS < RHS, return -1.
2768int ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) {
2769  Type *LHSC = getCanonicalType(LHS).getTypePtr();
2770  Type *RHSC = getCanonicalType(RHS).getTypePtr();
2771  if (LHSC == RHSC) return 0;
2772
2773  bool LHSUnsigned = LHSC->isUnsignedIntegerType();
2774  bool RHSUnsigned = RHSC->isUnsignedIntegerType();
2775
2776  unsigned LHSRank = getIntegerRank(LHSC);
2777  unsigned RHSRank = getIntegerRank(RHSC);
2778
2779  if (LHSUnsigned == RHSUnsigned) {  // Both signed or both unsigned.
2780    if (LHSRank == RHSRank) return 0;
2781    return LHSRank > RHSRank ? 1 : -1;
2782  }
2783
2784  // Otherwise, the LHS is signed and the RHS is unsigned or visa versa.
2785  if (LHSUnsigned) {
2786    // If the unsigned [LHS] type is larger, return it.
2787    if (LHSRank >= RHSRank)
2788      return 1;
2789
2790    // If the signed type can represent all values of the unsigned type, it
2791    // wins.  Because we are dealing with 2's complement and types that are
2792    // powers of two larger than each other, this is always safe.
2793    return -1;
2794  }
2795
2796  // If the unsigned [RHS] type is larger, return it.
2797  if (RHSRank >= LHSRank)
2798    return -1;
2799
2800  // If the signed type can represent all values of the unsigned type, it
2801  // wins.  Because we are dealing with 2's complement and types that are
2802  // powers of two larger than each other, this is always safe.
2803  return 1;
2804}
2805
2806static RecordDecl *
2807CreateRecordDecl(ASTContext &Ctx, RecordDecl::TagKind TK, DeclContext *DC,
2808                 SourceLocation L, IdentifierInfo *Id) {
2809  if (Ctx.getLangOptions().CPlusPlus)
2810    return CXXRecordDecl::Create(Ctx, TK, DC, L, Id);
2811  else
2812    return RecordDecl::Create(Ctx, TK, DC, L, Id);
2813}
2814
2815// getCFConstantStringType - Return the type used for constant CFStrings.
2816QualType ASTContext::getCFConstantStringType() {
2817  if (!CFConstantStringTypeDecl) {
2818    CFConstantStringTypeDecl =
2819      CreateRecordDecl(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
2820                       &Idents.get("NSConstantString"));
2821    CFConstantStringTypeDecl->startDefinition();
2822
2823    QualType FieldTypes[4];
2824
2825    // const int *isa;
2826    FieldTypes[0] = getPointerType(IntTy.withConst());
2827    // int flags;
2828    FieldTypes[1] = IntTy;
2829    // const char *str;
2830    FieldTypes[2] = getPointerType(CharTy.withConst());
2831    // long length;
2832    FieldTypes[3] = LongTy;
2833
2834    // Create fields
2835    for (unsigned i = 0; i < 4; ++i) {
2836      FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl,
2837                                           SourceLocation(), 0,
2838                                           FieldTypes[i], /*TInfo=*/0,
2839                                           /*BitWidth=*/0,
2840                                           /*Mutable=*/false);
2841      Field->setAccess(AS_public);
2842      CFConstantStringTypeDecl->addDecl(Field);
2843    }
2844
2845    CFConstantStringTypeDecl->completeDefinition();
2846  }
2847
2848  return getTagDeclType(CFConstantStringTypeDecl);
2849}
2850
2851void ASTContext::setCFConstantStringType(QualType T) {
2852  const RecordType *Rec = T->getAs<RecordType>();
2853  assert(Rec && "Invalid CFConstantStringType");
2854  CFConstantStringTypeDecl = Rec->getDecl();
2855}
2856
2857// getNSConstantStringType - Return the type used for constant NSStrings.
2858QualType ASTContext::getNSConstantStringType() {
2859  if (!NSConstantStringTypeDecl) {
2860    NSConstantStringTypeDecl =
2861    CreateRecordDecl(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
2862                     &Idents.get("__builtin_NSString"));
2863    NSConstantStringTypeDecl->startDefinition();
2864
2865    QualType FieldTypes[3];
2866
2867    // const int *isa;
2868    FieldTypes[0] = getPointerType(IntTy.withConst());
2869    // const char *str;
2870    FieldTypes[1] = getPointerType(CharTy.withConst());
2871    // unsigned int length;
2872    FieldTypes[2] = UnsignedIntTy;
2873
2874    // Create fields
2875    for (unsigned i = 0; i < 3; ++i) {
2876      FieldDecl *Field = FieldDecl::Create(*this, NSConstantStringTypeDecl,
2877                                           SourceLocation(), 0,
2878                                           FieldTypes[i], /*TInfo=*/0,
2879                                           /*BitWidth=*/0,
2880                                           /*Mutable=*/false);
2881      Field->setAccess(AS_public);
2882      NSConstantStringTypeDecl->addDecl(Field);
2883    }
2884
2885    NSConstantStringTypeDecl->completeDefinition();
2886  }
2887
2888  return getTagDeclType(NSConstantStringTypeDecl);
2889}
2890
2891void ASTContext::setNSConstantStringType(QualType T) {
2892  const RecordType *Rec = T->getAs<RecordType>();
2893  assert(Rec && "Invalid NSConstantStringType");
2894  NSConstantStringTypeDecl = Rec->getDecl();
2895}
2896
2897QualType ASTContext::getObjCFastEnumerationStateType() {
2898  if (!ObjCFastEnumerationStateTypeDecl) {
2899    ObjCFastEnumerationStateTypeDecl =
2900      CreateRecordDecl(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
2901                       &Idents.get("__objcFastEnumerationState"));
2902    ObjCFastEnumerationStateTypeDecl->startDefinition();
2903
2904    QualType FieldTypes[] = {
2905      UnsignedLongTy,
2906      getPointerType(ObjCIdTypedefType),
2907      getPointerType(UnsignedLongTy),
2908      getConstantArrayType(UnsignedLongTy,
2909                           llvm::APInt(32, 5), ArrayType::Normal, 0)
2910    };
2911
2912    for (size_t i = 0; i < 4; ++i) {
2913      FieldDecl *Field = FieldDecl::Create(*this,
2914                                           ObjCFastEnumerationStateTypeDecl,
2915                                           SourceLocation(), 0,
2916                                           FieldTypes[i], /*TInfo=*/0,
2917                                           /*BitWidth=*/0,
2918                                           /*Mutable=*/false);
2919      Field->setAccess(AS_public);
2920      ObjCFastEnumerationStateTypeDecl->addDecl(Field);
2921    }
2922
2923    ObjCFastEnumerationStateTypeDecl->completeDefinition();
2924  }
2925
2926  return getTagDeclType(ObjCFastEnumerationStateTypeDecl);
2927}
2928
2929QualType ASTContext::getBlockDescriptorType() {
2930  if (BlockDescriptorType)
2931    return getTagDeclType(BlockDescriptorType);
2932
2933  RecordDecl *T;
2934  // FIXME: Needs the FlagAppleBlock bit.
2935  T = CreateRecordDecl(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
2936                       &Idents.get("__block_descriptor"));
2937  T->startDefinition();
2938
2939  QualType FieldTypes[] = {
2940    UnsignedLongTy,
2941    UnsignedLongTy,
2942  };
2943
2944  const char *FieldNames[] = {
2945    "reserved",
2946    "Size"
2947  };
2948
2949  for (size_t i = 0; i < 2; ++i) {
2950    FieldDecl *Field = FieldDecl::Create(*this,
2951                                         T,
2952                                         SourceLocation(),
2953                                         &Idents.get(FieldNames[i]),
2954                                         FieldTypes[i], /*TInfo=*/0,
2955                                         /*BitWidth=*/0,
2956                                         /*Mutable=*/false);
2957    Field->setAccess(AS_public);
2958    T->addDecl(Field);
2959  }
2960
2961  T->completeDefinition();
2962
2963  BlockDescriptorType = T;
2964
2965  return getTagDeclType(BlockDescriptorType);
2966}
2967
2968void ASTContext::setBlockDescriptorType(QualType T) {
2969  const RecordType *Rec = T->getAs<RecordType>();
2970  assert(Rec && "Invalid BlockDescriptorType");
2971  BlockDescriptorType = Rec->getDecl();
2972}
2973
2974QualType ASTContext::getBlockDescriptorExtendedType() {
2975  if (BlockDescriptorExtendedType)
2976    return getTagDeclType(BlockDescriptorExtendedType);
2977
2978  RecordDecl *T;
2979  // FIXME: Needs the FlagAppleBlock bit.
2980  T = CreateRecordDecl(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
2981                       &Idents.get("__block_descriptor_withcopydispose"));
2982  T->startDefinition();
2983
2984  QualType FieldTypes[] = {
2985    UnsignedLongTy,
2986    UnsignedLongTy,
2987    getPointerType(VoidPtrTy),
2988    getPointerType(VoidPtrTy)
2989  };
2990
2991  const char *FieldNames[] = {
2992    "reserved",
2993    "Size",
2994    "CopyFuncPtr",
2995    "DestroyFuncPtr"
2996  };
2997
2998  for (size_t i = 0; i < 4; ++i) {
2999    FieldDecl *Field = FieldDecl::Create(*this,
3000                                         T,
3001                                         SourceLocation(),
3002                                         &Idents.get(FieldNames[i]),
3003                                         FieldTypes[i], /*TInfo=*/0,
3004                                         /*BitWidth=*/0,
3005                                         /*Mutable=*/false);
3006    Field->setAccess(AS_public);
3007    T->addDecl(Field);
3008  }
3009
3010  T->completeDefinition();
3011
3012  BlockDescriptorExtendedType = T;
3013
3014  return getTagDeclType(BlockDescriptorExtendedType);
3015}
3016
3017void ASTContext::setBlockDescriptorExtendedType(QualType T) {
3018  const RecordType *Rec = T->getAs<RecordType>();
3019  assert(Rec && "Invalid BlockDescriptorType");
3020  BlockDescriptorExtendedType = Rec->getDecl();
3021}
3022
3023bool ASTContext::BlockRequiresCopying(QualType Ty) {
3024  if (Ty->isBlockPointerType())
3025    return true;
3026  if (isObjCNSObjectType(Ty))
3027    return true;
3028  if (Ty->isObjCObjectPointerType())
3029    return true;
3030  return false;
3031}
3032
3033QualType ASTContext::BuildByRefType(const char *DeclName, QualType Ty) {
3034  //  type = struct __Block_byref_1_X {
3035  //    void *__isa;
3036  //    struct __Block_byref_1_X *__forwarding;
3037  //    unsigned int __flags;
3038  //    unsigned int __size;
3039  //    void *__copy_helper;		// as needed
3040  //    void *__destroy_help		// as needed
3041  //    int X;
3042  //  } *
3043
3044  bool HasCopyAndDispose = BlockRequiresCopying(Ty);
3045
3046  // FIXME: Move up
3047  static unsigned int UniqueBlockByRefTypeID = 0;
3048  llvm::SmallString<36> Name;
3049  llvm::raw_svector_ostream(Name) << "__Block_byref_" <<
3050                                  ++UniqueBlockByRefTypeID << '_' << DeclName;
3051  RecordDecl *T;
3052  T = CreateRecordDecl(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
3053                       &Idents.get(Name.str()));
3054  T->startDefinition();
3055  QualType Int32Ty = IntTy;
3056  assert(getIntWidth(IntTy) == 32 && "non-32bit int not supported");
3057  QualType FieldTypes[] = {
3058    getPointerType(VoidPtrTy),
3059    getPointerType(getTagDeclType(T)),
3060    Int32Ty,
3061    Int32Ty,
3062    getPointerType(VoidPtrTy),
3063    getPointerType(VoidPtrTy),
3064    Ty
3065  };
3066
3067  const char *FieldNames[] = {
3068    "__isa",
3069    "__forwarding",
3070    "__flags",
3071    "__size",
3072    "__copy_helper",
3073    "__destroy_helper",
3074    DeclName,
3075  };
3076
3077  for (size_t i = 0; i < 7; ++i) {
3078    if (!HasCopyAndDispose && i >=4 && i <= 5)
3079      continue;
3080    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
3081                                         &Idents.get(FieldNames[i]),
3082                                         FieldTypes[i], /*TInfo=*/0,
3083                                         /*BitWidth=*/0, /*Mutable=*/false);
3084    Field->setAccess(AS_public);
3085    T->addDecl(Field);
3086  }
3087
3088  T->completeDefinition();
3089
3090  return getPointerType(getTagDeclType(T));
3091}
3092
3093
3094QualType ASTContext::getBlockParmType(
3095  bool BlockHasCopyDispose,
3096  llvm::SmallVector<const Expr *, 8> &BlockDeclRefDecls) {
3097  // FIXME: Move up
3098  static unsigned int UniqueBlockParmTypeID = 0;
3099  llvm::SmallString<36> Name;
3100  llvm::raw_svector_ostream(Name) << "__block_literal_"
3101                                  << ++UniqueBlockParmTypeID;
3102  RecordDecl *T;
3103  T = CreateRecordDecl(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
3104                       &Idents.get(Name.str()));
3105  T->startDefinition();
3106  QualType FieldTypes[] = {
3107    getPointerType(VoidPtrTy),
3108    IntTy,
3109    IntTy,
3110    getPointerType(VoidPtrTy),
3111    (BlockHasCopyDispose ?
3112     getPointerType(getBlockDescriptorExtendedType()) :
3113     getPointerType(getBlockDescriptorType()))
3114  };
3115
3116  const char *FieldNames[] = {
3117    "__isa",
3118    "__flags",
3119    "__reserved",
3120    "__FuncPtr",
3121    "__descriptor"
3122  };
3123
3124  for (size_t i = 0; i < 5; ++i) {
3125    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
3126                                         &Idents.get(FieldNames[i]),
3127                                         FieldTypes[i], /*TInfo=*/0,
3128                                         /*BitWidth=*/0, /*Mutable=*/false);
3129    Field->setAccess(AS_public);
3130    T->addDecl(Field);
3131  }
3132
3133  for (size_t i = 0; i < BlockDeclRefDecls.size(); ++i) {
3134    const Expr *E = BlockDeclRefDecls[i];
3135    const BlockDeclRefExpr *BDRE = dyn_cast<BlockDeclRefExpr>(E);
3136    clang::IdentifierInfo *Name = 0;
3137    if (BDRE) {
3138      const ValueDecl *D = BDRE->getDecl();
3139      Name = &Idents.get(D->getName());
3140    }
3141    QualType FieldType = E->getType();
3142
3143    if (BDRE && BDRE->isByRef())
3144      FieldType = BuildByRefType(BDRE->getDecl()->getNameAsCString(),
3145                                 FieldType);
3146
3147    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
3148                                         Name, FieldType, /*TInfo=*/0,
3149                                         /*BitWidth=*/0, /*Mutable=*/false);
3150    Field->setAccess(AS_public);
3151    T->addDecl(Field);
3152  }
3153
3154  T->completeDefinition();
3155
3156  return getPointerType(getTagDeclType(T));
3157}
3158
3159void ASTContext::setObjCFastEnumerationStateType(QualType T) {
3160  const RecordType *Rec = T->getAs<RecordType>();
3161  assert(Rec && "Invalid ObjCFAstEnumerationStateType");
3162  ObjCFastEnumerationStateTypeDecl = Rec->getDecl();
3163}
3164
3165// This returns true if a type has been typedefed to BOOL:
3166// typedef <type> BOOL;
3167static bool isTypeTypedefedAsBOOL(QualType T) {
3168  if (const TypedefType *TT = dyn_cast<TypedefType>(T))
3169    if (IdentifierInfo *II = TT->getDecl()->getIdentifier())
3170      return II->isStr("BOOL");
3171
3172  return false;
3173}
3174
3175/// getObjCEncodingTypeSize returns size of type for objective-c encoding
3176/// purpose.
3177CharUnits ASTContext::getObjCEncodingTypeSize(QualType type) {
3178  CharUnits sz = getTypeSizeInChars(type);
3179
3180  // Make all integer and enum types at least as large as an int
3181  if (sz.isPositive() && type->isIntegralType())
3182    sz = std::max(sz, getTypeSizeInChars(IntTy));
3183  // Treat arrays as pointers, since that's how they're passed in.
3184  else if (type->isArrayType())
3185    sz = getTypeSizeInChars(VoidPtrTy);
3186  return sz;
3187}
3188
3189static inline
3190std::string charUnitsToString(const CharUnits &CU) {
3191  return llvm::itostr(CU.getQuantity());
3192}
3193
3194/// getObjCEncodingForBlockDecl - Return the encoded type for this block
3195/// declaration.
3196void ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr,
3197                                             std::string& S) {
3198  const BlockDecl *Decl = Expr->getBlockDecl();
3199  QualType BlockTy =
3200      Expr->getType()->getAs<BlockPointerType>()->getPointeeType();
3201  // Encode result type.
3202  getObjCEncodingForType(cast<FunctionType>(BlockTy)->getResultType(), S);
3203  // Compute size of all parameters.
3204  // Start with computing size of a pointer in number of bytes.
3205  // FIXME: There might(should) be a better way of doing this computation!
3206  SourceLocation Loc;
3207  CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
3208  CharUnits ParmOffset = PtrSize;
3209  for (BlockDecl::param_const_iterator PI = Decl->param_begin(),
3210       E = Decl->param_end(); PI != E; ++PI) {
3211    QualType PType = (*PI)->getType();
3212    CharUnits sz = getObjCEncodingTypeSize(PType);
3213    assert (sz.isPositive() && "BlockExpr - Incomplete param type");
3214    ParmOffset += sz;
3215  }
3216  // Size of the argument frame
3217  S += charUnitsToString(ParmOffset);
3218  // Block pointer and offset.
3219  S += "@?0";
3220  ParmOffset = PtrSize;
3221
3222  // Argument types.
3223  ParmOffset = PtrSize;
3224  for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E =
3225       Decl->param_end(); PI != E; ++PI) {
3226    ParmVarDecl *PVDecl = *PI;
3227    QualType PType = PVDecl->getOriginalType();
3228    if (const ArrayType *AT =
3229          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
3230      // Use array's original type only if it has known number of
3231      // elements.
3232      if (!isa<ConstantArrayType>(AT))
3233        PType = PVDecl->getType();
3234    } else if (PType->isFunctionType())
3235      PType = PVDecl->getType();
3236    getObjCEncodingForType(PType, S);
3237    S += charUnitsToString(ParmOffset);
3238    ParmOffset += getObjCEncodingTypeSize(PType);
3239  }
3240}
3241
3242/// getObjCEncodingForMethodDecl - Return the encoded type for this method
3243/// declaration.
3244void ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
3245                                              std::string& S) {
3246  // FIXME: This is not very efficient.
3247  // Encode type qualifer, 'in', 'inout', etc. for the return type.
3248  getObjCEncodingForTypeQualifier(Decl->getObjCDeclQualifier(), S);
3249  // Encode result type.
3250  getObjCEncodingForType(Decl->getResultType(), S);
3251  // Compute size of all parameters.
3252  // Start with computing size of a pointer in number of bytes.
3253  // FIXME: There might(should) be a better way of doing this computation!
3254  SourceLocation Loc;
3255  CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
3256  // The first two arguments (self and _cmd) are pointers; account for
3257  // their size.
3258  CharUnits ParmOffset = 2 * PtrSize;
3259  for (ObjCMethodDecl::param_iterator PI = Decl->param_begin(),
3260       E = Decl->sel_param_end(); PI != E; ++PI) {
3261    QualType PType = (*PI)->getType();
3262    CharUnits sz = getObjCEncodingTypeSize(PType);
3263    assert (sz.isPositive() &&
3264        "getObjCEncodingForMethodDecl - Incomplete param type");
3265    ParmOffset += sz;
3266  }
3267  S += charUnitsToString(ParmOffset);
3268  S += "@0:";
3269  S += charUnitsToString(PtrSize);
3270
3271  // Argument types.
3272  ParmOffset = 2 * PtrSize;
3273  for (ObjCMethodDecl::param_iterator PI = Decl->param_begin(),
3274       E = Decl->sel_param_end(); PI != E; ++PI) {
3275    ParmVarDecl *PVDecl = *PI;
3276    QualType PType = PVDecl->getOriginalType();
3277    if (const ArrayType *AT =
3278          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
3279      // Use array's original type only if it has known number of
3280      // elements.
3281      if (!isa<ConstantArrayType>(AT))
3282        PType = PVDecl->getType();
3283    } else if (PType->isFunctionType())
3284      PType = PVDecl->getType();
3285    // Process argument qualifiers for user supplied arguments; such as,
3286    // 'in', 'inout', etc.
3287    getObjCEncodingForTypeQualifier(PVDecl->getObjCDeclQualifier(), S);
3288    getObjCEncodingForType(PType, S);
3289    S += charUnitsToString(ParmOffset);
3290    ParmOffset += getObjCEncodingTypeSize(PType);
3291  }
3292}
3293
3294/// getObjCEncodingForPropertyDecl - Return the encoded type for this
3295/// property declaration. If non-NULL, Container must be either an
3296/// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be
3297/// NULL when getting encodings for protocol properties.
3298/// Property attributes are stored as a comma-delimited C string. The simple
3299/// attributes readonly and bycopy are encoded as single characters. The
3300/// parametrized attributes, getter=name, setter=name, and ivar=name, are
3301/// encoded as single characters, followed by an identifier. Property types
3302/// are also encoded as a parametrized attribute. The characters used to encode
3303/// these attributes are defined by the following enumeration:
3304/// @code
3305/// enum PropertyAttributes {
3306/// kPropertyReadOnly = 'R',   // property is read-only.
3307/// kPropertyBycopy = 'C',     // property is a copy of the value last assigned
3308/// kPropertyByref = '&',  // property is a reference to the value last assigned
3309/// kPropertyDynamic = 'D',    // property is dynamic
3310/// kPropertyGetter = 'G',     // followed by getter selector name
3311/// kPropertySetter = 'S',     // followed by setter selector name
3312/// kPropertyInstanceVariable = 'V'  // followed by instance variable  name
3313/// kPropertyType = 't'              // followed by old-style type encoding.
3314/// kPropertyWeak = 'W'              // 'weak' property
3315/// kPropertyStrong = 'P'            // property GC'able
3316/// kPropertyNonAtomic = 'N'         // property non-atomic
3317/// };
3318/// @endcode
3319void ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
3320                                                const Decl *Container,
3321                                                std::string& S) {
3322  // Collect information from the property implementation decl(s).
3323  bool Dynamic = false;
3324  ObjCPropertyImplDecl *SynthesizePID = 0;
3325
3326  // FIXME: Duplicated code due to poor abstraction.
3327  if (Container) {
3328    if (const ObjCCategoryImplDecl *CID =
3329        dyn_cast<ObjCCategoryImplDecl>(Container)) {
3330      for (ObjCCategoryImplDecl::propimpl_iterator
3331             i = CID->propimpl_begin(), e = CID->propimpl_end();
3332           i != e; ++i) {
3333        ObjCPropertyImplDecl *PID = *i;
3334        if (PID->getPropertyDecl() == PD) {
3335          if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
3336            Dynamic = true;
3337          } else {
3338            SynthesizePID = PID;
3339          }
3340        }
3341      }
3342    } else {
3343      const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container);
3344      for (ObjCCategoryImplDecl::propimpl_iterator
3345             i = OID->propimpl_begin(), e = OID->propimpl_end();
3346           i != e; ++i) {
3347        ObjCPropertyImplDecl *PID = *i;
3348        if (PID->getPropertyDecl() == PD) {
3349          if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
3350            Dynamic = true;
3351          } else {
3352            SynthesizePID = PID;
3353          }
3354        }
3355      }
3356    }
3357  }
3358
3359  // FIXME: This is not very efficient.
3360  S = "T";
3361
3362  // Encode result type.
3363  // GCC has some special rules regarding encoding of properties which
3364  // closely resembles encoding of ivars.
3365  getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0,
3366                             true /* outermost type */,
3367                             true /* encoding for property */);
3368
3369  if (PD->isReadOnly()) {
3370    S += ",R";
3371  } else {
3372    switch (PD->getSetterKind()) {
3373    case ObjCPropertyDecl::Assign: break;
3374    case ObjCPropertyDecl::Copy:   S += ",C"; break;
3375    case ObjCPropertyDecl::Retain: S += ",&"; break;
3376    }
3377  }
3378
3379  // It really isn't clear at all what this means, since properties
3380  // are "dynamic by default".
3381  if (Dynamic)
3382    S += ",D";
3383
3384  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic)
3385    S += ",N";
3386
3387  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
3388    S += ",G";
3389    S += PD->getGetterName().getAsString();
3390  }
3391
3392  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
3393    S += ",S";
3394    S += PD->getSetterName().getAsString();
3395  }
3396
3397  if (SynthesizePID) {
3398    const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl();
3399    S += ",V";
3400    S += OID->getNameAsString();
3401  }
3402
3403  // FIXME: OBJCGC: weak & strong
3404}
3405
3406/// getLegacyIntegralTypeEncoding -
3407/// Another legacy compatibility encoding: 32-bit longs are encoded as
3408/// 'l' or 'L' , but not always.  For typedefs, we need to use
3409/// 'i' or 'I' instead if encoding a struct field, or a pointer!
3410///
3411void ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const {
3412  if (isa<TypedefType>(PointeeTy.getTypePtr())) {
3413    if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) {
3414      if (BT->getKind() == BuiltinType::ULong &&
3415          ((const_cast<ASTContext *>(this))->getIntWidth(PointeeTy) == 32))
3416        PointeeTy = UnsignedIntTy;
3417      else
3418        if (BT->getKind() == BuiltinType::Long &&
3419            ((const_cast<ASTContext *>(this))->getIntWidth(PointeeTy) == 32))
3420          PointeeTy = IntTy;
3421    }
3422  }
3423}
3424
3425void ASTContext::getObjCEncodingForType(QualType T, std::string& S,
3426                                        const FieldDecl *Field) {
3427  // We follow the behavior of gcc, expanding structures which are
3428  // directly pointed to, and expanding embedded structures. Note that
3429  // these rules are sufficient to prevent recursive encoding of the
3430  // same type.
3431  getObjCEncodingForTypeImpl(T, S, true, true, Field,
3432                             true /* outermost type */);
3433}
3434
3435static void EncodeBitField(const ASTContext *Context, std::string& S,
3436                           const FieldDecl *FD) {
3437  const Expr *E = FD->getBitWidth();
3438  assert(E && "bitfield width not there - getObjCEncodingForTypeImpl");
3439  ASTContext *Ctx = const_cast<ASTContext*>(Context);
3440  unsigned N = E->EvaluateAsInt(*Ctx).getZExtValue();
3441  S += 'b';
3442  S += llvm::utostr(N);
3443}
3444
3445// FIXME: Use SmallString for accumulating string.
3446void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
3447                                            bool ExpandPointedToStructures,
3448                                            bool ExpandStructures,
3449                                            const FieldDecl *FD,
3450                                            bool OutermostType,
3451                                            bool EncodingProperty) {
3452  if (const BuiltinType *BT = T->getAs<BuiltinType>()) {
3453    if (FD && FD->isBitField())
3454      return EncodeBitField(this, S, FD);
3455    char encoding;
3456    switch (BT->getKind()) {
3457    default: assert(0 && "Unhandled builtin type kind");
3458    case BuiltinType::Void:       encoding = 'v'; break;
3459    case BuiltinType::Bool:       encoding = 'B'; break;
3460    case BuiltinType::Char_U:
3461    case BuiltinType::UChar:      encoding = 'C'; break;
3462    case BuiltinType::UShort:     encoding = 'S'; break;
3463    case BuiltinType::UInt:       encoding = 'I'; break;
3464    case BuiltinType::ULong:
3465        encoding =
3466          (const_cast<ASTContext *>(this))->getIntWidth(T) == 32 ? 'L' : 'Q';
3467        break;
3468    case BuiltinType::UInt128:    encoding = 'T'; break;
3469    case BuiltinType::ULongLong:  encoding = 'Q'; break;
3470    case BuiltinType::Char_S:
3471    case BuiltinType::SChar:      encoding = 'c'; break;
3472    case BuiltinType::Short:      encoding = 's'; break;
3473    case BuiltinType::Int:        encoding = 'i'; break;
3474    case BuiltinType::Long:
3475      encoding =
3476        (const_cast<ASTContext *>(this))->getIntWidth(T) == 32 ? 'l' : 'q';
3477      break;
3478    case BuiltinType::LongLong:   encoding = 'q'; break;
3479    case BuiltinType::Int128:     encoding = 't'; break;
3480    case BuiltinType::Float:      encoding = 'f'; break;
3481    case BuiltinType::Double:     encoding = 'd'; break;
3482    case BuiltinType::LongDouble: encoding = 'd'; break;
3483    }
3484
3485    S += encoding;
3486    return;
3487  }
3488
3489  if (const ComplexType *CT = T->getAs<ComplexType>()) {
3490    S += 'j';
3491    getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false,
3492                               false);
3493    return;
3494  }
3495
3496  // encoding for pointer or r3eference types.
3497  QualType PointeeTy;
3498  if (const PointerType *PT = T->getAs<PointerType>()) {
3499    if (PT->isObjCSelType()) {
3500      S += ':';
3501      return;
3502    }
3503    PointeeTy = PT->getPointeeType();
3504  }
3505  else if (const ReferenceType *RT = T->getAs<ReferenceType>())
3506    PointeeTy = RT->getPointeeType();
3507  if (!PointeeTy.isNull()) {
3508    bool isReadOnly = false;
3509    // For historical/compatibility reasons, the read-only qualifier of the
3510    // pointee gets emitted _before_ the '^'.  The read-only qualifier of
3511    // the pointer itself gets ignored, _unless_ we are looking at a typedef!
3512    // Also, do not emit the 'r' for anything but the outermost type!
3513    if (isa<TypedefType>(T.getTypePtr())) {
3514      if (OutermostType && T.isConstQualified()) {
3515        isReadOnly = true;
3516        S += 'r';
3517      }
3518    } else if (OutermostType) {
3519      QualType P = PointeeTy;
3520      while (P->getAs<PointerType>())
3521        P = P->getAs<PointerType>()->getPointeeType();
3522      if (P.isConstQualified()) {
3523        isReadOnly = true;
3524        S += 'r';
3525      }
3526    }
3527    if (isReadOnly) {
3528      // Another legacy compatibility encoding. Some ObjC qualifier and type
3529      // combinations need to be rearranged.
3530      // Rewrite "in const" from "nr" to "rn"
3531      if (llvm::StringRef(S).endswith("nr"))
3532        S.replace(S.end()-2, S.end(), "rn");
3533    }
3534
3535    if (PointeeTy->isCharType()) {
3536      // char pointer types should be encoded as '*' unless it is a
3537      // type that has been typedef'd to 'BOOL'.
3538      if (!isTypeTypedefedAsBOOL(PointeeTy)) {
3539        S += '*';
3540        return;
3541      }
3542    } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) {
3543      // GCC binary compat: Need to convert "struct objc_class *" to "#".
3544      if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) {
3545        S += '#';
3546        return;
3547      }
3548      // GCC binary compat: Need to convert "struct objc_object *" to "@".
3549      if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) {
3550        S += '@';
3551        return;
3552      }
3553      // fall through...
3554    }
3555    S += '^';
3556    getLegacyIntegralTypeEncoding(PointeeTy);
3557
3558    getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures,
3559                               NULL);
3560    return;
3561  }
3562
3563  if (const ArrayType *AT =
3564      // Ignore type qualifiers etc.
3565        dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) {
3566    if (isa<IncompleteArrayType>(AT)) {
3567      // Incomplete arrays are encoded as a pointer to the array element.
3568      S += '^';
3569
3570      getObjCEncodingForTypeImpl(AT->getElementType(), S,
3571                                 false, ExpandStructures, FD);
3572    } else {
3573      S += '[';
3574
3575      if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT))
3576        S += llvm::utostr(CAT->getSize().getZExtValue());
3577      else {
3578        //Variable length arrays are encoded as a regular array with 0 elements.
3579        assert(isa<VariableArrayType>(AT) && "Unknown array type!");
3580        S += '0';
3581      }
3582
3583      getObjCEncodingForTypeImpl(AT->getElementType(), S,
3584                                 false, ExpandStructures, FD);
3585      S += ']';
3586    }
3587    return;
3588  }
3589
3590  if (T->getAs<FunctionType>()) {
3591    S += '?';
3592    return;
3593  }
3594
3595  if (const RecordType *RTy = T->getAs<RecordType>()) {
3596    RecordDecl *RDecl = RTy->getDecl();
3597    S += RDecl->isUnion() ? '(' : '{';
3598    // Anonymous structures print as '?'
3599    if (const IdentifierInfo *II = RDecl->getIdentifier()) {
3600      S += II->getName();
3601      if (ClassTemplateSpecializationDecl *Spec
3602          = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
3603        const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
3604        std::string TemplateArgsStr
3605          = TemplateSpecializationType::PrintTemplateArgumentList(
3606                                            TemplateArgs.getFlatArgumentList(),
3607                                            TemplateArgs.flat_size(),
3608                                            (*this).PrintingPolicy);
3609
3610        S += TemplateArgsStr;
3611      }
3612    } else {
3613      S += '?';
3614    }
3615    if (ExpandStructures) {
3616      S += '=';
3617      for (RecordDecl::field_iterator Field = RDecl->field_begin(),
3618                                   FieldEnd = RDecl->field_end();
3619           Field != FieldEnd; ++Field) {
3620        if (FD) {
3621          S += '"';
3622          S += Field->getNameAsString();
3623          S += '"';
3624        }
3625
3626        // Special case bit-fields.
3627        if (Field->isBitField()) {
3628          getObjCEncodingForTypeImpl(Field->getType(), S, false, true,
3629                                     (*Field));
3630        } else {
3631          QualType qt = Field->getType();
3632          getLegacyIntegralTypeEncoding(qt);
3633          getObjCEncodingForTypeImpl(qt, S, false, true,
3634                                     FD);
3635        }
3636      }
3637    }
3638    S += RDecl->isUnion() ? ')' : '}';
3639    return;
3640  }
3641
3642  if (T->isEnumeralType()) {
3643    if (FD && FD->isBitField())
3644      EncodeBitField(this, S, FD);
3645    else
3646      S += 'i';
3647    return;
3648  }
3649
3650  if (T->isBlockPointerType()) {
3651    S += "@?"; // Unlike a pointer-to-function, which is "^?".
3652    return;
3653  }
3654
3655  if (const ObjCInterfaceType *OIT = T->getAs<ObjCInterfaceType>()) {
3656    // @encode(class_name)
3657    ObjCInterfaceDecl *OI = OIT->getDecl();
3658    S += '{';
3659    const IdentifierInfo *II = OI->getIdentifier();
3660    S += II->getName();
3661    S += '=';
3662    llvm::SmallVector<FieldDecl*, 32> RecFields;
3663    CollectObjCIvars(OI, RecFields);
3664    for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
3665      if (RecFields[i]->isBitField())
3666        getObjCEncodingForTypeImpl(RecFields[i]->getType(), S, false, true,
3667                                   RecFields[i]);
3668      else
3669        getObjCEncodingForTypeImpl(RecFields[i]->getType(), S, false, true,
3670                                   FD);
3671    }
3672    S += '}';
3673    return;
3674  }
3675
3676  if (const ObjCObjectPointerType *OPT = T->getAs<ObjCObjectPointerType>()) {
3677    if (OPT->isObjCIdType()) {
3678      S += '@';
3679      return;
3680    }
3681
3682    if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
3683      // FIXME: Consider if we need to output qualifiers for 'Class<p>'.
3684      // Since this is a binary compatibility issue, need to consult with runtime
3685      // folks. Fortunately, this is a *very* obsure construct.
3686      S += '#';
3687      return;
3688    }
3689
3690    if (OPT->isObjCQualifiedIdType()) {
3691      getObjCEncodingForTypeImpl(getObjCIdType(), S,
3692                                 ExpandPointedToStructures,
3693                                 ExpandStructures, FD);
3694      if (FD || EncodingProperty) {
3695        // Note that we do extended encoding of protocol qualifer list
3696        // Only when doing ivar or property encoding.
3697        S += '"';
3698        for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
3699             E = OPT->qual_end(); I != E; ++I) {
3700          S += '<';
3701          S += (*I)->getNameAsString();
3702          S += '>';
3703        }
3704        S += '"';
3705      }
3706      return;
3707    }
3708
3709    QualType PointeeTy = OPT->getPointeeType();
3710    if (!EncodingProperty &&
3711        isa<TypedefType>(PointeeTy.getTypePtr())) {
3712      // Another historical/compatibility reason.
3713      // We encode the underlying type which comes out as
3714      // {...};
3715      S += '^';
3716      getObjCEncodingForTypeImpl(PointeeTy, S,
3717                                 false, ExpandPointedToStructures,
3718                                 NULL);
3719      return;
3720    }
3721
3722    S += '@';
3723    if (OPT->getInterfaceDecl() && (FD || EncodingProperty)) {
3724      S += '"';
3725      S += OPT->getInterfaceDecl()->getIdentifier()->getName();
3726      for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
3727           E = OPT->qual_end(); I != E; ++I) {
3728        S += '<';
3729        S += (*I)->getNameAsString();
3730        S += '>';
3731      }
3732      S += '"';
3733    }
3734    return;
3735  }
3736
3737  assert(0 && "@encode for type not implemented!");
3738}
3739
3740void ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,
3741                                                 std::string& S) const {
3742  if (QT & Decl::OBJC_TQ_In)
3743    S += 'n';
3744  if (QT & Decl::OBJC_TQ_Inout)
3745    S += 'N';
3746  if (QT & Decl::OBJC_TQ_Out)
3747    S += 'o';
3748  if (QT & Decl::OBJC_TQ_Bycopy)
3749    S += 'O';
3750  if (QT & Decl::OBJC_TQ_Byref)
3751    S += 'R';
3752  if (QT & Decl::OBJC_TQ_Oneway)
3753    S += 'V';
3754}
3755
3756void ASTContext::setBuiltinVaListType(QualType T) {
3757  assert(BuiltinVaListType.isNull() && "__builtin_va_list type already set!");
3758
3759  BuiltinVaListType = T;
3760}
3761
3762void ASTContext::setObjCIdType(QualType T) {
3763  ObjCIdTypedefType = T;
3764}
3765
3766void ASTContext::setObjCSelType(QualType T) {
3767  ObjCSelTypedefType = T;
3768}
3769
3770void ASTContext::setObjCProtoType(QualType QT) {
3771  ObjCProtoType = QT;
3772}
3773
3774void ASTContext::setObjCClassType(QualType T) {
3775  ObjCClassTypedefType = T;
3776}
3777
3778void ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) {
3779  assert(ObjCConstantStringType.isNull() &&
3780         "'NSConstantString' type already set!");
3781
3782  ObjCConstantStringType = getObjCInterfaceType(Decl);
3783}
3784
3785/// \brief Retrieve the template name that corresponds to a non-empty
3786/// lookup.
3787TemplateName ASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
3788                                                   UnresolvedSetIterator End) {
3789  unsigned size = End - Begin;
3790  assert(size > 1 && "set is not overloaded!");
3791
3792  void *memory = Allocate(sizeof(OverloadedTemplateStorage) +
3793                          size * sizeof(FunctionTemplateDecl*));
3794  OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size);
3795
3796  NamedDecl **Storage = OT->getStorage();
3797  for (UnresolvedSetIterator I = Begin; I != End; ++I) {
3798    NamedDecl *D = *I;
3799    assert(isa<FunctionTemplateDecl>(D) ||
3800           (isa<UsingShadowDecl>(D) &&
3801            isa<FunctionTemplateDecl>(D->getUnderlyingDecl())));
3802    *Storage++ = D;
3803  }
3804
3805  return TemplateName(OT);
3806}
3807
3808/// \brief Retrieve the template name that represents a qualified
3809/// template name such as \c std::vector.
3810TemplateName ASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
3811                                                  bool TemplateKeyword,
3812                                                  TemplateDecl *Template) {
3813  // FIXME: Canonicalization?
3814  llvm::FoldingSetNodeID ID;
3815  QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template);
3816
3817  void *InsertPos = 0;
3818  QualifiedTemplateName *QTN =
3819    QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
3820  if (!QTN) {
3821    QTN = new (*this,4) QualifiedTemplateName(NNS, TemplateKeyword, Template);
3822    QualifiedTemplateNames.InsertNode(QTN, InsertPos);
3823  }
3824
3825  return TemplateName(QTN);
3826}
3827
3828/// \brief Retrieve the template name that represents a dependent
3829/// template name such as \c MetaFun::template apply.
3830TemplateName ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
3831                                                  const IdentifierInfo *Name) {
3832  assert((!NNS || NNS->isDependent()) &&
3833         "Nested name specifier must be dependent");
3834
3835  llvm::FoldingSetNodeID ID;
3836  DependentTemplateName::Profile(ID, NNS, Name);
3837
3838  void *InsertPos = 0;
3839  DependentTemplateName *QTN =
3840    DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
3841
3842  if (QTN)
3843    return TemplateName(QTN);
3844
3845  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
3846  if (CanonNNS == NNS) {
3847    QTN = new (*this,4) DependentTemplateName(NNS, Name);
3848  } else {
3849    TemplateName Canon = getDependentTemplateName(CanonNNS, Name);
3850    QTN = new (*this,4) DependentTemplateName(NNS, Name, Canon);
3851    DependentTemplateName *CheckQTN =
3852      DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
3853    assert(!CheckQTN && "Dependent type name canonicalization broken");
3854    (void)CheckQTN;
3855  }
3856
3857  DependentTemplateNames.InsertNode(QTN, InsertPos);
3858  return TemplateName(QTN);
3859}
3860
3861/// \brief Retrieve the template name that represents a dependent
3862/// template name such as \c MetaFun::template operator+.
3863TemplateName
3864ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
3865                                     OverloadedOperatorKind Operator) {
3866  assert((!NNS || NNS->isDependent()) &&
3867         "Nested name specifier must be dependent");
3868
3869  llvm::FoldingSetNodeID ID;
3870  DependentTemplateName::Profile(ID, NNS, Operator);
3871
3872  void *InsertPos = 0;
3873  DependentTemplateName *QTN
3874    = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
3875
3876  if (QTN)
3877    return TemplateName(QTN);
3878
3879  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
3880  if (CanonNNS == NNS) {
3881    QTN = new (*this,4) DependentTemplateName(NNS, Operator);
3882  } else {
3883    TemplateName Canon = getDependentTemplateName(CanonNNS, Operator);
3884    QTN = new (*this,4) DependentTemplateName(NNS, Operator, Canon);
3885
3886    DependentTemplateName *CheckQTN
3887      = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
3888    assert(!CheckQTN && "Dependent template name canonicalization broken");
3889    (void)CheckQTN;
3890  }
3891
3892  DependentTemplateNames.InsertNode(QTN, InsertPos);
3893  return TemplateName(QTN);
3894}
3895
3896/// getFromTargetType - Given one of the integer types provided by
3897/// TargetInfo, produce the corresponding type. The unsigned @p Type
3898/// is actually a value of type @c TargetInfo::IntType.
3899CanQualType ASTContext::getFromTargetType(unsigned Type) const {
3900  switch (Type) {
3901  case TargetInfo::NoInt: return CanQualType();
3902  case TargetInfo::SignedShort: return ShortTy;
3903  case TargetInfo::UnsignedShort: return UnsignedShortTy;
3904  case TargetInfo::SignedInt: return IntTy;
3905  case TargetInfo::UnsignedInt: return UnsignedIntTy;
3906  case TargetInfo::SignedLong: return LongTy;
3907  case TargetInfo::UnsignedLong: return UnsignedLongTy;
3908  case TargetInfo::SignedLongLong: return LongLongTy;
3909  case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy;
3910  }
3911
3912  assert(false && "Unhandled TargetInfo::IntType value");
3913  return CanQualType();
3914}
3915
3916//===----------------------------------------------------------------------===//
3917//                        Type Predicates.
3918//===----------------------------------------------------------------------===//
3919
3920/// isObjCNSObjectType - Return true if this is an NSObject object using
3921/// NSObject attribute on a c-style pointer type.
3922/// FIXME - Make it work directly on types.
3923/// FIXME: Move to Type.
3924///
3925bool ASTContext::isObjCNSObjectType(QualType Ty) const {
3926  if (TypedefType *TDT = dyn_cast<TypedefType>(Ty)) {
3927    if (TypedefDecl *TD = TDT->getDecl())
3928      if (TD->getAttr<ObjCNSObjectAttr>())
3929        return true;
3930  }
3931  return false;
3932}
3933
3934/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
3935/// garbage collection attribute.
3936///
3937Qualifiers::GC ASTContext::getObjCGCAttrKind(const QualType &Ty) const {
3938  Qualifiers::GC GCAttrs = Qualifiers::GCNone;
3939  if (getLangOptions().ObjC1 &&
3940      getLangOptions().getGCMode() != LangOptions::NonGC) {
3941    GCAttrs = Ty.getObjCGCAttr();
3942    // Default behavious under objective-c's gc is for objective-c pointers
3943    // (or pointers to them) be treated as though they were declared
3944    // as __strong.
3945    if (GCAttrs == Qualifiers::GCNone) {
3946      if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
3947        GCAttrs = Qualifiers::Strong;
3948      else if (Ty->isPointerType())
3949        return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType());
3950    }
3951    // Non-pointers have none gc'able attribute regardless of the attribute
3952    // set on them.
3953    else if (!Ty->isAnyPointerType() && !Ty->isBlockPointerType())
3954      return Qualifiers::GCNone;
3955  }
3956  return GCAttrs;
3957}
3958
3959//===----------------------------------------------------------------------===//
3960//                        Type Compatibility Testing
3961//===----------------------------------------------------------------------===//
3962
3963/// areCompatVectorTypes - Return true if the two specified vector types are
3964/// compatible.
3965static bool areCompatVectorTypes(const VectorType *LHS,
3966                                 const VectorType *RHS) {
3967  assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified());
3968  return LHS->getElementType() == RHS->getElementType() &&
3969         LHS->getNumElements() == RHS->getNumElements();
3970}
3971
3972//===----------------------------------------------------------------------===//
3973// ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's.
3974//===----------------------------------------------------------------------===//
3975
3976/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the
3977/// inheritance hierarchy of 'rProto'.
3978bool ASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
3979                                                ObjCProtocolDecl *rProto) {
3980  if (lProto == rProto)
3981    return true;
3982  for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(),
3983       E = rProto->protocol_end(); PI != E; ++PI)
3984    if (ProtocolCompatibleWithProtocol(lProto, *PI))
3985      return true;
3986  return false;
3987}
3988
3989/// QualifiedIdConformsQualifiedId - compare id<p,...> with id<p1,...>
3990/// return true if lhs's protocols conform to rhs's protocol; false
3991/// otherwise.
3992bool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) {
3993  if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType())
3994    return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false);
3995  return false;
3996}
3997
3998/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an
3999/// ObjCQualifiedIDType.
4000bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs,
4001                                                   bool compare) {
4002  // Allow id<P..> and an 'id' or void* type in all cases.
4003  if (lhs->isVoidPointerType() ||
4004      lhs->isObjCIdType() || lhs->isObjCClassType())
4005    return true;
4006  else if (rhs->isVoidPointerType() ||
4007           rhs->isObjCIdType() || rhs->isObjCClassType())
4008    return true;
4009
4010  if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) {
4011    const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
4012
4013    if (!rhsOPT) return false;
4014
4015    if (rhsOPT->qual_empty()) {
4016      // If the RHS is a unqualified interface pointer "NSString*",
4017      // make sure we check the class hierarchy.
4018      if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) {
4019        for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
4020             E = lhsQID->qual_end(); I != E; ++I) {
4021          // when comparing an id<P> on lhs with a static type on rhs,
4022          // see if static class implements all of id's protocols, directly or
4023          // through its super class and categories.
4024          if (!rhsID->ClassImplementsProtocol(*I, true))
4025            return false;
4026        }
4027      }
4028      // If there are no qualifiers and no interface, we have an 'id'.
4029      return true;
4030    }
4031    // Both the right and left sides have qualifiers.
4032    for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
4033         E = lhsQID->qual_end(); I != E; ++I) {
4034      ObjCProtocolDecl *lhsProto = *I;
4035      bool match = false;
4036
4037      // when comparing an id<P> on lhs with a static type on rhs,
4038      // see if static class implements all of id's protocols, directly or
4039      // through its super class and categories.
4040      for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(),
4041           E = rhsOPT->qual_end(); J != E; ++J) {
4042        ObjCProtocolDecl *rhsProto = *J;
4043        if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
4044            (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
4045          match = true;
4046          break;
4047        }
4048      }
4049      // If the RHS is a qualified interface pointer "NSString<P>*",
4050      // make sure we check the class hierarchy.
4051      if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) {
4052        for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
4053             E = lhsQID->qual_end(); I != E; ++I) {
4054          // when comparing an id<P> on lhs with a static type on rhs,
4055          // see if static class implements all of id's protocols, directly or
4056          // through its super class and categories.
4057          if (rhsID->ClassImplementsProtocol(*I, true)) {
4058            match = true;
4059            break;
4060          }
4061        }
4062      }
4063      if (!match)
4064        return false;
4065    }
4066
4067    return true;
4068  }
4069
4070  const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType();
4071  assert(rhsQID && "One of the LHS/RHS should be id<x>");
4072
4073  if (const ObjCObjectPointerType *lhsOPT =
4074        lhs->getAsObjCInterfacePointerType()) {
4075    if (lhsOPT->qual_empty()) {
4076      bool match = false;
4077      if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) {
4078        for (ObjCObjectPointerType::qual_iterator I = rhsQID->qual_begin(),
4079             E = rhsQID->qual_end(); I != E; ++I) {
4080          // when comparing an id<P> on lhs with a static type on rhs,
4081          // see if static class implements all of id's protocols, directly or
4082          // through its super class and categories.
4083          if (lhsID->ClassImplementsProtocol(*I, true)) {
4084            match = true;
4085            break;
4086          }
4087        }
4088        if (!match)
4089          return false;
4090      }
4091      return true;
4092    }
4093    // Both the right and left sides have qualifiers.
4094    for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(),
4095         E = lhsOPT->qual_end(); I != E; ++I) {
4096      ObjCProtocolDecl *lhsProto = *I;
4097      bool match = false;
4098
4099      // when comparing an id<P> on lhs with a static type on rhs,
4100      // see if static class implements all of id's protocols, directly or
4101      // through its super class and categories.
4102      for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
4103           E = rhsQID->qual_end(); J != E; ++J) {
4104        ObjCProtocolDecl *rhsProto = *J;
4105        if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
4106            (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
4107          match = true;
4108          break;
4109        }
4110      }
4111      if (!match)
4112        return false;
4113    }
4114    return true;
4115  }
4116  return false;
4117}
4118
4119/// canAssignObjCInterfaces - Return true if the two interface types are
4120/// compatible for assignment from RHS to LHS.  This handles validation of any
4121/// protocol qualifiers on the LHS or RHS.
4122///
4123bool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT,
4124                                         const ObjCObjectPointerType *RHSOPT) {
4125  // If either type represents the built-in 'id' or 'Class' types, return true.
4126  if (LHSOPT->isObjCBuiltinType() || RHSOPT->isObjCBuiltinType())
4127    return true;
4128
4129  if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType())
4130    return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
4131                                             QualType(RHSOPT,0),
4132                                             false);
4133
4134  const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
4135  const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
4136  if (LHS && RHS) // We have 2 user-defined types.
4137    return canAssignObjCInterfaces(LHS, RHS);
4138
4139  return false;
4140}
4141
4142/// canAssignObjCInterfacesInBlockPointer - This routine is specifically written
4143/// for providing type-safty for objective-c pointers used to pass/return
4144/// arguments in block literals. When passed as arguments, passing 'A*' where
4145/// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is
4146/// not OK. For the return type, the opposite is not OK.
4147bool ASTContext::canAssignObjCInterfacesInBlockPointer(
4148                                         const ObjCObjectPointerType *LHSOPT,
4149                                         const ObjCObjectPointerType *RHSOPT) {
4150  if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType())
4151    return true;
4152
4153  if (LHSOPT->isObjCBuiltinType()) {
4154    return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType();
4155  }
4156
4157  if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType())
4158    return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
4159                                             QualType(RHSOPT,0),
4160                                             false);
4161
4162  const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
4163  const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
4164  if (LHS && RHS)  { // We have 2 user-defined types.
4165    if (LHS != RHS) {
4166      if (LHS->getDecl()->isSuperClassOf(RHS->getDecl()))
4167        return false;
4168      if (RHS->getDecl()->isSuperClassOf(LHS->getDecl()))
4169        return true;
4170    }
4171    else
4172      return true;
4173  }
4174  return false;
4175}
4176
4177/// getIntersectionOfProtocols - This routine finds the intersection of set
4178/// of protocols inherited from two distinct objective-c pointer objects.
4179/// It is used to build composite qualifier list of the composite type of
4180/// the conditional expression involving two objective-c pointer objects.
4181static
4182void getIntersectionOfProtocols(ASTContext &Context,
4183                                const ObjCObjectPointerType *LHSOPT,
4184                                const ObjCObjectPointerType *RHSOPT,
4185      llvm::SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) {
4186
4187  const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
4188  const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
4189
4190  llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet;
4191  unsigned LHSNumProtocols = LHS->getNumProtocols();
4192  if (LHSNumProtocols > 0)
4193    InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end());
4194  else {
4195    llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
4196    Context.CollectInheritedProtocols(LHS->getDecl(), LHSInheritedProtocols);
4197    InheritedProtocolSet.insert(LHSInheritedProtocols.begin(),
4198                                LHSInheritedProtocols.end());
4199  }
4200
4201  unsigned RHSNumProtocols = RHS->getNumProtocols();
4202  if (RHSNumProtocols > 0) {
4203    ObjCProtocolDecl **RHSProtocols =
4204      const_cast<ObjCProtocolDecl **>(RHS->qual_begin());
4205    for (unsigned i = 0; i < RHSNumProtocols; ++i)
4206      if (InheritedProtocolSet.count(RHSProtocols[i]))
4207        IntersectionOfProtocols.push_back(RHSProtocols[i]);
4208  }
4209  else {
4210    llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols;
4211    Context.CollectInheritedProtocols(RHS->getDecl(), RHSInheritedProtocols);
4212    for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
4213         RHSInheritedProtocols.begin(),
4214         E = RHSInheritedProtocols.end(); I != E; ++I)
4215      if (InheritedProtocolSet.count((*I)))
4216        IntersectionOfProtocols.push_back((*I));
4217  }
4218}
4219
4220/// areCommonBaseCompatible - Returns common base class of the two classes if
4221/// one found. Note that this is O'2 algorithm. But it will be called as the
4222/// last type comparison in a ?-exp of ObjC pointer types before a
4223/// warning is issued. So, its invokation is extremely rare.
4224QualType ASTContext::areCommonBaseCompatible(
4225                                          const ObjCObjectPointerType *LHSOPT,
4226                                          const ObjCObjectPointerType *RHSOPT) {
4227  const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
4228  const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
4229  if (!LHS || !RHS)
4230    return QualType();
4231
4232  while (const ObjCInterfaceDecl *LHSIDecl = LHS->getDecl()->getSuperClass()) {
4233    QualType LHSTy = getObjCInterfaceType(LHSIDecl);
4234    LHS = LHSTy->getAs<ObjCInterfaceType>();
4235    if (canAssignObjCInterfaces(LHS, RHS)) {
4236      llvm::SmallVector<ObjCProtocolDecl *, 8> IntersectionOfProtocols;
4237      getIntersectionOfProtocols(*this,
4238                                 LHSOPT, RHSOPT, IntersectionOfProtocols);
4239      if (IntersectionOfProtocols.empty())
4240        LHSTy = getObjCObjectPointerType(LHSTy);
4241      else
4242        LHSTy = getObjCObjectPointerType(LHSTy, &IntersectionOfProtocols[0],
4243                                                IntersectionOfProtocols.size());
4244      return LHSTy;
4245    }
4246  }
4247
4248  return QualType();
4249}
4250
4251bool ASTContext::canAssignObjCInterfaces(const ObjCInterfaceType *LHS,
4252                                         const ObjCInterfaceType *RHS) {
4253  // Verify that the base decls are compatible: the RHS must be a subclass of
4254  // the LHS.
4255  if (!LHS->getDecl()->isSuperClassOf(RHS->getDecl()))
4256    return false;
4257
4258  // RHS must have a superset of the protocols in the LHS.  If the LHS is not
4259  // protocol qualified at all, then we are good.
4260  if (LHS->getNumProtocols() == 0)
4261    return true;
4262
4263  // Okay, we know the LHS has protocol qualifiers.  If the RHS doesn't, then it
4264  // isn't a superset.
4265  if (RHS->getNumProtocols() == 0)
4266    return true;  // FIXME: should return false!
4267
4268  for (ObjCInterfaceType::qual_iterator LHSPI = LHS->qual_begin(),
4269                                        LHSPE = LHS->qual_end();
4270       LHSPI != LHSPE; LHSPI++) {
4271    bool RHSImplementsProtocol = false;
4272
4273    // If the RHS doesn't implement the protocol on the left, the types
4274    // are incompatible.
4275    for (ObjCInterfaceType::qual_iterator RHSPI = RHS->qual_begin(),
4276                                          RHSPE = RHS->qual_end();
4277         RHSPI != RHSPE; RHSPI++) {
4278      if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) {
4279        RHSImplementsProtocol = true;
4280        break;
4281      }
4282    }
4283    // FIXME: For better diagnostics, consider passing back the protocol name.
4284    if (!RHSImplementsProtocol)
4285      return false;
4286  }
4287  // The RHS implements all protocols listed on the LHS.
4288  return true;
4289}
4290
4291bool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) {
4292  // get the "pointed to" types
4293  const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>();
4294  const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>();
4295
4296  if (!LHSOPT || !RHSOPT)
4297    return false;
4298
4299  return canAssignObjCInterfaces(LHSOPT, RHSOPT) ||
4300         canAssignObjCInterfaces(RHSOPT, LHSOPT);
4301}
4302
4303/// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible,
4304/// both shall have the identically qualified version of a compatible type.
4305/// C99 6.2.7p1: Two types have compatible types if their types are the
4306/// same. See 6.7.[2,3,5] for additional rules.
4307bool ASTContext::typesAreCompatible(QualType LHS, QualType RHS) {
4308  if (getLangOptions().CPlusPlus)
4309    return hasSameType(LHS, RHS);
4310
4311  return !mergeTypes(LHS, RHS).isNull();
4312}
4313
4314bool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) {
4315  return !mergeTypes(LHS, RHS, true).isNull();
4316}
4317
4318QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
4319                                        bool OfBlockPointer) {
4320  const FunctionType *lbase = lhs->getAs<FunctionType>();
4321  const FunctionType *rbase = rhs->getAs<FunctionType>();
4322  const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase);
4323  const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase);
4324  bool allLTypes = true;
4325  bool allRTypes = true;
4326
4327  // Check return type
4328  QualType retType;
4329  if (OfBlockPointer)
4330    retType = mergeTypes(rbase->getResultType(), lbase->getResultType(), true);
4331  else
4332   retType = mergeTypes(lbase->getResultType(), rbase->getResultType());
4333  if (retType.isNull()) return QualType();
4334  if (getCanonicalType(retType) != getCanonicalType(lbase->getResultType()))
4335    allLTypes = false;
4336  if (getCanonicalType(retType) != getCanonicalType(rbase->getResultType()))
4337    allRTypes = false;
4338  // FIXME: double check this
4339  // FIXME: should we error if lbase->getRegParmAttr() != 0 &&
4340  //                           rbase->getRegParmAttr() != 0 &&
4341  //                           lbase->getRegParmAttr() != rbase->getRegParmAttr()?
4342  FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo();
4343  FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo();
4344  unsigned RegParm = lbaseInfo.getRegParm() == 0 ? rbaseInfo.getRegParm() :
4345      lbaseInfo.getRegParm();
4346  bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn();
4347  if (NoReturn != lbaseInfo.getNoReturn() ||
4348      RegParm != lbaseInfo.getRegParm())
4349    allLTypes = false;
4350  if (NoReturn != rbaseInfo.getNoReturn() ||
4351      RegParm != rbaseInfo.getRegParm())
4352    allRTypes = false;
4353  CallingConv lcc = lbaseInfo.getCC();
4354  CallingConv rcc = rbaseInfo.getCC();
4355  // Compatible functions must have compatible calling conventions
4356  if (!isSameCallConv(lcc, rcc))
4357    return QualType();
4358
4359  if (lproto && rproto) { // two C99 style function prototypes
4360    assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() &&
4361           "C++ shouldn't be here");
4362    unsigned lproto_nargs = lproto->getNumArgs();
4363    unsigned rproto_nargs = rproto->getNumArgs();
4364
4365    // Compatible functions must have the same number of arguments
4366    if (lproto_nargs != rproto_nargs)
4367      return QualType();
4368
4369    // Variadic and non-variadic functions aren't compatible
4370    if (lproto->isVariadic() != rproto->isVariadic())
4371      return QualType();
4372
4373    if (lproto->getTypeQuals() != rproto->getTypeQuals())
4374      return QualType();
4375
4376    // Check argument compatibility
4377    llvm::SmallVector<QualType, 10> types;
4378    for (unsigned i = 0; i < lproto_nargs; i++) {
4379      QualType largtype = lproto->getArgType(i).getUnqualifiedType();
4380      QualType rargtype = rproto->getArgType(i).getUnqualifiedType();
4381      QualType argtype = mergeTypes(largtype, rargtype, OfBlockPointer);
4382      if (argtype.isNull()) return QualType();
4383      types.push_back(argtype);
4384      if (getCanonicalType(argtype) != getCanonicalType(largtype))
4385        allLTypes = false;
4386      if (getCanonicalType(argtype) != getCanonicalType(rargtype))
4387        allRTypes = false;
4388    }
4389    if (allLTypes) return lhs;
4390    if (allRTypes) return rhs;
4391    return getFunctionType(retType, types.begin(), types.size(),
4392                           lproto->isVariadic(), lproto->getTypeQuals(),
4393                           false, false, 0, 0,
4394                           FunctionType::ExtInfo(NoReturn, RegParm, lcc));
4395  }
4396
4397  if (lproto) allRTypes = false;
4398  if (rproto) allLTypes = false;
4399
4400  const FunctionProtoType *proto = lproto ? lproto : rproto;
4401  if (proto) {
4402    assert(!proto->hasExceptionSpec() && "C++ shouldn't be here");
4403    if (proto->isVariadic()) return QualType();
4404    // Check that the types are compatible with the types that
4405    // would result from default argument promotions (C99 6.7.5.3p15).
4406    // The only types actually affected are promotable integer
4407    // types and floats, which would be passed as a different
4408    // type depending on whether the prototype is visible.
4409    unsigned proto_nargs = proto->getNumArgs();
4410    for (unsigned i = 0; i < proto_nargs; ++i) {
4411      QualType argTy = proto->getArgType(i);
4412
4413      // Look at the promotion type of enum types, since that is the type used
4414      // to pass enum values.
4415      if (const EnumType *Enum = argTy->getAs<EnumType>())
4416        argTy = Enum->getDecl()->getPromotionType();
4417
4418      if (argTy->isPromotableIntegerType() ||
4419          getCanonicalType(argTy).getUnqualifiedType() == FloatTy)
4420        return QualType();
4421    }
4422
4423    if (allLTypes) return lhs;
4424    if (allRTypes) return rhs;
4425    return getFunctionType(retType, proto->arg_type_begin(),
4426                           proto->getNumArgs(), proto->isVariadic(),
4427                           proto->getTypeQuals(),
4428                           false, false, 0, 0,
4429                           FunctionType::ExtInfo(NoReturn, RegParm, lcc));
4430  }
4431
4432  if (allLTypes) return lhs;
4433  if (allRTypes) return rhs;
4434  FunctionType::ExtInfo Info(NoReturn, RegParm, lcc);
4435  return getFunctionNoProtoType(retType, Info);
4436}
4437
4438QualType ASTContext::mergeTypes(QualType LHS, QualType RHS,
4439                                bool OfBlockPointer) {
4440  // C++ [expr]: If an expression initially has the type "reference to T", the
4441  // type is adjusted to "T" prior to any further analysis, the expression
4442  // designates the object or function denoted by the reference, and the
4443  // expression is an lvalue unless the reference is an rvalue reference and
4444  // the expression is a function call (possibly inside parentheses).
4445  assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?");
4446  assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?");
4447
4448  QualType LHSCan = getCanonicalType(LHS),
4449           RHSCan = getCanonicalType(RHS);
4450
4451  // If two types are identical, they are compatible.
4452  if (LHSCan == RHSCan)
4453    return LHS;
4454
4455  // If the qualifiers are different, the types aren't compatible... mostly.
4456  Qualifiers LQuals = LHSCan.getLocalQualifiers();
4457  Qualifiers RQuals = RHSCan.getLocalQualifiers();
4458  if (LQuals != RQuals) {
4459    // If any of these qualifiers are different, we have a type
4460    // mismatch.
4461    if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
4462        LQuals.getAddressSpace() != RQuals.getAddressSpace())
4463      return QualType();
4464
4465    // Exactly one GC qualifier difference is allowed: __strong is
4466    // okay if the other type has no GC qualifier but is an Objective
4467    // C object pointer (i.e. implicitly strong by default).  We fix
4468    // this by pretending that the unqualified type was actually
4469    // qualified __strong.
4470    Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
4471    Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
4472    assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
4473
4474    if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
4475      return QualType();
4476
4477    if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) {
4478      return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong));
4479    }
4480    if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) {
4481      return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS);
4482    }
4483    return QualType();
4484  }
4485
4486  // Okay, qualifiers are equal.
4487
4488  Type::TypeClass LHSClass = LHSCan->getTypeClass();
4489  Type::TypeClass RHSClass = RHSCan->getTypeClass();
4490
4491  // We want to consider the two function types to be the same for these
4492  // comparisons, just force one to the other.
4493  if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
4494  if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
4495
4496  // Same as above for arrays
4497  if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
4498    LHSClass = Type::ConstantArray;
4499  if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
4500    RHSClass = Type::ConstantArray;
4501
4502  // Canonicalize ExtVector -> Vector.
4503  if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
4504  if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
4505
4506  // If the canonical type classes don't match.
4507  if (LHSClass != RHSClass) {
4508    // C99 6.7.2.2p4: Each enumerated type shall be compatible with char,
4509    // a signed integer type, or an unsigned integer type.
4510    // Compatibility is based on the underlying type, not the promotion
4511    // type.
4512    if (const EnumType* ETy = LHS->getAs<EnumType>()) {
4513      if (ETy->getDecl()->getIntegerType() == RHSCan.getUnqualifiedType())
4514        return RHS;
4515    }
4516    if (const EnumType* ETy = RHS->getAs<EnumType>()) {
4517      if (ETy->getDecl()->getIntegerType() == LHSCan.getUnqualifiedType())
4518        return LHS;
4519    }
4520
4521    return QualType();
4522  }
4523
4524  // The canonical type classes match.
4525  switch (LHSClass) {
4526#define TYPE(Class, Base)
4527#define ABSTRACT_TYPE(Class, Base)
4528#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
4529#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4530#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4531#include "clang/AST/TypeNodes.def"
4532    assert(false && "Non-canonical and dependent types shouldn't get here");
4533    return QualType();
4534
4535  case Type::LValueReference:
4536  case Type::RValueReference:
4537  case Type::MemberPointer:
4538    assert(false && "C++ should never be in mergeTypes");
4539    return QualType();
4540
4541  case Type::IncompleteArray:
4542  case Type::VariableArray:
4543  case Type::FunctionProto:
4544  case Type::ExtVector:
4545    assert(false && "Types are eliminated above");
4546    return QualType();
4547
4548  case Type::Pointer:
4549  {
4550    // Merge two pointer types, while trying to preserve typedef info
4551    QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType();
4552    QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType();
4553    QualType ResultType = mergeTypes(LHSPointee, RHSPointee);
4554    if (ResultType.isNull()) return QualType();
4555    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
4556      return LHS;
4557    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
4558      return RHS;
4559    return getPointerType(ResultType);
4560  }
4561  case Type::BlockPointer:
4562  {
4563    // Merge two block pointer types, while trying to preserve typedef info
4564    QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType();
4565    QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType();
4566    QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer);
4567    if (ResultType.isNull()) return QualType();
4568    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
4569      return LHS;
4570    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
4571      return RHS;
4572    return getBlockPointerType(ResultType);
4573  }
4574  case Type::ConstantArray:
4575  {
4576    const ConstantArrayType* LCAT = getAsConstantArrayType(LHS);
4577    const ConstantArrayType* RCAT = getAsConstantArrayType(RHS);
4578    if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize())
4579      return QualType();
4580
4581    QualType LHSElem = getAsArrayType(LHS)->getElementType();
4582    QualType RHSElem = getAsArrayType(RHS)->getElementType();
4583    QualType ResultType = mergeTypes(LHSElem, RHSElem);
4584    if (ResultType.isNull()) return QualType();
4585    if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
4586      return LHS;
4587    if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
4588      return RHS;
4589    if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(),
4590                                          ArrayType::ArraySizeModifier(), 0);
4591    if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(),
4592                                          ArrayType::ArraySizeModifier(), 0);
4593    const VariableArrayType* LVAT = getAsVariableArrayType(LHS);
4594    const VariableArrayType* RVAT = getAsVariableArrayType(RHS);
4595    if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
4596      return LHS;
4597    if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
4598      return RHS;
4599    if (LVAT) {
4600      // FIXME: This isn't correct! But tricky to implement because
4601      // the array's size has to be the size of LHS, but the type
4602      // has to be different.
4603      return LHS;
4604    }
4605    if (RVAT) {
4606      // FIXME: This isn't correct! But tricky to implement because
4607      // the array's size has to be the size of RHS, but the type
4608      // has to be different.
4609      return RHS;
4610    }
4611    if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
4612    if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
4613    return getIncompleteArrayType(ResultType,
4614                                  ArrayType::ArraySizeModifier(), 0);
4615  }
4616  case Type::FunctionNoProto:
4617    return mergeFunctionTypes(LHS, RHS, OfBlockPointer);
4618  case Type::Record:
4619  case Type::Enum:
4620    return QualType();
4621  case Type::Builtin:
4622    // Only exactly equal builtin types are compatible, which is tested above.
4623    return QualType();
4624  case Type::Complex:
4625    // Distinct complex types are incompatible.
4626    return QualType();
4627  case Type::Vector:
4628    // FIXME: The merged type should be an ExtVector!
4629    if (areCompatVectorTypes(LHSCan->getAs<VectorType>(),
4630                             RHSCan->getAs<VectorType>()))
4631      return LHS;
4632    return QualType();
4633  case Type::ObjCInterface: {
4634    // Check if the interfaces are assignment compatible.
4635    // FIXME: This should be type compatibility, e.g. whether
4636    // "LHS x; RHS x;" at global scope is legal.
4637    const ObjCInterfaceType* LHSIface = LHS->getAs<ObjCInterfaceType>();
4638    const ObjCInterfaceType* RHSIface = RHS->getAs<ObjCInterfaceType>();
4639    if (LHSIface && RHSIface &&
4640        canAssignObjCInterfaces(LHSIface, RHSIface))
4641      return LHS;
4642
4643    return QualType();
4644  }
4645  case Type::ObjCObjectPointer: {
4646    if (OfBlockPointer) {
4647      if (canAssignObjCInterfacesInBlockPointer(
4648                                          LHS->getAs<ObjCObjectPointerType>(),
4649                                          RHS->getAs<ObjCObjectPointerType>()))
4650      return LHS;
4651      return QualType();
4652    }
4653    if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(),
4654                                RHS->getAs<ObjCObjectPointerType>()))
4655      return LHS;
4656
4657    return QualType();
4658    }
4659  }
4660
4661  return QualType();
4662}
4663
4664//===----------------------------------------------------------------------===//
4665//                         Integer Predicates
4666//===----------------------------------------------------------------------===//
4667
4668unsigned ASTContext::getIntWidth(QualType T) {
4669  if (T->isBooleanType())
4670    return 1;
4671  if (EnumType *ET = dyn_cast<EnumType>(T))
4672    T = ET->getDecl()->getIntegerType();
4673  // For builtin types, just use the standard type sizing method
4674  return (unsigned)getTypeSize(T);
4675}
4676
4677QualType ASTContext::getCorrespondingUnsignedType(QualType T) {
4678  assert(T->isSignedIntegerType() && "Unexpected type");
4679
4680  // Turn <4 x signed int> -> <4 x unsigned int>
4681  if (const VectorType *VTy = T->getAs<VectorType>())
4682    return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()),
4683             VTy->getNumElements(), VTy->isAltiVec(), VTy->isPixel());
4684
4685  // For enums, we return the unsigned version of the base type.
4686  if (const EnumType *ETy = T->getAs<EnumType>())
4687    T = ETy->getDecl()->getIntegerType();
4688
4689  const BuiltinType *BTy = T->getAs<BuiltinType>();
4690  assert(BTy && "Unexpected signed integer type");
4691  switch (BTy->getKind()) {
4692  case BuiltinType::Char_S:
4693  case BuiltinType::SChar:
4694    return UnsignedCharTy;
4695  case BuiltinType::Short:
4696    return UnsignedShortTy;
4697  case BuiltinType::Int:
4698    return UnsignedIntTy;
4699  case BuiltinType::Long:
4700    return UnsignedLongTy;
4701  case BuiltinType::LongLong:
4702    return UnsignedLongLongTy;
4703  case BuiltinType::Int128:
4704    return UnsignedInt128Ty;
4705  default:
4706    assert(0 && "Unexpected signed integer type");
4707    return QualType();
4708  }
4709}
4710
4711ExternalASTSource::~ExternalASTSource() { }
4712
4713void ExternalASTSource::PrintStats() { }
4714
4715
4716//===----------------------------------------------------------------------===//
4717//                          Builtin Type Computation
4718//===----------------------------------------------------------------------===//
4719
4720/// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the
4721/// pointer over the consumed characters.  This returns the resultant type.
4722static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context,
4723                                  ASTContext::GetBuiltinTypeError &Error,
4724                                  bool AllowTypeModifiers = true) {
4725  // Modifiers.
4726  int HowLong = 0;
4727  bool Signed = false, Unsigned = false;
4728
4729  // Read the modifiers first.
4730  bool Done = false;
4731  while (!Done) {
4732    switch (*Str++) {
4733    default: Done = true; --Str; break;
4734    case 'S':
4735      assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!");
4736      assert(!Signed && "Can't use 'S' modifier multiple times!");
4737      Signed = true;
4738      break;
4739    case 'U':
4740      assert(!Signed && "Can't use both 'S' and 'U' modifiers!");
4741      assert(!Unsigned && "Can't use 'S' modifier multiple times!");
4742      Unsigned = true;
4743      break;
4744    case 'L':
4745      assert(HowLong <= 2 && "Can't have LLLL modifier");
4746      ++HowLong;
4747      break;
4748    }
4749  }
4750
4751  QualType Type;
4752
4753  // Read the base type.
4754  switch (*Str++) {
4755  default: assert(0 && "Unknown builtin type letter!");
4756  case 'v':
4757    assert(HowLong == 0 && !Signed && !Unsigned &&
4758           "Bad modifiers used with 'v'!");
4759    Type = Context.VoidTy;
4760    break;
4761  case 'f':
4762    assert(HowLong == 0 && !Signed && !Unsigned &&
4763           "Bad modifiers used with 'f'!");
4764    Type = Context.FloatTy;
4765    break;
4766  case 'd':
4767    assert(HowLong < 2 && !Signed && !Unsigned &&
4768           "Bad modifiers used with 'd'!");
4769    if (HowLong)
4770      Type = Context.LongDoubleTy;
4771    else
4772      Type = Context.DoubleTy;
4773    break;
4774  case 's':
4775    assert(HowLong == 0 && "Bad modifiers used with 's'!");
4776    if (Unsigned)
4777      Type = Context.UnsignedShortTy;
4778    else
4779      Type = Context.ShortTy;
4780    break;
4781  case 'i':
4782    if (HowLong == 3)
4783      Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
4784    else if (HowLong == 2)
4785      Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
4786    else if (HowLong == 1)
4787      Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy;
4788    else
4789      Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy;
4790    break;
4791  case 'c':
4792    assert(HowLong == 0 && "Bad modifiers used with 'c'!");
4793    if (Signed)
4794      Type = Context.SignedCharTy;
4795    else if (Unsigned)
4796      Type = Context.UnsignedCharTy;
4797    else
4798      Type = Context.CharTy;
4799    break;
4800  case 'b': // boolean
4801    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!");
4802    Type = Context.BoolTy;
4803    break;
4804  case 'z':  // size_t.
4805    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!");
4806    Type = Context.getSizeType();
4807    break;
4808  case 'F':
4809    Type = Context.getCFConstantStringType();
4810    break;
4811  case 'a':
4812    Type = Context.getBuiltinVaListType();
4813    assert(!Type.isNull() && "builtin va list type not initialized!");
4814    break;
4815  case 'A':
4816    // This is a "reference" to a va_list; however, what exactly
4817    // this means depends on how va_list is defined. There are two
4818    // different kinds of va_list: ones passed by value, and ones
4819    // passed by reference.  An example of a by-value va_list is
4820    // x86, where va_list is a char*. An example of by-ref va_list
4821    // is x86-64, where va_list is a __va_list_tag[1]. For x86,
4822    // we want this argument to be a char*&; for x86-64, we want
4823    // it to be a __va_list_tag*.
4824    Type = Context.getBuiltinVaListType();
4825    assert(!Type.isNull() && "builtin va list type not initialized!");
4826    if (Type->isArrayType()) {
4827      Type = Context.getArrayDecayedType(Type);
4828    } else {
4829      Type = Context.getLValueReferenceType(Type);
4830    }
4831    break;
4832  case 'V': {
4833    char *End;
4834    unsigned NumElements = strtoul(Str, &End, 10);
4835    assert(End != Str && "Missing vector size");
4836
4837    Str = End;
4838
4839    QualType ElementType = DecodeTypeFromStr(Str, Context, Error, false);
4840    // FIXME: Don't know what to do about AltiVec.
4841    Type = Context.getVectorType(ElementType, NumElements, false, false);
4842    break;
4843  }
4844  case 'X': {
4845    QualType ElementType = DecodeTypeFromStr(Str, Context, Error, false);
4846    Type = Context.getComplexType(ElementType);
4847    break;
4848  }
4849  case 'P':
4850    Type = Context.getFILEType();
4851    if (Type.isNull()) {
4852      Error = ASTContext::GE_Missing_stdio;
4853      return QualType();
4854    }
4855    break;
4856  case 'J':
4857    if (Signed)
4858      Type = Context.getsigjmp_bufType();
4859    else
4860      Type = Context.getjmp_bufType();
4861
4862    if (Type.isNull()) {
4863      Error = ASTContext::GE_Missing_setjmp;
4864      return QualType();
4865    }
4866    break;
4867  }
4868
4869  if (!AllowTypeModifiers)
4870    return Type;
4871
4872  Done = false;
4873  while (!Done) {
4874    switch (char c = *Str++) {
4875      default: Done = true; --Str; break;
4876      case '*':
4877      case '&':
4878        {
4879          // Both pointers and references can have their pointee types
4880          // qualified with an address space.
4881          char *End;
4882          unsigned AddrSpace = strtoul(Str, &End, 10);
4883          if (End != Str && AddrSpace != 0) {
4884            Type = Context.getAddrSpaceQualType(Type, AddrSpace);
4885            Str = End;
4886          }
4887        }
4888        if (c == '*')
4889          Type = Context.getPointerType(Type);
4890        else
4891          Type = Context.getLValueReferenceType(Type);
4892        break;
4893      // FIXME: There's no way to have a built-in with an rvalue ref arg.
4894      case 'C':
4895        Type = Type.withConst();
4896        break;
4897      case 'D':
4898        Type = Context.getVolatileType(Type);
4899        break;
4900    }
4901  }
4902
4903  return Type;
4904}
4905
4906/// GetBuiltinType - Return the type for the specified builtin.
4907QualType ASTContext::GetBuiltinType(unsigned id,
4908                                    GetBuiltinTypeError &Error) {
4909  const char *TypeStr = BuiltinInfo.GetTypeString(id);
4910
4911  llvm::SmallVector<QualType, 8> ArgTypes;
4912
4913  Error = GE_None;
4914  QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error);
4915  if (Error != GE_None)
4916    return QualType();
4917  while (TypeStr[0] && TypeStr[0] != '.') {
4918    QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error);
4919    if (Error != GE_None)
4920      return QualType();
4921
4922    // Do array -> pointer decay.  The builtin should use the decayed type.
4923    if (Ty->isArrayType())
4924      Ty = getArrayDecayedType(Ty);
4925
4926    ArgTypes.push_back(Ty);
4927  }
4928
4929  assert((TypeStr[0] != '.' || TypeStr[1] == 0) &&
4930         "'.' should only occur at end of builtin type list!");
4931
4932  // handle untyped/variadic arguments "T c99Style();" or "T cppStyle(...);".
4933  if (ArgTypes.size() == 0 && TypeStr[0] == '.')
4934    return getFunctionNoProtoType(ResType);
4935
4936  // FIXME: Should we create noreturn types?
4937  return getFunctionType(ResType, ArgTypes.data(), ArgTypes.size(),
4938                         TypeStr[0] == '.', 0, false, false, 0, 0,
4939                         FunctionType::ExtInfo());
4940}
4941
4942QualType
4943ASTContext::UsualArithmeticConversionsType(QualType lhs, QualType rhs) {
4944  // Perform the usual unary conversions. We do this early so that
4945  // integral promotions to "int" can allow us to exit early, in the
4946  // lhs == rhs check. Also, for conversion purposes, we ignore any
4947  // qualifiers.  For example, "const float" and "float" are
4948  // equivalent.
4949  if (lhs->isPromotableIntegerType())
4950    lhs = getPromotedIntegerType(lhs);
4951  else
4952    lhs = lhs.getUnqualifiedType();
4953  if (rhs->isPromotableIntegerType())
4954    rhs = getPromotedIntegerType(rhs);
4955  else
4956    rhs = rhs.getUnqualifiedType();
4957
4958  // If both types are identical, no conversion is needed.
4959  if (lhs == rhs)
4960    return lhs;
4961
4962  // If either side is a non-arithmetic type (e.g. a pointer), we are done.
4963  // The caller can deal with this (e.g. pointer + int).
4964  if (!lhs->isArithmeticType() || !rhs->isArithmeticType())
4965    return lhs;
4966
4967  // At this point, we have two different arithmetic types.
4968
4969  // Handle complex types first (C99 6.3.1.8p1).
4970  if (lhs->isComplexType() || rhs->isComplexType()) {
4971    // if we have an integer operand, the result is the complex type.
4972    if (rhs->isIntegerType() || rhs->isComplexIntegerType()) {
4973      // convert the rhs to the lhs complex type.
4974      return lhs;
4975    }
4976    if (lhs->isIntegerType() || lhs->isComplexIntegerType()) {
4977      // convert the lhs to the rhs complex type.
4978      return rhs;
4979    }
4980    // This handles complex/complex, complex/float, or float/complex.
4981    // When both operands are complex, the shorter operand is converted to the
4982    // type of the longer, and that is the type of the result. This corresponds
4983    // to what is done when combining two real floating-point operands.
4984    // The fun begins when size promotion occur across type domains.
4985    // From H&S 6.3.4: When one operand is complex and the other is a real
4986    // floating-point type, the less precise type is converted, within it's
4987    // real or complex domain, to the precision of the other type. For example,
4988    // when combining a "long double" with a "double _Complex", the
4989    // "double _Complex" is promoted to "long double _Complex".
4990    int result = getFloatingTypeOrder(lhs, rhs);
4991
4992    if (result > 0) { // The left side is bigger, convert rhs.
4993      rhs = getFloatingTypeOfSizeWithinDomain(lhs, rhs);
4994    } else if (result < 0) { // The right side is bigger, convert lhs.
4995      lhs = getFloatingTypeOfSizeWithinDomain(rhs, lhs);
4996    }
4997    // At this point, lhs and rhs have the same rank/size. Now, make sure the
4998    // domains match. This is a requirement for our implementation, C99
4999    // does not require this promotion.
5000    if (lhs != rhs) { // Domains don't match, we have complex/float mix.
5001      if (lhs->isRealFloatingType()) { // handle "double, _Complex double".
5002        return rhs;
5003      } else { // handle "_Complex double, double".
5004        return lhs;
5005      }
5006    }
5007    return lhs; // The domain/size match exactly.
5008  }
5009  // Now handle "real" floating types (i.e. float, double, long double).
5010  if (lhs->isRealFloatingType() || rhs->isRealFloatingType()) {
5011    // if we have an integer operand, the result is the real floating type.
5012    if (rhs->isIntegerType()) {
5013      // convert rhs to the lhs floating point type.
5014      return lhs;
5015    }
5016    if (rhs->isComplexIntegerType()) {
5017      // convert rhs to the complex floating point type.
5018      return getComplexType(lhs);
5019    }
5020    if (lhs->isIntegerType()) {
5021      // convert lhs to the rhs floating point type.
5022      return rhs;
5023    }
5024    if (lhs->isComplexIntegerType()) {
5025      // convert lhs to the complex floating point type.
5026      return getComplexType(rhs);
5027    }
5028    // We have two real floating types, float/complex combos were handled above.
5029    // Convert the smaller operand to the bigger result.
5030    int result = getFloatingTypeOrder(lhs, rhs);
5031    if (result > 0) // convert the rhs
5032      return lhs;
5033    assert(result < 0 && "illegal float comparison");
5034    return rhs;   // convert the lhs
5035  }
5036  if (lhs->isComplexIntegerType() || rhs->isComplexIntegerType()) {
5037    // Handle GCC complex int extension.
5038    const ComplexType *lhsComplexInt = lhs->getAsComplexIntegerType();
5039    const ComplexType *rhsComplexInt = rhs->getAsComplexIntegerType();
5040
5041    if (lhsComplexInt && rhsComplexInt) {
5042      if (getIntegerTypeOrder(lhsComplexInt->getElementType(),
5043                              rhsComplexInt->getElementType()) >= 0)
5044        return lhs; // convert the rhs
5045      return rhs;
5046    } else if (lhsComplexInt && rhs->isIntegerType()) {
5047      // convert the rhs to the lhs complex type.
5048      return lhs;
5049    } else if (rhsComplexInt && lhs->isIntegerType()) {
5050      // convert the lhs to the rhs complex type.
5051      return rhs;
5052    }
5053  }
5054  // Finally, we have two differing integer types.
5055  // The rules for this case are in C99 6.3.1.8
5056  int compare = getIntegerTypeOrder(lhs, rhs);
5057  bool lhsSigned = lhs->isSignedIntegerType(),
5058       rhsSigned = rhs->isSignedIntegerType();
5059  QualType destType;
5060  if (lhsSigned == rhsSigned) {
5061    // Same signedness; use the higher-ranked type
5062    destType = compare >= 0 ? lhs : rhs;
5063  } else if (compare != (lhsSigned ? 1 : -1)) {
5064    // The unsigned type has greater than or equal rank to the
5065    // signed type, so use the unsigned type
5066    destType = lhsSigned ? rhs : lhs;
5067  } else if (getIntWidth(lhs) != getIntWidth(rhs)) {
5068    // The two types are different widths; if we are here, that
5069    // means the signed type is larger than the unsigned type, so
5070    // use the signed type.
5071    destType = lhsSigned ? lhs : rhs;
5072  } else {
5073    // The signed type is higher-ranked than the unsigned type,
5074    // but isn't actually any bigger (like unsigned int and long
5075    // on most 32-bit systems).  Use the unsigned type corresponding
5076    // to the signed type.
5077    destType = getCorrespondingUnsignedType(lhsSigned ? lhs : rhs);
5078  }
5079  return destType;
5080}
5081