ASTContext.cpp revision d329724745b49f894b768d47275b7c2713106e89
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- ASTContext.cpp - Context to hold long-lived AST nodes ------------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file implements the ASTContext interface.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h"
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "CXXABI.h"
162fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/ASTMutationListener.h"
172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/Attr.h"
18bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck#include "clang/AST/CharUnits.h"
192fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/Comment.h"
20aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#include "clang/AST/CommentCommandTraits.h"
2149aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h"
22980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h"
23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h"
24e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h"
25ea1471e0e967548c596a71469702f8846dbaf3c0John McCall#include "clang/AST/ExprCXX.h"
262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/ExternalASTSource.h"
2714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/Mangle.h"
282fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/RecordLayout.h"
292fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/TypeLoc.h"
301b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h"
31a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner#include "clang/Basic/SourceManager.h"
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
33f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "llvm/ADT/SmallString.h"
3485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson#include "llvm/ADT/StringExtras.h"
352fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "llvm/Support/Capacity.h"
366fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman#include "llvm/Support/MathExtras.h"
37f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "llvm/Support/raw_ostream.h"
382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis#include <map>
3929445a0542d128cd7ee587ee52229670b9b54a12Anders Carlsson
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
421827403a7138946305c0058f262e02b595cf882fDouglas Gregorunsigned ASTContext::NumImplicitDefaultConstructors;
431827403a7138946305c0058f262e02b595cf882fDouglas Gregorunsigned ASTContext::NumImplicitDefaultConstructorsDeclared;
44225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorunsigned ASTContext::NumImplicitCopyConstructors;
45225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorunsigned ASTContext::NumImplicitCopyConstructorsDeclared;
46ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveConstructors;
47ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveConstructorsDeclared;
48a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorunsigned ASTContext::NumImplicitCopyAssignmentOperators;
49a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorunsigned ASTContext::NumImplicitCopyAssignmentOperatorsDeclared;
50ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveAssignmentOperators;
51ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveAssignmentOperatorsDeclared;
524923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregorunsigned ASTContext::NumImplicitDestructors;
534923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregorunsigned ASTContext::NumImplicitDestructorsDeclared;
544923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerenum FloatingRank {
56aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  HalfRank, FloatRank, DoubleRank, LongDoubleRank
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
59a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri GribenkoRawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
60aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (!CommentsLoaded && ExternalSource) {
61aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    ExternalSource->ReadComments();
62aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    CommentsLoaded = true;
63aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  }
64aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
65aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  assert(D);
66aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
67c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko  // User can not attach documentation to implicit declarations.
68c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko  if (D->isImplicit())
69c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko    return NULL;
70c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko
71c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  // User can not attach documentation to implicit instantiations.
72c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
73c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
74c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko      return NULL;
75c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  }
76c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
77dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
78dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    if (VD->isStaticDataMember() &&
79dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko        VD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
80dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko      return NULL;
81dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko  }
82dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
83dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko  if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(D)) {
84dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    if (CRD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
85dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko      return NULL;
86dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko  }
87dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
88dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko  if (const EnumDecl *ED = dyn_cast<EnumDecl>(D)) {
89dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    if (ED->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
90dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko      return NULL;
91dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko  }
92dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
93aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // TODO: handle comments for function parameters properly.
94aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (isa<ParmVarDecl>(D))
95aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
96aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
9796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  // TODO: we could look up template parameter documentation in the template
9896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  // documentation.
9996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  if (isa<TemplateTypeParmDecl>(D) ||
10096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      isa<NonTypeTemplateParmDecl>(D) ||
10196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      isa<TemplateTemplateParmDecl>(D))
10296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    return NULL;
10396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
104811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko  ArrayRef<RawComment *> RawComments = Comments.getComments();
105aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
106aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // If there are no comments anywhere, we won't find anything.
107aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (RawComments.empty())
108aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
109aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
110abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // Find declaration location.
111abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // For Objective-C declarations we generally don't expect to have multiple
112abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // declarators, thus use declaration starting location as the "declaration
113abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // location".
114abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // For all other declarations multiple declarators are used quite frequently,
115abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // so we use the location of the identifier as the "declaration location".
116abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  SourceLocation DeclLoc;
117abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  if (isa<ObjCMethodDecl>(D) || isa<ObjCContainerDecl>(D) ||
11896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      isa<ObjCPropertyDecl>(D) ||
119c27bc80a98b9558513b50956c930eedc9e461ae0Dmitri Gribenko      isa<RedeclarableTemplateDecl>(D) ||
120c27bc80a98b9558513b50956c930eedc9e461ae0Dmitri Gribenko      isa<ClassTemplateSpecializationDecl>(D))
121abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    DeclLoc = D->getLocStart();
122abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  else
123abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    DeclLoc = D->getLocation();
124abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
125aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // If the declaration doesn't map directly to a location in a file, we
126aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // can't find the comment.
127aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
128aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
129aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
130aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Find the comment that occurs just after this declaration.
131a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko  ArrayRef<RawComment *>::iterator Comment;
132a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko  {
133a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    // When searching for comments during parsing, the comment we are looking
134a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    // for is usually among the last two comments we parsed -- check them
135a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    // first.
136a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    RawComment CommentAtDeclLoc(SourceMgr, SourceRange(DeclLoc));
137a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    BeforeThanCompare<RawComment> Compare(SourceMgr);
138a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    ArrayRef<RawComment *>::iterator MaybeBeforeDecl = RawComments.end() - 1;
139a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    bool Found = Compare(*MaybeBeforeDecl, &CommentAtDeclLoc);
140a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    if (!Found && RawComments.size() >= 2) {
141a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      MaybeBeforeDecl--;
142a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      Found = Compare(*MaybeBeforeDecl, &CommentAtDeclLoc);
143a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    }
144a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko
145a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    if (Found) {
146a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      Comment = MaybeBeforeDecl + 1;
147a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      assert(Comment == std::lower_bound(RawComments.begin(), RawComments.end(),
148a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                         &CommentAtDeclLoc, Compare));
149a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    } else {
150a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      // Slow path.
151a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      Comment = std::lower_bound(RawComments.begin(), RawComments.end(),
152a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 &CommentAtDeclLoc, Compare);
153a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    }
154a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko  }
155aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
156aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Decompose the location for the declaration and find the beginning of the
157aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // file buffer.
158aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  std::pair<FileID, unsigned> DeclLocDecomp = SourceMgr.getDecomposedLoc(DeclLoc);
159aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
160aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // First check whether we have a trailing comment.
161aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (Comment != RawComments.end() &&
162811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko      (*Comment)->isDocumentation() && (*Comment)->isTrailingComment() &&
1639c00676f2393335dc60c61faf944d4f8f622fac6Dmitri Gribenko      (isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) || isa<VarDecl>(D))) {
164aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    std::pair<FileID, unsigned> CommentBeginDecomp
165811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko      = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getBegin());
166aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // Check that Doxygen trailing comment comes after the declaration, starts
167aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // on the same line and in the same file as the declaration.
168aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    if (DeclLocDecomp.first == CommentBeginDecomp.first &&
169aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second)
170aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko          == SourceMgr.getLineNumber(CommentBeginDecomp.first,
171aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                     CommentBeginDecomp.second)) {
172811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko      return *Comment;
173aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    }
174aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  }
175aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
176aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // The comment just after the declaration was not a trailing comment.
177aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Let's look at the previous comment.
178aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (Comment == RawComments.begin())
179aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
180aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  --Comment;
181aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
182aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Check that we actually have a non-member Doxygen comment.
183811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko  if (!(*Comment)->isDocumentation() || (*Comment)->isTrailingComment())
184aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
185aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
186aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Decompose the end of the comment.
187aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  std::pair<FileID, unsigned> CommentEndDecomp
188811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko    = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getEnd());
189aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
190aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // If the comment and the declaration aren't in the same file, then they
191aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // aren't related.
192aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (DeclLocDecomp.first != CommentEndDecomp.first)
193aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
194aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
195aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Get the corresponding buffer.
196aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  bool Invalid = false;
197aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first,
198aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                               &Invalid).data();
199aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (Invalid)
200aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
201aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
202aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Extract text between the comment and declaration.
203aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  StringRef Text(Buffer + CommentEndDecomp.second,
204aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                 DeclLocDecomp.second - CommentEndDecomp.second);
205aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
2068bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko  // There should be no other declarations or preprocessor directives between
2078bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko  // comment and declaration.
208abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  if (Text.find_first_of(",;{}#@") != StringRef::npos)
209aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
210aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
211811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko  return *Comment;
212aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
213aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
214c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenkonamespace {
215c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko/// If we have a 'templated' declaration for a template, adjust 'D' to
216c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko/// refer to the actual template.
2172125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko/// If we have an implicit instantiation, adjust 'D' to refer to template.
218c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenkoconst Decl *adjustDeclToTemplate(const Decl *D) {
219cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2202125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Is this function declaration part of a function template?
221cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor    if (const FunctionTemplateDecl *FTD = FD->getDescribedFunctionTemplate())
2222125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return FTD;
2232125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2242125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Nothing to do if function is not an implicit instantiation.
2252125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (FD->getTemplateSpecializationKind() != TSK_ImplicitInstantiation)
2262125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return D;
2272125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2282125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Function is an implicit instantiation of a function template?
2292125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const FunctionTemplateDecl *FTD = FD->getPrimaryTemplate())
2302125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return FTD;
2312125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2322125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Function is instantiated from a member definition of a class template?
2332125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const FunctionDecl *MemberDecl =
2342125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko            FD->getInstantiatedFromMemberFunction())
2352125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return MemberDecl;
2362125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2372125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    return D;
2382125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  }
2392125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2402125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Static data member is instantiated from a member definition of a class
2412125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // template?
2422125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (VD->isStaticDataMember())
2432125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      if (const VarDecl *MemberDecl = VD->getInstantiatedFromStaticDataMember())
2442125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko        return MemberDecl;
2452125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2462125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    return D;
2472125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  }
2482125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(D)) {
2492125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Is this class declaration part of a class template?
2502125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const ClassTemplateDecl *CTD = CRD->getDescribedClassTemplate())
2512125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return CTD;
2522125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2532125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Class is an implicit instantiation of a class template or partial
2542125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // specialization?
2552125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const ClassTemplateSpecializationDecl *CTSD =
2562125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko            dyn_cast<ClassTemplateSpecializationDecl>(CRD)) {
2572125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      if (CTSD->getSpecializationKind() != TSK_ImplicitInstantiation)
2582125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko        return D;
2592125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      llvm::PointerUnion<ClassTemplateDecl *,
2602125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                         ClassTemplatePartialSpecializationDecl *>
2612125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko          PU = CTSD->getSpecializedTemplateOrPartial();
2622125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return PU.is<ClassTemplateDecl*>() ?
2632125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko          static_cast<const Decl*>(PU.get<ClassTemplateDecl *>()) :
2642125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko          static_cast<const Decl*>(
2652125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko              PU.get<ClassTemplatePartialSpecializationDecl *>());
2662125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    }
2672125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2682125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Class is instantiated from a member definition of a class template?
2692125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const MemberSpecializationInfo *Info =
2702125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                   CRD->getMemberSpecializationInfo())
2712125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return Info->getInstantiatedFrom();
2722125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2732125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    return D;
2742125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  }
2752125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  if (const EnumDecl *ED = dyn_cast<EnumDecl>(D)) {
2762125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Enum is instantiated from a member definition of a class template?
2772125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const EnumDecl *MemberDecl = ED->getInstantiatedFromMemberEnum())
2782125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return MemberDecl;
2792125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2802125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    return D;
281cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor  }
2822125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  // FIXME: Adjust alias templates?
283c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  return D;
284c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko}
285c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko} // unnamed namespace
286c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
2871599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenkoconst RawComment *ASTContext::getRawCommentForAnyRedecl(
2881599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko                                                const Decl *D,
2891599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko                                                const Decl **OriginalDecl) const {
290c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  D = adjustDeclToTemplate(D);
291cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor
292f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  // Check whether we have cached a comment for this declaration already.
293f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  {
294f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    llvm::DenseMap<const Decl *, RawCommentAndCacheFlags>::iterator Pos =
295f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        RedeclComments.find(D);
296f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    if (Pos != RedeclComments.end()) {
297f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      const RawCommentAndCacheFlags &Raw = Pos->second;
2981599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko      if (Raw.getKind() != RawCommentAndCacheFlags::NoCommentInDecl) {
2991599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko        if (OriginalDecl)
3001599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko          *OriginalDecl = Raw.getOriginalDecl();
301f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        return Raw.getRaw();
3021599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko      }
303f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    }
304f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  }
305f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
306f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  // Search for comments attached to declarations in the redeclaration chain.
307f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  const RawComment *RC = NULL;
3081599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  const Decl *OriginalDeclForRC = NULL;
309f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  for (Decl::redecl_iterator I = D->redecls_begin(),
310f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko                             E = D->redecls_end();
311f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko       I != E; ++I) {
312f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    llvm::DenseMap<const Decl *, RawCommentAndCacheFlags>::iterator Pos =
313f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        RedeclComments.find(*I);
314f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    if (Pos != RedeclComments.end()) {
315f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      const RawCommentAndCacheFlags &Raw = Pos->second;
316f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      if (Raw.getKind() != RawCommentAndCacheFlags::NoCommentInDecl) {
317f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        RC = Raw.getRaw();
3181599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko        OriginalDeclForRC = Raw.getOriginalDecl();
319f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        break;
320f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      }
321f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    } else {
322f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      RC = getRawCommentForDeclNoCache(*I);
3231599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko      OriginalDeclForRC = *I;
324f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      RawCommentAndCacheFlags Raw;
325f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      if (RC) {
326f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        Raw.setRaw(RC);
327f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        Raw.setKind(RawCommentAndCacheFlags::FromDecl);
328f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      } else
329f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        Raw.setKind(RawCommentAndCacheFlags::NoCommentInDecl);
3301599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko      Raw.setOriginalDecl(*I);
331f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      RedeclComments[*I] = Raw;
332f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      if (RC)
333f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        break;
334f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    }
3358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
336aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
3378376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko  // If we found a comment, it should be a documentation comment.
3388376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko  assert(!RC || RC->isDocumentation());
339f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
3401599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  if (OriginalDecl)
3411599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko    *OriginalDecl = OriginalDeclForRC;
3421599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko
343f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  // Update cache for every declaration in the redeclaration chain.
344f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  RawCommentAndCacheFlags Raw;
345f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  Raw.setRaw(RC);
346f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  Raw.setKind(RawCommentAndCacheFlags::FromRedecl);
3471599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  Raw.setOriginalDecl(OriginalDeclForRC);
348f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
349f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  for (Decl::redecl_iterator I = D->redecls_begin(),
350f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko                             E = D->redecls_end();
351f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko       I != E; ++I) {
352f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    RawCommentAndCacheFlags &R = RedeclComments[*I];
353f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    if (R.getKind() == RawCommentAndCacheFlags::NoCommentInDecl)
354f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      R = Raw;
355f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  }
356f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
357aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  return RC;
358aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
359aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
360bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanianstatic void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod,
361bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian                   SmallVectorImpl<const NamedDecl *> &Redeclared) {
362bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  const DeclContext *DC = ObjCMethod->getDeclContext();
363bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  if (const ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(DC)) {
364bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    const ObjCInterfaceDecl *ID = IMD->getClassInterface();
365bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    if (!ID)
366bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      return;
367bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    // Add redeclared method here.
368d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    for (ObjCInterfaceDecl::known_extensions_iterator
369d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           Ext = ID->known_extensions_begin(),
370d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           ExtEnd = ID->known_extensions_end();
371d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         Ext != ExtEnd; ++Ext) {
372bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      if (ObjCMethodDecl *RedeclaredMethod =
373d329724745b49f894b768d47275b7c2713106e89Douglas Gregor            Ext->getMethod(ObjCMethod->getSelector(),
374bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian                                  ObjCMethod->isInstanceMethod()))
375bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian        Redeclared.push_back(RedeclaredMethod);
376bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    }
377bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  }
378bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian}
379bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
380749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahaniancomments::FullComment *ASTContext::cloneFullComment(comments::FullComment *FC,
381749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian                                                    const Decl *D) const {
382749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  comments::DeclInfo *ThisDeclInfo = new (*this) comments::DeclInfo;
383749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  ThisDeclInfo->CommentDecl = D;
384749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  ThisDeclInfo->IsFilled = false;
385749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  ThisDeclInfo->fill();
386749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  ThisDeclInfo->CommentDecl = FC->getDecl();
387749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  comments::FullComment *CFC =
388749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian    new (*this) comments::FullComment(FC->getBlocks(),
389749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian                                      ThisDeclInfo);
390749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  return CFC;
391749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian
392749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian}
393749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian
3941952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenkocomments::FullComment *ASTContext::getCommentForDecl(
3951952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko                                              const Decl *D,
3961952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko                                              const Preprocessor *PP) const {
397c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  D = adjustDeclToTemplate(D);
398bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
399c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  const Decl *Canonical = D->getCanonicalDecl();
400c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
401c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko      ParsedComments.find(Canonical);
402bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
403bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  if (Pos != ParsedComments.end()) {
404749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian    if (Canonical != D) {
405bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      comments::FullComment *FC = Pos->second;
406749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian      comments::FullComment *CFC = cloneFullComment(FC, D);
407bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      return CFC;
408bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    }
409c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    return Pos->second;
410bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  }
411bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
4121599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  const Decl *OriginalDecl;
413bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
4141599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  const RawComment *RC = getRawCommentForAnyRedecl(D, &OriginalDecl);
415bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  if (!RC) {
416bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    if (isa<ObjCMethodDecl>(D) || isa<FunctionDecl>(D)) {
4171e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko      SmallVector<const NamedDecl*, 8> Overridden;
418c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian      const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D);
419c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian      if (OMD && OMD->isPropertyAccessor()) {
420c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian        if (const ObjCPropertyDecl *PDecl = OMD->findPropertyDecl()) {
421c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian          if (comments::FullComment *FC = getCommentForDecl(PDecl, PP)) {
422c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian            comments::FullComment *CFC = cloneFullComment(FC, D);
423c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian            return CFC;
424c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian          }
425c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian        }
426c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian      }
427c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian      if (OMD)
4281e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko        addRedeclaredMethods(OMD, Overridden);
4291e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko      getOverriddenMethods(dyn_cast<NamedDecl>(D), Overridden);
4301e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko      for (unsigned i = 0, e = Overridden.size(); i < e; i++) {
4311e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko        if (comments::FullComment *FC = getCommentForDecl(Overridden[i], PP)) {
432749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian          comments::FullComment *CFC = cloneFullComment(FC, D);
433bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian          return CFC;
434bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian        }
435bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      }
436bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    }
4378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    return NULL;
438bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  }
439bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
4404b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // If the RawComment was attached to other redeclaration of this Decl, we
4414b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // should parse the comment in context of that other Decl.  This is important
4424b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // because comments can contain references to parameter names which can be
4434b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // different across redeclarations.
4441599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  if (D != OriginalDecl)
4451952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    return getCommentForDecl(OriginalDecl, PP);
4461599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko
4471952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  comments::FullComment *FC = RC->parse(*this, PP, D);
448c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  ParsedComments[Canonical] = FC;
449c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  return FC;
4508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
4518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
4523e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregorvoid
4533e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,
4543e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TemplateTemplateParmDecl *Parm) {
4553e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Parm->getDepth());
4563e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Parm->getPosition());
45761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  ID.AddBoolean(Parm->isParameterPack());
4583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
4593e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateParameterList *Params = Parm->getTemplateParameters();
4603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Params->size());
4613e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  for (TemplateParameterList::const_iterator P = Params->begin(),
4623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                          PEnd = Params->end();
4633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor       P != PEnd; ++P) {
4643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
4653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddInteger(0);
4663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddBoolean(TTP->isParameterPack());
4673e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      continue;
4683e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    }
4693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
4703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
4713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddInteger(1);
47261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor      ID.AddBoolean(NTTP->isParameterPack());
4739e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman      ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr());
4746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->isExpandedParameterPack()) {
4756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddBoolean(true);
4766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddInteger(NTTP->getNumExpansionTypes());
4779e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman        for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
4789e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman          QualType T = NTTP->getExpansionType(I);
4799e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman          ID.AddPointer(T.getCanonicalType().getAsOpaquePtr());
4809e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman        }
4816952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      } else
4826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddBoolean(false);
4833e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      continue;
4843e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    }
4853e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
4863e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P);
4873e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    ID.AddInteger(2);
4883e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    Profile(ID, TTP);
4893e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
4903e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor}
4913e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
4923e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorTemplateTemplateParmDecl *
4933e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::getCanonicalTemplateTemplateParmDecl(
4944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          TemplateTemplateParmDecl *TTP) const {
4953e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Check if we already have a canonical template template parameter.
4963e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  llvm::FoldingSetNodeID ID;
4973e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonicalTemplateTemplateParm::Profile(ID, TTP);
4983e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  void *InsertPos = 0;
4993e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonicalTemplateTemplateParm *Canonical
5003e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
5013e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  if (Canonical)
5023e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    return Canonical->getParam();
5033e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5043e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Build a canonical template parameter list.
5053e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateParameterList *Params = TTP->getTemplateParameters();
5065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<NamedDecl *, 4> CanonParams;
5073e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonParams.reserve(Params->size());
5083e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  for (TemplateParameterList::const_iterator P = Params->begin(),
5093e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                          PEnd = Params->end();
5103e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor       P != PEnd; ++P) {
5113e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P))
5123e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      CanonParams.push_back(
5133e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                  TemplateTypeParmDecl::Create(*this, getTranslationUnitDecl(),
514344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               SourceLocation(),
515344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               SourceLocation(),
516344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               TTP->getDepth(),
5173e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TTP->getIndex(), 0, false,
5183e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TTP->isParameterPack()));
5193e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    else if (NonTypeTemplateParmDecl *NTTP
5206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor             = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      QualType T = getCanonicalType(NTTP->getType());
5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T);
5236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      NonTypeTemplateParmDecl *Param;
5246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->isExpandedParameterPack()) {
5255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        SmallVector<QualType, 2> ExpandedTypes;
5265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        SmallVector<TypeSourceInfo *, 2> ExpandedTInfos;
5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
5286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I)));
5296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          ExpandedTInfos.push_back(
5306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                getTrivialTypeSourceInfo(ExpandedTypes.back()));
5316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        }
5326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
534ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
535ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
5366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getDepth(),
5376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getPosition(), 0,
5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                T,
5396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TInfo,
5406952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTypes.data(),
5416952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTypes.size(),
5426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTInfos.data());
5436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      } else {
5446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
545ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
546ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
5476952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getDepth(),
5486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getPosition(), 0,
5496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                T,
5506952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->isParameterPack(),
5516952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TInfo);
5526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      }
5536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      CanonParams.push_back(Param);
5546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else
5563e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      CanonParams.push_back(getCanonicalTemplateTemplateParmDecl(
5573e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                           cast<TemplateTemplateParmDecl>(*P)));
5583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
5593e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateTemplateParmDecl *CanonTTP
5613e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
5623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                       SourceLocation(), TTP->getDepth(),
56361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       TTP->getPosition(),
56461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       TTP->isParameterPack(),
56561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       0,
5663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                         TemplateParameterList::Create(*this, SourceLocation(),
5673e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       SourceLocation(),
5683e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       CanonParams.data(),
5693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       CanonParams.size(),
5703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       SourceLocation()));
5713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Get the new insert position for the node we care about.
5733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
5743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  assert(Canonical == 0 && "Shouldn't be in the map!");
5753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  (void)Canonical;
5763e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5773e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Create the canonical template template parameter entry.
5783e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP);
5793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
5803e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  return CanonTTP;
5813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor}
5823e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
583071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *ASTContext::createCXXABI(const TargetInfo &T) {
584ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall  if (!LangOpts.CPlusPlus) return 0;
585ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall
58620cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis  switch (T.getCXXABI()) {
587ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall  case CXXABI_ARM:
588ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall    return CreateARMCXXABI(*this);
589ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall  case CXXABI_Itanium:
590071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    return CreateItaniumCXXABI(*this);
59120cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis  case CXXABI_Microsoft:
59220cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis    return CreateMicrosoftCXXABI(*this);
59320cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis  }
5947530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid CXXABI type!");
595071cc7deffad608165b1ddd5263e8bf181861520Charles Davis}
596071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
597bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorstatic const LangAS::Map *getAddressSpaceMap(const TargetInfo &T,
598207f4d8543529221932af82836016a2ef066c917Peter Collingbourne                                             const LangOptions &LOpts) {
599207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  if (LOpts.FakeAddressSpaceMap) {
600207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    // The fake address space map must have a distinct entry for each
601207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    // language-specific address space.
602207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    static const unsigned FakeAddrSpaceMap[] = {
603207f4d8543529221932af82836016a2ef066c917Peter Collingbourne      1, // opencl_global
604207f4d8543529221932af82836016a2ef066c917Peter Collingbourne      2, // opencl_local
6054dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      3, // opencl_constant
6064dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      4, // cuda_device
6074dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      5, // cuda_constant
6084dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      6  // cuda_shared
609207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    };
610bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    return &FakeAddrSpaceMap;
611207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  } else {
612bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    return &T.getAddressSpaceMap();
613207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  }
614207f4d8543529221932af82836016a2ef066c917Peter Collingbourne}
615207f4d8543529221932af82836016a2ef066c917Peter Collingbourne
6163e3cd93b2fd9644e970c389e715c13883faf68b6Douglas GregorASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM,
617bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       const TargetInfo *t,
618e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar                       IdentifierTable &idents, SelectorTable &sels,
6191b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner                       Builtin::Context &builtins,
620bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       unsigned size_reserve,
621bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       bool DelayInitialization)
622bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  : FunctionProtoTypes(this_()),
623bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    TemplateSpecializationTypes(this_()),
624bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    DependentTemplateSpecializationTypes(this_()),
625bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    SubstTemplateTemplateParmPacks(this_()),
626bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    GlobalNestedNameSpecifier(0),
627bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Int128Decl(0), UInt128Decl(0),
628c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    BuiltinVaListDecl(0),
629a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    ObjCIdDecl(0), ObjCSelDecl(0), ObjCClassDecl(0), ObjCProtocolClassDecl(0),
630961713055e636170da59d7006a878cb4ba518a5dFariborz Jahanian    BOOLDecl(0),
631e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor    CFConstantStringTypeDecl(0), ObjCInstanceTypeDecl(0),
632bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    FILEDecl(0),
633e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    jmp_bufDecl(0), sigjmp_bufDecl(0), ucontext_tDecl(0),
634e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    BlockDescriptorType(0), BlockDescriptorExtendedType(0),
635e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    cudaConfigureCallDecl(0),
636e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    NullTypeSourceInfo(QualType()),
637e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    FirstLocalImport(), LastLocalImport(),
638bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    SourceMgr(SM), LangOpts(LOpts),
63930c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor    AddrSpaceMap(0), Target(t), PrintingPolicy(LOpts),
640bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Idents(idents), Selectors(sels),
641bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    BuiltinInfo(builtins),
642bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    DeclarationNames(*this),
64330c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor    ExternalSource(0), Listener(0),
644aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    Comments(SM), CommentsLoaded(false),
645e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    CommentCommandTraits(BumpAlloc),
646bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    LastSDM(0, 0),
647f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    UniqueBlockByRefTypeID(0)
648bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor{
6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (size_reserve > 0) Types.reserve(size_reserve);
650e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar  TUDecl = TranslationUnitDecl::Create(*this);
651bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
652bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  if (!DelayInitialization) {
653bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    assert(t && "No target supplied for ASTContext initialization");
654bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    InitBuiltinTypes(*t);
655bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  }
656e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar}
657e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar
6585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext::~ASTContext() {
6593478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  // Release the DenseMaps associated with DeclContext objects.
6603478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  // FIXME: Is this the ideal solution?
6613478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  ReleaseDeclContextMaps();
6627d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
66363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  // Call all of the deallocation functions.
66463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  for (unsigned I = 0, N = Deallocations.size(); I != N; ++I)
66563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    Deallocations[I].first(Deallocations[I].second);
6660054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
667dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed
66863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  // because they can contain DenseMaps.
66963fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  for (llvm::DenseMap<const ObjCContainerDecl*,
67063fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor       const ASTRecordLayout*>::iterator
67163fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor       I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; )
67263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    // Increment in loop to prevent using deallocated memory.
67363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
67463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor      R->Destroy(*this);
67563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor
676dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
677dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek       I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
678dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek    // Increment in loop to prevent using deallocated memory.
679dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek    if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
680dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek      R->Destroy(*this);
681dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  }
6826320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
6836320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
6846320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor                                                    AEnd = DeclAttrs.end();
6856320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor       A != AEnd; ++A)
6866320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    A->second->~AttrVec();
6876320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
688ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
6890054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) {
6900054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  Deallocations.push_back(std::make_pair(Callback, Data));
6910054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
6920054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
6931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
6946f42b62b6194f53bcbc349f5d17388e1936535d7Dylan NoblesmithASTContext::setExternalSource(OwningPtr<ExternalASTSource> &Source) {
6952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ExternalSource.reset(Source.take());
6962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
6972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
6985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ASTContext::PrintStats() const {
699cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "\n*** AST Context Stats:\n";
700cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "  " << Types.size() << " types total.\n";
7017c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
702dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned counts[] = {
7031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define TYPE(Name, Parent) 0,
704dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent)
705dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def"
706dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor    0 // Extra
707dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  };
708c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor
7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Types.size(); i != e; ++i) {
7105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Type *T = Types[i];
711dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor    counts[(unsigned)T->getTypeClass()]++;
7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
714dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned Idx = 0;
715dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned TotalBytes = 0;
716dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define TYPE(Name, Parent)                                              \
717dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  if (counts[Idx])                                                      \
718cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << "    " << counts[Idx] << " " << #Name               \
719cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " types\n";                                         \
720dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  TotalBytes += counts[Idx] * sizeof(Name##Type);                       \
721dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  ++Idx;
722dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent)
723dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def"
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
725cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "Total bytes = " << TotalBytes << "\n";
726cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
7274923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor  // Implicit special member functions.
728cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/"
729cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitDefaultConstructors
730cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit default constructors created\n";
731cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitCopyConstructorsDeclared << "/"
732cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitCopyConstructors
733cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit copy constructors created\n";
7344e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
735cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << NumImplicitMoveConstructorsDeclared << "/"
736cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << NumImplicitMoveConstructors
737cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " implicit move constructors created\n";
738cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/"
739cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitCopyAssignmentOperators
740cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit copy assignment operators created\n";
7414e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
742cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/"
743cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << NumImplicitMoveAssignmentOperators
744cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " implicit move assignment operators created\n";
745cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitDestructorsDeclared << "/"
746cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitDestructors
747cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit destructors created\n";
748cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
7492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  if (ExternalSource.get()) {
750cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << "\n";
7512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    ExternalSource->PrintStats();
7522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
753cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
75463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  BumpAlloc.PrintStats();
7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
757772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getInt128Decl() const {
758772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (!Int128Decl) {
759772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(Int128Ty);
760772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    Int128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
761772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     getTranslationUnitDecl(),
762772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
763772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
764772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     &Idents.get("__int128_t"),
765772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     TInfo);
766772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  }
767772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
768772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  return Int128Decl;
769772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor}
770772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
771772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getUInt128Decl() const {
772772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (!UInt128Decl) {
773772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(UnsignedInt128Ty);
774772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    UInt128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
775772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     getTranslationUnitDecl(),
776772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
777772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
778772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     &Idents.get("__uint128_t"),
779772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     TInfo);
780772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  }
781772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
782772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  return UInt128Decl;
783772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor}
7845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
785e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallvoid ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) {
7866b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K);
787e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall  R = CanQualType::CreateUnsafe(QualType(Ty, 0));
7886b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  Types.push_back(Ty);
7895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
791bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorvoid ASTContext::InitBuiltinTypes(const TargetInfo &Target) {
792bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  assert((!this->Target || this->Target == &Target) &&
793bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor         "Incorrect target reinitialization");
7945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(VoidTy.isNull() && "Context reinitialized?");
7951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
796bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  this->Target = &Target;
797bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
798bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  ABI.reset(createCXXABI(Target));
799bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  AddrSpaceMap = getAddressSpaceMap(Target, LangOpts);
800bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
8015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p19.
8025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(VoidTy,              BuiltinType::Void);
8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p2.
8055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(BoolTy,              BuiltinType::Bool);
8065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p3.
80715b91764d08e886391c865c4a444d7b51141c284Eli Friedman  if (LangOpts.CharIsSigned)
8085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InitBuiltinType(CharTy,            BuiltinType::Char_S);
8095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
8105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InitBuiltinType(CharTy,            BuiltinType::Char_U);
8115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p4.
8125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(SignedCharTy,        BuiltinType::SChar);
8135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(ShortTy,             BuiltinType::Short);
8145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(IntTy,               BuiltinType::Int);
8155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongTy,              BuiltinType::Long);
8165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongLongTy,          BuiltinType::LongLong);
8171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p6.
8195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedCharTy,      BuiltinType::UChar);
8205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedShortTy,     BuiltinType::UShort);
8215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedIntTy,       BuiltinType::UInt);
8225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedLongTy,      BuiltinType::ULong);
8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedLongLongTy,  BuiltinType::ULongLong);
8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p10.
8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(FloatTy,             BuiltinType::Float);
8275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(DoubleTy,            BuiltinType::Double);
8285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongDoubleTy,        BuiltinType::LongDouble);
82964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
8302df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  // GNU extension, 128-bit integers.
8312df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  InitBuiltinType(Int128Ty,            BuiltinType::Int128);
8322df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  InitBuiltinType(UnsignedInt128Ty,    BuiltinType::UInt128);
8332df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner
834e75bb61f1b876afaa6b2f4a2b860c2889ea1d050Abramo Bagnara  if (LangOpts.CPlusPlus && LangOpts.WChar) { // C++ 3.9.1p5
835d3d77cd138f8e830f6547b6f83fcd5721ccf5f5dEli Friedman    if (TargetInfo::isTypeSigned(Target.getWCharType()))
8363f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner      InitBuiltinType(WCharTy,           BuiltinType::WChar_S);
8373f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    else  // -fshort-wchar makes wchar_t be unsigned.
8383f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner      InitBuiltinType(WCharTy,           BuiltinType::WChar_U);
839e75bb61f1b876afaa6b2f4a2b860c2889ea1d050Abramo Bagnara  } else // C99 (or C++ using -fno-wchar)
8403a2503227c3db04a3619735127483263c1075ef7Chris Lattner    WCharTy = getFromTargetType(Target.getWCharType());
84164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
842392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy  WIntTy = getFromTargetType(Target.getWIntType());
843392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy
844f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
845f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    InitBuiltinType(Char16Ty,           BuiltinType::Char16);
846f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  else // C99
847f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    Char16Ty = getFromTargetType(Target.getChar16Type());
848f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
849f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
850f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    InitBuiltinType(Char32Ty,           BuiltinType::Char32);
851f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  else // C99
852f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    Char32Ty = getFromTargetType(Target.getChar32Type());
853f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
854898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // Placeholder type for type-dependent expressions whose type is
855898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // completely unknown. No code should ever check a type against
856898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // DependentTy and users should never see it; however, it is here to
857898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // help diagnose failures to properly check for type-dependent
858898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // expressions.
859898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  InitBuiltinType(DependentTy,         BuiltinType::Dependent);
8608e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor
8612a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  // Placeholder type for functions.
8622a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  InitBuiltinType(OverloadTy,          BuiltinType::Overload);
8632a984cad5ac3fdceeff2bd99daa7b90979313475John McCall
864864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  // Placeholder type for bound members.
865864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  InitBuiltinType(BoundMemberTy,       BuiltinType::BoundMember);
866864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
8673c3b7f90a863af43fa63043d396553ecf205351cJohn McCall  // Placeholder type for pseudo-objects.
8683c3b7f90a863af43fa63043d396553ecf205351cJohn McCall  InitBuiltinType(PseudoObjectTy,      BuiltinType::PseudoObject);
8693c3b7f90a863af43fa63043d396553ecf205351cJohn McCall
8701de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall  // "any" type; useful for debugger-like clients.
8711de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall  InitBuiltinType(UnknownAnyTy,        BuiltinType::UnknownAny);
8721de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall
8730ddaeb9b031070ec64afe92d9892875ac44df427John McCall  // Placeholder type for unbridged ARC casts.
8740ddaeb9b031070ec64afe92d9892875ac44df427John McCall  InitBuiltinType(ARCUnbridgedCastTy,  BuiltinType::ARCUnbridgedCast);
8750ddaeb9b031070ec64afe92d9892875ac44df427John McCall
876a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  // Placeholder type for builtin functions.
877a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  InitBuiltinType(BuiltinFnTy,  BuiltinType::BuiltinFn);
878a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman
8795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p11.
8805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  FloatComplexTy      = getComplexType(FloatTy);
8815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DoubleComplexTy     = getComplexType(DoubleTy);
8825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LongDoubleComplexTy = getComplexType(LongDoubleTy);
8838e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor
88413dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian  // Builtin types for 'id', 'Class', and 'SEL'.
885de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId);
886de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
88713dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian  InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
888b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei
889b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  if (LangOpts.OpenCL) {
890b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dTy, BuiltinType::OCLImage1d);
891b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dArrayTy, BuiltinType::OCLImage1dArray);
892b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dBufferTy, BuiltinType::OCLImage1dBuffer);
893b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage2dTy, BuiltinType::OCLImage2d);
894b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage2dArrayTy, BuiltinType::OCLImage2dArray);
895b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage3dTy, BuiltinType::OCLImage3d);
896b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  }
897ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
898ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  // Builtin type for __objc_yes and __objc_no
89993a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian  ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ?
90093a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian                       SignedCharTy : BoolTy);
901ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
902a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCConstantStringType = QualType();
903f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian
904f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  ObjCSuperType = QualType();
9051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
90633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // void * type
90733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  VoidPtrTy = getPointerType(VoidTy);
9086e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
9096e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // nullptr type (C++0x 2.14.7)
9106e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  InitBuiltinType(NullPtrTy,           BuiltinType::NullPtr);
911aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov
912aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  // half type (OpenCL 6.1.1.1) / ARM NEON __fp16
913aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  InitBuiltinType(HalfTy, BuiltinType::Half);
914fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
915fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // Builtin type used to help define __builtin_va_list.
916fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  VaListTagTy = QualType();
9175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
919d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikieDiagnosticsEngine &ASTContext::getDiagnostics() const {
92078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  return SourceMgr.getDiagnostics();
92178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis}
92278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
9236320064d0c60fa8683f5623881c9394fd4aa7689Douglas GregorAttrVec& ASTContext::getDeclAttrs(const Decl *D) {
9246320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  AttrVec *&Result = DeclAttrs[D];
9256320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  if (!Result) {
9266320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    void *Mem = Allocate(sizeof(AttrVec));
9276320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    Result = new (Mem) AttrVec;
9286320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  }
9296320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
9306320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  return *Result;
9316320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
9326320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
9336320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor/// \brief Erase the attributes corresponding to the given declaration.
9346320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregorvoid ASTContext::eraseDeclAttrs(const Decl *D) {
9356320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
9366320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  if (Pos != DeclAttrs.end()) {
9376320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    Pos->second->~AttrVec();
9386320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    DeclAttrs.erase(Pos);
9396320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  }
9406320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
9416320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
942251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorMemberSpecializationInfo *
943663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas GregorASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) {
9447caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Var->isStaticDataMember() && "Not a static data member");
945663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor  llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos
9467caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    = InstantiatedFromStaticDataMember.find(Var);
9477caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  if (Pos == InstantiatedFromStaticDataMember.end())
9487caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    return 0;
9491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9507caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  return Pos->second;
9517caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor}
9527caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor
9531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
954251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl,
9559421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis                                                TemplateSpecializationKind TSK,
9569421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis                                          SourceLocation PointOfInstantiation) {
9577caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Inst->isStaticDataMember() && "Not a static data member");
9587caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Tmpl->isStaticDataMember() && "Not a static data member");
9597caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(!InstantiatedFromStaticDataMember[Inst] &&
9607caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor         "Already noted what static data member was instantiated from");
961251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor  InstantiatedFromStaticDataMember[Inst]
9629421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    = new (*this) MemberSpecializationInfo(Tmpl, TSK, PointOfInstantiation);
9637caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor}
9647caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor
965af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetFunctionDecl *ASTContext::getClassScopeSpecializationPattern(
966af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet                                                     const FunctionDecl *FD){
967af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(FD && "Specialization is 0");
968af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  llvm::DenseMap<const FunctionDecl*, FunctionDecl *>::const_iterator Pos
9690d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet    = ClassScopeSpecializationPattern.find(FD);
9700d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet  if (Pos == ClassScopeSpecializationPattern.end())
971af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet    return 0;
972af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
973af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  return Pos->second;
974af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet}
975af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
976af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichetvoid ASTContext::setClassScopeSpecializationPattern(FunctionDecl *FD,
977af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet                                        FunctionDecl *Pattern) {
978af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(FD && "Specialization is 0");
979af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(Pattern && "Class scope specialization pattern is 0");
9800d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet  ClassScopeSpecializationPattern[FD] = Pattern;
981af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet}
982af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
9837ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallNamedDecl *
984ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) {
9857ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall  llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos
986ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    = InstantiatedFromUsingDecl.find(UUD);
987ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (Pos == InstantiatedFromUsingDecl.end())
9880d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    return 0;
9891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9900d8df780aef1acda5962347a32591efc629b6748Anders Carlsson  return Pos->second;
9910d8df780aef1acda5962347a32591efc629b6748Anders Carlsson}
9920d8df780aef1acda5962347a32591efc629b6748Anders Carlsson
9930d8df780aef1acda5962347a32591efc629b6748Anders Carlssonvoid
994ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) {
995ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert((isa<UsingDecl>(Pattern) ||
996ed97649e9574b9d854fa4d6109c9333ae0993554John McCall          isa<UnresolvedUsingValueDecl>(Pattern) ||
997ed97649e9574b9d854fa4d6109c9333ae0993554John McCall          isa<UnresolvedUsingTypenameDecl>(Pattern)) &&
998ed97649e9574b9d854fa4d6109c9333ae0993554John McCall         "pattern decl is not a using decl");
999ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists");
1000ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  InstantiatedFromUsingDecl[Inst] = Pattern;
1001ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
1002ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1003ed97649e9574b9d854fa4d6109c9333ae0993554John McCallUsingShadowDecl *
1004ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) {
1005ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos
1006ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    = InstantiatedFromUsingShadowDecl.find(Inst);
1007ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (Pos == InstantiatedFromUsingShadowDecl.end())
1008ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return 0;
1009ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1010ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Pos->second;
1011ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
1012ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1013ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid
1014ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst,
1015ed97649e9574b9d854fa4d6109c9333ae0993554John McCall                                               UsingShadowDecl *Pattern) {
1016ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists");
1017ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  InstantiatedFromUsingShadowDecl[Inst] = Pattern;
10180d8df780aef1acda5962347a32591efc629b6748Anders Carlsson}
10190d8df780aef1acda5962347a32591efc629b6748Anders Carlsson
1020d8b285fee4471f393da8ee30f552ceacdc362afaAnders CarlssonFieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) {
1021d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos
1022d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    = InstantiatedFromUnnamedFieldDecl.find(Field);
1023d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  if (Pos == InstantiatedFromUnnamedFieldDecl.end())
1024d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    return 0;
10251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1026d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  return Pos->second;
1027d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson}
1028d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson
1029d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlssonvoid ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst,
1030d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                                     FieldDecl *Tmpl) {
1031d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed");
1032d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!Tmpl->getDeclName() && "Template field decl is not unnamed");
1033d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1034d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson         "Already noted what unnamed field was instantiated from");
10351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1036d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1037d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson}
1038d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson
103914d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanianbool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD,
104014d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian                                    const FieldDecl *LastFD) const {
104114d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian  return (FD->isBitField() && LastFD && !LastFD->isBitField() &&
1042a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) == 0);
104314d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian}
104414d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian
1045340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanianbool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD,
1046340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian                                             const FieldDecl *LastFD) const {
1047340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian  return (FD->isBitField() && LastFD && LastFD->isBitField() &&
1048a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) == 0 &&
1049a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this) != 0);
1050340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian}
1051340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian
10529b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanianbool ASTContext::BitfieldFollowsBitfield(const FieldDecl *FD,
10539b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian                                         const FieldDecl *LastFD) const {
10549b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian  return (FD->isBitField() && LastFD && LastFD->isBitField() &&
1055a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) &&
1056a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this));
10579b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian}
10589b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian
1059dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::NonBitfieldFollowsBitfield(const FieldDecl *FD,
106052bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian                                         const FieldDecl *LastFD) const {
106152bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian  return (!FD->isBitField() && LastFD && LastFD->isBitField() &&
1062a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this));
106352bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian}
106452bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian
1065dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::BitfieldFollowsNonBitfield(const FieldDecl *FD,
106652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian                                             const FieldDecl *LastFD) const {
106752bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian  return (FD->isBitField() && LastFD && !LastFD->isBitField() &&
1068a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this));
106952bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian}
107052bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian
10717d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator
10727d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const {
10737d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
107438eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
10757d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  if (Pos == OverriddenMethods.end())
10767d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor    return 0;
10777d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
10787d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  return Pos->second.begin();
10797d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
10807d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
10817d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator
10827d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_end(const CXXMethodDecl *Method) const {
10837d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
108438eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
10857d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  if (Pos == OverriddenMethods.end())
10867d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor    return 0;
10877d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
10887d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  return Pos->second.end();
10897d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
10907d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
1091c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned
1092c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios KyrtzidisASTContext::overridden_methods_size(const CXXMethodDecl *Method) const {
1093c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
109438eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
1095c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pos == OverriddenMethods.end())
1096c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    return 0;
1097c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis
1098c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  return Pos->second.size();
1099c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis}
1100c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis
11017d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregorvoid ASTContext::addOverriddenMethod(const CXXMethodDecl *Method,
11027d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor                                     const CXXMethodDecl *Overridden) {
110338eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis  assert(Method->isCanonicalDecl() && Overridden->isCanonicalDecl());
11047d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  OverriddenMethods[Method].push_back(Overridden);
11057d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
11067d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
11071e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenkovoid ASTContext::getOverriddenMethods(
11081e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko                      const NamedDecl *D,
11091e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko                      SmallVectorImpl<const NamedDecl *> &Overridden) const {
111021c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  assert(D);
111121c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
111221c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  if (const CXXMethodDecl *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1113bc0a2bb8dc122f8daae890ec82cecfe2054859ebArgyrios Kyrtzidis    Overridden.append(CXXMethod->begin_overridden_methods(),
1114bc0a2bb8dc122f8daae890ec82cecfe2054859ebArgyrios Kyrtzidis                      CXXMethod->end_overridden_methods());
111521c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis    return;
111621c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  }
111721c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
111821c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D);
111921c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  if (!Method)
112021c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis    return;
112121c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
1122740ae67dbf8dac44dbc8d6593a60f4f37a0a2aa5Argyrios Kyrtzidis  SmallVector<const ObjCMethodDecl *, 8> OverDecls;
1123740ae67dbf8dac44dbc8d6593a60f4f37a0a2aa5Argyrios Kyrtzidis  Method->getOverriddenMethods(OverDecls);
1124bc0a2bb8dc122f8daae890ec82cecfe2054859ebArgyrios Kyrtzidis  Overridden.append(OverDecls.begin(), OverDecls.end());
112521c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis}
112621c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
1127e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregorvoid ASTContext::addedLocalImportDecl(ImportDecl *Import) {
1128e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  assert(!Import->NextLocalImport && "Import declaration already in the chain");
1129e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  assert(!Import->isFromASTFile() && "Non-local import declaration");
1130e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  if (!FirstLocalImport) {
1131e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    FirstLocalImport = Import;
1132e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    LastLocalImport = Import;
1133e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    return;
1134e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  }
1135e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor
1136e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  LastLocalImport->NextLocalImport = Import;
1137e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  LastLocalImport = Import;
1138e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor}
1139e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor
1140464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===//
1141464175bba1318bef7905122e9fda20cff926df78Chris Lattner//                         Type Sizing and Analysis
1142464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===//
1143a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
1144b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified
1145b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// scalar floating point type.
1146b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattnerconst llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
1147183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const BuiltinType *BT = T->getAs<BuiltinType>();
1148b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  assert(BT && "Not a floating point type!");
1149b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  switch (BT->getKind()) {
1150b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Not a floating point type!");
1151aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case BuiltinType::Half:       return Target->getHalfFormat();
1152bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::Float:      return Target->getFloatFormat();
1153bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::Double:     return Target->getDoubleFormat();
1154bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::LongDouble: return Target->getLongDoubleFormat();
1155b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  }
1156b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner}
1157b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
11588b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck/// getDeclAlign - Return a conservative estimate of the alignment of the
1159af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// specified decl.  Note that bitfields do not have a valid alignment, so
1160af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// this method will assert on them.
11615d484e8cf710207010720589d89602233de61d01Sebastian Redl/// If @p RefAsPointee, references are treated like their underlying type
11625d484e8cf710207010720589d89602233de61d01Sebastian Redl/// (for alignof), else they're treated like pointers (for CodeGen).
11634ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const {
1164bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  unsigned Align = Target->getCharWidth();
1165dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
11664081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  bool UseAlignAttrOnly = false;
11674081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  if (unsigned AlignFromAttr = D->getMaxAlignment()) {
11684081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    Align = AlignFromAttr;
11694081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall
11704081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // __attribute__((aligned)) can increase or decrease alignment
11714081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // *except* on a struct or struct member, where it only increases
11724081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // alignment unless 'packed' is also specified.
11734081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    //
117482d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne    // It is an error for alignas to decrease alignment, so we can
11754081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // ignore that possibility;  Sema should diagnose it.
11764081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    if (isa<FieldDecl>(D)) {
11774081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall      UseAlignAttrOnly = D->hasAttr<PackedAttr>() ||
11784081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall        cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
11794081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    } else {
11804081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall      UseAlignAttrOnly = true;
11814081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    }
11824081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  }
118378a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian  else if (isa<FieldDecl>(D))
118478a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian      UseAlignAttrOnly =
118578a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian        D->hasAttr<PackedAttr>() ||
118678a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian        cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
1187dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
1188ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall  // If we're using the align attribute only, just ignore everything
1189ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall  // else about the declaration and its type.
11904081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  if (UseAlignAttrOnly) {
1191ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // do nothing
1192ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
11934081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  } else if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
1194af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner    QualType T = VD->getType();
11956217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    if (const ReferenceType* RT = T->getAs<ReferenceType>()) {
11965d484e8cf710207010720589d89602233de61d01Sebastian Redl      if (RefAsPointee)
11975d484e8cf710207010720589d89602233de61d01Sebastian Redl        T = RT->getPointeeType();
11985d484e8cf710207010720589d89602233de61d01Sebastian Redl      else
11995d484e8cf710207010720589d89602233de61d01Sebastian Redl        T = getPointerType(RT->getPointeeType());
12005d484e8cf710207010720589d89602233de61d01Sebastian Redl    }
12015d484e8cf710207010720589d89602233de61d01Sebastian Redl    if (!T->isIncompleteType() && !T->isFunctionType()) {
12023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      // Adjust alignments of declarations with array type by the
12033b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      // large-array alignment on the target.
1204bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      unsigned MinWidth = Target->getLargeArrayMinWidth();
12053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      const ArrayType *arrayType;
12063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      if (MinWidth && (arrayType = getAsArrayType(T))) {
12073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        if (isa<VariableArrayType>(arrayType))
1208bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor          Align = std::max(Align, Target->getLargeArrayAlign());
12093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        else if (isa<ConstantArrayType>(arrayType) &&
12103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                 MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType)))
1211bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor          Align = std::max(Align, Target->getLargeArrayAlign());
12123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
12133b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        // Walk through any array types while we're at it.
12143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        T = getBaseElementType(arrayType);
12156deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola      }
12169f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier      Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr()));
1217dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman    }
1218ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1219ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // Fields can be subject to extra alignment constraints, like if
1220ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // the field is packed, the struct is packed, or the struct has a
1221ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // a max-field-alignment constraint (#pragma pack).  So calculate
1222ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // the actual alignment of the field within the struct, and then
1223ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // (as we're expected to) constrain that by the alignment of the type.
1224ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    if (const FieldDecl *field = dyn_cast<FieldDecl>(VD)) {
1225ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // So calculate the alignment of the field.
1226ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      const ASTRecordLayout &layout = getASTRecordLayout(field->getParent());
1227ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1228ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // Start with the record's overall alignment.
1229dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck      unsigned fieldAlign = toBits(layout.getAlignment());
1230ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1231ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // Use the GCD of that and the offset within the record.
1232ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      uint64_t offset = layout.getFieldOffset(field->getFieldIndex());
1233ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      if (offset > 0) {
1234ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        // Alignment is always a power of 2, so the GCD will be a power of 2,
1235ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        // which means we get to do this crazy thing instead of Euclid's.
1236ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        uint64_t lowBitOfOffset = offset & (~offset + 1);
1237ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        if (lowBitOfOffset < fieldAlign)
1238ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall          fieldAlign = static_cast<unsigned>(lowBitOfOffset);
1239ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      }
1240ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1241ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      Align = std::min(Align, fieldAlign);
124205f62474dd2b0f1cb69adbe0787f2868788aa949Charles Davis    }
1243af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  }
1244dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
1245eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(Align);
1246af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner}
1247b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
1248929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// getTypeInfoDataSizeInChars - Return the size of a type, in
1249929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// chars. If the type is a record, its data size is returned.  This is
1250929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// the size of the memcpy that's performed when assigning this type
1251929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// using a trivial copy/move assignment operator.
1252929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCallstd::pair<CharUnits, CharUnits>
1253929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCallASTContext::getTypeInfoDataSizeInChars(QualType T) const {
1254929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  std::pair<CharUnits, CharUnits> sizeAndAlign = getTypeInfoInChars(T);
1255929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1256929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // In C++, objects can sometimes be allocated into the tail padding
1257929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // of a base-class subobject.  We decide whether that's possible
1258929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // during class layout, so here we can just trust the layout results.
1259929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  if (getLangOpts().CPlusPlus) {
1260929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall    if (const RecordType *RT = T->getAs<RecordType>()) {
1261929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall      const ASTRecordLayout &layout = getASTRecordLayout(RT->getDecl());
1262929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall      sizeAndAlign.first = layout.getDataSize();
1263929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall    }
1264929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  }
1265929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1266929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  return sizeAndAlign;
1267929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall}
1268929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1269ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits>
1270bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(const Type *T) const {
1271ea1471e0e967548c596a71469702f8846dbaf3c0John McCall  std::pair<uint64_t, unsigned> Info = getTypeInfo(T);
1272eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return std::make_pair(toCharUnitsFromBits(Info.first),
1273eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck                        toCharUnitsFromBits(Info.second));
1274ea1471e0e967548c596a71469702f8846dbaf3c0John McCall}
1275ea1471e0e967548c596a71469702f8846dbaf3c0John McCall
1276ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits>
1277bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(QualType T) const {
1278ea1471e0e967548c596a71469702f8846dbaf3c0John McCall  return getTypeInfoInChars(T.getTypePtr());
1279ea1471e0e967548c596a71469702f8846dbaf3c0John McCall}
1280ea1471e0e967548c596a71469702f8846dbaf3c0John McCall
1281bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbarstd::pair<uint64_t, unsigned> ASTContext::getTypeInfo(const Type *T) const {
1282bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  TypeInfoMap::iterator it = MemoizedTypeInfo.find(T);
1283bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  if (it != MemoizedTypeInfo.end())
1284bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar    return it->second;
1285bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar
1286bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  std::pair<uint64_t, unsigned> Info = getTypeInfoImpl(T);
1287bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  MemoizedTypeInfo.insert(std::make_pair(T, Info));
1288bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  return Info;
1289bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar}
1290bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar
1291bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// getTypeInfoImpl - Return the size of the specified type, in bits.  This
1292bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// method does not work on incomplete types.
12930953e767ff7817f97b3ab20896b229891eeff45bJohn McCall///
12940953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// FIXME: Pointers into different addr spaces could have different sizes and
12950953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// alignment requirements: getPointerInfo should take an AddrSpace, this
12960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// should take a QualType, &c.
1297d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattnerstd::pair<uint64_t, unsigned>
1298bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel DunbarASTContext::getTypeInfoImpl(const Type *T) const {
12995e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump  uint64_t Width=0;
13005e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump  unsigned Align=8;
1301a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner  switch (T->getTypeClass()) {
130272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base)
130372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base)
130418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor#define NON_CANONICAL_TYPE(Class, Base)
130572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class:
130672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def"
1307d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    llvm_unreachable("Should not see dependent types");
130872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
13095d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::FunctionNoProto:
13105d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::FunctionProto:
131118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    // GCC extension: alignof(function) = 32 bits
131218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Width = 0;
131318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Align = 32;
131418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    break;
131518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
131672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::IncompleteArray:
1317fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case Type::VariableArray:
131818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Width = 0;
131918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Align = getTypeAlign(cast<ArrayType>(T)->getElementType());
132018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    break;
132118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
1322fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case Type::ConstantArray: {
13231d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const ConstantArrayType *CAT = cast<ConstantArrayType>(T);
13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
132598be4943e8dc4f3905629a7102668960873cf863Chris Lattner    std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType());
1326fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara    uint64_t Size = CAT->getSize().getZExtValue();
1327bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar    assert((Size == 0 || EltInfo.first <= (uint64_t)(-1)/Size) &&
1328bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar           "Overflow in array type bit size evaluation");
1329fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara    Width = EltInfo.first*Size;
1330030d8846c7e520330007087e949f621989876e3aChris Lattner    Align = EltInfo.second;
1331cd88b4171753dcb2bc0a21d78f1597c796bb8a20Argyrios Kyrtzidis    Width = llvm::RoundUpToAlignment(Width, Align);
1332030d8846c7e520330007087e949f621989876e3aChris Lattner    break;
13335c09a02a5db85e08a432b6eeced9aa656349710dChristopher Lamb  }
1334213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  case Type::ExtVector:
1335030d8846c7e520330007087e949f621989876e3aChris Lattner  case Type::Vector: {
13369fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    const VectorType *VT = cast<VectorType>(T);
13379fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType());
13389fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    Width = EltInfo.first*VT->getNumElements();
13394bd998bbc228915d2b9cae5b67879de48940d05eEli Friedman    Align = Width;
13406fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // If the alignment is not a power of 2, round up to the next power of 2.
13416fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // This happens for non-power-of-2 length vectors.
13428eefcd353c1d06a10104f69e5079ebab3183f9a3Dan Gohman    if (Align & (Align-1)) {
13439fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner      Align = llvm::NextPowerOf2(Align);
13449fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner      Width = llvm::RoundUpToAlignment(Width, Align);
13459fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    }
1346f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    // Adjust the alignment based on the target max.
1347f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
1348f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    if (TargetVectorAlign && TargetVectorAlign < Align)
1349f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier      Align = TargetVectorAlign;
1350030d8846c7e520330007087e949f621989876e3aChris Lattner    break;
1351030d8846c7e520330007087e949f621989876e3aChris Lattner  }
13525d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner
13539e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  case Type::Builtin:
1354a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner    switch (cast<BuiltinType>(T)->getKind()) {
1355b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    default: llvm_unreachable("Unknown builtin type!");
1356d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    case BuiltinType::Void:
135718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      // GCC extension: alignof(void) = 8 bits.
135818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      Width = 0;
135918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      Align = 8;
136018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      break;
136118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
13626f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Bool:
1363bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getBoolWidth();
1364bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getBoolAlign();
13656f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1366692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::Char_S:
1367692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::Char_U:
1368692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UChar:
13696f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::SChar:
1370bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getCharWidth();
1371bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getCharAlign();
13726f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
13733f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_S:
13743f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_U:
1375bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getWCharWidth();
1376bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getWCharAlign();
137764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis      break;
1378f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    case BuiltinType::Char16:
1379bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getChar16Width();
1380bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getChar16Align();
1381f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      break;
1382f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    case BuiltinType::Char32:
1383bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getChar32Width();
1384bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getChar32Align();
1385f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      break;
1386692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UShort:
13876f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Short:
1388bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getShortWidth();
1389bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getShortAlign();
13906f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1391692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UInt:
13926f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Int:
1393bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getIntWidth();
1394bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getIntAlign();
13956f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1396692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::ULong:
13976f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Long:
1398bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongWidth();
1399bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongAlign();
14006f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1401692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::ULongLong:
14026f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::LongLong:
1403bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongLongWidth();
1404bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongLongAlign();
14056f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1406ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner    case BuiltinType::Int128:
1407ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner    case BuiltinType::UInt128:
1408ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      Width = 128;
1409ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      Align = 128; // int128_t is 128-bit aligned on all targets.
1410ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      break;
1411aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov    case BuiltinType::Half:
1412aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      Width = Target->getHalfWidth();
1413aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      Align = Target->getHalfAlign();
1414aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      break;
14156f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Float:
1416bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getFloatWidth();
1417bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getFloatAlign();
14186f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14196f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Double:
1420bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getDoubleWidth();
1421bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getDoubleAlign();
14226f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14236f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::LongDouble:
1424bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongDoubleWidth();
1425bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongDoubleAlign();
14266f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14276e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl    case BuiltinType::NullPtr:
1428bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t)
1429bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getPointerAlign(0); //   == sizeof(void*)
14301590d9c0fec4c710c2962e4bb71f76979b5163d3Sebastian Redl      break;
1431e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCId:
1432e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCClass:
1433e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCSel:
1434bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getPointerWidth(0);
1435bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getPointerAlign(0);
1436e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian      break;
1437b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1d:
1438b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1dArray:
1439b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1dBuffer:
1440b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage2d:
1441b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage2dArray:
1442b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage3d:
1443b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      // Currently these types are pointers to opaque types.
1444b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      Width = Target->getPointerWidth(0);
1445b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      Align = Target->getPointerAlign(0);
1446b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      break;
1447a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner    }
1448bfef6d7c67831a135d6ab79931f010f750a730adChris Lattner    break;
1449d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  case Type::ObjCObjectPointer:
1450bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(0);
1451bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(0);
14526f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    break;
1453485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff  case Type::BlockPointer: {
1454207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(
1455207f4d8543529221932af82836016a2ef066c917Peter Collingbourne        cast<BlockPointerType>(T)->getPointeeType());
1456bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1457bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
1458485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff    break;
1459485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff  }
14605d484e8cf710207010720589d89602233de61d01Sebastian Redl  case Type::LValueReference:
14615d484e8cf710207010720589d89602233de61d01Sebastian Redl  case Type::RValueReference: {
14625d484e8cf710207010720589d89602233de61d01Sebastian Redl    // alignof and sizeof should never enter this code path here, so we go
14635d484e8cf710207010720589d89602233de61d01Sebastian Redl    // the pointer route.
1464207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(
1465207f4d8543529221932af82836016a2ef066c917Peter Collingbourne        cast<ReferenceType>(T)->getPointeeType());
1466bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1467bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
14685d484e8cf710207010720589d89602233de61d01Sebastian Redl    break;
14695d484e8cf710207010720589d89602233de61d01Sebastian Redl  }
1470f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  case Type::Pointer: {
1471207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType());
1472bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1473bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
1474f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner    break;
1475f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  }
1476f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  case Type::MemberPointer: {
1477071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    const MemberPointerType *MPT = cast<MemberPointerType>(T);
14781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    std::pair<uint64_t, unsigned> PtrDiffInfo =
14791cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson      getTypeInfo(getPointerDiffType());
1480071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    Width = PtrDiffInfo.first * ABI->getMemberPointerSize(MPT);
14811cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson    Align = PtrDiffInfo.second;
14821cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson    break;
1483f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  }
14845d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::Complex: {
14855d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    // Complex types have the same alignment as their elements, but twice the
14865d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    // size.
14871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    std::pair<uint64_t, unsigned> EltInfo =
148898be4943e8dc4f3905629a7102668960873cf863Chris Lattner      getTypeInfo(cast<ComplexType>(T)->getElementType());
14899e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner    Width = EltInfo.first*2;
14905d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    Align = EltInfo.second;
14915d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    break;
14925d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  }
1493c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCObject:
1494c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr());
149544a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel  case Type::ObjCInterface: {
14961d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
149744a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel    const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
1498dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck    Width = toBits(Layout.getSize());
1499dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck    Align = toBits(Layout.getAlignment());
150044a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel    break;
150144a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel  }
150272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Record:
150372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Enum: {
15041d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const TagType *TT = cast<TagType>(T);
15051d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar
15061d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    if (TT->getDecl()->isInvalidDecl()) {
150722ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor      Width = 8;
150822ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor      Align = 8;
15098389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner      break;
15108389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner    }
15111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15121d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    if (const EnumType *ET = dyn_cast<EnumType>(TT))
15137176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner      return getTypeInfo(ET->getDecl()->getIntegerType());
15147176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner
15151d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const RecordType *RT = cast<RecordType>(TT);
15167176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner    const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
1517dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck    Width = toBits(Layout.getSize());
1518dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck    Align = toBits(Layout.getAlignment());
1519dc0d73e6495404418acf8548875aeaff07791a74Chris Lattner    break;
1520a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner  }
15217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
15229fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner  case Type::SubstTemplateTypeParm:
152349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    return getTypeInfo(cast<SubstTemplateTypeParmType>(T)->
152449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                       getReplacementType().getTypePtr());
152549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
152634b41d939a1328f484511c6002ba2456db879a29Richard Smith  case Type::Auto: {
152734b41d939a1328f484511c6002ba2456db879a29Richard Smith    const AutoType *A = cast<AutoType>(T);
152834b41d939a1328f484511c6002ba2456db879a29Richard Smith    assert(A->isDeduced() && "Cannot request the size of a dependent type");
1529dc856aff4428380baa9afb5577ea04f8fb6beb13Matt Beaumont-Gay    return getTypeInfo(A->getDeducedType().getTypePtr());
153034b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
153134b41d939a1328f484511c6002ba2456db879a29Richard Smith
1532075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  case Type::Paren:
1533075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr());
1534075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
153518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::Typedef: {
1536162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl();
1537df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor    std::pair<uint64_t, unsigned> Info
1538df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor      = getTypeInfo(Typedef->getUnderlyingType().getTypePtr());
1539c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // If the typedef has an aligned attribute on it, it overrides any computed
1540c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // alignment we have.  This violates the GCC documentation (which says that
1541c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // attribute(aligned) can only round up) but matches its implementation.
1542c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    if (unsigned AttrAlign = Typedef->getMaxAlignment())
1543c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner      Align = AttrAlign;
1544c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    else
1545c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner      Align = Info.second;
1546df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor    Width = Info.first;
15477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    break;
15487176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner  }
154918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
155018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::TypeOfExpr:
155118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType()
155218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor                         .getTypePtr());
155318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
155418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::TypeOf:
155518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr());
155618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
1557395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  case Type::Decltype:
1558395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType()
1559395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson                        .getTypePtr());
1560395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
1561ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  case Type::UnaryTransform:
1562ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType());
1563ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
1564465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  case Type::Elaborated:
1565465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr());
15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15679d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  case Type::Attributed:
15689d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    return getTypeInfo(
15699d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                  cast<AttributedType>(T)->getEquivalentType().getTypePtr());
15709d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
15713e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  case Type::TemplateSpecialization: {
15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(getCanonicalType(T) != T &&
157318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor           "Cannot request the size of a dependent type");
15743e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T);
15753e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    // A type alias template specialization may refer to a typedef with the
15763e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    // aligned attribute on it.
15773e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    if (TST->isTypeAlias())
15783e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith      return getTypeInfo(TST->getAliasedType().getTypePtr());
15793e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    else
15803e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith      return getTypeInfo(getCanonicalType(T));
15813e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  }
15823e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
1583b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic: {
15842be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    std::pair<uint64_t, unsigned> Info
15852be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      = getTypeInfo(cast<AtomicType>(T)->getValueType());
15862be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    Width = Info.first;
15872be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    Align = Info.second;
15882be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    if (Width != 0 && Width <= Target->getMaxAtomicPromoteWidth() &&
15892be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman        llvm::isPowerOf2_64(Width)) {
15902be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // We can potentially perform lock-free atomic operations for this
15912be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // type; promote the alignment appropriately.
15922be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // FIXME: We could potentially promote the width here as well...
15932be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // is that worthwhile?  (Non-struct atomic types generally have
15942be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // power-of-two size anyway, but structs might not.  Requires a bit
15952be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // of implementation work to make sure we zero out the extra bits.)
15962be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      Align = static_cast<unsigned>(Width);
15972be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    }
1598b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
1599b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
160018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  }
16011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16022be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman  assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2");
16039e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  return std::make_pair(Width, Align);
1604a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner}
1605a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
1606eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck/// toCharUnitsFromBits - Convert a size in bits to a size in characters.
1607eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen DyckCharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const {
1608eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return CharUnits::fromQuantity(BitSize / getCharWidth());
1609eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck}
1610eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck
1611dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck/// toBits - Convert a size in characters to a size in characters.
1612dd76a9ab9ea675671200f94b18ce95766841952bKen Dyckint64_t ASTContext::toBits(CharUnits CharSize) const {
1613dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck  return CharSize.getQuantity() * getCharWidth();
1614dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck}
1615dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck
1616bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// getTypeSizeInChars - Return the size of the specified type, in characters.
1617bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// This method does not work on incomplete types.
16184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(QualType T) const {
1619eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeSize(T));
1620bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck}
16214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(const Type *T) const {
1622eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeSize(T));
1623bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck}
1624bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck
162516e20cce43385001f33f8e3f90ee345609c805d1Ken Dyck/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in
162686fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck/// characters. This method does not work on incomplete types.
16274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(QualType T) const {
1628eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeAlign(T));
162986fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck}
16304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(const Type *T) const {
1631eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeAlign(T));
163286fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck}
163386fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck
163434ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// getPreferredTypeAlign - Return the "preferred" alignment of the specified
163534ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// type for the current target in bits.  This can be different than the ABI
163634ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// alignment in cases where it is beneficial for performance to overalign
163734ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// a data type.
16384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
163934ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner  unsigned ABIAlign = getTypeAlign(T);
16401eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman
16411eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman  // Double and long long should be naturally aligned if possible.
1642183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  if (const ComplexType* CT = T->getAs<ComplexType>())
16431eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman    T = CT->getElementType().getTypePtr();
16441eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman  if (T->isSpecificBuiltinType(BuiltinType::Double) ||
1645cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier      T->isSpecificBuiltinType(BuiltinType::LongLong) ||
1646cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier      T->isSpecificBuiltinType(BuiltinType::ULongLong))
16471eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman    return std::max(ABIAlign, (unsigned)getTypeSize(T));
16481eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman
164934ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner  return ABIAlign;
165034ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner}
165134ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner
16522c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// DeepCollectObjCIvars -
16532c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// This routine first collects all declared, but not synthesized, ivars in
16542c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// super class and then collects all ivars, including those synthesized for
16552c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// current class. This routine is used for implementation of current class
16562c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// when all ivars, declared and synthesized are known.
16579820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian///
16582c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanianvoid ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI,
16592c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian                                      bool leafClass,
1660db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose                            SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const {
16612c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass())
16622c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    DeepCollectObjCIvars(SuperClass, false, Ivars);
16632c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  if (!leafClass) {
16642c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(),
16652c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian         E = OI->ivar_end(); I != E; ++I)
1666581deb3da481053c4993c7600f97acf7768caac5David Blaikie      Ivars.push_back(*I);
16673060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  } else {
1668bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian    ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI);
1669db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose    for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
1670bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian         Iv= Iv->getNextIvar())
1671bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian      Ivars.push_back(Iv);
1672bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian  }
16739820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian}
16749820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian
1675e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// CollectInheritedProtocols - Collect all protocols in current class and
1676e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// those inherited by it.
1677e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid ASTContext::CollectInheritedProtocols(const Decl *CDecl,
1678432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian                          llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) {
1679e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
168053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    // We can use protocol_iterator here instead of
168153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    // all_referenced_protocol_iterator since we are walking all categories.
168253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    for (ObjCInterfaceDecl::all_protocol_iterator P = OI->all_referenced_protocol_begin(),
168353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek         PE = OI->all_referenced_protocol_end(); P != PE; ++P) {
1684e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
16853fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1686e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1687b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P) {
16883fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor        Protocols.insert((*P)->getCanonicalDecl());
1689e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1690e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      }
1691b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian    }
1692e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
1693e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    // Categories of this Interface.
1694d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    for (ObjCInterfaceDecl::visible_categories_iterator
1695d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           Cat = OI->visible_categories_begin(),
1696d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           CatEnd = OI->visible_categories_end();
1697d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         Cat != CatEnd; ++Cat) {
1698d329724745b49f894b768d47275b7c2713106e89Douglas Gregor      CollectInheritedProtocols(*Cat, Protocols);
1699d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    }
1700d329724745b49f894b768d47275b7c2713106e89Douglas Gregor
1701e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    if (ObjCInterfaceDecl *SD = OI->getSuperClass())
1702e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      while (SD) {
1703e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(SD, Protocols);
1704e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        SD = SD->getSuperClass();
1705e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      }
1706b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer  } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
170753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    for (ObjCCategoryDecl::protocol_iterator P = OC->protocol_begin(),
1708e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian         PE = OC->protocol_end(); P != PE; ++P) {
1709e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
17103fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1711e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1712e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P)
1713e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1714e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
1715b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer  } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
1716e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(),
1717e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian         PE = OP->protocol_end(); P != PE; ++P) {
1718e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
17193fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1720e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1721e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P)
1722e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1723e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
1724e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
1725e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian}
1726e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
17274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const {
17283bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  unsigned count = 0;
17293bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // Count ivars declared in class extension.
1730d329724745b49f894b768d47275b7c2713106e89Douglas Gregor  for (ObjCInterfaceDecl::known_extensions_iterator
1731d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         Ext = OI->known_extensions_begin(),
1732d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         ExtEnd = OI->known_extensions_end();
1733d329724745b49f894b768d47275b7c2713106e89Douglas Gregor       Ext != ExtEnd; ++Ext) {
1734d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    count += Ext->ivar_size();
1735d329724745b49f894b768d47275b7c2713106e89Douglas Gregor  }
1736d329724745b49f894b768d47275b7c2713106e89Douglas Gregor
17373bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // Count ivar defined in this class's implementation.  This
17383bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // includes synthesized ivars.
17393bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  if (ObjCImplementationDecl *ImplDecl = OI->getImplementation())
1740b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer    count += ImplDecl->ivar_size();
1741b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer
17428e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian  return count;
17438e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian}
17448e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian
17458deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidisbool ASTContext::isSentinelNullExpr(const Expr *E) {
17468deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (!E)
17478deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis    return false;
17488deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17498deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  // nullptr_t is always treated as null.
17508deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (E->getType()->isNullPtrType()) return true;
17518deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17528deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (E->getType()->isAnyPointerType() &&
17538deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis      E->IgnoreParenCasts()->isNullPointerConstant(*this,
17548deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis                                                Expr::NPC_ValueDependentIsNull))
17558deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis    return true;
17568deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17578deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  // Unfortunately, __null has type 'int'.
17588deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (isa<GNUNullExpr>(E)) return true;
17598deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17608deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  return false;
17618deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis}
17628deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17638a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists.
17648a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) {
17658a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
17668a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    I = ObjCImpls.find(D);
17678a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  if (I != ObjCImpls.end())
17688a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    return cast<ObjCImplementationDecl>(I->second);
17698a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  return 0;
17708a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
17718a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists.
17728a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) {
17738a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
17748a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    I = ObjCImpls.find(D);
17758a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  if (I != ObjCImpls.end())
17768a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    return cast<ObjCCategoryImplDecl>(I->second);
17778a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  return 0;
17788a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
17798a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis
17808a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCInterfaceDecl.
17818a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD,
17828a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis                           ObjCImplementationDecl *ImplD) {
17838a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  assert(IFaceD && ImplD && "Passed null params");
17848a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  ObjCImpls[IFaceD] = ImplD;
17858a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
17868a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCCategoryDecl.
17878a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD,
17888a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis                           ObjCCategoryImplDecl *ImplD) {
17898a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  assert(CatD && ImplD && "Passed null params");
17908a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  ObjCImpls[CatD] = ImplD;
17918a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
17928a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis
179387ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios KyrtzidisObjCInterfaceDecl *ASTContext::getObjContainingInterface(NamedDecl *ND) const {
179487ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext()))
179587ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return ID;
179687ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ND->getDeclContext()))
179787ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return CD->getClassInterface();
179887ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  if (ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(ND->getDeclContext()))
179987ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return IMD->getClassInterface();
180087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis
180187ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  return 0;
180287ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis}
180387ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis
18041ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Get the copy initialization expression of VarDecl,or NULL if
18051ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// none exists.
1806830937bc1100fba7682f7c32c40512085870f50cFariborz JahanianExpr *ASTContext::getBlockVarCopyInits(const VarDecl*VD) {
1807d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD && "Passed null params");
1808d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD->hasAttr<BlocksAttr>() &&
1809d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian         "getBlockVarCopyInits - not __block var");
1810830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian  llvm::DenseMap<const VarDecl*, Expr*>::iterator
1811d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian    I = BlockVarCopyInits.find(VD);
18121ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  return (I != BlockVarCopyInits.end()) ? cast<Expr>(I->second) : 0;
18131ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian}
18141ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian
18151ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Set the copy inialization expression of a block var decl.
18161ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanianvoid ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) {
18171ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  assert(VD && Init && "Passed null params");
1818d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD->hasAttr<BlocksAttr>() &&
1819d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian         "setBlockVarCopyInits - not __block var");
18201ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  BlockVarCopyInits[VD] = Init;
18211ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian}
18221ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian
1823a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T,
18244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                 unsigned DataSize) const {
1825109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall  if (!DataSize)
1826109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall    DataSize = TypeLoc::getFullDataSizeForType(T);
1827109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall  else
1828109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall    assert(DataSize == TypeLoc::getFullDataSizeForType(T) &&
1829a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall           "incorrect data size provided to CreateTypeSourceInfo!");
1830109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall
1831a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *TInfo =
1832a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8);
1833a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  new (TInfo) TypeSourceInfo(T);
1834a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TInfo;
1835b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
1836b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
1837a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T,
18386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                     SourceLocation L) const {
1839a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = CreateTypeSourceInfo(T);
1840c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L);
1841a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall  return DI;
1842a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall}
1843a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall
1844b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout &
18454ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const {
1846b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar  return getObjCLayout(D, 0);
1847b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar}
1848b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar
1849b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout &
18504ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCImplementationLayout(
18514ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                        const ObjCImplementationDecl *D) const {
1852b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar  return getObjCLayout(D->getClassInterface(), D);
1853b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar}
1854b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar
1855a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===//
1856a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//                   Type creation/memoization methods
1857a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===//
1858a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
18594ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
18603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const {
18613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  unsigned fastQuals = quals.getFastQualifiers();
18623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  quals.removeFastQualifiers();
18630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
18640953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Check if we've already instantiated this type.
18650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  llvm::FoldingSetNodeID ID;
18663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQuals::Profile(ID, baseType, quals);
18673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
18683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
18693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    assert(eq->getQualifiers() == quals);
18703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(eq, fastQuals);
18710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  }
18720953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
18733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If the base type is not canonical, make the appropriate canonical type.
18743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon;
18753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!baseType->isCanonicalUnqualified()) {
18763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split();
1877200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canonSplit.Quals.addConsistentQualifiers(quals);
1878200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getExtQualType(canonSplit.Ty, canonSplit.Quals);
18793b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
18803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    // Re-find the insert position.
18813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
18823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
18833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
18843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQuals *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals);
18853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQualNodes.InsertNode(eq, insertPos);
18863b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(eq, fastQuals);
18870953e767ff7817f97b3ab20896b229891eeff45bJohn McCall}
18880953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
18894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
18904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const {
1891f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  QualType CanT = getCanonicalType(T);
1892f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  if (CanT.getAddressSpace() == AddressSpace)
1893f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    return T;
1894b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner
18950953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If we are composing extended qualifiers together, merge together
18960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // into one ExtQuals node.
18970953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  QualifierCollector Quals;
18980953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  const Type *TypeNode = Quals.strip(T);
18991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19000953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If this type already has an address space specified, it cannot get
19010953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // another one.
19020953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  assert(!Quals.hasAddressSpace() &&
19030953e767ff7817f97b3ab20896b229891eeff45bJohn McCall         "Type cannot be in multiple addr spaces!");
19040953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  Quals.addAddressSpace(AddressSpace);
19051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19060953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getExtQualType(TypeNode, Quals);
1907ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb}
1908ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
1909b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris LattnerQualType ASTContext::getObjCGCQualType(QualType T,
19104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                       Qualifiers::GC GCAttr) const {
1911d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  QualType CanT = getCanonicalType(T);
1912b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner  if (CanT.getObjCGCAttr() == GCAttr)
1913d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    return T;
19141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19157f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall  if (const PointerType *ptr = T->getAs<PointerType>()) {
19167f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall    QualType Pointee = ptr->getPointeeType();
191758f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff    if (Pointee->isAnyPointerType()) {
19184027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian      QualType ResultType = getObjCGCQualType(Pointee, GCAttr);
19194027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian      return getPointerType(ResultType);
19204027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian    }
19214027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian  }
19221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If we are composing extended qualifiers together, merge together
19240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // into one ExtQuals node.
19250953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  QualifierCollector Quals;
19260953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  const Type *TypeNode = Quals.strip(T);
19271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19280953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If this type already has an ObjCGC specified, it cannot get
19290953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // another one.
19300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  assert(!Quals.hasObjCGCAttr() &&
19310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall         "Type cannot have multiple ObjCGCs!");
19320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  Quals.addObjCGCAttr(GCAttr);
19331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19340953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getExtQualType(TypeNode, Quals);
1935d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian}
1936a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
1937e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCallconst FunctionType *ASTContext::adjustFunctionType(const FunctionType *T,
1938e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall                                                   FunctionType::ExtInfo Info) {
1939e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  if (T->getExtInfo() == Info)
1940e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    return T;
1941e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
1942e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  QualType Result;
1943e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
1944e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    Result = getFunctionNoProtoType(FNPT->getResultType(), Info);
1945e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  } else {
1946e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    const FunctionProtoType *FPT = cast<FunctionProtoType>(T);
1947e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
1948e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    EPI.ExtInfo = Info;
1949e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    Result = getFunctionType(FPT->getResultType(), FPT->arg_type_begin(),
1950e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall                             FPT->getNumArgs(), EPI);
1951e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  }
1952e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
1953e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  return cast<FunctionType>(Result.getTypePtr());
1954e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall}
1955e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
19565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getComplexType - Return the uniqued reference to the type for a complex
19575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// number with the specified element type.
19584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getComplexType(QualType T) const {
19595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
19605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
19615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
19625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ComplexType::Profile(ID, T);
19631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
19655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
19665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(CT, 0);
19671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the pointee type isn't canonical, this won't be a canonical type either,
19695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
19705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
1971467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!T.isCanonical()) {
1972f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner    Canonical = getComplexType(getCanonicalType(T));
19731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
19755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
1976c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
19775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
19786b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical);
19795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
19805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ComplexTypes.InsertNode(New, InsertPos);
19815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
19825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
19835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
19845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getPointerType - Return the uniqued reference to the type for a pointer to
19855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the specified type.
19864ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPointerType(QualType T) const {
19875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
19885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
19895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
19905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PointerType::Profile(ID, T);
19911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
19935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
19945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(PT, 0);
19951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the pointee type isn't canonical, this won't be a canonical type either,
19975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
19985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
1999467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!T.isCanonical()) {
2000f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner    Canonical = getPointerType(getCanonicalType(T));
20011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
20035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2004c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
20055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
20066b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical);
20075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
20085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PointerTypes.InsertNode(New, InsertPos);
20095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
20105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
20115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
20121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getBlockPointerType - Return the uniqued reference to the type for
20135618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff/// a pointer to the specified block.
20144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockPointerType(QualType T) const {
2015296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff  assert(T->isFunctionType() && "block of function types only");
2016296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff  // Unique pointers, to guarantee there is only one block of a particular
20175618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  // structure.
20185618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  llvm::FoldingSetNodeID ID;
20195618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  BlockPointerType::Profile(ID, T);
20201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20215618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  void *InsertPos = 0;
20225618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  if (BlockPointerType *PT =
20235618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff        BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
20245618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    return QualType(PT, 0);
20251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // If the block pointee type isn't canonical, this won't be a canonical
20275618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  // type either so fill in the canonical type field.
20285618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  QualType Canonical;
2029467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!T.isCanonical()) {
20305618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    Canonical = getBlockPointerType(getCanonicalType(T));
20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20325618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    // Get the new insert position for the node we care about.
20335618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    BlockPointerType *NewIP =
20345618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff      BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2035c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
20365618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  }
20376b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  BlockPointerType *New
20386b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) BlockPointerType(T, Canonical);
20395618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  Types.push_back(New);
20405618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  BlockPointerTypes.InsertNode(New, InsertPos);
20415618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  return QualType(New, 0);
20425618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff}
20435618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff
20447c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getLValueReferenceType - Return the uniqued reference to the type for an
20457c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// lvalue reference to the specified type.
20464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
20474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const {
20489625e44c0252485277a340746ed8ac950686156fDouglas Gregor  assert(getCanonicalType(T) != OverloadTy &&
20499625e44c0252485277a340746ed8ac950686156fDouglas Gregor         "Unresolved overloaded function type");
20509625e44c0252485277a340746ed8ac950686156fDouglas Gregor
20515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
20525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
20535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
205454e14c4db764c0636160d26c5bbf491637c83a76John McCall  ReferenceType::Profile(ID, T, SpelledAsLValue);
20555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
20565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
20577c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  if (LValueReferenceType *RT =
20587c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl        LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
20595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(RT, 0);
20607c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
206154e14c4db764c0636160d26c5bbf491637c83a76John McCall  const ReferenceType *InnerRef = T->getAs<ReferenceType>();
206254e14c4db764c0636160d26c5bbf491637c83a76John McCall
20635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the referencee type isn't canonical, this won't be a canonical type
20645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // either, so fill in the canonical type field.
20655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
206654e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
206754e14c4db764c0636160d26c5bbf491637c83a76John McCall    QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
206854e14c4db764c0636160d26c5bbf491637c83a76John McCall    Canonical = getLValueReferenceType(getCanonicalType(PointeeType));
20697c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
20707c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    // Get the new insert position for the node we care about.
20717c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    LValueReferenceType *NewIP =
20727c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl      LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
2073c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
20747c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  }
20757c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
20766b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  LValueReferenceType *New
207754e14c4db764c0636160d26c5bbf491637c83a76John McCall    = new (*this, TypeAlignment) LValueReferenceType(T, Canonical,
207854e14c4db764c0636160d26c5bbf491637c83a76John McCall                                                     SpelledAsLValue);
20797c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  Types.push_back(New);
20807c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  LValueReferenceTypes.InsertNode(New, InsertPos);
208154e14c4db764c0636160d26c5bbf491637c83a76John McCall
20827c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  return QualType(New, 0);
20837c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl}
20847c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
20857c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getRValueReferenceType - Return the uniqued reference to the type for an
20867c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// rvalue reference to the specified type.
20874ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRValueReferenceType(QualType T) const {
20887c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // Unique pointers, to guarantee there is only one pointer of a particular
20897c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // structure.
20907c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  llvm::FoldingSetNodeID ID;
209154e14c4db764c0636160d26c5bbf491637c83a76John McCall  ReferenceType::Profile(ID, T, false);
20927c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
20937c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  void *InsertPos = 0;
20947c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  if (RValueReferenceType *RT =
20957c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl        RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
20967c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    return QualType(RT, 0);
20977c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
209854e14c4db764c0636160d26c5bbf491637c83a76John McCall  const ReferenceType *InnerRef = T->getAs<ReferenceType>();
209954e14c4db764c0636160d26c5bbf491637c83a76John McCall
21007c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // If the referencee type isn't canonical, this won't be a canonical type
21017c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // either, so fill in the canonical type field.
21027c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  QualType Canonical;
210354e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (InnerRef || !T.isCanonical()) {
210454e14c4db764c0636160d26c5bbf491637c83a76John McCall    QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
210554e14c4db764c0636160d26c5bbf491637c83a76John McCall    Canonical = getRValueReferenceType(getCanonicalType(PointeeType));
21067c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
21075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
21087c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    RValueReferenceType *NewIP =
21097c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl      RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
2110c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
21115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
21125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
21136b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  RValueReferenceType *New
21146b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) RValueReferenceType(T, Canonical);
21155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
21167c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  RValueReferenceTypes.InsertNode(New, InsertPos);
21175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
21185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
21195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2120f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// getMemberPointerType - Return the uniqued reference to the type for a
2121f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// member pointer to the specified type, in the specified class.
21224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const {
2123f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // Unique pointers, to guarantee there is only one pointer of a particular
2124f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // structure.
2125f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  llvm::FoldingSetNodeID ID;
2126f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  MemberPointerType::Profile(ID, T, Cls);
2127f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2128f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  void *InsertPos = 0;
2129f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  if (MemberPointerType *PT =
2130f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
2131f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    return QualType(PT, 0);
2132f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2133f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // If the pointee or class type isn't canonical, this won't be a canonical
2134f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // type either, so fill in the canonical type field.
2135f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  QualType Canonical;
213687c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor  if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) {
2137f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls));
2138f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2139f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    // Get the new insert position for the node we care about.
2140f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    MemberPointerType *NewIP =
2141f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2142c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
2143f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  }
21446b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  MemberPointerType *New
21456b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical);
2146f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  Types.push_back(New);
2147f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  MemberPointerTypes.InsertNode(New, InsertPos);
2148f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  return QualType(New, 0);
2149f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl}
2150f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
21511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getConstantArrayType - Return the unique reference to the type for an
2152fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff/// array of the specified element type.
21531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getConstantArrayType(QualType EltTy,
215438aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner                                          const llvm::APInt &ArySizeIn,
2155c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff                                          ArrayType::ArraySizeModifier ASM,
215663e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                          unsigned IndexTypeQuals) const {
2157923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  assert((EltTy->isDependentType() ||
2158923d56d436f750bc1f29db50e641078725558a1bSebastian Redl          EltTy->isIncompleteType() || EltTy->isConstantSizeType()) &&
2159587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman         "Constant array of VLAs is illegal!");
2160587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman
216138aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  // Convert the array size into a canonical width matching the pointer size for
216238aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  // the target.
216338aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  llvm::APInt ArySize(ArySizeIn);
21649f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad  ArySize =
2165bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    ArySize.zextOrTrunc(Target->getPointerWidth(getTargetAddressSpace(EltTy)));
21661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
216863e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara  ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, IndexTypeQuals);
21691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
21711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (ConstantArrayType *ATP =
21727192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek      ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
21735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(ATP, 0);
21741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If the element type isn't canonical or has qualifiers, this won't
21763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // be a canonical type either, so fill in the canonical type field.
21773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType Canon;
21783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) {
21793b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(EltTy).split();
2180200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize,
218163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                 ASM, IndexTypeQuals);
2182200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getQualifiedType(Canon, canonSplit.Quals);
21833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
21845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
21851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ConstantArrayType *NewIP =
21867192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek      ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
2187c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
21885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
21891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21906b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ConstantArrayType *New = new(*this,TypeAlignment)
219163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara    ConstantArrayType(EltTy, Canon, ArySize, ASM, IndexTypeQuals);
21927192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek  ConstantArrayTypes.InsertNode(New, InsertPos);
21935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
21945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
21955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
21965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2197ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// getVariableArrayDecayedType - Turns the given type, which may be
2198ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// variably-modified, into the corresponding type with all the known
2199ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// sizes replaced with [*].
2200ce8890371fcdb983ae487c87fa40606a34896ff7John McCallQualType ASTContext::getVariableArrayDecayedType(QualType type) const {
2201ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Vastly most common case.
2202ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  if (!type->isVariablyModifiedType()) return type;
2203ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2204ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  QualType result;
2205ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2206ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  SplitQualType split = type.getSplitDesugaredType();
2207200fa53fd420aa8369586f569dbece04930ad6a3John McCall  const Type *ty = split.Ty;
2208ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  switch (ty->getTypeClass()) {
2209ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define TYPE(Class, Base)
2210ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define ABSTRACT_TYPE(Class, Base)
2211ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2212ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#include "clang/AST/TypeNodes.def"
2213ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    llvm_unreachable("didn't desugar past all non-canonical types?");
2214ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2215ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types should never be variably-modified.
2216ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Builtin:
2217ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Complex:
2218ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Vector:
2219ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ExtVector:
2220ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentSizedExtVector:
2221ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCObject:
2222ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCInterface:
2223ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCObjectPointer:
2224ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Record:
2225ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Enum:
2226ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::UnresolvedUsing:
2227ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TypeOfExpr:
2228ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TypeOf:
2229ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Decltype:
2230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  case Type::UnaryTransform:
2231ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentName:
2232ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::InjectedClassName:
2233ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TemplateSpecialization:
2234ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentTemplateSpecialization:
2235ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TemplateTypeParm:
2236ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::SubstTemplateTypeParmPack:
223734b41d939a1328f484511c6002ba2456db879a29Richard Smith  case Type::Auto:
2238ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::PackExpansion:
2239ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    llvm_unreachable("type should never be variably-modified");
2240ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2241ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types can be variably-modified but should never need to
2242ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // further decay.
2243ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::FunctionNoProto:
2244ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::FunctionProto:
2245ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::BlockPointer:
2246ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::MemberPointer:
2247ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    return type;
2248ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2249ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types can be variably-modified.  All these modifications
2250ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // preserve structure except as noted by comments.
2251ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // TODO: if we ever care about optimizing VLAs, there are no-op
2252ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // optimizations available here.
2253ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Pointer:
2254ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getPointerType(getVariableArrayDecayedType(
2255ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                              cast<PointerType>(ty)->getPointeeType()));
2256ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2257ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2258ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::LValueReference: {
2259ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const LValueReferenceType *lv = cast<LValueReferenceType>(ty);
2260ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getLValueReferenceType(
2261ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(lv->getPointeeType()),
2262ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                    lv->isSpelledAsLValue());
2263ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2264745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2265ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2266ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::RValueReference: {
2267ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const RValueReferenceType *lv = cast<RValueReferenceType>(ty);
2268ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getRValueReferenceType(
2269ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(lv->getPointeeType()));
2270ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2271745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2272745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2273b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic: {
2274b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    const AtomicType *at = cast<AtomicType>(ty);
2275b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    result = getAtomicType(getVariableArrayDecayedType(at->getValueType()));
2276b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    break;
2277b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
2278b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
2279ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ConstantArray: {
2280ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const ConstantArrayType *cat = cast<ConstantArrayType>(ty);
2281ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getConstantArrayType(
2282ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(cat->getElementType()),
2283ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getSize(),
2284ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getSizeModifier(),
2285ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getIndexTypeCVRQualifiers());
2286ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2287745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2288745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2289ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentSizedArray: {
2290ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const DependentSizedArrayType *dat = cast<DependentSizedArrayType>(ty);
2291ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getDependentSizedArrayType(
2292ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(dat->getElementType()),
2293ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getSizeExpr(),
2294ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getSizeModifier(),
2295ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getIndexTypeCVRQualifiers(),
2296ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getBracketsRange());
2297ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2298ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2299ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2300ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Turn incomplete types into [*] types.
2301ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::IncompleteArray: {
2302ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const IncompleteArrayType *iat = cast<IncompleteArrayType>(ty);
2303ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getVariableArrayType(
2304ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(iat->getElementType()),
2305ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  /*size*/ 0,
2306ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  ArrayType::Normal,
2307ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  iat->getIndexTypeCVRQualifiers(),
2308ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  SourceRange());
2309ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2310ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2311ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2312ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Turn VLA types into [*] types.
2313ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::VariableArray: {
2314ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const VariableArrayType *vat = cast<VariableArrayType>(ty);
2315ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getVariableArrayType(
2316ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(vat->getElementType()),
2317ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  /*size*/ 0,
2318ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  ArrayType::Star,
2319ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  vat->getIndexTypeCVRQualifiers(),
2320ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  vat->getBracketsRange());
2321ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2322ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2323ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2324ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2325ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Apply the top-level qualifiers from the original.
2326200fa53fd420aa8369586f569dbece04930ad6a3John McCall  return getQualifiedType(result, split.Quals);
2327ce8890371fcdb983ae487c87fa40606a34896ff7John McCall}
2328745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2329bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// getVariableArrayType - Returns a non-unique reference to the type for a
2330bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// variable array of the specified element type.
23317e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas GregorQualType ASTContext::getVariableArrayType(QualType EltTy,
23327e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                          Expr *NumElts,
2333c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff                                          ArrayType::ArraySizeModifier ASM,
233463e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                          unsigned IndexTypeQuals,
23354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          SourceRange Brackets) const {
2336c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // Since we don't unique expressions, it isn't possible to unique VLA's
2337c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // that have an expression provided for their size.
23383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType Canon;
2339715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor
23403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Be sure to pull qualifiers off the element type.
23413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) {
23423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(EltTy).split();
2343200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM,
234463e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                 IndexTypeQuals, Brackets);
2345200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getQualifiedType(Canon, canonSplit.Quals);
2346715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor  }
2347715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor
23486b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  VariableArrayType *New = new(*this, TypeAlignment)
234963e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara    VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets);
2350c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2351c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  VariableArrayTypes.push_back(New);
2352c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  Types.push_back(New);
2353c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return QualType(New, 0);
2354c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman}
2355c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2356898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// getDependentSizedArrayType - Returns a non-unique reference to
2357898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// the type for a dependently-sized array of the specified element
235804d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor/// type.
23593b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getDependentSizedArrayType(QualType elementType,
23603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                Expr *numElements,
2361898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                                                ArrayType::ArraySizeModifier ASM,
23623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                unsigned elementTypeQuals,
23633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                SourceRange brackets) const {
23643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  assert((!numElements || numElements->isTypeDependent() ||
23653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall          numElements->isValueDependent()) &&
2366898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor         "Size must be type- or value-dependent!");
2367898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
23683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Dependently-sized array types that do not have a specified number
23693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // of elements will have their sizes deduced from a dependent
23703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // initializer.  We do no canonicalization here at all, which is okay
23713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // because they can't be used in most locations.
23723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!numElements) {
23733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayType *newType
23743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      = new (*this, TypeAlignment)
23753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall          DependentSizedArrayType(*this, elementType, QualType(),
23763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                  numElements, ASM, elementTypeQuals,
23773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                  brackets);
23783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    Types.push_back(newType);
23793b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(newType, 0);
2380cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor  }
2381cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor
23823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Otherwise, we actually build a new type every time, but we
23833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // also build a canonical type.
23841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  SplitQualType canonElementType = getCanonicalType(elementType).split();
2386898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
23873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
23883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  llvm::FoldingSetNodeID ID;
23893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType::Profile(ID, *this,
2390200fa53fd420aa8369586f569dbece04930ad6a3John McCall                                   QualType(canonElementType.Ty, 0),
23913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                   ASM, elementTypeQuals, numElements);
23923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
23933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Look for an existing type with these properties.
23943b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType *canonTy =
23953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
23963b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
23973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If we don't have one, build one.
23983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!canonTy) {
23993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    canonTy = new (*this, TypeAlignment)
2400200fa53fd420aa8369586f569dbece04930ad6a3John McCall      DependentSizedArrayType(*this, QualType(canonElementType.Ty, 0),
24013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                              QualType(), numElements, ASM, elementTypeQuals,
24023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                              brackets);
24033b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
24043b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    Types.push_back(canonTy);
24053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
24063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Apply qualifiers from the element type to the array.
24083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon = getQualifiedType(QualType(canonTy,0),
2409200fa53fd420aa8369586f569dbece04930ad6a3John McCall                                    canonElementType.Quals);
24103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If we didn't need extra canonicalization for the element type,
24123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // then just use that as our result.
2413200fa53fd420aa8369586f569dbece04930ad6a3John McCall  if (QualType(canonElementType.Ty, 0) == elementType)
24143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return canon;
24153b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Otherwise, we need to build a type which follows the spelling
24173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // of the element type.
24183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType *sugaredType
24193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    = new (*this, TypeAlignment)
24203b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        DependentSizedArrayType(*this, elementType, canon, numElements,
24213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                ASM, elementTypeQuals, brackets);
24223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Types.push_back(sugaredType);
24233b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(sugaredType, 0);
24243b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall}
24253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getIncompleteArrayType(QualType elementType,
2427c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman                                            ArrayType::ArraySizeModifier ASM,
24283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                            unsigned elementTypeQuals) const {
2429c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  llvm::FoldingSetNodeID ID;
24303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals);
2431c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
24323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
24333b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (IncompleteArrayType *iat =
24343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall       IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
24353b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(iat, 0);
2436c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2437c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If the element type isn't canonical, this won't be a canonical type
24383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // either, so fill in the canonical type field.  We also have to pull
24393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // qualifiers off the element type.
24403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon;
2441c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
24423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) {
24433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(elementType).split();
2444200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0),
24453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                   ASM, elementTypeQuals);
2446200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getQualifiedType(canon, canonSplit.Quals);
2447c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2448c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    // Get the new insert position for the node we care about.
24493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    IncompleteArrayType *existing =
24503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
24513b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    assert(!existing && "Shouldn't be in the map!"); (void) existing;
24522bd24ba6d10f8c811c8e2a57c8397e07082ba497Ted Kremenek  }
2453c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
24543b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayType *newType = new (*this, TypeAlignment)
24553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    IncompleteArrayType(elementType, canon, ASM, elementTypeQuals);
2456c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
24573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayTypes.InsertNode(newType, insertPos);
24583b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Types.push_back(newType);
24593b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(newType, 0);
2460fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff}
2461fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
246273322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// getVectorType - Return the unique reference to a vector type of
246373322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type.
246482287d19ded35248c4ce6a425ce74116a13ce44eJohn ThompsonQualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
24654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                   VectorType::VectorKind VecKind) const {
24663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  assert(vecType->isBuiltinType());
24671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Check if we've already instantiated a vector of this type.
24695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
2470e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson  VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind);
2471788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner
24725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
24735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
24745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(VTP, 0);
24755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
24765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the element type isn't canonical, this won't be a canonical type either,
24775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
24785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2479255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  if (!vecType.isCanonical()) {
2480231da7eb3dd13007e5e40fffe48998e5ef284e06Bob Wilson    Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind);
24811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
24835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2484c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
24855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
24866b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  VectorType *New = new (*this, TypeAlignment)
2487e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson    VectorType(vecType, NumElts, Canonical, VecKind);
24885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  VectorTypes.InsertNode(New, InsertPos);
24895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
24905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
24915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
24925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2493213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman/// getExtVectorType - Return the unique reference to an extended vector type of
249473322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type.
24954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
24964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const {
24974ac01401b1ec602a1f58c217544d3dcb5fcbd7f1Douglas Gregor  assert(vecType->isBuiltinType() || vecType->isDependentType());
24981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
249973322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // Check if we've already instantiated a vector of this type.
250073322924127c873c13101b705dd823f5539ffa5fSteve Naroff  llvm::FoldingSetNodeID ID;
2501788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  VectorType::Profile(ID, vecType, NumElts, Type::ExtVector,
2502e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                      VectorType::GenericVector);
250373322924127c873c13101b705dd823f5539ffa5fSteve Naroff  void *InsertPos = 0;
250473322924127c873c13101b705dd823f5539ffa5fSteve Naroff  if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
250573322924127c873c13101b705dd823f5539ffa5fSteve Naroff    return QualType(VTP, 0);
250673322924127c873c13101b705dd823f5539ffa5fSteve Naroff
250773322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // If the element type isn't canonical, this won't be a canonical type either,
250873322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // so fill in the canonical type field.
250973322924127c873c13101b705dd823f5539ffa5fSteve Naroff  QualType Canonical;
2510467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!vecType.isCanonical()) {
2511213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    Canonical = getExtVectorType(getCanonicalType(vecType), NumElts);
25121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
251373322924127c873c13101b705dd823f5539ffa5fSteve Naroff    // Get the new insert position for the node we care about.
251473322924127c873c13101b705dd823f5539ffa5fSteve Naroff    VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2515c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
251673322924127c873c13101b705dd823f5539ffa5fSteve Naroff  }
25176b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ExtVectorType *New = new (*this, TypeAlignment)
25186b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    ExtVectorType(vecType, NumElts, Canonical);
251973322924127c873c13101b705dd823f5539ffa5fSteve Naroff  VectorTypes.InsertNode(New, InsertPos);
252073322924127c873c13101b705dd823f5539ffa5fSteve Naroff  Types.push_back(New);
252173322924127c873c13101b705dd823f5539ffa5fSteve Naroff  return QualType(New, 0);
252273322924127c873c13101b705dd823f5539ffa5fSteve Naroff}
252373322924127c873c13101b705dd823f5539ffa5fSteve Naroff
25244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
25254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentSizedExtVectorType(QualType vecType,
25264ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           Expr *SizeExpr,
25274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           SourceLocation AttrLoc) const {
25282ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  llvm::FoldingSetNodeID ID;
25291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType),
25302ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor                                       SizeExpr);
25311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25322ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  void *InsertPos = 0;
25332ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  DependentSizedExtVectorType *Canon
25342ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
25352ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  DependentSizedExtVectorType *New;
25362ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  if (Canon) {
25372ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    // We already have a canonical version of this array type; use it as
25382ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    // the canonical type for a newly-built type.
25396b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    New = new (*this, TypeAlignment)
25406b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0),
25416b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                                  SizeExpr, AttrLoc);
25422ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  } else {
25432ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    QualType CanonVecTy = getCanonicalType(vecType);
25442ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    if (CanonVecTy == vecType) {
25456b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      New = new (*this, TypeAlignment)
25466b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr,
25476b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                                    AttrLoc);
2548789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
2549789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      DependentSizedExtVectorType *CanonCheck
2550789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor        = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2551789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken");
2552789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      (void)CanonCheck;
25532ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor      DependentSizedExtVectorTypes.InsertNode(New, InsertPos);
25542ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    } else {
25552ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor      QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr,
25562ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor                                                      SourceLocation());
25576b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      New = new (*this, TypeAlignment)
25586b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc);
25592ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    }
25602ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  }
25611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25629cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  Types.push_back(New);
25639cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  return QualType(New, 0);
25649cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor}
25659cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor
256672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'.
25675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
25684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
25694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionNoProtoType(QualType ResultTy,
25704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                   const FunctionType::ExtInfo &Info) const {
2571cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv DefaultCC = Info.getCC();
2572cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ?
2573cfe9af250f466e7e38becea4428990448ae07737Roman Divacky                               CC_X86StdCall : DefaultCC;
25745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique functions, to guarantee there is only one function of a particular
25755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
25765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
2577264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionNoProtoType::Profile(ID, ResultTy, Info);
25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
25801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (FunctionNoProtoType *FT =
258172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor        FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
25825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(FT, 0);
25831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2585ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor  if (!ResultTy.isCanonical() ||
258604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      getCanonicalCallConv(CallConv) != CallConv) {
2587264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola    Canonical =
2588264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      getFunctionNoProtoType(getCanonicalType(ResultTy),
2589264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                     Info.withCallingConv(getCanonicalCallConv(CallConv)));
25901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
259272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    FunctionNoProtoType *NewIP =
259372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor      FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
2594c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
25955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
25961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2597cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  FunctionProtoType::ExtInfo newInfo = Info.withCallingConv(CallConv);
25986b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  FunctionNoProtoType *New = new (*this, TypeAlignment)
2599cfe9af250f466e7e38becea4428990448ae07737Roman Divacky    FunctionNoProtoType(ResultTy, Canonical, newInfo);
26005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
260172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  FunctionNoProtoTypes.InsertNode(New, InsertPos);
26025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
26035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
26045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
26055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFunctionType - Return a normal function type with a typed argument
26065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// list.  isVariadic indicates whether the argument list includes '...'.
26074ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
26084ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionType(QualType ResultTy,
26094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                            const QualType *ArgArray, unsigned NumArgs,
26104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                            const FunctionProtoType::ExtProtoInfo &EPI) const {
26115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique functions, to guarantee there is only one function of a particular
26125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
26135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
26148026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl  FunctionProtoType::Profile(ID, ResultTy, ArgArray, NumArgs, EPI, *this);
26155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
26165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
26171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (FunctionProtoType *FTP =
261872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor        FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
26195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(FTP, 0);
2620465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2621465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  // Determine whether the type being created is already canonical or not.
2622eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith  bool isCanonical =
2623eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith    EPI.ExceptionSpecType == EST_None && ResultTy.isCanonical() &&
2624eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith    !EPI.HasTrailingReturn;
26255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0; i != NumArgs && isCanonical; ++i)
262654e14c4db764c0636160d26c5bbf491637c83a76John McCall    if (!ArgArray[i].isCanonicalAsParam())
26275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      isCanonical = false;
26285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2629cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv DefaultCC = EPI.ExtInfo.getCC();
2630cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ?
2631cfe9af250f466e7e38becea4428990448ae07737Roman Divacky                               CC_X86StdCall : DefaultCC;
2632e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
26335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this type isn't canonical, get the canonical version of it.
2634465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  // The exception spec is not part of the canonical type.
26355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
263604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) {
26375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<QualType, 16> CanonicalArgs;
26385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CanonicalArgs.reserve(NumArgs);
26395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    for (unsigned i = 0; i != NumArgs; ++i)
264054e14c4db764c0636160d26c5bbf491637c83a76John McCall      CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i]));
2641465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2642e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
2643eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith    CanonicalEPI.HasTrailingReturn = false;
26448b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl    CanonicalEPI.ExceptionSpecType = EST_None;
26458b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl    CanonicalEPI.NumExceptions = 0;
2646e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    CanonicalEPI.ExtInfo
2647e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall      = CanonicalEPI.ExtInfo.withCallingConv(getCanonicalCallConv(CallConv));
2648e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
2649f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner    Canonical = getFunctionType(getCanonicalType(ResultTy),
2650beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad                                CanonicalArgs.data(), NumArgs,
2651e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                                CanonicalEPI);
2652465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
26535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
265472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    FunctionProtoType *NewIP =
265572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor      FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
2656c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
26575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2658465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2659f85e193739c953358c865005855253af4f68a497John McCall  // FunctionProtoType objects are allocated with extra bytes after
2660f85e193739c953358c865005855253af4f68a497John McCall  // them for three variable size arrays at the end:
2661f85e193739c953358c865005855253af4f68a497John McCall  //  - parameter types
2662f85e193739c953358c865005855253af4f68a497John McCall  //  - exception types
2663f85e193739c953358c865005855253af4f68a497John McCall  //  - consumed-arguments flags
2664f85e193739c953358c865005855253af4f68a497John McCall  // Instead of the exception types, there could be a noexcept
2665b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  // expression, or information used to resolve the exception
2666b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  // specification.
2667e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  size_t Size = sizeof(FunctionProtoType) +
266860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl                NumArgs * sizeof(QualType);
2669b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  if (EPI.ExceptionSpecType == EST_Dynamic) {
267060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    Size += EPI.NumExceptions * sizeof(QualType);
2671b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  } else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) {
26728026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl    Size += sizeof(Expr*);
2673e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  } else if (EPI.ExceptionSpecType == EST_Uninstantiated) {
267413bffc532bafd45d4a77867993c1afb83c7661beRichard Smith    Size += 2 * sizeof(FunctionDecl*);
2675b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  } else if (EPI.ExceptionSpecType == EST_Unevaluated) {
2676b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith    Size += sizeof(FunctionDecl*);
267760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  }
2678f85e193739c953358c865005855253af4f68a497John McCall  if (EPI.ConsumedArguments)
2679f85e193739c953358c865005855253af4f68a497John McCall    Size += NumArgs * sizeof(bool);
2680f85e193739c953358c865005855253af4f68a497John McCall
2681e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment);
2682cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  FunctionProtoType::ExtProtoInfo newEPI = EPI;
2683cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv);
26848026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl  new (FTP) FunctionProtoType(ResultTy, ArgArray, NumArgs, Canonical, newEPI);
26855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(FTP);
268672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  FunctionProtoTypes.InsertNode(FTP, InsertPos);
26875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(FTP, 0);
26885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
26895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
26903cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#ifndef NDEBUG
26913cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallstatic bool NeedsInjectedClassNameType(const RecordDecl *D) {
26923cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!isa<CXXRecordDecl>(D)) return false;
26933cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  const CXXRecordDecl *RD = cast<CXXRecordDecl>(D);
26943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (isa<ClassTemplatePartialSpecializationDecl>(RD))
26953cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    return true;
26963cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (RD->getDescribedClassTemplate() &&
26973cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall      !isa<ClassTemplateSpecializationDecl>(RD))
26983cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    return true;
26993cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return false;
27003cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
27013cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif
27023cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
27033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// getInjectedClassNameType - Return the unique reference to the
27043cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// injected class name type for the specified templated declaration.
27053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl,
27064ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                              QualType TST) const {
27073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  assert(NeedsInjectedClassNameType(Decl));
27083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (Decl->TypeForDecl) {
27093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
2710ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) {
27113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(PrevDecl->TypeForDecl && "previous declaration has no type");
27123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    Decl->TypeForDecl = PrevDecl->TypeForDecl;
27133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
27143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  } else {
2715f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Type *newType =
271631f17ecbef57b5679c017c375db330546b7b5145John McCall      new (*this, TypeAlignment) InjectedClassNameType(Decl, TST);
2717f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Decl->TypeForDecl = newType;
2718f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Types.push_back(newType);
27193cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  }
27203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return QualType(Decl->TypeForDecl, 0);
27213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
27223cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
27232ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// getTypeDeclType - Return the unique reference to the type for the
27242ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// specified type declaration.
27254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const {
27261e6759e9e33dcaa73ce14c8a908ac9f87ac16463Argyrios Kyrtzidis  assert(Decl && "Passed null for Decl param");
2727becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall  assert(!Decl->TypeForDecl && "TypeForDecl present in slow case");
27281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2729162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  if (const TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Decl))
27302ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    return getTypedefType(Typedef);
2731becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall
2732becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall  assert(!isa<TemplateTypeParmDecl>(Decl) &&
2733becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall         "Template type parameter types are always available.");
2734becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall
273519c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) {
2736ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    assert(!Record->getPreviousDecl() &&
2737becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall           "struct/union has previous declaration");
2738becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall    assert(!NeedsInjectedClassNameType(Record));
2739400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    return getRecordType(Record);
274019c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) {
2741ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    assert(!Enum->getPreviousDecl() &&
2742becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall           "enum has previous declaration");
2743400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    return getEnumType(Enum);
274419c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  } else if (const UnresolvedUsingTypenameDecl *Using =
2745ed97649e9574b9d854fa4d6109c9333ae0993554John McCall               dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) {
2746f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using);
2747f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Decl->TypeForDecl = newType;
2748f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Types.push_back(newType);
27499fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump  } else
2750becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall    llvm_unreachable("TypeDecl without a type?");
275149aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis
275249aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis  return QualType(Decl->TypeForDecl, 0);
27532ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor}
27542ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor
27555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTypedefType - Return the unique reference to the type for the
2756162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// specified typedef name decl.
27579763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType
2758162e1c1b487352434552147967c3dd296ebee2f7Richard SmithASTContext::getTypedefType(const TypedefNameDecl *Decl,
2759162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                           QualType Canonical) const {
27605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
27611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27629763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  if (Canonical.isNull())
27639763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Canonical = getCanonicalType(Decl->getUnderlyingType());
2764f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  TypedefType *newType = new(*this, TypeAlignment)
27656b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    TypedefType(Type::Typedef, Decl, Canonical);
2766f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2767f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2768f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
27695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
27705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
27714ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRecordType(const RecordDecl *Decl) const {
2772400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
2773400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2774ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  if (const RecordDecl *PrevDecl = Decl->getPreviousDecl())
2775400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    if (PrevDecl->TypeForDecl)
2776400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis      return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
2777400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2778f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  RecordType *newType = new (*this, TypeAlignment) RecordType(Decl);
2779f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2780f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2781f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
2782400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis}
2783400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
27844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getEnumType(const EnumDecl *Decl) const {
2785400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
2786400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2787ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  if (const EnumDecl *PrevDecl = Decl->getPreviousDecl())
2788400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    if (PrevDecl->TypeForDecl)
2789400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis      return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
2790400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2791f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  EnumType *newType = new (*this, TypeAlignment) EnumType(Decl);
2792f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2793f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2794f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
2795400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis}
2796400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
27979d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType ASTContext::getAttributedType(AttributedType::Kind attrKind,
27989d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                       QualType modifiedType,
27999d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                       QualType equivalentType) {
28009d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  llvm::FoldingSetNodeID id;
28019d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedType::Profile(id, attrKind, modifiedType, equivalentType);
28029d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28039d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  void *insertPos = 0;
28049d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos);
28059d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (type) return QualType(type, 0);
28069d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28079d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  QualType canon = getCanonicalType(equivalentType);
28089d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  type = new (*this, TypeAlignment)
28099d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall           AttributedType(canon, attrKind, modifiedType, equivalentType);
28109d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28119d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  Types.push_back(type);
28129d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedTypes.InsertNode(type, insertPos);
28139d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28149d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  return QualType(type, 0);
28159d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
28169d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28179d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
281849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/// \brief Retrieve a substitution-result type.
281949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType
282049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,
28214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                         QualType Replacement) const {
2822467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(Replacement.isCanonical()
282349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall         && "replacement types must always be canonical");
282449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
282549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  llvm::FoldingSetNodeID ID;
282649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  SubstTemplateTypeParmType::Profile(ID, Parm, Replacement);
282749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  void *InsertPos = 0;
282849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  SubstTemplateTypeParmType *SubstParm
282949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
283049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
283149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  if (!SubstParm) {
283249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    SubstParm = new (*this, TypeAlignment)
283349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall      SubstTemplateTypeParmType(Parm, Replacement);
283449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    Types.push_back(SubstParm);
283549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
283649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  }
283749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
283849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  return QualType(SubstParm, 0);
283949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
284049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
2841c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor/// \brief Retrieve a
2842c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType ASTContext::getSubstTemplateTypeParmPackType(
2843c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                          const TemplateTypeParmType *Parm,
2844c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                              const TemplateArgument &ArgPack) {
2845c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifndef NDEBUG
2846c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(),
2847c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                    PEnd = ArgPack.pack_end();
2848c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor       P != PEnd; ++P) {
2849c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type");
2850c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    assert(P->getAsType().isCanonical() && "Pack contains non-canonical type");
2851c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  }
2852c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#endif
2853c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2854c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  llvm::FoldingSetNodeID ID;
2855c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack);
2856c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  void *InsertPos = 0;
2857c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  if (SubstTemplateTypeParmPackType *SubstParm
2858c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor        = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
2859c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    return QualType(SubstParm, 0);
2860c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2861c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  QualType Canon;
2862c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  if (!Parm->isCanonicalUnqualified()) {
2863c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    Canon = getCanonicalType(QualType(Parm, 0));
2864c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon),
2865c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                             ArgPack);
2866c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
2867c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  }
2868c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2869c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmPackType *SubstParm
2870c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon,
2871c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                                               ArgPack);
2872c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  Types.push_back(SubstParm);
2873c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
2874c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  return QualType(SubstParm, 0);
2875c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
2876c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2877fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor/// \brief Retrieve the template type parameter type for a template
28781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parameter or parameter pack with the given depth, index, and (optionally)
287976e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson/// name.
28801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
288176e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson                                             bool ParameterPack,
28824fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth                                             TemplateTypeParmDecl *TTPDecl) const {
2883fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  llvm::FoldingSetNodeID ID;
28844fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
2885fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  void *InsertPos = 0;
28861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateTypeParmType *TypeParm
2887fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor    = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
2888fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
2889fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  if (TypeParm)
2890fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor    return QualType(TypeParm, 0);
28911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28924fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  if (TTPDecl) {
289376e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson    QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
28944fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon);
2895789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
2896789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    TemplateTypeParmType *TypeCheck
2897789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
2898789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!TypeCheck && "Template type parameter canonical type broken");
2899789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)TypeCheck;
290076e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson  } else
29016b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    TypeParm = new (*this, TypeAlignment)
29026b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      TemplateTypeParmType(Depth, Index, ParameterPack);
2903fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
2904fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  Types.push_back(TypeParm);
2905fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
2906fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
2907fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  return QualType(TypeParm, 0);
2908fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor}
2909fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
29103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallTypeSourceInfo *
29113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
29123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                              SourceLocation NameLoc,
29133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                        const TemplateArgumentListInfo &Args,
29143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                              QualType Underlying) const {
29157c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Name.getAsDependentTemplateName() &&
29167c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
29173e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  QualType TST = getTemplateSpecializationType(Name, Args, Underlying);
29183cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
29193cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TypeSourceInfo *DI = CreateTypeSourceInfo(TST);
29203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TemplateSpecializationTypeLoc TL
29213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc());
292255d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  TL.setTemplateKeywordLoc(SourceLocation());
29233cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setTemplateNameLoc(NameLoc);
29243cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setLAngleLoc(Args.getLAngleLoc());
29253cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setRAngleLoc(Args.getRAngleLoc());
29263cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
29273cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    TL.setArgLocInfo(i, Args[i].getLocInfo());
29283cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return DI;
29293cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
29303cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
29311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
29327532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorASTContext::getTemplateSpecializationType(TemplateName Template,
2933d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                          const TemplateArgumentListInfo &Args,
29343e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                          QualType Underlying) const {
29357c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
29367c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
29377c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
2938d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned NumArgs = Args.size();
2939d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
29405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 4> ArgVec;
2941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ArgVec.reserve(NumArgs);
2942833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0; i != NumArgs; ++i)
2943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ArgVec.push_back(Args[i].getArgument());
2944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
294531f17ecbef57b5679c017c375db330546b7b5145John McCall  return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs,
29463e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                       Underlying);
2947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2949b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#ifndef NDEBUG
2950b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregorstatic bool hasAnyPackExpansions(const TemplateArgument *Args,
2951b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                                 unsigned NumArgs) {
2952b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  for (unsigned I = 0; I != NumArgs; ++I)
2953b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    if (Args[I].isPackExpansion())
2954b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor      return true;
2955b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor
2956b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  return true;
2957b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor}
2958b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#endif
2959b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor
2960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType
2961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallASTContext::getTemplateSpecializationType(TemplateName Template,
29627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                          const TemplateArgument *Args,
29637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                          unsigned NumArgs,
29643e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                          QualType Underlying) const {
29657c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
29667c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
29670f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  // Look through qualified template names.
29680f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
29690f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor    Template = TemplateName(QTN->getTemplateDecl());
29707c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
2971b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  bool IsTypeAlias =
29723e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    Template.getAsTemplateDecl() &&
29733e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl());
29743e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  QualType CanonType;
29753e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  if (!Underlying.isNull())
29763e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    CanonType = getCanonicalType(Underlying);
29773e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  else {
2978b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    // We can get here with an alias template when the specialization contains
2979b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    // a pack expansion that does not match up with a parameter pack.
2980b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    assert((!IsTypeAlias || hasAnyPackExpansions(Args, NumArgs)) &&
2981b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor           "Caller must compute aliased type");
2982b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    IsTypeAlias = false;
29833e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    CanonType = getCanonicalTemplateSpecializationType(Template, Args,
29843e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                       NumArgs);
29853e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  }
2986fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor
29871275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // Allocate the (non-canonical) template specialization type, but don't
29881275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // try to unique it: these types typically have location information that
29891275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // we don't unique and don't want to lose.
29903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  void *Mem = Allocate(sizeof(TemplateSpecializationType) +
29913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                       sizeof(TemplateArgument) * NumArgs +
2992b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                       (IsTypeAlias? sizeof(QualType) : 0),
29936b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                       TypeAlignment);
29941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateSpecializationType *Spec
2995b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, CanonType,
2996b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                                         IsTypeAlias ? Underlying : QualType());
29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  Types.push_back(Spec);
29991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(Spec, 0);
300055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
300155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
30021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
30039763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
30049763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                                   const TemplateArgument *Args,
30054ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                   unsigned NumArgs) const {
30067c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
30077c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
30083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
30090f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  // Look through qualified template names.
30100f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
30110f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor    Template = TemplateName(QTN->getTemplateDecl());
30127c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
30139763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // Build the canonical template specialization type.
30149763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateName CanonTemplate = getCanonicalTemplateName(Template);
30155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 4> CanonArgs;
30169763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  CanonArgs.reserve(NumArgs);
30179763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  for (unsigned I = 0; I != NumArgs; ++I)
30189763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    CanonArgs.push_back(getCanonicalTemplateArgument(Args[I]));
30199763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30209763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // Determine whether this canonical template specialization type already
30219763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // exists.
30229763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  llvm::FoldingSetNodeID ID;
30239763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateSpecializationType::Profile(ID, CanonTemplate,
30249763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                      CanonArgs.data(), NumArgs, *this);
30259763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30269763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  void *InsertPos = 0;
30279763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateSpecializationType *Spec
30289763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
30299763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30309763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  if (!Spec) {
30319763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    // Allocate a new canonical template specialization type.
30329763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    void *Mem = Allocate((sizeof(TemplateSpecializationType) +
30339763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                          sizeof(TemplateArgument) * NumArgs),
30349763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                         TypeAlignment);
30359763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Spec = new (Mem) TemplateSpecializationType(CanonTemplate,
30369763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                                CanonArgs.data(), NumArgs,
30373e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                QualType(), QualType());
30389763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Types.push_back(Spec);
30399763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
30409763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  }
30419763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30429763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  assert(Spec->isDependentType() &&
30439763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis         "Non-dependent template-id type must have a canonical type");
30449763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  return QualType(Spec, 0);
30459763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis}
30469763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30479763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType
3048465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword,
3049465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                              NestedNameSpecifier *NNS,
30504ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                              QualType NamedType) const {
3051e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  llvm::FoldingSetNodeID ID;
3052465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType::Profile(ID, Keyword, NNS, NamedType);
3053e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3054e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  void *InsertPos = 0;
3055465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
3056e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  if (T)
3057e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor    return QualType(T, 0);
3058e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3059789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  QualType Canon = NamedType;
3060789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  if (!Canon.isCanonical()) {
3061789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    Canon = getCanonicalType(NamedType);
3062465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
3063465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    assert(!CheckT && "Elaborated canonical type broken");
3064789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckT;
3065789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  }
3066789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
3067465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  T = new (*this) ElaboratedType(Keyword, NNS, NamedType, Canon);
3068e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  Types.push_back(T);
3069465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypes.InsertNode(T, InsertPos);
3070e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  return QualType(T, 0);
3071e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor}
3072e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3073075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType
30744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getParenType(QualType InnerType) const {
3075075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  llvm::FoldingSetNodeID ID;
3076075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenType::Profile(ID, InnerType);
3077075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3078075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  void *InsertPos = 0;
3079075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
3080075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (T)
3081075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return QualType(T, 0);
3082075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3083075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType Canon = InnerType;
3084075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (!Canon.isCanonical()) {
3085075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    Canon = getCanonicalType(InnerType);
3086075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
3087075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    assert(!CheckT && "Paren canonical type broken");
3088075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    (void)CheckT;
3089075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
3090075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3091075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  T = new (*this) ParenType(InnerType, Canon);
3092075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  Types.push_back(T);
3093075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenTypes.InsertNode(T, InsertPos);
3094075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  return QualType(T, 0);
3095075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara}
3096075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
30974a2023f5014e82389d5980d307b89c545dbbac81Douglas GregorQualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword,
30984a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                          NestedNameSpecifier *NNS,
30994a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                          const IdentifierInfo *Name,
31004ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          QualType Canon) const {
3101d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  assert(NNS->isDependent() && "nested-name-specifier must be dependent");
3102d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3103d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  if (Canon.isNull()) {
3104d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
31054a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    ElaboratedTypeKeyword CanonKeyword = Keyword;
31064a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    if (Keyword == ETK_None)
31074a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor      CanonKeyword = ETK_Typename;
31084a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor
31094a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    if (CanonNNS != NNS || CanonKeyword != Keyword)
31104a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor      Canon = getDependentNameType(CanonKeyword, CanonNNS, Name);
3111d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
3112d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3113d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  llvm::FoldingSetNodeID ID;
31144a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor  DependentNameType::Profile(ID, Keyword, NNS, Name);
3115d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3116d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  void *InsertPos = 0;
31174714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T
31184714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
3119d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  if (T)
3120d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return QualType(T, 0);
3121d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
31224a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor  T = new (*this) DependentNameType(Keyword, NNS, Name, Canon);
3123d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  Types.push_back(T);
31244714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameTypes.InsertNode(T, InsertPos);
31251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
3126d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
3127d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
31281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
312933500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType(
313033500955d731c73717af52088b7fc0e7a85681e7John McCall                                 ElaboratedTypeKeyword Keyword,
31314a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                 NestedNameSpecifier *NNS,
313233500955d731c73717af52088b7fc0e7a85681e7John McCall                                 const IdentifierInfo *Name,
31334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                 const TemplateArgumentListInfo &Args) const {
313433500955d731c73717af52088b7fc0e7a85681e7John McCall  // TODO: avoid this copy
31355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> ArgCopy;
313633500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = Args.size(); I != E; ++I)
313733500955d731c73717af52088b7fc0e7a85681e7John McCall    ArgCopy.push_back(Args[I].getArgument());
313833500955d731c73717af52088b7fc0e7a85681e7John McCall  return getDependentTemplateSpecializationType(Keyword, NNS, Name,
313933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ArgCopy.size(),
314033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ArgCopy.data());
314133500955d731c73717af52088b7fc0e7a85681e7John McCall}
314233500955d731c73717af52088b7fc0e7a85681e7John McCall
314333500955d731c73717af52088b7fc0e7a85681e7John McCallQualType
314433500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType(
314533500955d731c73717af52088b7fc0e7a85681e7John McCall                                 ElaboratedTypeKeyword Keyword,
314633500955d731c73717af52088b7fc0e7a85681e7John McCall                                 NestedNameSpecifier *NNS,
314733500955d731c73717af52088b7fc0e7a85681e7John McCall                                 const IdentifierInfo *Name,
314833500955d731c73717af52088b7fc0e7a85681e7John McCall                                 unsigned NumArgs,
31494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                 const TemplateArgument *Args) const {
3150aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor  assert((!NNS || NNS->isDependent()) &&
3151aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor         "nested-name-specifier must be dependent");
31521734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
3153789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  llvm::FoldingSetNodeID ID;
315433500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS,
315533500955d731c73717af52088b7fc0e7a85681e7John McCall                                               Name, NumArgs, Args);
3156789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
3157789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  void *InsertPos = 0;
315833500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType *T
315933500955d731c73717af52088b7fc0e7a85681e7John McCall    = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
3160789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  if (T)
3161789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    return QualType(T, 0);
3162789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
316333500955d731c73717af52088b7fc0e7a85681e7John McCall  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
316433500955d731c73717af52088b7fc0e7a85681e7John McCall
316533500955d731c73717af52088b7fc0e7a85681e7John McCall  ElaboratedTypeKeyword CanonKeyword = Keyword;
316633500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Keyword == ETK_None) CanonKeyword = ETK_Typename;
31671734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
316833500955d731c73717af52088b7fc0e7a85681e7John McCall  bool AnyNonCanonArgs = false;
31695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> CanonArgs(NumArgs);
317033500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0; I != NumArgs; ++I) {
317133500955d731c73717af52088b7fc0e7a85681e7John McCall    CanonArgs[I] = getCanonicalTemplateArgument(Args[I]);
317233500955d731c73717af52088b7fc0e7a85681e7John McCall    if (!CanonArgs[I].structurallyEquals(Args[I]))
317333500955d731c73717af52088b7fc0e7a85681e7John McCall      AnyNonCanonArgs = true;
3174789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  }
31751734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
317633500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Canon;
317733500955d731c73717af52088b7fc0e7a85681e7John McCall  if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {
317833500955d731c73717af52088b7fc0e7a85681e7John McCall    Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS,
317933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                   Name, NumArgs,
318033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                   CanonArgs.data());
318133500955d731c73717af52088b7fc0e7a85681e7John McCall
318233500955d731c73717af52088b7fc0e7a85681e7John McCall    // Find the insert position again.
318333500955d731c73717af52088b7fc0e7a85681e7John McCall    DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
318433500955d731c73717af52088b7fc0e7a85681e7John McCall  }
318533500955d731c73717af52088b7fc0e7a85681e7John McCall
318633500955d731c73717af52088b7fc0e7a85681e7John McCall  void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) +
318733500955d731c73717af52088b7fc0e7a85681e7John McCall                        sizeof(TemplateArgument) * NumArgs),
318833500955d731c73717af52088b7fc0e7a85681e7John McCall                       TypeAlignment);
3189ef99001908e799c388f1363b1e607dad5f5b57d3John McCall  T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS,
319033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                    Name, NumArgs, Args, Canon);
31911734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  Types.push_back(T);
319233500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationTypes.InsertNode(T, InsertPos);
31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
31941734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor}
31951734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
3196cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas GregorQualType ASTContext::getPackExpansionType(QualType Pattern,
3197cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                      llvm::Optional<unsigned> NumExpansions) {
31987536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  llvm::FoldingSetNodeID ID;
3199cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  PackExpansionType::Profile(ID, Pattern, NumExpansions);
32007536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
32017536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  assert(Pattern->containsUnexpandedParameterPack() &&
32027536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor         "Pack expansions must expand one or more parameter packs");
32037536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  void *InsertPos = 0;
32047536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  PackExpansionType *T
32057536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
32067536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (T)
32077536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    return QualType(T, 0);
32087536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
32097536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  QualType Canon;
32107536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (!Pattern.isCanonical()) {
3211d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    Canon = getCanonicalType(Pattern);
3212d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // The canonical type might not contain an unexpanded parameter pack, if it
3213d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // contains an alias template specialization which ignores one of its
3214d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // parameters.
3215d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    if (Canon->containsUnexpandedParameterPack()) {
3216d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions);
3217d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith
3218d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      // Find the insert position again, in case we inserted an element into
3219d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      // PackExpansionTypes and invalidated our insert position.
3220d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
3221d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    }
32227536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  }
32237536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
3224cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  T = new (*this) PackExpansionType(Pattern, Canon, NumExpansions);
32257536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  Types.push_back(T);
32267536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  PackExpansionTypes.InsertNode(T, InsertPos);
32277536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  return QualType(T, 0);
32287536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
32297536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
323088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// CmpProtocolNames - Comparison predicate for sorting protocols
323188cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// alphabetically.
323288cb27a160adc305783a44f922ee4b216006ebf9Chris Lattnerstatic bool CmpProtocolNames(const ObjCProtocolDecl *LHS,
323388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner                            const ObjCProtocolDecl *RHS) {
32342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return LHS->getDeclName() < RHS->getDeclName();
323588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner}
323688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3237c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallstatic bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols,
323854e14c4db764c0636160d26c5bbf491637c83a76John McCall                                unsigned NumProtocols) {
323954e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (NumProtocols == 0) return true;
324054e14c4db764c0636160d26c5bbf491637c83a76John McCall
324161cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  if (Protocols[0]->getCanonicalDecl() != Protocols[0])
324261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    return false;
324361cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor
324454e14c4db764c0636160d26c5bbf491637c83a76John McCall  for (unsigned i = 1; i != NumProtocols; ++i)
324561cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    if (!CmpProtocolNames(Protocols[i-1], Protocols[i]) ||
324661cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor        Protocols[i]->getCanonicalDecl() != Protocols[i])
324754e14c4db764c0636160d26c5bbf491637c83a76John McCall      return false;
324854e14c4db764c0636160d26c5bbf491637c83a76John McCall  return true;
324954e14c4db764c0636160d26c5bbf491637c83a76John McCall}
325054e14c4db764c0636160d26c5bbf491637c83a76John McCall
325154e14c4db764c0636160d26c5bbf491637c83a76John McCallstatic void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols,
325288cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner                                   unsigned &NumProtocols) {
325388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols;
32541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
325588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  // Sort protocols, keyed by name.
325688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames);
325788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
325861cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  // Canonicalize.
325961cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  for (unsigned I = 0, N = NumProtocols; I != N; ++I)
326061cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    Protocols[I] = Protocols[I]->getCanonicalDecl();
326161cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor
326288cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  // Remove duplicates.
326388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  ProtocolsEnd = std::unique(Protocols, ProtocolsEnd);
326488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  NumProtocols = ProtocolsEnd-Protocols;
326588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner}
326688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3267c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType ASTContext::getObjCObjectType(QualType BaseType,
3268c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                       ObjCProtocolDecl * const *Protocols,
32694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                       unsigned NumProtocols) const {
3270c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // If the base type is an interface and there aren't any protocols
3271c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // to add, then the interface type will do just fine.
3272c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!NumProtocols && isa<ObjCInterfaceType>(BaseType))
3273c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return BaseType;
3274d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
3275c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Look in the folding set for an existing type.
3276c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  llvm::FoldingSetNodeID ID;
3277c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypeImpl::Profile(ID, BaseType, Protocols, NumProtocols);
3278d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  void *InsertPos = 0;
3279c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
3280c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return QualType(QT, 0);
3281d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
3282c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Build the canonical type, which has the canonical base type and
3283c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // a sorted-and-uniqued list of protocols.
328454e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Canonical;
3285c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  bool ProtocolsSorted = areSortedAndUniqued(Protocols, NumProtocols);
3286c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!ProtocolsSorted || !BaseType.isCanonical()) {
3287c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (!ProtocolsSorted) {
32885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols,
32890237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer                                                     Protocols + NumProtocols);
329054e14c4db764c0636160d26c5bbf491637c83a76John McCall      unsigned UniqueCount = NumProtocols;
329154e14c4db764c0636160d26c5bbf491637c83a76John McCall
329254e14c4db764c0636160d26c5bbf491637c83a76John McCall      SortAndUniqueProtocols(&Sorted[0], UniqueCount);
3293c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Canonical = getObjCObjectType(getCanonicalType(BaseType),
3294c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                    &Sorted[0], UniqueCount);
329554e14c4db764c0636160d26c5bbf491637c83a76John McCall    } else {
3296c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Canonical = getObjCObjectType(getCanonicalType(BaseType),
3297c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                    Protocols, NumProtocols);
329854e14c4db764c0636160d26c5bbf491637c83a76John McCall    }
329954e14c4db764c0636160d26c5bbf491637c83a76John McCall
330054e14c4db764c0636160d26c5bbf491637c83a76John McCall    // Regenerate InsertPos.
3301c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
330254e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
330354e14c4db764c0636160d26c5bbf491637c83a76John McCall
3304c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  unsigned Size = sizeof(ObjCObjectTypeImpl);
3305c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  Size += NumProtocols * sizeof(ObjCProtocolDecl *);
3306fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor  void *Mem = Allocate(Size, TypeAlignment);
3307c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypeImpl *T =
3308c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    new (Mem) ObjCObjectTypeImpl(Canonical, BaseType, Protocols, NumProtocols);
33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3310c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  Types.push_back(T);
3311c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypes.InsertNode(T, InsertPos);
3312c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return QualType(T, 0);
3313d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff}
331488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3315c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for
3316c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// the given object type.
33174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const {
33184b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  llvm::FoldingSetNodeID ID;
3319c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerType::Profile(ID, ObjectT);
33201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33214b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  void *InsertPos = 0;
3322c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (ObjCObjectPointerType *QT =
3323c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall              ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
33244b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian    return QualType(QT, 0);
33251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3326c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Find the canonical object type.
332754e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Canonical;
3328c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!ObjectT.isCanonical()) {
3329c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT));
333054e14c4db764c0636160d26c5bbf491637c83a76John McCall
3331c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    // Regenerate InsertPos.
3332c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
333354e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
333454e14c4db764c0636160d26c5bbf491637c83a76John McCall
3335c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // No match.
3336c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment);
3337c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerType *QType =
3338c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    new (Mem) ObjCObjectPointerType(Canonical, ObjectT);
333924fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
334024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis  Types.push_back(QType);
3341c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
334224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis  return QualType(QType, 0);
334324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
334424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3345deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// getObjCInterfaceType - Return the unique reference to the type for the
3346deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// specified ObjC interface decl. The list of protocols is optional.
33470af550115df1f57f17a4f125ff0e8b34820c65d1Douglas GregorQualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl,
33480af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor                                          ObjCInterfaceDecl *PrevDecl) const {
3349deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  if (Decl->TypeForDecl)
3350deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    return QualType(Decl->TypeForDecl, 0);
335174c730ad1f6818b676b0bad46d806a9176950328Sebastian Redl
33520af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor  if (PrevDecl) {
33530af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl");
33540af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    Decl->TypeForDecl = PrevDecl->TypeForDecl;
33550af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    return QualType(PrevDecl->TypeForDecl, 0);
33560af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor  }
33570af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor
33588d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor  // Prefer the definition, if there is one.
33598d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor  if (const ObjCInterfaceDecl *Def = Decl->getDefinition())
33608d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor    Decl = Def;
33618d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor
3362deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment);
3363deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ObjCInterfaceType *T = new (Mem) ObjCInterfaceType(Decl);
3364deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  Decl->TypeForDecl = T;
3365deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  Types.push_back(T);
3366deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  return QualType(T, 0);
3367c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3368c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
336972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique
337072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// TypeOfExprType AST's (since expression's are never shared). For example,
33719752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// multiple declarations that refer to "typeof(x)" all contain different
33721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// DeclRefExpr's. This doesn't effect the type checker, since it operates
33739752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique).
33744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfExprType(Expr *tofExpr) const {
3375dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  TypeOfExprType *toe;
3376b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor  if (tofExpr->isTypeDependent()) {
3377b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    llvm::FoldingSetNodeID ID;
3378b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    DependentTypeOfExprType::Profile(ID, *this, tofExpr);
33791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3380b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    void *InsertPos = 0;
3381b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    DependentTypeOfExprType *Canon
3382b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
3383b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    if (Canon) {
3384b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // We already have a "canonical" version of an identical, dependent
3385b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // typeof(expr) type. Use that as our canonical type.
33866b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr,
3387b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor                                          QualType((TypeOfExprType*)Canon, 0));
33883060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    } else {
3389b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // Build a new, canonical typeof(expr) type.
33906b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      Canon
33916b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr);
3392b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
3393b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      toe = Canon;
3394b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    }
3395b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor  } else {
3396dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor    QualType Canonical = getCanonicalType(tofExpr->getType());
33976b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical);
3398dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  }
33999752f25748d954df99087d741ea35db37ff16beaSteve Naroff  Types.push_back(toe);
34009752f25748d954df99087d741ea35db37ff16beaSteve Naroff  return QualType(toe, 0);
3401d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
3402d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
34039752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// getTypeOfType -  Unlike many "get<Type>" functions, we don't unique
34049752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// TypeOfType AST's. The only motivation to unique these nodes would be
34059752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be
34061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates
34079752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique).
34084ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfType(QualType tofType) const {
3409f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  QualType Canonical = getCanonicalType(tofType);
34106b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical);
34119752f25748d954df99087d741ea35db37ff16beaSteve Naroff  Types.push_back(tot);
34129752f25748d954df99087d741ea35db37ff16beaSteve Naroff  return QualType(tot, 0);
3413d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
3414d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
341560a9a2a404a4cf259d39133383e922aa00ca9043Anders Carlsson
3416395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// getDecltypeType -  Unlike many "get<Type>" functions, we don't unique
3417395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// DecltypeType AST's. The only motivation to unique these nodes would be
3418395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be
34191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates
342039e02032b01874a0d02ba85a4cd3922adda81376David Blaikie/// on canonical types (which are always unique).
3421f8af98286022f72157d84951b48fde5fb369ab29Douglas GregorQualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const {
3422dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  DecltypeType *dt;
3423561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
3424561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  // C++0x [temp.type]p2:
3425561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   If an expression e involves a template parameter, decltype(e) denotes a
3426561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   unique dependent type. Two such decltype-specifiers refer to the same
3427561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   type only if their expressions are equivalent (14.5.6.1).
3428561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  if (e->isInstantiationDependent()) {
34299d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    llvm::FoldingSetNodeID ID;
34309d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    DependentDecltypeType::Profile(ID, *this, e);
34311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34329d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    void *InsertPos = 0;
34339d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    DependentDecltypeType *Canon
34349d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos);
34359d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    if (Canon) {
34369d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // We already have a "canonical" version of an equivalent, dependent
34379d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // decltype type. Use that as our canonical type.
34380d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith      dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType,
34399d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor                                       QualType((DecltypeType*)Canon, 0));
34403060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    } else {
34419d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // Build a new, canonical typeof(expr) type.
34426b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e);
34439d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      DependentDecltypeTypes.InsertNode(Canon, InsertPos);
34449d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      dt = Canon;
34459d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    }
34469d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor  } else {
3447f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor    dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType,
3448f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor                                      getCanonicalType(UnderlyingType));
3449dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  }
3450395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  Types.push_back(dt);
3451395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  return QualType(dt, 0);
3452395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson}
3453395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
3454ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// getUnaryTransformationType - We don't unique these, since the memory
3455ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// savings are minimal and these are rare.
3456ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTContext::getUnaryTransformType(QualType BaseType,
3457ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt                                           QualType UnderlyingType,
3458ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt                                           UnaryTransformType::UTTKind Kind)
3459ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    const {
3460ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  UnaryTransformType *Ty =
346169d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor    new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType,
346269d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor                                                   Kind,
346369d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor                                 UnderlyingType->isDependentType() ?
346412fc4b0624706b474fa10308631fa8daf92f340fPeter Collingbourne                                 QualType() : getCanonicalType(UnderlyingType));
3465ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  Types.push_back(Ty);
3466ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  return QualType(Ty, 0);
3467ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt}
3468ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
3469483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith/// getAutoType - We only unique auto types after they've been deduced.
347034b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTContext::getAutoType(QualType DeducedType) const {
3471483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  void *InsertPos = 0;
3472483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  if (!DeducedType.isNull()) {
3473483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    // Look in the folding set for an existing type.
3474483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    llvm::FoldingSetNodeID ID;
3475483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    AutoType::Profile(ID, DeducedType);
3476483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos))
3477483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith      return QualType(AT, 0);
3478483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  }
3479483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith
3480483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType);
3481483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  Types.push_back(AT);
3482483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  if (InsertPos)
3483483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    AutoTypes.InsertNode(AT, InsertPos);
3484483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  return QualType(AT, 0);
348534b41d939a1328f484511c6002ba2456db879a29Richard Smith}
348634b41d939a1328f484511c6002ba2456db879a29Richard Smith
3487b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// getAtomicType - Return the uniqued reference to the atomic type for
3488b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// the given value type.
3489b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanQualType ASTContext::getAtomicType(QualType T) const {
3490b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // Unique pointers, to guarantee there is only one pointer of a particular
3491b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // structure.
3492b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  llvm::FoldingSetNodeID ID;
3493b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicType::Profile(ID, T);
3494b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3495b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  void *InsertPos = 0;
3496b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
3497b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    return QualType(AT, 0);
3498b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3499b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // If the atomic value type isn't canonical, this won't be a canonical type
3500b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // either, so fill in the canonical type field.
3501b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  QualType Canonical;
3502b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  if (!T.isCanonical()) {
3503b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    Canonical = getAtomicType(getCanonicalType(T));
3504b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3505b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    // Get the new insert position for the node we care about.
3506b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
3507b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
3508b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
3509b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicType *New = new (*this, TypeAlignment) AtomicType(T, Canonical);
3510b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  Types.push_back(New);
3511b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicTypes.InsertNode(New, InsertPos);
3512b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  return QualType(New, 0);
3513b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman}
3514b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3515ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoDeductType - Get type pattern for deducing against 'auto'.
3516ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoDeductType() const {
3517ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  if (AutoDeductTy.isNull())
3518ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    AutoDeductTy = getAutoType(QualType());
3519ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  assert(!AutoDeductTy.isNull() && "can't build 'auto' pattern");
3520ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  return AutoDeductTy;
3521ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
3522ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
3523ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'.
3524ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoRRefDeductType() const {
3525ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  if (AutoRRefDeductTy.isNull())
3526ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType());
3527ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern");
3528ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  return AutoRRefDeductTy;
3529ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
3530ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
35315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTagDeclType - Return the unique reference to the type for the
35325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified TagDecl (struct/union/class/enum) decl.
35334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTagDeclType(const TagDecl *Decl) const {
3534d778f88d32b96a74c9edb7342c81357606a7cdc0Ted Kremenek  assert (Decl);
3535e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  // FIXME: What is the design on getTagDeclType when it requires casting
3536e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  // away const?  mutable?
3537e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  return getTypeDeclType(const_cast<TagDecl*>(Decl));
35385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
35395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
35401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result
35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and
35421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// needs to agree with the definition in <stddef.h>.
3543a3ccda58913cc1a4b8564e349448b12acc462da7Anders CarlssonCanQualType ASTContext::getSizeType() const {
3544bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  return getFromTargetType(Target->getSizeType());
35455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
35465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
354729e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5).
354829e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getIntMaxType() const {
354929e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg  return getFromTargetType(Target->getIntMaxType());
355029e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg}
355129e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg
355229e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5).
355329e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getUIntMaxType() const {
355429e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg  return getFromTargetType(Target->getUIntMaxType());
355529e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg}
355629e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg
355764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getSignedWCharType - Return the type of "signed wchar_t".
355864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension.
355964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getSignedWCharType() const {
356064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  // FIXME: derive from "Target" ?
356164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  return WCharTy;
356264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis}
356364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
356464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getUnsignedWCharType - Return the type of "unsigned wchar_t".
356564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension.
356664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getUnsignedWCharType() const {
356764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  // FIXME: derive from "Target" ?
356864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  return UnsignedIntTy;
356964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis}
357064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
357129e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17)
35728b9023ba35a86838789e2c9034a6128728c547aaChris Lattner/// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
35738b9023ba35a86838789e2c9034a6128728c547aaChris LattnerQualType ASTContext::getPointerDiffType() const {
3574bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  return getFromTargetType(Target->getPtrDiffType(0));
35758b9023ba35a86838789e2c9034a6128728c547aaChris Lattner}
35768b9023ba35a86838789e2c9034a6128728c547aaChris Lattner
35776902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman/// \brief Return the unique type for "pid_t" defined in
35786902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman/// <sys/types.h>. We need this to compute the correct type for vfork().
35796902e4146d426998ff6a94b16776c1b3f805a048Eli FriedmanQualType ASTContext::getProcessIDType() const {
35806902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman  return getFromTargetType(Target->getProcessIDType());
35816902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman}
35826902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman
3583e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===//
3584e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//                              Type Operators
3585e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===//
3586e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
35874ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCanQualType ASTContext::getCanonicalParamType(QualType T) const {
358854e14c4db764c0636160d26c5bbf491637c83a76John McCall  // Push qualifiers into arrays, and then discard any remaining
358954e14c4db764c0636160d26c5bbf491637c83a76John McCall  // qualifiers.
359054e14c4db764c0636160d26c5bbf491637c83a76John McCall  T = getCanonicalType(T);
3591745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  T = getVariableArrayDecayedType(T);
359254e14c4db764c0636160d26c5bbf491637c83a76John McCall  const Type *Ty = T.getTypePtr();
359354e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Result;
359454e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (isa<ArrayType>(Ty)) {
359554e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = getArrayDecayedType(QualType(Ty,0));
359654e14c4db764c0636160d26c5bbf491637c83a76John McCall  } else if (isa<FunctionType>(Ty)) {
359754e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = getPointerType(QualType(Ty, 0));
359854e14c4db764c0636160d26c5bbf491637c83a76John McCall  } else {
359954e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = QualType(Ty, 0);
360054e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
360154e14c4db764c0636160d26c5bbf491637c83a76John McCall
360254e14c4db764c0636160d26c5bbf491637c83a76John McCall  return CanQualType::CreateUnsafe(Result);
360354e14c4db764c0636160d26c5bbf491637c83a76John McCall}
360454e14c4db764c0636160d26c5bbf491637c83a76John McCall
360562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCallQualType ASTContext::getUnqualifiedArrayType(QualType type,
360662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall                                             Qualifiers &quals) {
360762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  SplitQualType splitType = type.getSplitUnqualifiedType();
360862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
360962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // FIXME: getSplitUnqualifiedType() actually walks all the way to
361062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // the unqualified desugared type and then drops it on the floor.
361162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // We then have to strip that sugar back off with
361262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // getUnqualifiedDesugaredType(), which is silly.
361362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  const ArrayType *AT =
3614200fa53fd420aa8369586f569dbece04930ad6a3John McCall    dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType());
361562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
361662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // If we don't have an array, just use the results in splitType.
36179dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (!AT) {
3618200fa53fd420aa8369586f569dbece04930ad6a3John McCall    quals = splitType.Quals;
3619200fa53fd420aa8369586f569dbece04930ad6a3John McCall    return QualType(splitType.Ty, 0);
362028e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
362128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
362262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // Otherwise, recurse on the array's element type.
362362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  QualType elementType = AT->getElementType();
362462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  QualType unqualElementType = getUnqualifiedArrayType(elementType, quals);
362562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
362662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // If that didn't change the element type, AT has no qualifiers, so we
362762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // can just use the results in splitType.
362862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  if (elementType == unqualElementType) {
362962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    assert(quals.empty()); // from the recursive call
3630200fa53fd420aa8369586f569dbece04930ad6a3John McCall    quals = splitType.Quals;
3631200fa53fd420aa8369586f569dbece04930ad6a3John McCall    return QualType(splitType.Ty, 0);
363262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  }
363362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
363462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // Otherwise, add in the qualifiers from the outermost type, then
363562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // build the type back up.
3636200fa53fd420aa8369586f569dbece04930ad6a3John McCall  quals.addConsistentQualifiers(splitType.Quals);
363728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
36389dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
363962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getConstantArrayType(unqualElementType, CAT->getSize(),
364028e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                CAT->getSizeModifier(), 0);
364128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
364228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
36439dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
364462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0);
364528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
364628e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
36479dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(AT)) {
364862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getVariableArrayType(unqualElementType,
36493fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                VAT->getSizeExpr(),
36509dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getSizeModifier(),
36519dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getIndexTypeCVRQualifiers(),
36529dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getBracketsRange());
36539dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  }
36549dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor
36559dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(AT);
365662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(),
365728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                    DSAT->getSizeModifier(), 0,
365828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                    SourceRange());
365928e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth}
366028e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
36615a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types  that
36625a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// may be similar (C++ 4.4), replaces T1 and T2 with the type that
36635a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// they point to and return true. If T1 and T2 aren't pointer types
36645a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// or pointer-to-member types, or if they are not similar at this
36655a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// level, returns false and leaves T1 and T2 unchanged. Top-level
36665a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// qualifiers on T1 and T2 are ignored. This function will typically
36675a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// be called in a loop that successively "unwraps" pointer and
36685a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// pointer-to-member types to compare them at each level.
36695a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregorbool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) {
36705a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  const PointerType *T1PtrType = T1->getAs<PointerType>(),
36715a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                    *T2PtrType = T2->getAs<PointerType>();
36725a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  if (T1PtrType && T2PtrType) {
36735a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T1 = T1PtrType->getPointeeType();
36745a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T2 = T2PtrType->getPointeeType();
36755a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    return true;
36765a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
36775a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
36785a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(),
36795a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                          *T2MPType = T2->getAs<MemberPointerType>();
36805a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  if (T1MPType && T2MPType &&
36815a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0),
36825a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                             QualType(T2MPType->getClass(), 0))) {
36835a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T1 = T1MPType->getPointeeType();
36845a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T2 = T2MPType->getPointeeType();
36855a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    return true;
36865a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
36875a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
36884e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().ObjC1) {
36895a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    const ObjCObjectPointerType *T1OPType = T1->getAs<ObjCObjectPointerType>(),
36905a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                                *T2OPType = T2->getAs<ObjCObjectPointerType>();
36915a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    if (T1OPType && T2OPType) {
36925a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      T1 = T1OPType->getPointeeType();
36935a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      T2 = T2OPType->getPointeeType();
36945a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      return true;
36955a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    }
36965a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
36975a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
36985a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  // FIXME: Block pointers, too?
36995a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
37005a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  return false;
37015a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor}
37025a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
37034ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameInfo
37044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getNameForTemplate(TemplateName Name,
37054ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                               SourceLocation NameLoc) const {
3706146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  switch (Name.getKind()) {
3707146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::QualifiedTemplate:
3708146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::Template:
37092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    // DNInfo work in progress: CHECKME: what about DNLoc?
3710146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(),
3711146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
37122577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
3713146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::OverloadedTemplate: {
3714146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate();
3715146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    // DNInfo work in progress: CHECKME: what about DNLoc?
3716146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc);
3717146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3718146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3719146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::DependentTemplate: {
3720146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    DependentTemplateName *DTN = Name.getAsDependentTemplateName();
37212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName DName;
372280ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    if (DTN->isIdentifier()) {
37232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DName = DeclarationNames.getIdentifier(DTN->getIdentifier());
37242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return DeclarationNameInfo(DName, NameLoc);
372580ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    } else {
37262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DName = DeclarationNames.getCXXOperatorName(DTN->getOperator());
37272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      // DNInfo work in progress: FIXME: source locations?
37282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DeclarationNameLoc DNLoc;
37292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DNLoc.CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding();
37302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DNLoc.CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding();
37312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return DeclarationNameInfo(DName, NameLoc, DNLoc);
373280ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    }
373380ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall  }
373480ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall
3735146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParm: {
3736146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmStorage *subst
3737146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParm();
3738146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(subst->getParameter()->getDeclName(),
3739146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
3740146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3741146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3742146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParmPack: {
3743146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmPackStorage *subst
3744146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParmPack();
3745146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(subst->getParameterPack()->getDeclName(),
3746146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
3747146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3748146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3749146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3750146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm_unreachable("bad template name kind!");
375180ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall}
375280ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall
37534ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const {
3754146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  switch (Name.getKind()) {
3755146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::QualifiedTemplate:
3756146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::Template: {
3757146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateDecl *Template = Name.getAsTemplateDecl();
37583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTemplateParmDecl *TTP
3759146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall          = dyn_cast<TemplateTemplateParmDecl>(Template))
37603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      Template = getCanonicalTemplateTemplateParmDecl(TTP);
37613e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
37623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    // The canonical template name is the canonical template declaration.
376397fbaa2a38804268a024f1a104b43fcf8b4411b0Argyrios Kyrtzidis    return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl()));
37643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
376525a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor
3766146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::OverloadedTemplate:
3767146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    llvm_unreachable("cannot canonicalize overloaded template");
3768146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3769146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::DependentTemplate: {
3770146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    DependentTemplateName *DTN = Name.getAsDependentTemplateName();
3771146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    assert(DTN && "Non-dependent template names must refer to template decls.");
3772146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DTN->CanonicalTemplateName;
3773146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3774146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3775146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParm: {
3776146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmStorage *subst
3777146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParm();
3778146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return getCanonicalTemplateName(subst->getReplacement());
37791aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
37801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3781146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParmPack: {
3782146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmPackStorage *subst
3783146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                  = Name.getAsSubstTemplateTemplateParmPack();
3784146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateTemplateParmDecl *canonParameter
3785146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack());
3786146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateArgument canonArgPack
3787146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = getCanonicalTemplateArgument(subst->getArgumentPack());
3788146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack);
3789146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3790146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3791146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3792146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm_unreachable("bad template name!");
379325a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor}
379425a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor
3795db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregorbool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) {
3796db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  X = getCanonicalTemplateName(X);
3797db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  Y = getCanonicalTemplateName(Y);
3798db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  return X.getAsVoidPointer() == Y.getAsVoidPointer();
3799db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor}
3800db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument
38024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const {
38031275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  switch (Arg.getKind()) {
38041275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Null:
38051275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      return Arg;
38061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38071275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Expression:
38081275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      return Arg;
38091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3810d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    case TemplateArgument::Declaration: {
3811d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      ValueDecl *D = cast<ValueDecl>(Arg.getAsDecl()->getCanonicalDecl());
3812d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return TemplateArgument(D, Arg.isDeclForReferenceParam());
3813d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    }
38141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3815d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    case TemplateArgument::NullPtr:
3816d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return TemplateArgument(getCanonicalType(Arg.getNullPtrType()),
3817d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman                              /*isNullPtr*/true);
3818d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
3819788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    case TemplateArgument::Template:
3820788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate()));
3821a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
3822a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    case TemplateArgument::TemplateExpansion:
3823a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      return TemplateArgument(getCanonicalTemplateName(
3824a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                         Arg.getAsTemplateOrTemplatePattern()),
38252be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                              Arg.getNumTemplateExpansions());
3826a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
38271275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Integral:
3828855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer      return TemplateArgument(Arg, getCanonicalType(Arg.getIntegralType()));
38291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38301275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Type:
3831833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      return TemplateArgument(getCanonicalType(Arg.getAsType()));
38321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38331275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Pack: {
383487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor      if (Arg.pack_size() == 0)
383587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor        return Arg;
383687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
3837910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      TemplateArgument *CanonArgs
3838910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor        = new (*this) TemplateArgument[Arg.pack_size()];
38391275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      unsigned Idx = 0;
38401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
38411275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                        AEnd = Arg.pack_end();
38421275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor           A != AEnd; (void)++A, ++Idx)
38431275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor        CanonArgs[Idx] = getCanonicalTemplateArgument(*A);
38441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3845910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      return TemplateArgument(CanonArgs, Arg.pack_size());
38461275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    }
38471275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  }
38481275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor
38491275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // Silence GCC warning
3850b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unhandled template argument kind");
38511275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor}
38521275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor
3853d57959af02b4af695276f4204443afe6e5d86bd8Douglas GregorNestedNameSpecifier *
38544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const {
38551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!NNS)
3856d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return 0;
3857d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3858d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  switch (NNS->getKind()) {
3859d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Identifier:
3860d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // Canonicalize the prefix but keep the identifier the same.
38611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return NestedNameSpecifier::Create(*this,
3862d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor                         getCanonicalNestedNameSpecifier(NNS->getPrefix()),
3863d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor                                       NNS->getAsIdentifier());
3864d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3865d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Namespace:
3866d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // A namespace is canonical; build a nested-name-specifier with
3867d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // this namespace and no prefix.
386814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return NestedNameSpecifier::Create(*this, 0,
386914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                 NNS->getAsNamespace()->getOriginalNamespace());
387014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
387114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NestedNameSpecifier::NamespaceAlias:
387214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    // A namespace is canonical; build a nested-name-specifier with
387314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    // this namespace and no prefix.
387414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return NestedNameSpecifier::Create(*this, 0,
387514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                    NNS->getAsNamespaceAlias()->getNamespace()
387614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                      ->getOriginalNamespace());
3877d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3878d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::TypeSpec:
3879d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate: {
3880d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    QualType T = getCanonicalType(QualType(NNS->getAsType(), 0));
3881264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor
3882264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // If we have some kind of dependent-named type (e.g., "typename T::type"),
3883264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // break it apart into its prefix and identifier, then reconsititute those
3884264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // as the canonical nested-name-specifier. This is required to canonicalize
3885264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // a dependent nested-name-specifier involving typedefs of dependent-name
3886264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // types, e.g.,
3887264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    //   typedef typename T::type T1;
3888264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    //   typedef typename T1::type T2;
388916412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    if (const DependentNameType *DNT = T->getAs<DependentNameType>())
389016412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman      return NestedNameSpecifier::Create(*this, DNT->getQualifier(),
3891264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor                           const_cast<IdentifierInfo *>(DNT->getIdentifier()));
3892264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor
389316412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // Otherwise, just canonicalize the type, and force it to be a TypeSpec.
389416412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // FIXME: Why are TypeSpec and TypeSpecWithTemplate distinct in the
389516412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // first place?
38963b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return NestedNameSpecifier::Create(*this, 0, false,
38973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                       const_cast<Type*>(T.getTypePtr()));
3898d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
3899d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3900d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Global:
3901d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // The global specifier is canonical and unique.
3902d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return NNS;
3903d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
3904d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
39057530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid NestedNameSpecifier::Kind!");
3906d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
3907d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3908c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner
39094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadconst ArrayType *ASTContext::getAsArrayType(QualType T) const {
3910c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Handle the non-qualified case efficiently.
3911a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  if (!T.hasLocalQualifiers()) {
3912c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    // Handle the common positive case fast.
3913c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    if (const ArrayType *AT = dyn_cast<ArrayType>(T))
3914c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner      return AT;
3915c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  }
39161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39170953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Handle the common negative case fast.
39183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!isa<ArrayType>(T.getCanonicalType()))
3919c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return 0;
39201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Apply any qualifiers from the array type to the element type.  This
3922c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // implements C99 6.7.3p8: "If the specification of an array type includes
3923c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // any type qualifiers, the element type is so qualified, not the array type."
39241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3925c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If we get here, we either have type qualifiers on the type, or we have
3926c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // sugar such as a typedef in the way.  If we have type qualifiers on the type
392750d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor  // we must propagate them down into the element type.
39280953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
39293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  SplitQualType split = T.getSplitDesugaredType();
3930200fa53fd420aa8369586f569dbece04930ad6a3John McCall  Qualifiers qs = split.Quals;
39311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3932c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If we have a simple case, just return now.
3933200fa53fd420aa8369586f569dbece04930ad6a3John McCall  const ArrayType *ATy = dyn_cast<ArrayType>(split.Ty);
39343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (ATy == 0 || qs.empty())
3935c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return ATy;
39361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3937c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Otherwise, we have an array and we have qualifiers on it.  Push the
3938c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // qualifiers into the array element type and return a new array type.
39393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs);
39401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3941c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy))
3942c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(),
3943c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                                CAT->getSizeModifier(),
39440953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                           CAT->getIndexTypeCVRQualifiers()));
3945c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy))
3946c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return cast<ArrayType>(getIncompleteArrayType(NewEltTy,
3947c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                                  IAT->getSizeModifier(),
39480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                           IAT->getIndexTypeCVRQualifiers()));
3949898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
39501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (const DependentSizedArrayType *DSAT
3951898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor        = dyn_cast<DependentSizedArrayType>(ATy))
3952898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    return cast<ArrayType>(
39531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                     getDependentSizedArrayType(NewEltTy,
39543fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                                DSAT->getSizeExpr(),
3955898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                                                DSAT->getSizeModifier(),
39560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                              DSAT->getIndexTypeCVRQualifiers(),
39577e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                                DSAT->getBracketsRange()));
39581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3959c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  const VariableArrayType *VAT = cast<VariableArrayType>(ATy);
39607e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  return cast<ArrayType>(getVariableArrayType(NewEltTy,
39613fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                              VAT->getSizeExpr(),
3962c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                              VAT->getSizeModifier(),
39630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                              VAT->getIndexTypeCVRQualifiers(),
39647e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                              VAT->getBracketsRange()));
396577c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner}
396677c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner
3967ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getAdjustedParameterType(QualType T) const {
396879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  // C99 6.7.5.3p7:
396979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   A declaration of a parameter as "array of type" shall be
397079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   adjusted to "qualified pointer to type", where the type
397179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   qualifiers (if any) are those specified within the [ and ] of
397279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   the array type derivation.
397379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  if (T->isArrayType())
397479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor    return getArrayDecayedType(T);
397579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
397679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  // C99 6.7.5.3p8:
397779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   A declaration of a parameter as "function returning type"
397879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   shall be adjusted to "pointer to function returning type", as
397979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   in 6.3.2.1.
398079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  if (T->isFunctionType())
398179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor    return getPointerType(T);
398279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
398379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  return T;
398479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor}
398579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
3986ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getSignatureParameterType(QualType T) const {
398779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  T = getVariableArrayDecayedType(T);
398879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  T = getAdjustedParameterType(T);
398979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  return T.getUnqualifiedType();
399079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor}
399179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
3992e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// getArrayDecayedType - Return the properly qualified result of decaying the
3993e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// specified array type to a pointer.  This operation is non-trivial when
3994e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// handling typedefs etc.  The canonical type of "T" must be an array type,
3995e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// this returns a pointer to a properly qualified element of the array.
3996e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner///
3997e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
39984ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getArrayDecayedType(QualType Ty) const {
3999c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Get the element type with 'getAsArrayType' so that we don't lose any
4000c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // typedefs in the element type of the array.  This also handles propagation
4001c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // of type qualifiers from the array type into the element type if present
4002c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // (C99 6.7.3p8).
4003c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  const ArrayType *PrettyArrayType = getAsArrayType(Ty);
4004c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  assert(PrettyArrayType && "Not an array type!");
40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4006c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  QualType PtrTy = getPointerType(PrettyArrayType->getElementType());
4007e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
4008e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner  // int x[restrict 4] ->  int *restrict
40090953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers());
4010e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner}
4011e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
40123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(const ArrayType *array) const {
40133b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return getBaseElementType(array->getElementType());
40145e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor}
40155e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor
40163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(QualType type) const {
40173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Qualifiers qs;
40183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  while (true) {
40193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType split = type.getSplitDesugaredType();
4020200fa53fd420aa8369586f569dbece04930ad6a3John McCall    const ArrayType *array = split.Ty->getAsArrayTypeUnsafe();
40213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    if (!array) break;
40221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40233b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    type = array->getElementType();
4024200fa53fd420aa8369586f569dbece04930ad6a3John McCall    qs.addConsistentQualifiers(split.Quals);
40253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return getQualifiedType(type, qs);
40286183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson}
40296183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson
40300de78998e7bda473b408437053e48661b510d453Fariborz Jahanian/// getConstantArrayElementCount - Returns number of constant array elements.
40311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpuint64_t
40320de78998e7bda473b408437053e48661b510d453Fariborz JahanianASTContext::getConstantArrayElementCount(const ConstantArrayType *CA)  const {
40330de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  uint64_t ElementCount = 1;
40340de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  do {
40350de78998e7bda473b408437053e48661b510d453Fariborz Jahanian    ElementCount *= CA->getSize().getZExtValue();
4036d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith    CA = dyn_cast_or_null<ConstantArrayType>(
4037d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith      CA->getElementType()->getAsArrayTypeUnsafe());
40380de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  } while (CA);
40390de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  return ElementCount;
40400de78998e7bda473b408437053e48661b510d453Fariborz Jahanian}
40410de78998e7bda473b408437053e48661b510d453Fariborz Jahanian
40425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFloatingRank - Return a relative rank for floating point types.
40435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// This routine will assert if passed a built-in type that isn't a float.
4044a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattnerstatic FloatingRank getFloatingRank(QualType T) {
4045183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  if (const ComplexType *CT = T->getAs<ComplexType>())
40465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return getFloatingRank(CT->getElementType());
4047a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner
4048183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type");
4049183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  switch (T->getAs<BuiltinType>()->getKind()) {
4050b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("getFloatingRank(): not a floating type");
4051aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case BuiltinType::Half:       return HalfRank;
40525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Float:      return FloatRank;
40535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Double:     return DoubleRank;
40545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::LongDouble: return LongDoubleRank;
40555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
40565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
40575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getFloatingTypeOfSizeWithinDomain - Returns a real floating
40591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// point or a complex type (based on typeDomain/typeSize).
4060716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeDomain' is a real floating point or complex type.
4061716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeSize' is a real floating point or complex type.
40621361b11066239ea15764a2a844405352d87296b3Chris LattnerQualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size,
40631361b11066239ea15764a2a844405352d87296b3Chris Lattner                                                       QualType Domain) const {
40641361b11066239ea15764a2a844405352d87296b3Chris Lattner  FloatingRank EltRank = getFloatingRank(Size);
40651361b11066239ea15764a2a844405352d87296b3Chris Lattner  if (Domain->isComplexType()) {
40661361b11066239ea15764a2a844405352d87296b3Chris Lattner    switch (EltRank) {
4067561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie    case HalfRank: llvm_unreachable("Complex half is not supported");
4068f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case FloatRank:      return FloatComplexTy;
4069f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case DoubleRank:     return DoubleComplexTy;
4070f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case LongDoubleRank: return LongDoubleComplexTy;
4071f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    }
4072f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff  }
40731361b11066239ea15764a2a844405352d87296b3Chris Lattner
40741361b11066239ea15764a2a844405352d87296b3Chris Lattner  assert(Domain->isRealFloatingType() && "Unknown domain!");
40751361b11066239ea15764a2a844405352d87296b3Chris Lattner  switch (EltRank) {
4076561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie  case HalfRank: llvm_unreachable("Half ranks are not valid here");
40771361b11066239ea15764a2a844405352d87296b3Chris Lattner  case FloatRank:      return FloatTy;
40781361b11066239ea15764a2a844405352d87296b3Chris Lattner  case DoubleRank:     return DoubleTy;
40791361b11066239ea15764a2a844405352d87296b3Chris Lattner  case LongDoubleRank: return LongDoubleTy;
40805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4081561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie  llvm_unreachable("getFloatingRank(): illegal value for rank");
40825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
40835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
40847cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// getFloatingTypeOrder - Compare the rank of the two specified floating
40857cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// point types, ignoring the domain of the type (i.e. 'double' ==
40867cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// '_Complex double').  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
40871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1.
40884ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const {
4089a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  FloatingRank LHSR = getFloatingRank(LHS);
4090a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  FloatingRank RHSR = getFloatingRank(RHS);
40911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4092a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  if (LHSR == RHSR)
4093fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff    return 0;
4094a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  if (LHSR > RHSR)
4095fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff    return 1;
4096fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff  return -1;
40975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
40985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4099f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This
4100f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// routine will assert if passed a built-in type that isn't an integer or enum,
4101f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// or if it is not canonicalized.
4102f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallunsigned ASTContext::getIntegerRank(const Type *T) const {
4103467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(T->isCanonicalUnqualified() && "T should be canonicalized");
4104f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
4105f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  switch (cast<BuiltinType>(T)->getKind()) {
4106b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("getIntegerRank(): not a built-in integer");
41077cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Bool:
4108f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 1 + (getIntWidth(BoolTy) << 3);
41097cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Char_S:
41107cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Char_U:
41117cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::SChar:
41127cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UChar:
4113f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 2 + (getIntWidth(CharTy) << 3);
41147cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Short:
41157cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UShort:
4116f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 3 + (getIntWidth(ShortTy) << 3);
41177cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Int:
41187cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UInt:
4119f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 4 + (getIntWidth(IntTy) << 3);
41207cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Long:
41217cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::ULong:
4122f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 5 + (getIntWidth(LongTy) << 3);
41237cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::LongLong:
41247cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::ULongLong:
4125f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 6 + (getIntWidth(LongLongTy) << 3);
41262df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::Int128:
41272df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::UInt128:
41282df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner    return 7 + (getIntWidth(Int128Ty) << 3);
4129f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  }
4130f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner}
4131f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner
413204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \brief Whether this is a promotable bitfield reference according
413304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
413404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman///
413504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \returns the type this bit-field will promote to, or NULL if no
413604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// promotion occurs.
41374ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::isPromotableBitField(Expr *E) const {
4138ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor  if (E->isTypeDependent() || E->isValueDependent())
4139ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor    return QualType();
4140ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor
414104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  FieldDecl *Field = E->getBitField();
414204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (!Field)
414304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return QualType();
414404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
414504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  QualType FT = Field->getType();
414604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
4147a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  uint64_t BitWidth = Field->getBitWidthValue(*this);
414804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  uint64_t IntSize = getTypeSize(IntTy);
414904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // GCC extension compatibility: if the bit-field size is less than or equal
415004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // to the size of int, it gets promoted no matter what its type is.
415104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // For instance, unsigned long bf : 4 gets promoted to signed int.
415204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (BitWidth < IntSize)
415304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return IntTy;
415404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
415504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (BitWidth == IntSize)
415604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy;
415704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
415804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // Types bigger than int are not subject to promotions, and therefore act
415904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // like the base type.
416004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // FIXME: This doesn't quite match what gcc does, but what gcc does here
416104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // is ridiculous.
416204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  return QualType();
416304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman}
416404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
4165a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// getPromotedIntegerType - Returns the type that Promotable will
4166a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable
4167a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// integer type.
41684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPromotedIntegerType(QualType Promotable) const {
4169a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(!Promotable.isNull());
4170a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(Promotable->isPromotableIntegerType());
4171842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  if (const EnumType *ET = Promotable->getAs<EnumType>())
4172842aef8d942a880eeb9535d40de31a86838264cbJohn McCall    return ET->getDecl()->getPromotionType();
417368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman
417468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  if (const BuiltinType *BT = Promotable->getAs<BuiltinType>()) {
417568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t
417668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // (3.9.1) can be converted to a prvalue of the first of the following
417768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // types that can represent all the values of its underlying type:
417868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // int, unsigned int, long int, unsigned long int, long long int, or
417968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // unsigned long long int [...]
418068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // FIXME: Is there some better way to compute this?
418168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    if (BT->getKind() == BuiltinType::WChar_S ||
418268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::WChar_U ||
418368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::Char16 ||
418468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::Char32) {
418568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
418668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      uint64_t FromSize = getTypeSize(BT);
418768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy,
418868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman                                  LongLongTy, UnsignedLongLongTy };
418968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      for (size_t Idx = 0; Idx < llvm::array_lengthof(PromoteTypes); ++Idx) {
419068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        uint64_t ToSize = getTypeSize(PromoteTypes[Idx]);
419168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        if (FromSize < ToSize ||
419268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman            (FromSize == ToSize &&
419368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman             FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType()))
419468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman          return PromoteTypes[Idx];
419568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      }
419668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      llvm_unreachable("char type should fit into long long");
419768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    }
419868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  }
419968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman
420068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  // At this point, we should have a signed or unsigned integer type.
4201a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  if (Promotable->isSignedIntegerType())
4202a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman    return IntTy;
42035b64e77c2d51ca3e9313ed4107d3c4d927895cd6Eli Friedman  uint64_t PromotableSize = getIntWidth(Promotable);
42045b64e77c2d51ca3e9313ed4107d3c4d927895cd6Eli Friedman  uint64_t IntSize = getIntWidth(IntTy);
4205a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize);
4206a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy;
4207a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman}
4208a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman
420931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// \brief Recurses in pointer/array types until it finds an objc retainable
421031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// type and returns its ownership.
421131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios KyrtzidisQualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const {
421231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  while (!T.isNull()) {
421331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    if (T.getObjCLifetime() != Qualifiers::OCL_None)
421431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      return T.getObjCLifetime();
421531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    if (T->isArrayType())
421631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      T = getBaseElementType(T);
421731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else if (const PointerType *PT = T->getAs<PointerType>())
421831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      T = PT->getPointeeType();
421931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else if (const ReferenceType *RT = T->getAs<ReferenceType>())
422028445f0b62f6aed851ff87ce64d9b19200d3211fArgyrios Kyrtzidis      T = RT->getPointeeType();
422131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else
422231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      break;
422331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  }
422431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis
422531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  return Qualifiers::OCL_None;
422631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis}
422731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis
42281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getIntegerTypeOrder - Returns the highest ranked integer type:
42297cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// C99 6.3.1.8p1.  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
42301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1.
42314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const {
4232f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const Type *LHSC = getCanonicalType(LHS).getTypePtr();
4233f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const Type *RHSC = getCanonicalType(RHS).getTypePtr();
42347cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSC == RHSC) return 0;
42351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4236f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  bool LHSUnsigned = LHSC->isUnsignedIntegerType();
4237f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  bool RHSUnsigned = RHSC->isUnsignedIntegerType();
42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42397cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  unsigned LHSRank = getIntegerRank(LHSC);
42407cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  unsigned RHSRank = getIntegerRank(RHSC);
42411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42427cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSUnsigned == RHSUnsigned) {  // Both signed or both unsigned.
42437cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    if (LHSRank == RHSRank) return 0;
42447cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return LHSRank > RHSRank ? 1 : -1;
42457cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  }
42461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42477cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // Otherwise, the LHS is signed and the RHS is unsigned or visa versa.
42487cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSUnsigned) {
42497cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // If the unsigned [LHS] type is larger, return it.
42507cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    if (LHSRank >= RHSRank)
42517cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner      return 1;
42521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42537cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // If the signed type can represent all values of the unsigned type, it
42547cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // wins.  Because we are dealing with 2's complement and types that are
42551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // powers of two larger than each other, this is always safe.
42567cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return -1;
42577cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  }
42587cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner
42597cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // If the unsigned [RHS] type is larger, return it.
42607cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (RHSRank >= LHSRank)
42617cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return -1;
42621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42637cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // If the signed type can represent all values of the unsigned type, it
42647cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // wins.  Because we are dealing with 2's complement and types that are
42651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // powers of two larger than each other, this is always safe.
42667cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  return 1;
42675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
426871993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson
426979cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlssonstatic RecordDecl *
4270ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK,
4271ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                 DeclContext *DC, IdentifierInfo *Id) {
4272ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  SourceLocation Loc;
42734e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (Ctx.getLangOpts().CPlusPlus)
4274ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id);
427579cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson  else
4276ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id);
427779cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson}
4278ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// getCFConstantStringType - Return the type used for constant CFStrings.
42804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getCFConstantStringType() const {
428171993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  if (!CFConstantStringTypeDecl) {
42821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CFConstantStringTypeDecl =
4283ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara      CreateRecordDecl(*this, TTK_Struct, TUDecl,
428479cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("NSConstantString"));
42855cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall    CFConstantStringTypeDecl->startDefinition();
428679cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson
4287f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    QualType FieldTypes[4];
42881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
428971993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // const int *isa;
42900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    FieldTypes[0] = getPointerType(IntTy.withConst());
4291f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    // int flags;
4292f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    FieldTypes[1] = IntTy;
429371993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // const char *str;
42940953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    FieldTypes[2] = getPointerType(CharTy.withConst());
429571993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // long length;
42961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    FieldTypes[3] = LongTy;
42971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
429844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    // Create fields
429944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    for (unsigned i = 0; i < 4; ++i) {
43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl,
4301ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           SourceLocation(),
430244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                                           SourceLocation(), 0,
4303a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                           FieldTypes[i], /*TInfo=*/0,
43041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                           /*BitWidth=*/0,
43057a614d8380297fcd2bc23986241905d97222948cRichard Smith                                           /*Mutable=*/false,
4306ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                           ICIS_NoInit);
43072888b65aae768f54062505330df7be230a0510c7John McCall      Field->setAccess(AS_public);
430817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      CFConstantStringTypeDecl->addDecl(Field);
430944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    }
431044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
4311838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor    CFConstantStringTypeDecl->completeDefinition();
431271993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  }
43131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
431471993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  return getTagDeclType(CFConstantStringTypeDecl);
43158467583c2704e7a9691ea56939a029015f0ade0aGabor Greif}
4316b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson
4317f7992132207d7ddc8810a135cec97ebe5805e500Fariborz JahanianQualType ASTContext::getObjCSuperType() const {
4318f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  if (ObjCSuperType.isNull()) {
4319f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    RecordDecl *ObjCSuperTypeDecl  =
4320f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian      CreateRecordDecl(*this, TTK_Struct, TUDecl, &Idents.get("objc_super"));
4321f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    TUDecl->addDecl(ObjCSuperTypeDecl);
4322f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    ObjCSuperType = getTagDeclType(ObjCSuperTypeDecl);
4323f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  }
4324f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  return ObjCSuperType;
4325f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian}
4326f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian
4327319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregorvoid ASTContext::setCFConstantStringType(QualType T) {
43286217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  const RecordType *Rec = T->getAs<RecordType>();
4329319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor  assert(Rec && "Invalid CFConstantStringType");
4330319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor  CFConstantStringTypeDecl = Rec->getDecl();
4331319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor}
4332319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor
43334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorType() const {
4334adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  if (BlockDescriptorType)
4335adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    return getTagDeclType(BlockDescriptorType);
4336adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4337adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  RecordDecl *T;
4338adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  // FIXME: Needs the FlagAppleBlock bit.
4339ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  T = CreateRecordDecl(*this, TTK_Struct, TUDecl,
434079cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("__block_descriptor"));
43415cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall  T->startDefinition();
4342adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4343adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  QualType FieldTypes[] = {
4344adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    UnsignedLongTy,
4345adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    UnsignedLongTy,
4346adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  };
4347adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4348adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  const char *FieldNames[] = {
4349adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    "reserved",
4350083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "Size"
4351adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  };
4352adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4353adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  for (size_t i = 0; i < 2; ++i) {
4354ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
4355adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         SourceLocation(),
4356adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         &Idents.get(FieldNames[i]),
4357a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                         FieldTypes[i], /*TInfo=*/0,
4358adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         /*BitWidth=*/0,
43597a614d8380297fcd2bc23986241905d97222948cRichard Smith                                         /*Mutable=*/false,
4360ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                         ICIS_NoInit);
43612888b65aae768f54062505330df7be230a0510c7John McCall    Field->setAccess(AS_public);
4362adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    T->addDecl(Field);
4363adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  }
4364adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4365838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  T->completeDefinition();
4366adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4367adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  BlockDescriptorType = T;
4368adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4369adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  return getTagDeclType(BlockDescriptorType);
4370adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump}
4371adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
43724ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorExtendedType() const {
4373083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  if (BlockDescriptorExtendedType)
4374083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    return getTagDeclType(BlockDescriptorExtendedType);
4375083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4376083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  RecordDecl *T;
4377083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  // FIXME: Needs the FlagAppleBlock bit.
4378ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  T = CreateRecordDecl(*this, TTK_Struct, TUDecl,
437979cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("__block_descriptor_withcopydispose"));
43805cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall  T->startDefinition();
4381083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4382083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  QualType FieldTypes[] = {
4383083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    UnsignedLongTy,
4384083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    UnsignedLongTy,
4385083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    getPointerType(VoidPtrTy),
4386083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    getPointerType(VoidPtrTy)
4387083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  };
4388083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4389083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  const char *FieldNames[] = {
4390083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "reserved",
4391083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "Size",
4392083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "CopyFuncPtr",
4393083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "DestroyFuncPtr"
4394083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  };
4395083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4396083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  for (size_t i = 0; i < 4; ++i) {
4397ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
4398083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         SourceLocation(),
4399083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         &Idents.get(FieldNames[i]),
4400a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                         FieldTypes[i], /*TInfo=*/0,
4401083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         /*BitWidth=*/0,
44027a614d8380297fcd2bc23986241905d97222948cRichard Smith                                         /*Mutable=*/false,
4403ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                         ICIS_NoInit);
44042888b65aae768f54062505330df7be230a0510c7John McCall    Field->setAccess(AS_public);
4405083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    T->addDecl(Field);
4406083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  }
4407083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4408838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  T->completeDefinition();
4409083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4410083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  BlockDescriptorExtendedType = T;
4411083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4412083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  return getTagDeclType(BlockDescriptorExtendedType);
4413083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump}
4414083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4415b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// BlockRequiresCopying - Returns true if byref variable "D" of type "Ty"
4416b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// requires copy/dispose. Note that this must match the logic
4417b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// in buildByrefHelpers.
4418b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanianbool ASTContext::BlockRequiresCopying(QualType Ty,
4419b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian                                      const VarDecl *D) {
4420b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (const CXXRecordDecl *record = Ty->getAsCXXRecordDecl()) {
4421b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    const Expr *copyExpr = getBlockVarCopyInits(D);
4422b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    if (!copyExpr && record->hasTrivialDestructor()) return false;
4423b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4424af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump    return true;
4425b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  }
4426b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4427b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (!Ty->isObjCRetainableType()) return false;
4428b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4429b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  Qualifiers qs = Ty.getQualifiers();
4430b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4431b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  // If we have lifetime, that dominates.
4432b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (Qualifiers::ObjCLifetime lifetime = qs.getObjCLifetime()) {
4433b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    assert(getLangOpts().ObjCAutoRefCount);
4434b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4435b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    switch (lifetime) {
4436b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_None: llvm_unreachable("impossible");
4437b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4438b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // These are just bits as far as the runtime is concerned.
4439b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_ExplicitNone:
4440b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Autoreleasing:
4441b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian        return false;
4442b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4443b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // Tell the runtime that this is ARC __weak, called by the
4444b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // byref routines.
4445b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Weak:
4446b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // ARC __strong __block variables need to be retained.
4447b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Strong:
4448b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian        return true;
4449e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian    }
4450b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    llvm_unreachable("fell out of lifetime switch!");
4451e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian  }
4452b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  return (Ty->isBlockPointerType() || isObjCNSObjectType(Ty) ||
4453b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian          Ty->isObjCObjectPointerType());
4454af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump}
4455af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump
44563ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanianbool ASTContext::getByrefLifetime(QualType Ty,
44573ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian                              Qualifiers::ObjCLifetime &LifeTime,
44583ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian                              bool &HasByrefExtendedLayout) const {
44593ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
44603ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  if (!getLangOpts().ObjC1 ||
44613ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian      getLangOpts().getGC() != LangOptions::NonGC)
44623ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    return false;
44633ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
44643ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  HasByrefExtendedLayout = false;
446534db84fdb092f89ea3678a0792074a5b9253829aFariborz Jahanian  if (Ty->isRecordType()) {
44663ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    HasByrefExtendedLayout = true;
44673ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_None;
44683ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  }
44693ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else if (getLangOpts().ObjCAutoRefCount)
44703ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Ty.getObjCLifetime();
44713ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  // MRR.
44723ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
44733ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_ExplicitNone;
44743ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else
44753ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_None;
44763ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  return true;
44773ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian}
44783ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
4479e97179c675b341927807c718be215c8d1aab8acbDouglas GregorTypedefDecl *ASTContext::getObjCInstanceTypeDecl() {
4480e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor  if (!ObjCInstanceTypeDecl)
4481e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor    ObjCInstanceTypeDecl = TypedefDecl::Create(*this,
4482e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               getTranslationUnitDecl(),
4483e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               SourceLocation(),
4484e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               SourceLocation(),
4485e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               &Idents.get("instancetype"),
4486e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                     getTrivialTypeSourceInfo(getObjCIdType()));
4487e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor  return ObjCInstanceTypeDecl;
4488e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor}
4489e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor
4490e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// This returns true if a type has been typedefed to BOOL:
4491e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// typedef <type> BOOL;
44922d99833e8c956775f2183601cd120b65b569c867Chris Lattnerstatic bool isTypeTypedefedAsBOOL(QualType T) {
4493e8c49533521c40643653f943d47229e62d277f88Anders Carlsson  if (const TypedefType *TT = dyn_cast<TypedefType>(T))
4494bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner    if (IdentifierInfo *II = TT->getDecl()->getIdentifier())
4495bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner      return II->isStr("BOOL");
44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
449785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson  return false;
449885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson}
449985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson
4500a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingTypeSize returns size of type for objective-c encoding
450133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// purpose.
45024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const {
4503f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  if (!type->isIncompleteArrayType() && type->isIncompleteType())
4504f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    return CharUnits::Zero();
4505f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4506199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits sz = getTypeSizeInChars(type);
45071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
450833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Make all integer and enum types at least as large as an int
45092ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor  if (sz.isPositive() && type->isIntegralOrEnumerationType())
4510199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    sz = std::max(sz, getTypeSizeInChars(IntTy));
451133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Treat arrays as pointers, since that's how they're passed in.
451233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  else if (type->isArrayType())
4513199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    sz = getTypeSizeInChars(VoidPtrTy);
4514aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck  return sz;
4515199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck}
4516199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck
4517199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstatic inline
4518199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstd::string charUnitsToString(const CharUnits &CU) {
4519199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  return llvm::itostr(CU.getQuantity());
452033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
452133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
45226b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// getObjCEncodingForBlock - Return the encoded type for this block
45235e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall/// declaration.
45246b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallstd::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const {
45256b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  std::string S;
45266b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
45275e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  const BlockDecl *Decl = Expr->getBlockDecl();
45285e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  QualType BlockTy =
45295e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      Expr->getType()->getAs<BlockPointerType>()->getPointeeType();
45305e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Encode result type.
45313d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian  if (getLangOpts().EncodeExtendedBlockSig)
453206cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None,
453306cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                            BlockTy->getAs<FunctionType>()->getResultType(),
453406cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                            S, true /*Extended*/);
453506cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian  else
453606cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    getObjCEncodingForType(BlockTy->getAs<FunctionType>()->getResultType(),
453706cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                           S);
45385e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Compute size of all parameters.
45395e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Start with computing size of a pointer in number of bytes.
45405e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // FIXME: There might(should) be a better way of doing this computation!
45415e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  SourceLocation Loc;
4542199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
4543199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits ParmOffset = PtrSize;
45446f46c2653c1545cc3fef0c0df996d18160160ce8Fariborz Jahanian  for (BlockDecl::param_const_iterator PI = Decl->param_begin(),
45455e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall       E = Decl->param_end(); PI != E; ++PI) {
45465e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    QualType PType = (*PI)->getType();
4547aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    CharUnits sz = getObjCEncodingTypeSize(PType);
4548075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian    if (sz.isZero())
4549075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian      continue;
4550199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    assert (sz.isPositive() && "BlockExpr - Incomplete param type");
45515e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    ParmOffset += sz;
45525e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
45535e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Size of the argument frame
4554199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(ParmOffset);
45555e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Block pointer and offset.
45565e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  S += "@?0";
45575e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall
45585e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Argument types.
45595e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  ParmOffset = PtrSize;
45605e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E =
45615e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall       Decl->param_end(); PI != E; ++PI) {
45625e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    ParmVarDecl *PVDecl = *PI;
45635e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    QualType PType = PVDecl->getOriginalType();
45645e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    if (const ArrayType *AT =
45655e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
45665e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      // Use array's original type only if it has known number of
45675389f48b24937ad7b4093307128b3cbf25235654David Chisnall      // elements.
45685389f48b24937ad7b4093307128b3cbf25235654David Chisnall      if (!isa<ConstantArrayType>(AT))
45695389f48b24937ad7b4093307128b3cbf25235654David Chisnall        PType = PVDecl->getType();
45705389f48b24937ad7b4093307128b3cbf25235654David Chisnall    } else if (PType->isFunctionType())
45715389f48b24937ad7b4093307128b3cbf25235654David Chisnall      PType = PVDecl->getType();
45723d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian    if (getLangOpts().EncodeExtendedBlockSig)
457306cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian      getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, PType,
457406cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                                      S, true /*Extended*/);
457506cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    else
457606cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian      getObjCEncodingForType(PType, S);
45775389f48b24937ad7b4093307128b3cbf25235654David Chisnall    S += charUnitsToString(ParmOffset);
45785389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmOffset += getObjCEncodingTypeSize(PType);
45795389f48b24937ad7b4093307128b3cbf25235654David Chisnall  }
45806b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
45816b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  return S;
45825389f48b24937ad7b4093307128b3cbf25235654David Chisnall}
45835389f48b24937ad7b4093307128b3cbf25235654David Chisnall
4584f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl,
45855389f48b24937ad7b4093307128b3cbf25235654David Chisnall                                                std::string& S) {
45865389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Encode result type.
45875389f48b24937ad7b4093307128b3cbf25235654David Chisnall  getObjCEncodingForType(Decl->getResultType(), S);
45885389f48b24937ad7b4093307128b3cbf25235654David Chisnall  CharUnits ParmOffset;
45895389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Compute size of all parameters.
45905389f48b24937ad7b4093307128b3cbf25235654David Chisnall  for (FunctionDecl::param_const_iterator PI = Decl->param_begin(),
45915389f48b24937ad7b4093307128b3cbf25235654David Chisnall       E = Decl->param_end(); PI != E; ++PI) {
45925389f48b24937ad7b4093307128b3cbf25235654David Chisnall    QualType PType = (*PI)->getType();
45935389f48b24937ad7b4093307128b3cbf25235654David Chisnall    CharUnits sz = getObjCEncodingTypeSize(PType);
4594f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    if (sz.isZero())
45957e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian      continue;
45967e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian
45975389f48b24937ad7b4093307128b3cbf25235654David Chisnall    assert (sz.isPositive() &&
4598f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor        "getObjCEncodingForFunctionDecl - Incomplete param type");
45995389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmOffset += sz;
46005389f48b24937ad7b4093307128b3cbf25235654David Chisnall  }
46015389f48b24937ad7b4093307128b3cbf25235654David Chisnall  S += charUnitsToString(ParmOffset);
46025389f48b24937ad7b4093307128b3cbf25235654David Chisnall  ParmOffset = CharUnits::Zero();
46035389f48b24937ad7b4093307128b3cbf25235654David Chisnall
46045389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Argument types.
46055389f48b24937ad7b4093307128b3cbf25235654David Chisnall  for (FunctionDecl::param_const_iterator PI = Decl->param_begin(),
46065389f48b24937ad7b4093307128b3cbf25235654David Chisnall       E = Decl->param_end(); PI != E; ++PI) {
46075389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmVarDecl *PVDecl = *PI;
46085389f48b24937ad7b4093307128b3cbf25235654David Chisnall    QualType PType = PVDecl->getOriginalType();
46095389f48b24937ad7b4093307128b3cbf25235654David Chisnall    if (const ArrayType *AT =
46105389f48b24937ad7b4093307128b3cbf25235654David Chisnall          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
46115389f48b24937ad7b4093307128b3cbf25235654David Chisnall      // Use array's original type only if it has known number of
46125e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      // elements.
46135e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      if (!isa<ConstantArrayType>(AT))
46145e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall        PType = PVDecl->getType();
46155e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    } else if (PType->isFunctionType())
46165e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      PType = PVDecl->getType();
46175e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    getObjCEncodingForType(PType, S);
4618199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    S += charUnitsToString(ParmOffset);
4619aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    ParmOffset += getObjCEncodingTypeSize(PType);
46205e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
4621f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4622f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  return false;
46235e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall}
46245e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall
4625dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// getObjCEncodingForMethodParameter - Return the encoded type for a single
4626dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// method parameter or return type. If Extended, include class names and
4627dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// block object types.
4628dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilsonvoid ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT,
4629dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                                   QualType T, std::string& S,
4630dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                                   bool Extended) const {
4631dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode type qualifer, 'in', 'inout', etc. for the parameter.
4632dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForTypeQualifier(QT, S);
4633dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode parameter type.
4634dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForTypeImpl(T, S, true, true, 0,
4635dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             true     /*OutermostType*/,
4636dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             false    /*EncodingProperty*/,
4637dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             false    /*StructField*/,
4638dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             Extended /*EncodeBlockParameters*/,
4639dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             Extended /*EncodeClassNames*/);
4640dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson}
4641dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson
4642a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingForMethodDecl - Return the encoded type for this method
464333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// declaration.
4644f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
4645dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                              std::string& S,
4646dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                              bool Extended) const {
4647c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: This is not very efficient.
4648dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode return type.
4649dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(),
4650dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                    Decl->getResultType(), S, Extended);
465133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Compute size of all parameters.
465233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Start with computing size of a pointer in number of bytes.
465333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // FIXME: There might(should) be a better way of doing this computation!
465433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  SourceLocation Loc;
4655199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
465633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // The first two arguments (self and _cmd) are pointers; account for
465733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // their size.
4658199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits ParmOffset = 2 * PtrSize;
4659491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis  for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
46607732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian       E = Decl->sel_param_end(); PI != E; ++PI) {
466189951a86b594513c2a013532ed45d197413b1087Chris Lattner    QualType PType = (*PI)->getType();
4662aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    CharUnits sz = getObjCEncodingTypeSize(PType);
4663f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    if (sz.isZero())
46647e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian      continue;
46657e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian
4666199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    assert (sz.isPositive() &&
4667199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        "getObjCEncodingForMethodDecl - Incomplete param type");
466833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    ParmOffset += sz;
466933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  }
4670199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(ParmOffset);
467133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  S += "@0:";
4672199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(PtrSize);
46731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
467433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Argument types.
467533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  ParmOffset = 2 * PtrSize;
4676491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis  for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
46777732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian       E = Decl->sel_param_end(); PI != E; ++PI) {
4678491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis    const ParmVarDecl *PVDecl = *PI;
46791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType PType = PVDecl->getOriginalType();
46804306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian    if (const ArrayType *AT =
4681ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
4682ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      // Use array's original type only if it has known number of
4683ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      // elements.
4684bb3fde337fb712c0e6da8790d431621be4793048Steve Naroff      if (!isa<ConstantArrayType>(AT))
4685ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff        PType = PVDecl->getType();
4686ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff    } else if (PType->isFunctionType())
4687ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      PType = PVDecl->getType();
4688dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(),
4689dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                      PType, S, Extended);
4690199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    S += charUnitsToString(ParmOffset);
4691aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    ParmOffset += getObjCEncodingTypeSize(PType);
469233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  }
4693f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4694f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  return false;
469533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
469633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
4697c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// getObjCEncodingForPropertyDecl - Return the encoded type for this
469883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// property declaration. If non-NULL, Container must be either an
4699c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be
4700c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// NULL when getting encodings for protocol properties.
47011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Property attributes are stored as a comma-delimited C string. The simple
47021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// attributes readonly and bycopy are encoded as single characters. The
47031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parametrized attributes, getter=name, setter=name, and ivar=name, are
47041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// encoded as single characters, followed by an identifier. Property types
47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// are also encoded as a parametrized attribute. The characters used to encode
470683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// these attributes are defined by the following enumeration:
470783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @code
470883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// enum PropertyAttributes {
470983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyReadOnly = 'R',   // property is read-only.
471083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyBycopy = 'C',     // property is a copy of the value last assigned
471183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyByref = '&',  // property is a reference to the value last assigned
471283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyDynamic = 'D',    // property is dynamic
471383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyGetter = 'G',     // followed by getter selector name
471483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertySetter = 'S',     // followed by setter selector name
471583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyInstanceVariable = 'V'  // followed by instance variable  name
47160d4cb85130d91da61c45aecb9fd31c7097a7cfccBob Wilson/// kPropertyType = 'T'              // followed by old-style type encoding.
471783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyWeak = 'W'              // 'weak' property
471883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyStrong = 'P'            // property GC'able
471983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyNonAtomic = 'N'         // property non-atomic
472083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// };
472183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @endcode
47221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
4723c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar                                                const Decl *Container,
47244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                std::string& S) const {
4725c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // Collect information from the property implementation decl(s).
4726c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  bool Dynamic = false;
4727c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  ObjCPropertyImplDecl *SynthesizePID = 0;
4728c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4729c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: Duplicated code due to poor abstraction.
4730c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (Container) {
47311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const ObjCCategoryImplDecl *CID =
4732c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        dyn_cast<ObjCCategoryImplDecl>(Container)) {
4733c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      for (ObjCCategoryImplDecl::propimpl_iterator
473417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis             i = CID->propimpl_begin(), e = CID->propimpl_end();
4735653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor           i != e; ++i) {
4736581deb3da481053c4993c7600f97acf7768caac5David Blaikie        ObjCPropertyImplDecl *PID = *i;
4737c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        if (PID->getPropertyDecl() == PD) {
4738c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
4739c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            Dynamic = true;
4740c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          } else {
4741c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            SynthesizePID = PID;
4742c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          }
4743c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        }
4744c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      }
4745c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    } else {
474661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container);
4747c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      for (ObjCCategoryImplDecl::propimpl_iterator
474817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis             i = OID->propimpl_begin(), e = OID->propimpl_end();
4749653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor           i != e; ++i) {
4750581deb3da481053c4993c7600f97acf7768caac5David Blaikie        ObjCPropertyImplDecl *PID = *i;
4751c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        if (PID->getPropertyDecl() == PD) {
4752c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
4753c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            Dynamic = true;
4754c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          } else {
4755c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            SynthesizePID = PID;
4756c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          }
4757c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        }
47581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
4759c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    }
4760c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4761c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4762c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: This is not very efficient.
4763c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  S = "T";
4764c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4765c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // Encode result type.
4766090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  // GCC has some special rules regarding encoding of properties which
4767090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  // closely resembles encoding of ivars.
47681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0,
4769090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                             true /* outermost type */,
4770090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                             true /* encoding for property */);
4771c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4772c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->isReadOnly()) {
4773c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",R";
4774c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  } else {
4775c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    switch (PD->getSetterKind()) {
4776c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    case ObjCPropertyDecl::Assign: break;
4777c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    case ObjCPropertyDecl::Copy:   S += ",C"; break;
47781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case ObjCPropertyDecl::Retain: S += ",&"; break;
47793a02b44e3948f7762dbfba94b7961281ca29d022Fariborz Jahanian    case ObjCPropertyDecl::Weak:   S += ",W"; break;
4780c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    }
4781c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4782c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4783c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // It really isn't clear at all what this means, since properties
4784c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // are "dynamic by default".
4785c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (Dynamic)
4786c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",D";
4787c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4788090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic)
4789090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian    S += ",N";
47901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4791c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
4792c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",G";
4793077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    S += PD->getGetterName().getAsString();
4794c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4795c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4796c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
4797c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",S";
4798077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    S += PD->getSetterName().getAsString();
4799c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4800c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4801c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (SynthesizePID) {
4802c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl();
4803c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",V";
480439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner    S += OID->getNameAsString();
4805c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4806c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4807c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: OBJCGC: weak & strong
4808c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar}
4809c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4810a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// getLegacyIntegralTypeEncoding -
48111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Another legacy compatibility encoding: 32-bit longs are encoded as
48121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 'l' or 'L' , but not always.  For typedefs, we need to use
4813a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 'i' or 'I' instead if encoding a struct field, or a pointer!
4814a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian///
4815a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanianvoid ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const {
48168e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump  if (isa<TypedefType>(PointeeTy.getTypePtr())) {
4817183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) {
48184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad      if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32)
4819a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        PointeeTy = UnsignedIntTy;
48201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      else
48214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32)
4822a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian          PointeeTy = IntTy;
4823a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
4824a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian  }
4825a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian}
4826a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian
48277d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanianvoid ASTContext::getObjCEncodingForType(QualType T, std::string& S,
48284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                        const FieldDecl *Field) const {
482982a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // We follow the behavior of gcc, expanding structures which are
483082a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // directly pointed to, and expanding embedded structures. Note that
483182a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // these rules are sufficient to prevent recursive encoding of the
483282a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // same type.
48331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getObjCEncodingForTypeImpl(T, S, true, true, Field,
48345b8c7d9fb620ba3a71e996d61e7b9bdf763b5c09Fariborz Jahanian                             true /* outermost type */);
483582a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar}
483682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar
48373624e9e55d98507863d0731a0942cd874f2a1574John McCallstatic char getObjCEncodingForPrimitiveKind(const ASTContext *C,
48383624e9e55d98507863d0731a0942cd874f2a1574John McCall                                            BuiltinType::Kind kind) {
48393624e9e55d98507863d0731a0942cd874f2a1574John McCall    switch (kind) {
484064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Void:       return 'v';
484164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Bool:       return 'B';
484264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Char_U:
484364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UChar:      return 'C';
48443624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Char16:
484564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UShort:     return 'S';
48463624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Char32:
484764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UInt:       return 'I';
484864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::ULong:
48493624e9e55d98507863d0731a0942cd874f2a1574John McCall        return C->getTargetInfo().getLongWidth() == 32 ? 'L' : 'Q';
485064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UInt128:    return 'T';
485164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::ULongLong:  return 'Q';
485264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Char_S:
485364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::SChar:      return 'c';
485464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Short:      return 's';
48553f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_S:
48563f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_U:
485764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Int:        return 'i';
485864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Long:
48593624e9e55d98507863d0731a0942cd874f2a1574John McCall      return C->getTargetInfo().getLongWidth() == 32 ? 'l' : 'q';
486064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::LongLong:   return 'q';
486164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Int128:     return 't';
486264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Float:      return 'f';
486364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Double:     return 'd';
48643a0be84b2aed8563150cdbd976a98838afa261ebDaniel Dunbar    case BuiltinType::LongDouble: return 'D';
48653624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::NullPtr:    return '*'; // like char*
48663624e9e55d98507863d0731a0942cd874f2a1574John McCall
48673624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Half:
48683624e9e55d98507863d0731a0942cd874f2a1574John McCall      // FIXME: potentially need @encodes for these!
48693624e9e55d98507863d0731a0942cd874f2a1574John McCall      return ' ';
48703624e9e55d98507863d0731a0942cd874f2a1574John McCall
48713624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCId:
48723624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCClass:
48733624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCSel:
48743624e9e55d98507863d0731a0942cd874f2a1574John McCall      llvm_unreachable("@encoding ObjC primitive type");
48753624e9e55d98507863d0731a0942cd874f2a1574John McCall
48763624e9e55d98507863d0731a0942cd874f2a1574John McCall    // OpenCL and placeholder types don't need @encodings.
48773624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1d:
48783624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1dArray:
48793624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1dBuffer:
48803624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage2d:
48813624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage2dArray:
48823624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage3d:
48833624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Dependent:
48843624e9e55d98507863d0731a0942cd874f2a1574John McCall#define BUILTIN_TYPE(KIND, ID)
48853624e9e55d98507863d0731a0942cd874f2a1574John McCall#define PLACEHOLDER_TYPE(KIND, ID) \
48863624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::KIND:
48873624e9e55d98507863d0731a0942cd874f2a1574John McCall#include "clang/AST/BuiltinTypes.def"
48883624e9e55d98507863d0731a0942cd874f2a1574John McCall      llvm_unreachable("invalid builtin type for @encode");
488964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    }
4890719e53f64637c5ac41aac0c711e1977487ffc0d7David Blaikie    llvm_unreachable("invalid BuiltinType::Kind value");
489164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall}
489264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall
48935471bc85b69912e3b448de004498a80c0de32296Douglas Gregorstatic char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) {
48945471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  EnumDecl *Enum = ET->getDecl();
48955471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
48965471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  // The encoding of an non-fixed enum type is always 'i', regardless of size.
48975471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  if (!Enum->isFixed())
48985471bc85b69912e3b448de004498a80c0de32296Douglas Gregor    return 'i';
48995471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
49005471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  // The encoding of a fixed enum type matches its fixed underlying type.
49013624e9e55d98507863d0731a0942cd874f2a1574John McCall  const BuiltinType *BT = Enum->getIntegerType()->castAs<BuiltinType>();
49023624e9e55d98507863d0731a0942cd874f2a1574John McCall  return getObjCEncodingForPrimitiveKind(C, BT->getKind());
49035471bc85b69912e3b448de004498a80c0de32296Douglas Gregor}
49045471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
49054ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic void EncodeBitField(const ASTContext *Ctx, std::string& S,
490664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall                           QualType T, const FieldDecl *FD) {
4907a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl");
49088b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian  S += 'b';
490964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // The NeXT runtime encodes bit fields as b followed by the number of bits.
491064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // The GNU runtime requires more information; bitfields are encoded as b,
491164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // then the offset (in bits) of the first element, then the type of the
491264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // bitfield, then the size in bits.  For example, in this structure:
491364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //
491464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // struct
491564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // {
491664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //    int integer;
491764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //    int flags:2;
491864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // };
491964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // On a 32-bit system, the encoding for flags would be b2 for the NeXT
492064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // runtime, but b32i2 for the GNU runtime.  The reason for this extra
492164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // information is not especially sensible, but we're stuck with it for
492264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // compatibility with GCC, although providing it breaks anything that
492364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // actually uses runtime introspection and wants to work on both runtimes...
4924260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (Ctx->getLangOpts().ObjCRuntime.isGNUFamily()) {
492564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    const RecordDecl *RD = FD->getParent();
492664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD);
492782905749d5c8d8b4edec11de754a73349cb96603Eli Friedman    S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex()));
49285471bc85b69912e3b448de004498a80c0de32296Douglas Gregor    if (const EnumType *ET = T->getAs<EnumType>())
49295471bc85b69912e3b448de004498a80c0de32296Douglas Gregor      S += ObjCEncodingForEnumType(Ctx, ET);
49303624e9e55d98507863d0731a0942cd874f2a1574John McCall    else {
49313624e9e55d98507863d0731a0942cd874f2a1574John McCall      const BuiltinType *BT = T->castAs<BuiltinType>();
49323624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += getObjCEncodingForPrimitiveKind(Ctx, BT->getKind());
49333624e9e55d98507863d0731a0942cd874f2a1574John McCall    }
493464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  }
4935a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  S += llvm::utostr(FD->getBitWidthValue(*Ctx));
49368b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian}
49378b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian
493801eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar// FIXME: Use SmallString for accumulating string.
493982a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbarvoid ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
494082a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar                                            bool ExpandPointedToStructures,
494182a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar                                            bool ExpandStructures,
4942153bfe5795e2c1a5a738e73d3784964e082237fcDaniel Dunbar                                            const FieldDecl *FD,
4943090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                                            bool OutermostType,
49442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                            bool EncodingProperty,
4945dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                            bool StructField,
4946dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                            bool EncodeBlockParameters,
4947dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                            bool EncodeClassNames) const {
49483624e9e55d98507863d0731a0942cd874f2a1574John McCall  CanQualType CT = getCanonicalType(T);
49493624e9e55d98507863d0731a0942cd874f2a1574John McCall  switch (CT->getTypeClass()) {
49503624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Builtin:
49513624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Enum:
4952ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (FD && FD->isBitField())
495364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall      return EncodeBitField(this, S, T, FD);
49543624e9e55d98507863d0731a0942cd874f2a1574John McCall    if (const BuiltinType *BT = dyn_cast<BuiltinType>(CT))
49553624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += getObjCEncodingForPrimitiveKind(this, BT->getKind());
49563624e9e55d98507863d0731a0942cd874f2a1574John McCall    else
49573624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += ObjCEncodingForEnumType(this, cast<EnumType>(CT));
4958ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
49591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49603624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Complex: {
49613624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ComplexType *CT = T->castAs<ComplexType>();
4962c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson    S += 'j';
49631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false,
4964c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson                               false);
4965ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
4966ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
49673624e9e55d98507863d0731a0942cd874f2a1574John McCall
49683624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Atomic: {
49693624e9e55d98507863d0731a0942cd874f2a1574John McCall    const AtomicType *AT = T->castAs<AtomicType>();
49703624e9e55d98507863d0731a0942cd874f2a1574John McCall    S += 'A';
49713624e9e55d98507863d0731a0942cd874f2a1574John McCall    getObjCEncodingForTypeImpl(AT->getValueType(), S, false, false, 0,
49723624e9e55d98507863d0731a0942cd874f2a1574John McCall                               false, false);
49733624e9e55d98507863d0731a0942cd874f2a1574John McCall    return;
4974aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian  }
49753624e9e55d98507863d0731a0942cd874f2a1574John McCall
49763624e9e55d98507863d0731a0942cd874f2a1574John McCall  // encoding for pointer or reference types.
49773624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Pointer:
49783624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::LValueReference:
49793624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::RValueReference: {
49803624e9e55d98507863d0731a0942cd874f2a1574John McCall    QualType PointeeTy;
49813624e9e55d98507863d0731a0942cd874f2a1574John McCall    if (isa<PointerType>(CT)) {
49823624e9e55d98507863d0731a0942cd874f2a1574John McCall      const PointerType *PT = T->castAs<PointerType>();
49833624e9e55d98507863d0731a0942cd874f2a1574John McCall      if (PT->isObjCSelType()) {
49843624e9e55d98507863d0731a0942cd874f2a1574John McCall        S += ':';
49853624e9e55d98507863d0731a0942cd874f2a1574John McCall        return;
49863624e9e55d98507863d0731a0942cd874f2a1574John McCall      }
49873624e9e55d98507863d0731a0942cd874f2a1574John McCall      PointeeTy = PT->getPointeeType();
49883624e9e55d98507863d0731a0942cd874f2a1574John McCall    } else {
49893624e9e55d98507863d0731a0942cd874f2a1574John McCall      PointeeTy = T->castAs<ReferenceType>()->getPointeeType();
49903624e9e55d98507863d0731a0942cd874f2a1574John McCall    }
49913624e9e55d98507863d0731a0942cd874f2a1574John McCall
4992a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    bool isReadOnly = false;
4993a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // For historical/compatibility reasons, the read-only qualifier of the
4994a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // pointee gets emitted _before_ the '^'.  The read-only qualifier of
4995a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // the pointer itself gets ignored, _unless_ we are looking at a typedef!
49961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Also, do not emit the 'r' for anything but the outermost type!
49978e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump    if (isa<TypedefType>(T.getTypePtr())) {
4998a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      if (OutermostType && T.isConstQualified()) {
4999a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        isReadOnly = true;
5000a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        S += 'r';
5001a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      }
50029fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump    } else if (OutermostType) {
5003a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      QualType P = PointeeTy;
50046217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      while (P->getAs<PointerType>())
50056217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek        P = P->getAs<PointerType>()->getPointeeType();
5006a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      if (P.isConstQualified()) {
5007a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        isReadOnly = true;
5008a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        S += 'r';
5009a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      }
5010a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
5011a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    if (isReadOnly) {
5012a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // Another legacy compatibility encoding. Some ObjC qualifier and type
5013a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // combinations need to be rearranged.
5014a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // Rewrite "in const" from "nr" to "rn"
50155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (StringRef(S).endswith("nr"))
50160237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer        S.replace(S.end()-2, S.end(), "rn");
5017a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
50181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
501985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    if (PointeeTy->isCharType()) {
502085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      // char pointer types should be encoded as '*' unless it is a
502185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      // type that has been typedef'd to 'BOOL'.
5022e8c49533521c40643653f943d47229e62d277f88Anders Carlsson      if (!isTypeTypedefedAsBOOL(PointeeTy)) {
502385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson        S += '*';
502485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson        return;
502585f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      }
50266217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) {
50279533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // GCC binary compat: Need to convert "struct objc_class *" to "#".
50289533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) {
50299533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        S += '#';
50309533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        return;
50319533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      }
50329533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // GCC binary compat: Need to convert "struct objc_object *" to "@".
50339533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) {
50349533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        S += '@';
50359533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        return;
50369533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      }
50379533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // fall through...
503885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    }
503985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    S += '^';
5040a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    getLegacyIntegralTypeEncoding(PointeeTy);
5041a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian
50421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures,
504343822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian                               NULL);
5044ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5045ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
50463624e9e55d98507863d0731a0942cd874f2a1574John McCall
50473624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ConstantArray:
50483624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::IncompleteArray:
50493624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::VariableArray: {
50503624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ArrayType *AT = cast<ArrayType>(CT);
50513624e9e55d98507863d0731a0942cd874f2a1574John McCall
50522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (isa<IncompleteArrayType>(AT) && !StructField) {
5053559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      // Incomplete arrays are encoded as a pointer to the array element.
5054559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += '^';
5055559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson
50561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(AT->getElementType(), S,
5057559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson                                 false, ExpandStructures, FD);
5058559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson    } else {
5059559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += '[';
50601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
50622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        if (getTypeSize(CAT->getElementType()) == 0)
50632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          S += '0';
50642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        else
50652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          S += llvm::utostr(CAT->getSize().getZExtValue());
50662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
5067559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson        //Variable length arrays are encoded as a regular array with 0 elements.
50682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) &&
50692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis               "Unknown array type!");
5070559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson        S += '0';
5071559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      }
50721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(AT->getElementType(), S,
5074559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson                                 false, ExpandStructures, FD);
5075559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += ']';
5076559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson    }
5077ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5078ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
50791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50803624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::FunctionNoProto:
50813624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::FunctionProto:
5082c0a87b7db06643178ad2cbce0767548c139ea387Anders Carlsson    S += '?';
5083ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
50841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50853624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Record: {
50863624e9e55d98507863d0731a0942cd874f2a1574John McCall    RecordDecl *RDecl = cast<RecordType>(CT)->getDecl();
5087d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar    S += RDecl->isUnion() ? '(' : '{';
5088502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    // Anonymous structures print as '?'
5089502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    if (const IdentifierInfo *II = RDecl->getIdentifier()) {
5090502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar      S += II->getName();
50916fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian      if (ClassTemplateSpecializationDecl *Spec
50926fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian          = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
50936fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian        const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
50946fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian        std::string TemplateArgsStr
50956fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian          = TemplateSpecializationType::PrintTemplateArgumentList(
5096910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                            TemplateArgs.data(),
5097910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                            TemplateArgs.size(),
509830c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor                                            (*this).getPrintingPolicy());
50996fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian
51006fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian        S += TemplateArgsStr;
51016fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian      }
5102502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    } else {
5103502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar      S += '?';
5104502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    }
51050d504c1da852e58ff802545c823ecff3b6c654b8Daniel Dunbar    if (ExpandStructures) {
51067d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian      S += '=';
51072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (!RDecl->isUnion()) {
51082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getObjCEncodingForStructureImpl(RDecl, S, FD);
51092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
51102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        for (RecordDecl::field_iterator Field = RDecl->field_begin(),
51112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                     FieldEnd = RDecl->field_end();
51122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis             Field != FieldEnd; ++Field) {
51132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          if (FD) {
51142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += '"';
51152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += Field->getNameAsString();
51162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += '"';
51172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          }
51181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          // Special case bit-fields.
51202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          if (Field->isBitField()) {
51212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getObjCEncodingForTypeImpl(Field->getType(), S, false, true,
5122581deb3da481053c4993c7600f97acf7768caac5David Blaikie                                       *Field);
51232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          } else {
51242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            QualType qt = Field->getType();
51252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getLegacyIntegralTypeEncoding(qt);
51262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getObjCEncodingForTypeImpl(qt, S, false, true,
51272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       FD, /*OutermostType*/false,
51282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       /*EncodingProperty*/false,
51292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       /*StructField*/true);
51302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          }
5131d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar        }
51327d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian      }
51336de88a873a4cbe06d72602eef57d68006730a80bFariborz Jahanian    }
5134d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar    S += RDecl->isUnion() ? ')' : '}';
5135ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5136ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
51371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51383624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::BlockPointer: {
51393624e9e55d98507863d0731a0942cd874f2a1574John McCall    const BlockPointerType *BT = T->castAs<BlockPointerType>();
514021a98b188857d690aa4510c52ac4317ffa0908a8Steve Naroff    S += "@?"; // Unlike a pointer-to-function, which is "^?".
5141dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    if (EncodeBlockParameters) {
51423624e9e55d98507863d0731a0942cd874f2a1574John McCall      const FunctionType *FT = BT->getPointeeType()->castAs<FunctionType>();
5143dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson
5144dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += '<';
5145dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block return type
5146dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      getObjCEncodingForTypeImpl(FT->getResultType(), S,
5147dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 ExpandPointedToStructures, ExpandStructures,
5148dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 FD,
5149dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 false /* OutermostType */,
5150dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodingProperty,
5151dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 false /* StructField */,
5152dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodeBlockParameters,
5153dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodeClassNames);
5154dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block self
5155dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += "@?";
5156dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block parameters
5157dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) {
5158dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        for (FunctionProtoType::arg_type_iterator I = FPT->arg_type_begin(),
5159dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson               E = FPT->arg_type_end(); I && (I != E); ++I) {
5160dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson          getObjCEncodingForTypeImpl(*I, S,
5161dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     ExpandPointedToStructures,
5162dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     ExpandStructures,
5163dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     FD,
5164dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     false /* OutermostType */,
5165dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodingProperty,
5166dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     false /* StructField */,
5167dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodeBlockParameters,
5168dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodeClassNames);
5169dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        }
5170dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      }
5171dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += '>';
5172dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    }
5173ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5174ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
51751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51763624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCObject:
51773624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCInterface: {
51783624e9e55d98507863d0731a0942cd874f2a1574John McCall    // Ignore protocol qualifiers when mangling at this level.
51793624e9e55d98507863d0731a0942cd874f2a1574John McCall    T = T->castAs<ObjCObjectType>()->getBaseType();
5180c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
51813624e9e55d98507863d0731a0942cd874f2a1574John McCall    // The assumption seems to be that this assert will succeed
51823624e9e55d98507863d0731a0942cd874f2a1574John McCall    // because nested levels will have filtered out 'id' and 'Class'.
51833624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ObjCInterfaceType *OIT = T->castAs<ObjCInterfaceType>();
518443822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    // @encode(class_name)
51850953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    ObjCInterfaceDecl *OI = OIT->getDecl();
518643822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '{';
518743822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    const IdentifierInfo *II = OI->getIdentifier();
518843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += II->getName();
518943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '=';
5190db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose    SmallVector<const ObjCIvarDecl*, 32> Ivars;
51912c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    DeepCollectObjCIvars(OI, true, Ivars);
51922c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    for (unsigned i = 0, e = Ivars.size(); i != e; ++i) {
5193db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose      const FieldDecl *Field = cast<FieldDecl>(Ivars[i]);
51942c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian      if (Field->isBitField())
51952c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian        getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field);
519643822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian      else
51972c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian        getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD);
519843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    }
519943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '}';
5200ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
520143822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian  }
52021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52033624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCObjectPointer: {
52043624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ObjCObjectPointerType *OPT = T->castAs<ObjCObjectPointerType>();
520514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    if (OPT->isObjCIdType()) {
520614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      S += '@';
520714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5208ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
52091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
521027d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff    if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
521127d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // FIXME: Consider if we need to output qualifiers for 'Class<p>'.
521227d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // Since this is a binary compatibility issue, need to consult with runtime
521327d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // folks. Fortunately, this is a *very* obsure construct.
521414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      S += '#';
521514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5216ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
52171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5218ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (OPT->isObjCQualifiedIdType()) {
52191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(getObjCIdType(), S,
522014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff                                 ExpandPointedToStructures,
522114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff                                 ExpandStructures, FD);
5222dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      if (FD || EncodingProperty || EncodeClassNames) {
522314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        // Note that we do extended encoding of protocol qualifer list
522414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        // Only when doing ivar or property encoding.
522514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        S += '"';
522667ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
522767ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff             E = OPT->qual_end(); I != E; ++I) {
522814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += '<';
522914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += (*I)->getNameAsString();
523014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += '>';
523114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        }
523214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        S += '"';
523314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      }
523414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5235ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
52361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5237ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    QualType PointeeTy = OPT->getPointeeType();
5238ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (!EncodingProperty &&
5239ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        isa<TypedefType>(PointeeTy.getTypePtr())) {
5240ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      // Another historical/compatibility reason.
52411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // We encode the underlying type which comes out as
5242ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      // {...};
5243ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '^';
52441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(PointeeTy, S,
52451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 false, ExpandPointedToStructures,
5246ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner                                 NULL);
524714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
524814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    }
5249ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner
5250ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    S += '@';
5251dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    if (OPT->getInterfaceDecl() &&
5252dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        (FD || EncodingProperty || EncodeClassNames)) {
5253ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '"';
525427d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      S += OPT->getInterfaceDecl()->getIdentifier()->getName();
525567ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff      for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
525667ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff           E = OPT->qual_end(); I != E; ++I) {
5257ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += '<';
5258ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += (*I)->getNameAsString();
5259ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += '>';
52601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
5261ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '"';
5262ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
5263ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5264ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
52651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5266532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall  // gcc just blithely ignores member pointers.
52673624e9e55d98507863d0731a0942cd874f2a1574John McCall  // FIXME: we shoul do better than that.  'M' is available.
52683624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::MemberPointer:
5269532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall    return;
5270e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian
52713624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Vector:
52723624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ExtVector:
5273e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // This matches gcc's encoding, even though technically it is
5274e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // insufficient.
5275e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // FIXME. We should do a better job than gcc.
5276e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    return;
52773624e9e55d98507863d0731a0942cd874f2a1574John McCall
52783624e9e55d98507863d0731a0942cd874f2a1574John McCall#define ABSTRACT_TYPE(KIND, BASE)
52793624e9e55d98507863d0731a0942cd874f2a1574John McCall#define TYPE(KIND, BASE)
52803624e9e55d98507863d0731a0942cd874f2a1574John McCall#define DEPENDENT_TYPE(KIND, BASE) \
52813624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
52823624e9e55d98507863d0731a0942cd874f2a1574John McCall#define NON_CANONICAL_TYPE(KIND, BASE) \
52833624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
52843624e9e55d98507863d0731a0942cd874f2a1574John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
52853624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
52863624e9e55d98507863d0731a0942cd874f2a1574John McCall#include "clang/AST/TypeNodes.def"
52873624e9e55d98507863d0731a0942cd874f2a1574John McCall    llvm_unreachable("@encode for dependent type!");
5288e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian  }
52893624e9e55d98507863d0731a0942cd874f2a1574John McCall  llvm_unreachable("bad type kind!");
529085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson}
529185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson
52922636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidisvoid ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
52932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 std::string &S,
52942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 const FieldDecl *FD,
52952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 bool includeVBases) const {
52962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  assert(RDecl && "Expected non-null RecordDecl");
52972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  assert(!RDecl->isUnion() && "Should not be called for unions");
52982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (!RDecl->getDefinition())
52992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    return;
53002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
53022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
53032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  const ASTRecordLayout &layout = getASTRecordLayout(RDecl);
53042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec) {
53062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    for (CXXRecordDecl::base_class_iterator
53072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BI = CXXRec->bases_begin(),
53082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BE = CXXRec->bases_end(); BI != BE; ++BI) {
53092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (!BI->isVirtual()) {
53102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
5311829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis        if (base->isEmpty())
5312829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis          continue;
5313d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer        uint64_t offs = toBits(layout.getBaseClassOffset(base));
53142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
53152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                  std::make_pair(offs, base));
53162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
53172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
53182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  unsigned i = 0;
53212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  for (RecordDecl::field_iterator Field = RDecl->field_begin(),
53222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                               FieldEnd = RDecl->field_end();
53232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis       Field != FieldEnd; ++Field, ++i) {
53242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    uint64_t offs = layout.getFieldOffset(i);
53252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
5326581deb3da481053c4993c7600f97acf7768caac5David Blaikie                              std::make_pair(offs, *Field));
53272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec && includeVBases) {
53302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    for (CXXRecordDecl::base_class_iterator
53312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BI = CXXRec->vbases_begin(),
53322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BE = CXXRec->vbases_end(); BI != BE; ++BI) {
53332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
5334829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      if (base->isEmpty())
5335829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis        continue;
5336d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer      uint64_t offs = toBits(layout.getVBaseClassOffset(base));
533719aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis      if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
533819aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis        FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
533919aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis                                  std::make_pair(offs, base));
53402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
53412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  CharUnits size;
53442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec) {
53452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    size = includeVBases ? layout.getSize() : layout.getNonVirtualSize();
53462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  } else {
53472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    size = layout.getSize();
53482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  uint64_t CurOffs = 0;
53512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  std::multimap<uint64_t, NamedDecl *>::iterator
53522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    CurLayObj = FieldOrBaseOffsets.begin();
53532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
535458db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor  if (CXXRec && CXXRec->isDynamicClass() &&
535558db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor      (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
53562636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (FD) {
53572636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += "\"_vptr$";
53582636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      std::string recname = CXXRec->getNameAsString();
53592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (recname.empty()) recname = "?";
53602636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += recname;
53612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += '"';
53622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
53632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    S += "^^?";
53642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    CurOffs += getTypeSize(VoidPtrTy);
53652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (!RDecl->hasFlexibleArrayMember()) {
53682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    // Mark the end of the structure.
53692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    uint64_t offs = toBits(size);
53702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
53712636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                              std::make_pair(offs, (NamedDecl*)0));
53722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
53752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    assert(CurOffs <= CurLayObj->first);
53762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (CurOffs < CurLayObj->first) {
53782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      uint64_t padding = CurLayObj->first - CurOffs;
53792636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // FIXME: There doesn't seem to be a way to indicate in the encoding that
53802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // packing/alignment of members is different that normal, in which case
53812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // the encoding will be out-of-sync with the real layout.
53822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // If the runtime switches to just consider the size of types without
53832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // taking into account alignment, we could make padding explicit in the
53842636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // encoding (e.g. using arrays of chars). The encoding strings would be
53852636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // longer then though.
53862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      CurOffs += padding;
53872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
53882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    NamedDecl *dcl = CurLayObj->second;
53902636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (dcl == 0)
53912636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      break; // reached end of structure.
53922636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) {
53942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // We expand the bases without their virtual bases since those are going
53952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // in the initial structure. Note that this differs from gcc which
53962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // expands virtual bases each time one is encountered in the hierarchy,
53972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // making the encoding type bigger than it really is.
53982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false);
5399829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      assert(!base->isEmpty());
5400829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
54012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    } else {
54022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      FieldDecl *field = cast<FieldDecl>(dcl);
54032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (FD) {
54042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += '"';
54052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += field->getNameAsString();
54062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += '"';
54072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
54082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (field->isBitField()) {
54102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        EncodeBitField(this, S, field->getType(), field);
5411a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith        CurOffs += field->getBitWidthValue(*this);
54122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
54132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        QualType qt = field->getType();
54142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getLegacyIntegralTypeEncoding(qt);
54152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getObjCEncodingForTypeImpl(qt, S, false, true, FD,
54162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*OutermostType*/false,
54172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*EncodingProperty*/false,
54182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*StructField*/true);
54192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        CurOffs += getTypeSize(field->getType());
54202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
54212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
54222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
54232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis}
54242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,
5426ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian                                                 std::string& S) const {
5427ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_In)
5428ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'n';
5429ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Inout)
5430ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'N';
5431ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Out)
5432ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'o';
5433ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Bycopy)
5434ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'O';
5435ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Byref)
5436ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'R';
5437ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Oneway)
5438ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'V';
5439ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian}
5440ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian
54414dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas GregorTypedefDecl *ASTContext::getObjCIdDecl() const {
54424dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  if (!ObjCIdDecl) {
54434dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0);
54444dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    T = getObjCObjectPointerType(T);
54454dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T);
54464dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
54474dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     getTranslationUnitDecl(),
54484dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     SourceLocation(), SourceLocation(),
54494dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     &Idents.get("id"), IdInfo);
54504dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  }
54514dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor
54524dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  return ObjCIdDecl;
54537e219e47de26346885d667131977bd9ca2d7662aSteve Naroff}
54547e219e47de26346885d667131977bd9ca2d7662aSteve Naroff
54557a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas GregorTypedefDecl *ASTContext::getObjCSelDecl() const {
54567a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  if (!ObjCSelDecl) {
54577a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    QualType SelT = getPointerType(ObjCBuiltinSelTy);
54587a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    TypeSourceInfo *SelInfo = getTrivialTypeSourceInfo(SelT);
54597a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    ObjCSelDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
54607a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      getTranslationUnitDecl(),
54617a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      SourceLocation(), SourceLocation(),
54627a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      &Idents.get("SEL"), SelInfo);
54637a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  }
54647a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  return ObjCSelDecl;
5465b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
5466b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
546779d6726921897811232554ed94c5d77b5b7b3fc0Douglas GregorTypedefDecl *ASTContext::getObjCClassDecl() const {
546879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  if (!ObjCClassDecl) {
546979d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    QualType T = getObjCObjectType(ObjCBuiltinClassTy, 0, 0);
547079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    T = getObjCObjectPointerType(T);
547179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    TypeSourceInfo *ClassInfo = getTrivialTypeSourceInfo(T);
547279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    ObjCClassDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
547379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        getTranslationUnitDecl(),
547479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        SourceLocation(), SourceLocation(),
547579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        &Idents.get("Class"), ClassInfo);
547679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  }
547779d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor
547879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  return ObjCClassDecl;
5479a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor}
5480a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor
5481a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas GregorObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const {
5482a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  if (!ObjCProtocolClassDecl) {
5483a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    ObjCProtocolClassDecl
5484a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor      = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(),
5485a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  SourceLocation(),
5486a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  &Idents.get("Protocol"),
5487a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  /*PrevDecl=*/0,
5488a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  SourceLocation(), true);
5489a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  }
5490a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor
5491a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  return ObjCProtocolClassDecl;
54928baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson}
54938baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson
5494c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===//
5495c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge// __builtin_va_list Construction Functions
5496c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===//
5497c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5498c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateCharPtrBuiltinVaListDecl(const ASTContext *Context) {
5499c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef char* __builtin_va_list;
5500c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType CharPtrType = Context->getPointerType(Context->CharTy);
5501c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5502c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(CharPtrType);
5503c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5504c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypeDecl
5505c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5506c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5507c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5508c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5509c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5510c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypeDecl;
5511c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5512c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5513c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) {
5514c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef void* __builtin_va_list;
5515c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VoidPtrType = Context->getPointerType(Context->VoidTy);
5516c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5517c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VoidPtrType);
5518c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5519c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypeDecl
5520c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5521c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5522c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5523c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5524c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5525c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypeDecl;
5526c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5527c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5528c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePowerABIBuiltinVaListDecl(const ASTContext *Context) {
5529c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef struct __va_list_tag {
5530c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  RecordDecl *VaListTagDecl;
5531c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5532c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct,
5533c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   Context->getTranslationUnitDecl(),
5534c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   &Context->Idents.get("__va_list_tag"));
5535c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->startDefinition();
5536c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5537c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const size_t NumFields = 5;
5538c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType FieldTypes[NumFields];
5539c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const char *FieldNames[NumFields];
5540c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5541c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned char gpr;
5542c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[0] = Context->UnsignedCharTy;
5543c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[0] = "gpr";
5544c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5545c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned char fpr;
5546c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[1] = Context->UnsignedCharTy;
5547c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[1] = "fpr";
5548c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5549c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned short reserved;
5550c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[2] = Context->UnsignedShortTy;
5551c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[2] = "reserved";
5552c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5553c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* overflow_arg_area;
5554c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[3] = Context->getPointerType(Context->VoidTy);
5555c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[3] = "overflow_arg_area";
5556c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5557c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* reg_save_area;
5558c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[4] = Context->getPointerType(Context->VoidTy);
5559c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[4] = "reg_save_area";
5560c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5561c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // Create fields
5562c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  for (unsigned i = 0; i < NumFields; ++i) {
5563c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    FieldDecl *Field = FieldDecl::Create(*Context, VaListTagDecl,
5564c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5565c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5566c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         &Context->Idents.get(FieldNames[i]),
5567c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         FieldTypes[i], /*TInfo=*/0,
5568c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*BitWidth=*/0,
5569c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*Mutable=*/false,
5570c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         ICIS_NoInit);
5571c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Field->setAccess(AS_public);
5572c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    VaListTagDecl->addDecl(Field);
5573c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5574c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->completeDefinition();
5575c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagType = Context->getRecordType(VaListTagDecl);
5576fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  Context->VaListTagTy = VaListTagType;
5577c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5578c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // } __va_list_tag;
5579c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTagTypedefDecl
5580c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5581c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5582c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5583c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__va_list_tag"),
5584c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(VaListTagType));
5585c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagTypedefType =
5586c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Context->getTypedefType(VaListTagTypedefDecl);
5587c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5588c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef __va_list_tag __builtin_va_list[1];
5589c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
5590c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagArrayType
5591c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(VaListTagTypedefType,
5592c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                    Size, ArrayType::Normal, 0);
5593c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5594c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VaListTagArrayType);
5595c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5596c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5597c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5598c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5599c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5600c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5601c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5602c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5603c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5604c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5605c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *
5606c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeCreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context) {
5607c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef struct __va_list_tag {
5608c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  RecordDecl *VaListTagDecl;
5609c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct,
5610c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   Context->getTranslationUnitDecl(),
5611c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   &Context->Idents.get("__va_list_tag"));
5612c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->startDefinition();
5613c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5614c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const size_t NumFields = 4;
5615c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType FieldTypes[NumFields];
5616c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const char *FieldNames[NumFields];
5617c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5618c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned gp_offset;
5619c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[0] = Context->UnsignedIntTy;
5620c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[0] = "gp_offset";
5621c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5622c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned fp_offset;
5623c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[1] = Context->UnsignedIntTy;
5624c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[1] = "fp_offset";
5625c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5626c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* overflow_arg_area;
5627c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[2] = Context->getPointerType(Context->VoidTy);
5628c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[2] = "overflow_arg_area";
5629c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5630c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* reg_save_area;
5631c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[3] = Context->getPointerType(Context->VoidTy);
5632c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[3] = "reg_save_area";
5633c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5634c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // Create fields
5635c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  for (unsigned i = 0; i < NumFields; ++i) {
5636c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
5637c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         VaListTagDecl,
5638c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5639c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5640c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         &Context->Idents.get(FieldNames[i]),
5641c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         FieldTypes[i], /*TInfo=*/0,
5642c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*BitWidth=*/0,
5643c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*Mutable=*/false,
5644c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         ICIS_NoInit);
5645c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Field->setAccess(AS_public);
5646c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    VaListTagDecl->addDecl(Field);
5647c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5648c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->completeDefinition();
5649c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagType = Context->getRecordType(VaListTagDecl);
5650fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  Context->VaListTagTy = VaListTagType;
5651c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5652c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // } __va_list_tag;
5653c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTagTypedefDecl
5654c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5655c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5656c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5657c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__va_list_tag"),
5658c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(VaListTagType));
5659c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagTypedefType =
5660c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Context->getTypedefType(VaListTagTypedefDecl);
5661c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5662c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef __va_list_tag __builtin_va_list[1];
5663c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
5664c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagArrayType
5665c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(VaListTagTypedefType,
5666c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                      Size, ArrayType::Normal,0);
5667c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5668c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VaListTagArrayType);
5669c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5670c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5671c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5672c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5673c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5674c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5675c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5676c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5677c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5678c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5679c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context) {
5680c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef int __builtin_va_list[4];
5681c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 4);
5682c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType IntArrayType
5683c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(Context->IntTy,
5684c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge				    Size, ArrayType::Normal, 0);
5685c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5686c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5687c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5688c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5689c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5690c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(IntArrayType));
5691c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5692c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5693c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5694c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5695eae5a820bced67465c8517793a1602dfaeed8a06Logan Chienstatic TypedefDecl *
5696eae5a820bced67465c8517793a1602dfaeed8a06Logan ChienCreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context) {
5697eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  RecordDecl *VaListDecl;
5698eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  if (Context->getLangOpts().CPlusPlus) {
5699eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    // namespace std { struct __va_list {
5700eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    NamespaceDecl *NS;
5701eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    NS = NamespaceDecl::Create(const_cast<ASTContext &>(*Context),
5702eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               Context->getTranslationUnitDecl(),
5703eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               /*Inline*/false, SourceLocation(),
5704eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               SourceLocation(), &Context->Idents.get("std"),
5705eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               /*PrevDecl*/0);
5706eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5707eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl = CXXRecordDecl::Create(*Context, TTK_Struct,
5708eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       Context->getTranslationUnitDecl(),
5709eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(), SourceLocation(),
5710eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       &Context->Idents.get("__va_list"));
5711eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5712eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl->setDeclContext(NS);
5713eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5714eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  } else {
5715eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    // struct __va_list {
5716eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl = CreateRecordDecl(*Context, TTK_Struct,
5717eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                  Context->getTranslationUnitDecl(),
5718eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                  &Context->Idents.get("__va_list"));
5719eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  }
5720eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5721eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->startDefinition();
5722eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5723eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // void * __ap;
5724eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
5725eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       VaListDecl,
5726eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(),
5727eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(),
5728eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       &Context->Idents.get("__ap"),
5729eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       Context->getPointerType(Context->VoidTy),
5730eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*TInfo=*/0,
5731eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*BitWidth=*/0,
5732eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*Mutable=*/false,
5733eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       ICIS_NoInit);
5734eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  Field->setAccess(AS_public);
5735eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->addDecl(Field);
5736eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5737eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // };
5738eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->completeDefinition();
5739eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5740eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // typedef struct __va_list __builtin_va_list;
5741eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  TypeSourceInfo *TInfo
5742eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    = Context->getTrivialTypeSourceInfo(Context->getRecordType(VaListDecl));
5743eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5744eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  TypedefDecl *VaListTypeDecl
5745eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5746eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          Context->getTranslationUnitDecl(),
5747eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          SourceLocation(), SourceLocation(),
5748eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          &Context->Idents.get("__builtin_va_list"),
5749eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          TInfo);
5750eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5751eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  return VaListTypeDecl;
5752eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien}
5753eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5754c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVaListDecl(const ASTContext *Context,
5755c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                     TargetInfo::BuiltinVaListKind Kind) {
5756c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  switch (Kind) {
5757c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::CharPtrBuiltinVaList:
5758c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateCharPtrBuiltinVaListDecl(Context);
5759c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::VoidPtrBuiltinVaList:
5760c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateVoidPtrBuiltinVaListDecl(Context);
5761c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::PowerABIBuiltinVaList:
5762c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreatePowerABIBuiltinVaListDecl(Context);
5763c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::X86_64ABIBuiltinVaList:
5764c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateX86_64ABIBuiltinVaListDecl(Context);
5765c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::PNaClABIBuiltinVaList:
5766c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreatePNaClABIBuiltinVaListDecl(Context);
5767eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  case TargetInfo::AAPCSABIBuiltinVaList:
5768eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    return CreateAAPCSABIBuiltinVaListDecl(Context);
5769c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5770c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5771c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm_unreachable("Unhandled __builtin_va_list type kind");
5772c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5773c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5774c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeTypedefDecl *ASTContext::getBuiltinVaListDecl() const {
5775c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  if (!BuiltinVaListDecl)
5776c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    BuiltinVaListDecl = CreateVaListDecl(this, Target->getBuiltinVaListKind());
5777c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5778c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return BuiltinVaListDecl;
5779c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5780c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5781fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador IngeQualType ASTContext::getVaListTagType() const {
5782fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // Force the creation of VaListTagTy by building the __builtin_va_list
5783fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // declaration.
5784fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  if (VaListTagTy.isNull())
5785fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge    (void) getBuiltinVaListDecl();
5786fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
5787fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  return VaListTagTy;
5788fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge}
5789fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
5790a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) {
57911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(ObjCConstantStringType.isNull() &&
57922198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff         "'NSConstantString' type already set!");
57931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5794a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCConstantStringType = getObjCInterfaceType(Decl);
57952198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff}
57962198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff
57970bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// \brief Retrieve the template name that corresponds to a non-empty
57980bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// lookup.
57994ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
58004ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
58014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                      UnresolvedSetIterator End) const {
58020bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  unsigned size = End - Begin;
58030bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  assert(size > 1 && "set is not overloaded!");
58047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58050bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  void *memory = Allocate(sizeof(OverloadedTemplateStorage) +
58060bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall                          size * sizeof(FunctionTemplateDecl*));
58070bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size);
58080bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
58090bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  NamedDecl **Storage = OT->getStorage();
5810eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall  for (UnresolvedSetIterator I = Begin; I != End; ++I) {
58110bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    NamedDecl *D = *I;
58120bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    assert(isa<FunctionTemplateDecl>(D) ||
58130bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall           (isa<UsingShadowDecl>(D) &&
58140bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall            isa<FunctionTemplateDecl>(D->getUnderlyingDecl())));
58150bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    *Storage++ = D;
58167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
58177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58180bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  return TemplateName(OT);
58197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
58207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5821d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// \brief Retrieve the template name that represents a qualified
5822d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// template name such as \c std::vector.
58234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
58244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
58254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     bool TemplateKeyword,
58264ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     TemplateDecl *Template) const {
58270f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  assert(NNS && "Missing nested-name-specifier in qualified template name");
58280f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor
5829789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  // FIXME: Canonicalization?
5830d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  llvm::FoldingSetNodeID ID;
5831d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template);
58321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5833d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  void *InsertPos = 0;
5834d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  QualifiedTemplateName *QTN =
58350bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
5836d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  if (!QTN) {
58372f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<QualifiedTemplateName>())
58382f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        QualifiedTemplateName(NNS, TemplateKeyword, Template);
5839d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    QualifiedTemplateNames.InsertNode(QTN, InsertPos);
5840d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  }
58411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5842d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  return TemplateName(QTN);
5843d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor}
5844d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
58457532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Retrieve the template name that represents a dependent
58467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name such as \c MetaFun::template apply.
58474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
58484ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
58494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     const IdentifierInfo *Name) const {
58501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert((!NNS || NNS->isDependent()) &&
58513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor         "Nested name specifier must be dependent");
58527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  llvm::FoldingSetNodeID ID;
58547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateName::Profile(ID, NNS, Name);
58557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void *InsertPos = 0;
58577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateName *QTN =
58587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
58597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (QTN)
58617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return TemplateName(QTN);
58627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
58647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (CanonNNS == NNS) {
58652f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
58662f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Name);
58677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  } else {
58687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    TemplateName Canon = getDependentTemplateName(CanonNNS, Name);
58692f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
58702f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Name, Canon);
5871789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    DependentTemplateName *CheckQTN =
5872789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
5873789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!CheckQTN && "Dependent type name canonicalization broken");
5874789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckQTN;
58757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
58767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58777532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateNames.InsertNode(QTN, InsertPos);
58787532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  return TemplateName(QTN);
58797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
58807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5881ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// \brief Retrieve the template name that represents a dependent
5882ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// template name such as \c MetaFun::template operator+.
5883ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
5884ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
58854ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     OverloadedOperatorKind Operator) const {
5886ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  assert((!NNS || NNS->isDependent()) &&
5887ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor         "Nested name specifier must be dependent");
5888ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5889ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  llvm::FoldingSetNodeID ID;
5890ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateName::Profile(ID, NNS, Operator);
5891ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5892ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  void *InsertPos = 0;
5893789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  DependentTemplateName *QTN
5894789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
5895ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5896ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  if (QTN)
5897ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return TemplateName(QTN);
5898ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5899ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
5900ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  if (CanonNNS == NNS) {
59012f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
59022f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Operator);
5903ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  } else {
5904ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    TemplateName Canon = getDependentTemplateName(CanonNNS, Operator);
59052f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
59062f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Operator, Canon);
5907789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
5908789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    DependentTemplateName *CheckQTN
5909789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
5910789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!CheckQTN && "Dependent template name canonicalization broken");
5911789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckQTN;
5912ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
5913ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5914ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateNames.InsertNode(QTN, InsertPos);
5915ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return TemplateName(QTN);
5916ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
5917ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
59181aee05d08b2184acadeb36de300e216390780d6cDouglas GregorTemplateName
5919146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param,
5920146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                         TemplateName replacement) const {
5921146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm::FoldingSetNodeID ID;
5922146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage::Profile(ID, param, replacement);
5923146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5924146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  void *insertPos = 0;
5925146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage *subst
5926146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
5927146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5928146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  if (!subst) {
5929146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement);
5930146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParms.InsertNode(subst, insertPos);
5931146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
5932146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5933146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  return TemplateName(subst);
5934146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall}
5935146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5936146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallTemplateName
59371aee05d08b2184acadeb36de300e216390780d6cDouglas GregorASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param,
59381aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                       const TemplateArgument &ArgPack) const {
59391aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ASTContext &Self = const_cast<ASTContext &>(*this);
59401aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  llvm::FoldingSetNodeID ID;
59411aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack);
59421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
59431aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  void *InsertPos = 0;
59441aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage *Subst
59451aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
59461aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
59471aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  if (!Subst) {
5948146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param,
59491aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                                           ArgPack.pack_size(),
59501aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                                         ArgPack.pack_begin());
59511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
59521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
59531aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
59541aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  return TemplateName(Subst);
59551aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor}
59561aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
5957b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor/// getFromTargetType - Given one of the integer types provided by
5958d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// TargetInfo, produce the corresponding type. The unsigned @p Type
5959d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// is actually a value of type @c TargetInfo::IntType.
5960e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallCanQualType ASTContext::getFromTargetType(unsigned Type) const {
5961b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  switch (Type) {
5962e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall  case TargetInfo::NoInt: return CanQualType();
5963b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedShort: return ShortTy;
5964b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedShort: return UnsignedShortTy;
5965b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedInt: return IntTy;
5966b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedInt: return UnsignedIntTy;
5967b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedLong: return LongTy;
5968b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedLong: return UnsignedLongTy;
5969b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedLongLong: return LongLongTy;
5970b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy;
5971b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  }
5972b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor
5973b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unhandled TargetInfo::IntType value");
5974b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor}
5975b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek
5976b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===//
5977b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//                        Type Predicates.
5978b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===//
5979b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek
59804fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
59814fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// garbage collection attribute.
59824fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian///
5983ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCallQualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const {
59844e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().getGC() == LangOptions::NonGC)
5985ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    return Qualifiers::GCNone;
5986ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall
59874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  assert(getLangOpts().ObjC1);
5988ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  Qualifiers::GC GCAttrs = Ty.getObjCGCAttr();
5989ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall
5990ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // Default behaviour under objective-C's gc is for ObjC pointers
5991ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // (or pointers to them) be treated as though they were declared
5992ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // as __strong.
5993ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  if (GCAttrs == Qualifiers::GCNone) {
5994ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
5995ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      return Qualifiers::Strong;
5996ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    else if (Ty->isPointerType())
5997ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType());
5998ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  } else {
5999ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    // It's not valid to set GC attributes on anything that isn't a
6000ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    // pointer.
6001ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#ifndef NDEBUG
6002ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    QualType CT = Ty->getCanonicalTypeInternal();
6003ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    while (const ArrayType *AT = dyn_cast<ArrayType>(CT))
6004ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      CT = AT->getElementType();
6005ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    assert(CT->isAnyPointerType() || CT->isBlockPointerType());
6006ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#endif
60074fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian  }
6008b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner  return GCAttrs;
60094fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian}
60104fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian
60116ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===//
60126ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//                        Type Compatibility Testing
60136ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===//
6014770951b5bb6028a8d326ddb4a13cef7d4a128162Chris Lattner
60151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// areCompatVectorTypes - Return true if the two specified vector types are
60166ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner/// compatible.
60176ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattnerstatic bool areCompatVectorTypes(const VectorType *LHS,
60186ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner                                 const VectorType *RHS) {
6019467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified());
60206ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  return LHS->getElementType() == RHS->getElementType() &&
602161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner         LHS->getNumElements() == RHS->getNumElements();
60226ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner}
60236ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner
6024255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregorbool ASTContext::areCompatibleVectorTypes(QualType FirstVec,
6025255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor                                          QualType SecondVec) {
6026255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  assert(FirstVec->isVectorType() && "FirstVec should be a vector type");
6027255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  assert(SecondVec->isVectorType() && "SecondVec should be a vector type");
6028255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6029255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  if (hasSameUnqualifiedType(FirstVec, SecondVec))
6030255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor    return true;
6031255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6032f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  // Treat Neon vector types and most AltiVec vector types as if they are the
6033f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  // equivalent GCC vector types.
6034255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  const VectorType *First = FirstVec->getAs<VectorType>();
6035255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  const VectorType *Second = SecondVec->getAs<VectorType>();
6036f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  if (First->getNumElements() == Second->getNumElements() &&
6037255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor      hasSameType(First->getElementType(), Second->getElementType()) &&
6038f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      First->getVectorKind() != VectorType::AltiVecPixel &&
6039f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      First->getVectorKind() != VectorType::AltiVecBool &&
6040f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      Second->getVectorKind() != VectorType::AltiVecPixel &&
6041f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      Second->getVectorKind() != VectorType::AltiVecBool)
6042255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor    return true;
6043255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6044255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  return false;
6045255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor}
6046255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
60474084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===//
60484084c306635b70f37029dca938444e6013f08684Steve Naroff// ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's.
60494084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===//
60504084c306635b70f37029dca938444e6013f08684Steve Naroff
60514084c306635b70f37029dca938444e6013f08684Steve Naroff/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the
60524084c306635b70f37029dca938444e6013f08684Steve Naroff/// inheritance hierarchy of 'rProto'.
60534ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool
60544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
60554ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           ObjCProtocolDecl *rProto) const {
60563fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor  if (declaresSameEntity(lProto, rProto))
605714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    return true;
60584084c306635b70f37029dca938444e6013f08684Steve Naroff  for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(),
60594084c306635b70f37029dca938444e6013f08684Steve Naroff       E = rProto->protocol_end(); PI != E; ++PI)
60604084c306635b70f37029dca938444e6013f08684Steve Naroff    if (ProtocolCompatibleWithProtocol(lProto, *PI))
60614084c306635b70f37029dca938444e6013f08684Steve Naroff      return true;
60624084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
60634084c306635b70f37029dca938444e6013f08684Steve Naroff}
606414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
60654c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// QualifiedIdConformsQualifiedId - compare id<pr,...> with id<pr1,...>
60664084c306635b70f37029dca938444e6013f08684Steve Naroff/// return true if lhs's protocols conform to rhs's protocol; false
60674084c306635b70f37029dca938444e6013f08684Steve Naroff/// otherwise.
60684084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) {
60694084c306635b70f37029dca938444e6013f08684Steve Naroff  if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType())
60704084c306635b70f37029dca938444e6013f08684Steve Naroff    return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false);
60714084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
60724084c306635b70f37029dca938444e6013f08684Steve Naroff}
60734084c306635b70f37029dca938444e6013f08684Steve Naroff
60744c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// ObjCQualifiedClassTypesAreCompatible - compare  Class<pr,...> and
60754c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// Class<pr1, ...>.
6076a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanianbool ASTContext::ObjCQualifiedClassTypesAreCompatible(QualType lhs,
6077a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian                                                      QualType rhs) {
6078a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  const ObjCObjectPointerType *lhsQID = lhs->getAs<ObjCObjectPointerType>();
6079a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
6080a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  assert ((lhsQID && rhsOPT) && "ObjCQualifiedClassTypesAreCompatible");
6081a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6082a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
6083a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian       E = lhsQID->qual_end(); I != E; ++I) {
6084a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    bool match = false;
6085a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    ObjCProtocolDecl *lhsProto = *I;
6086a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(),
6087a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian         E = rhsOPT->qual_end(); J != E; ++J) {
6088a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      ObjCProtocolDecl *rhsProto = *J;
6089a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) {
6090a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian        match = true;
6091a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian        break;
6092a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      }
6093a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    }
6094a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    if (!match)
6095a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      return false;
6096a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  }
6097a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  return true;
6098a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian}
6099a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
61004084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an
61014084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIDType.
61024084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs,
61034084c306635b70f37029dca938444e6013f08684Steve Naroff                                                   bool compare) {
61044084c306635b70f37029dca938444e6013f08684Steve Naroff  // Allow id<P..> and an 'id' or void* type in all cases.
61051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (lhs->isVoidPointerType() ||
61064084c306635b70f37029dca938444e6013f08684Steve Naroff      lhs->isObjCIdType() || lhs->isObjCClassType())
61074084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
61081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  else if (rhs->isVoidPointerType() ||
61094084c306635b70f37029dca938444e6013f08684Steve Naroff           rhs->isObjCIdType() || rhs->isObjCClassType())
61104084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
61114084c306635b70f37029dca938444e6013f08684Steve Naroff
61124084c306635b70f37029dca938444e6013f08684Steve Naroff  if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) {
6113183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
61141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61154084c306635b70f37029dca938444e6013f08684Steve Naroff    if (!rhsOPT) return false;
61161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61174084c306635b70f37029dca938444e6013f08684Steve Naroff    if (rhsOPT->qual_empty()) {
61181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // If the RHS is a unqualified interface pointer "NSString*",
61194084c306635b70f37029dca938444e6013f08684Steve Naroff      // make sure we check the class hierarchy.
61204084c306635b70f37029dca938444e6013f08684Steve Naroff      if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) {
61214084c306635b70f37029dca938444e6013f08684Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
61224084c306635b70f37029dca938444e6013f08684Steve Naroff             E = lhsQID->qual_end(); I != E; ++I) {
61234084c306635b70f37029dca938444e6013f08684Steve Naroff          // when comparing an id<P> on lhs with a static type on rhs,
61244084c306635b70f37029dca938444e6013f08684Steve Naroff          // see if static class implements all of id's protocols, directly or
61254084c306635b70f37029dca938444e6013f08684Steve Naroff          // through its super class and categories.
61260fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian          if (!rhsID->ClassImplementsProtocol(*I, true))
61274084c306635b70f37029dca938444e6013f08684Steve Naroff            return false;
61284084c306635b70f37029dca938444e6013f08684Steve Naroff        }
61294084c306635b70f37029dca938444e6013f08684Steve Naroff      }
61304084c306635b70f37029dca938444e6013f08684Steve Naroff      // If there are no qualifiers and no interface, we have an 'id'.
61314084c306635b70f37029dca938444e6013f08684Steve Naroff      return true;
61324084c306635b70f37029dca938444e6013f08684Steve Naroff    }
61331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Both the right and left sides have qualifiers.
61344084c306635b70f37029dca938444e6013f08684Steve Naroff    for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
61354084c306635b70f37029dca938444e6013f08684Steve Naroff         E = lhsQID->qual_end(); I != E; ++I) {
61364084c306635b70f37029dca938444e6013f08684Steve Naroff      ObjCProtocolDecl *lhsProto = *I;
61374084c306635b70f37029dca938444e6013f08684Steve Naroff      bool match = false;
6138de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff
6139de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // when comparing an id<P> on lhs with a static type on rhs,
6140de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // see if static class implements all of id's protocols, directly or
6141de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // through its super class and categories.
61424084c306635b70f37029dca938444e6013f08684Steve Naroff      for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(),
61434084c306635b70f37029dca938444e6013f08684Steve Naroff           E = rhsOPT->qual_end(); J != E; ++J) {
61444084c306635b70f37029dca938444e6013f08684Steve Naroff        ObjCProtocolDecl *rhsProto = *J;
61454084c306635b70f37029dca938444e6013f08684Steve Naroff        if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
61464084c306635b70f37029dca938444e6013f08684Steve Naroff            (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
61474084c306635b70f37029dca938444e6013f08684Steve Naroff          match = true;
61488f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff          break;
61498f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff        }
6150de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      }
61511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // If the RHS is a qualified interface pointer "NSString<P>*",
61524084c306635b70f37029dca938444e6013f08684Steve Naroff      // make sure we check the class hierarchy.
61534084c306635b70f37029dca938444e6013f08684Steve Naroff      if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) {
61544084c306635b70f37029dca938444e6013f08684Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
61554084c306635b70f37029dca938444e6013f08684Steve Naroff             E = lhsQID->qual_end(); I != E; ++I) {
61564084c306635b70f37029dca938444e6013f08684Steve Naroff          // when comparing an id<P> on lhs with a static type on rhs,
61574084c306635b70f37029dca938444e6013f08684Steve Naroff          // see if static class implements all of id's protocols, directly or
61584084c306635b70f37029dca938444e6013f08684Steve Naroff          // through its super class and categories.
61590fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian          if (rhsID->ClassImplementsProtocol(*I, true)) {
61604084c306635b70f37029dca938444e6013f08684Steve Naroff            match = true;
61614084c306635b70f37029dca938444e6013f08684Steve Naroff            break;
61624084c306635b70f37029dca938444e6013f08684Steve Naroff          }
61634084c306635b70f37029dca938444e6013f08684Steve Naroff        }
61644084c306635b70f37029dca938444e6013f08684Steve Naroff      }
61654084c306635b70f37029dca938444e6013f08684Steve Naroff      if (!match)
6166de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff        return false;
6167de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    }
61681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6169de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    return true;
6170de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  }
61711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61724084c306635b70f37029dca938444e6013f08684Steve Naroff  const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType();
61734084c306635b70f37029dca938444e6013f08684Steve Naroff  assert(rhsQID && "One of the LHS/RHS should be id<x>");
61744084c306635b70f37029dca938444e6013f08684Steve Naroff
61751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (const ObjCObjectPointerType *lhsOPT =
61764084c306635b70f37029dca938444e6013f08684Steve Naroff        lhs->getAsObjCInterfacePointerType()) {
6177de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // If both the right and left sides have qualifiers.
61784084c306635b70f37029dca938444e6013f08684Steve Naroff    for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(),
61794084c306635b70f37029dca938444e6013f08684Steve Naroff         E = lhsOPT->qual_end(); I != E; ++I) {
61804084c306635b70f37029dca938444e6013f08684Steve Naroff      ObjCProtocolDecl *lhsProto = *I;
61814084c306635b70f37029dca938444e6013f08684Steve Naroff      bool match = false;
61824084c306635b70f37029dca938444e6013f08684Steve Naroff
6183de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // when comparing an id<P> on rhs with a static type on lhs,
61844084c306635b70f37029dca938444e6013f08684Steve Naroff      // see if static class implements all of id's protocols, directly or
61854084c306635b70f37029dca938444e6013f08684Steve Naroff      // through its super class and categories.
6186de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // First, lhs protocols in the qualifier list must be found, direct
6187de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // or indirect in rhs's qualifier list or it is a mismatch.
61884084c306635b70f37029dca938444e6013f08684Steve Naroff      for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
61894084c306635b70f37029dca938444e6013f08684Steve Naroff           E = rhsQID->qual_end(); J != E; ++J) {
61904084c306635b70f37029dca938444e6013f08684Steve Naroff        ObjCProtocolDecl *rhsProto = *J;
61914084c306635b70f37029dca938444e6013f08684Steve Naroff        if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
61924084c306635b70f37029dca938444e6013f08684Steve Naroff            (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
61934084c306635b70f37029dca938444e6013f08684Steve Naroff          match = true;
61944084c306635b70f37029dca938444e6013f08684Steve Naroff          break;
61954084c306635b70f37029dca938444e6013f08684Steve Naroff        }
61964084c306635b70f37029dca938444e6013f08684Steve Naroff      }
61974084c306635b70f37029dca938444e6013f08684Steve Naroff      if (!match)
61984084c306635b70f37029dca938444e6013f08684Steve Naroff        return false;
61994084c306635b70f37029dca938444e6013f08684Steve Naroff    }
6200de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian
6201de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // Static class's protocols, or its super class or category protocols
6202de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // must be found, direct or indirect in rhs's qualifier list or it is a mismatch.
6203de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) {
6204de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
6205de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      CollectInheritedProtocols(lhsID, LHSInheritedProtocols);
6206de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // This is rather dubious but matches gcc's behavior. If lhs has
6207de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // no type qualifier and its class has no static protocol(s)
6208de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // assume that it is mismatch.
6209de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty())
6210de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        return false;
6211de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6212de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian           LHSInheritedProtocols.begin(),
6213de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian           E = LHSInheritedProtocols.end(); I != E; ++I) {
6214de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        bool match = false;
6215de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        ObjCProtocolDecl *lhsProto = (*I);
6216de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
6217de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian             E = rhsQID->qual_end(); J != E; ++J) {
6218de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          ObjCProtocolDecl *rhsProto = *J;
6219de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
6220de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian              (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
6221de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian            match = true;
6222de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian            break;
6223de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          }
6224de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        }
6225de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        if (!match)
6226de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          return false;
6227de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      }
6228de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    }
62294084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
62304084c306635b70f37029dca938444e6013f08684Steve Naroff  }
62314084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
62324084c306635b70f37029dca938444e6013f08684Steve Naroff}
62334084c306635b70f37029dca938444e6013f08684Steve Naroff
62344084c306635b70f37029dca938444e6013f08684Steve Naroff/// canAssignObjCInterfaces - Return true if the two interface types are
62354084c306635b70f37029dca938444e6013f08684Steve Naroff/// compatible for assignment from RHS to LHS.  This handles validation of any
62364084c306635b70f37029dca938444e6013f08684Steve Naroff/// protocol qualifiers on the LHS or RHS.
62374084c306635b70f37029dca938444e6013f08684Steve Naroff///
62384084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT,
62394084c306635b70f37029dca938444e6013f08684Steve Naroff                                         const ObjCObjectPointerType *RHSOPT) {
6240c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* LHS = LHSOPT->getObjectType();
6241c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* RHS = RHSOPT->getObjectType();
6242c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
62434084c306635b70f37029dca938444e6013f08684Steve Naroff  // If either type represents the built-in 'id' or 'Class' types, return true.
6244c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->isObjCUnqualifiedIdOrClass() ||
6245c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      RHS->isObjCUnqualifiedIdOrClass())
62464084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
62474084c306635b70f37029dca938444e6013f08684Steve Naroff
6248c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId())
62491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
62501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             QualType(RHSOPT,0),
62514084c306635b70f37029dca938444e6013f08684Steve Naroff                                             false);
6252a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6253a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass())
6254a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    return ObjCQualifiedClassTypesAreCompatible(QualType(LHSOPT,0),
6255a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian                                                QualType(RHSOPT,0));
6256a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6257c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // If we have 2 user-defined types, fall into that path.
6258c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->getInterface() && RHS->getInterface())
62594084c306635b70f37029dca938444e6013f08684Steve Naroff    return canAssignObjCInterfaces(LHS, RHS);
62601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62614084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
626214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff}
626314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
6264132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// canAssignObjCInterfacesInBlockPointer - This routine is specifically written
6265fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// for providing type-safety for objective-c pointers used to pass/return
6266132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// arguments in block literals. When passed as arguments, passing 'A*' where
6267132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is
6268132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// not OK. For the return type, the opposite is not OK.
6269132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::canAssignObjCInterfacesInBlockPointer(
6270132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                         const ObjCObjectPointerType *LHSOPT,
6271a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                         const ObjCObjectPointerType *RHSOPT,
6272a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                         bool BlockReturnType) {
6273a98344869c278295f38e106583906377520079b8Fariborz Jahanian  if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType())
6274132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return true;
6275132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6276132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  if (LHSOPT->isObjCBuiltinType()) {
6277132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType();
6278132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  }
6279132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6280a98344869c278295f38e106583906377520079b8Fariborz Jahanian  if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType())
6281132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
6282132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                             QualType(RHSOPT,0),
6283132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                             false);
6284132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6285132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
6286132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
6287132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  if (LHS && RHS)  { // We have 2 user-defined types.
6288132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    if (LHS != RHS) {
6289132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (LHS->getDecl()->isSuperClassOf(RHS->getDecl()))
6290a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian        return BlockReturnType;
6291132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (RHS->getDecl()->isSuperClassOf(LHS->getDecl()))
6292a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian        return !BlockReturnType;
6293132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    }
6294132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    else
6295132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      return true;
6296132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  }
6297132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  return false;
6298132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian}
6299132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6300e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// getIntersectionOfProtocols - This routine finds the intersection of set
6301e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// of protocols inherited from two distinct objective-c pointer objects.
6302e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// It is used to build composite qualifier list of the composite type of
6303e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// the conditional expression involving two objective-c pointer objects.
6304e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianstatic
6305e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid getIntersectionOfProtocols(ASTContext &Context,
6306e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                const ObjCObjectPointerType *LHSOPT,
6307e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                const ObjCObjectPointerType *RHSOPT,
63085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) {
6309e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6310c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* LHS = LHSOPT->getObjectType();
6311c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* RHS = RHSOPT->getObjectType();
6312c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(LHS->getInterface() && "LHS must have an interface base");
6313c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(RHS->getInterface() && "RHS must have an interface base");
6314e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6315e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet;
6316e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  unsigned LHSNumProtocols = LHS->getNumProtocols();
6317e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (LHSNumProtocols > 0)
6318e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end());
6319e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  else {
6320432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
6321c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Context.CollectInheritedProtocols(LHS->getInterface(),
6322c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                      LHSInheritedProtocols);
6323e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    InheritedProtocolSet.insert(LHSInheritedProtocols.begin(),
6324e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                LHSInheritedProtocols.end());
6325e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
6326e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6327e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  unsigned RHSNumProtocols = RHS->getNumProtocols();
6328e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (RHSNumProtocols > 0) {
6329cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman    ObjCProtocolDecl **RHSProtocols =
6330cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman      const_cast<ObjCProtocolDecl **>(RHS->qual_begin());
6331e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    for (unsigned i = 0; i < RHSNumProtocols; ++i)
6332e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      if (InheritedProtocolSet.count(RHSProtocols[i]))
6333e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        IntersectionOfProtocols.push_back(RHSProtocols[i]);
63343060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  } else {
6335432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols;
6336c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Context.CollectInheritedProtocols(RHS->getInterface(),
6337c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                      RHSInheritedProtocols);
6338432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6339432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian         RHSInheritedProtocols.begin(),
6340432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian         E = RHSInheritedProtocols.end(); I != E; ++I)
6341432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian      if (InheritedProtocolSet.count((*I)))
6342432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian        IntersectionOfProtocols.push_back((*I));
6343e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
6344e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian}
6345e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6346db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// areCommonBaseCompatible - Returns common base class of the two classes if
6347db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// one found. Note that this is O'2 algorithm. But it will be called as the
6348db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// last type comparison in a ?-exp of ObjC pointer types before a
6349db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// warning is issued. So, its invokation is extremely rare.
6350db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz JahanianQualType ASTContext::areCommonBaseCompatible(
6351c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                          const ObjCObjectPointerType *Lptr,
6352c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                          const ObjCObjectPointerType *Rptr) {
6353c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType *LHS = Lptr->getObjectType();
6354c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType *RHS = Rptr->getObjectType();
6355c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCInterfaceDecl* LDecl = LHS->getInterface();
6356c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCInterfaceDecl* RDecl = RHS->getInterface();
635760ef308e51c71b760d7f598c1b763ceb7b768148Douglas Gregor  if (!LDecl || !RDecl || (declaresSameEntity(LDecl, RDecl)))
6358db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian    return QualType();
6359db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
63607c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian  do {
6361c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    LHS = cast<ObjCInterfaceType>(getObjCInterfaceType(LDecl));
6362e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    if (canAssignObjCInterfaces(LHS, RHS)) {
63635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVector<ObjCProtocolDecl *, 8> Protocols;
6364c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      getIntersectionOfProtocols(*this, Lptr, Rptr, Protocols);
6365c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
6366c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      QualType Result = QualType(LHS, 0);
6367c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      if (!Protocols.empty())
6368c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        Result = getObjCObjectType(Result, Protocols.data(), Protocols.size());
6369c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Result = getObjCObjectPointerType(Result);
6370c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      return Result;
6371e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
63727c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian  } while ((LDecl = LDecl->getSuperClass()));
6373db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
6374db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian  return QualType();
6375db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian}
6376db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
6377c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallbool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS,
6378c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                         const ObjCObjectType *RHS) {
6379c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(LHS->getInterface() && "LHS is not an interface type");
6380c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(RHS->getInterface() && "RHS is not an interface type");
6381c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
63826ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // Verify that the base decls are compatible: the RHS must be a subclass of
63836ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // the LHS.
6384c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!LHS->getInterface()->isSuperClassOf(RHS->getInterface()))
63856ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner    return false;
63861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63876ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // RHS must have a superset of the protocols in the LHS.  If the LHS is not
63886ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // protocol qualified at all, then we are good.
6389c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  if (LHS->getNumProtocols() == 0)
63906ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner    return true;
63911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6392b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  // Okay, we know the LHS has protocol qualifiers.  If the RHS doesn't,
6393b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  // more detailed analysis is required.
6394b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  if (RHS->getNumProtocols() == 0) {
6395b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // OK, if LHS is a superclass of RHS *and*
6396b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // this superclass is assignment compatible with LHS.
6397b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // false otherwise.
6398627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian    bool IsSuperClass =
6399627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian      LHS->getInterface()->isSuperClassOf(RHS->getInterface());
6400627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian    if (IsSuperClass) {
6401b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // OK if conversion of LHS to SuperClass results in narrowing of types
6402b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // ; i.e., SuperClass may implement at least one of the protocols
6403b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok.
6404b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // But not SuperObj<P1,P2,P3> = lhs<P1,P2>.
6405b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols;
6406627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian      CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols);
6407b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // If super class has no protocols, it is not a match.
6408b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      if (SuperClassInheritedProtocols.empty())
6409b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        return false;
6410b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian
6411b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(),
6412b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian           LHSPE = LHS->qual_end();
6413b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian           LHSPI != LHSPE; LHSPI++) {
6414b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        bool SuperImplementsProtocol = false;
6415b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        ObjCProtocolDecl *LHSProto = (*LHSPI);
6416b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian
6417b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6418b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian             SuperClassInheritedProtocols.begin(),
6419b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian             E = SuperClassInheritedProtocols.end(); I != E; ++I) {
6420b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          ObjCProtocolDecl *SuperClassProto = (*I);
6421b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
6422b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian            SuperImplementsProtocol = true;
6423b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian            break;
6424b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          }
6425b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        }
6426b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        if (!SuperImplementsProtocol)
6427b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          return false;
6428b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      }
6429b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      return true;
6430b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    }
6431b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    return false;
6432b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  }
64331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6434c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(),
6435c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                     LHSPE = LHS->qual_end();
643691b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff       LHSPI != LHSPE; LHSPI++) {
643791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    bool RHSImplementsProtocol = false;
643891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff
643991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // If the RHS doesn't implement the protocol on the left, the types
644091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // are incompatible.
6441c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    for (ObjCObjectType::qual_iterator RHSPI = RHS->qual_begin(),
6442c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                       RHSPE = RHS->qual_end();
64438f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff         RHSPI != RHSPE; RHSPI++) {
64448f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff      if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) {
644591b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff        RHSImplementsProtocol = true;
64468f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff        break;
64478f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff      }
644891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    }
644991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // FIXME: For better diagnostics, consider passing back the protocol name.
645091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    if (!RHSImplementsProtocol)
645191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff      return false;
645291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  }
645391b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  // The RHS implements all protocols listed on the LHS.
645491b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  return true;
64556ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner}
64566ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner
6457389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroffbool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) {
6458389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff  // get the "pointed to" types
6459183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>();
6460183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>();
64611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
646214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (!LHSOPT || !RHSOPT)
6463389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff    return false;
646414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
646514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  return canAssignObjCInterfaces(LHSOPT, RHSOPT) ||
646614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff         canAssignObjCInterfaces(RHSOPT, LHSOPT);
6467389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff}
6468389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff
6469569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorbool ASTContext::canBindObjCObjectType(QualType To, QualType From) {
6470569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor  return canAssignObjCInterfaces(
6471569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor                getObjCObjectPointerType(To)->getAs<ObjCObjectPointerType>(),
6472569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor                getObjCObjectPointerType(From)->getAs<ObjCObjectPointerType>());
6473569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor}
6474569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor
64751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible,
6476ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// both shall have the identically qualified version of a compatible type.
64771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// C99 6.2.7p1: Two types have compatible types if their types are the
6478ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// same. See 6.7.[2,3,5] for additional rules.
6479447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregorbool ASTContext::typesAreCompatible(QualType LHS, QualType RHS,
6480447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                    bool CompareUnqualified) {
64814e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
64820e709abafbd939326850501f795cc7a92c88a354Douglas Gregor    return hasSameType(LHS, RHS);
64830e709abafbd939326850501f795cc7a92c88a354Douglas Gregor
6484447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull();
64853d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman}
64863d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6487c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanianbool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) {
648882378391dfc3b2fc22f63dbf1552bd9aed39dc42Fariborz Jahanian  return typesAreCompatible(LHS, RHS);
6489c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian}
6490c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian
6491132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) {
6492132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  return !mergeTypes(LHS, RHS, true).isNull();
6493132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian}
6494132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
64954846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeTransparentUnionType - if T is a transparent union type and a member
64964846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// of T is compatible with SubType, return the merged type, else return
64974846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// QualType()
64984846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType,
64994846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                               bool OfBlockPointer,
65004846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                               bool Unqualified) {
65014846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (const RecordType *UT = T->getAsUnionType()) {
65024846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    RecordDecl *UD = UT->getDecl();
65034846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    if (UD->hasAttr<TransparentUnionAttr>()) {
65044846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      for (RecordDecl::field_iterator it = UD->field_begin(),
65054846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne           itend = UD->field_end(); it != itend; ++it) {
6506f91d7572ee7fa6f2926c8e7e816039a1154a59f8Peter Collingbourne        QualType ET = it->getType().getUnqualifiedType();
65074846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne        QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified);
65084846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne        if (!MT.isNull())
65094846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne          return MT;
65104846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      }
65114846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    }
65124846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  }
65134846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
65144846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  return QualType();
65154846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne}
65164846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
65174846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeFunctionArgumentTypes - merge two types which appear as function
65184846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// argument types
65194846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeFunctionArgumentTypes(QualType lhs, QualType rhs,
65204846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                bool OfBlockPointer,
65214846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                bool Unqualified) {
65224846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // GNU extension: two types are compatible if they appear as a function
65234846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // argument, one of the types is a transparent union type and the other
65244846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // type is compatible with a union member
65254846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer,
65264846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                              Unqualified);
65274846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (!lmerge.isNull())
65284846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    return lmerge;
65294846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
65304846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer,
65314846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                              Unqualified);
65324846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (!rmerge.isNull())
65334846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    return rmerge;
65344846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
65354846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified);
65364846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne}
65374846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
6538132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
6539447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                        bool OfBlockPointer,
6540447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                        bool Unqualified) {
6541183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const FunctionType *lbase = lhs->getAs<FunctionType>();
6542183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const FunctionType *rbase = rhs->getAs<FunctionType>();
654372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase);
654472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase);
65453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  bool allLTypes = true;
65463d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  bool allRTypes = true;
65473d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
65483d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  // Check return type
6549132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  QualType retType;
6550d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian  if (OfBlockPointer) {
6551d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    QualType RHS = rbase->getResultType();
6552d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    QualType LHS = lbase->getResultType();
6553d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    bool UnqualifiedResult = Unqualified;
6554d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    if (!UnqualifiedResult)
6555d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian      UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers());
6556a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian    retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true);
6557d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian  }
6558132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  else
65598cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    retType = mergeTypes(lbase->getResultType(), rbase->getResultType(), false,
65608cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall                         Unqualified);
65613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (retType.isNull()) return QualType();
6562447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6563447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified)
6564447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    retType = retType.getUnqualifiedType();
6565447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6566447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  CanQualType LRetType = getCanonicalType(lbase->getResultType());
6567447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  CanQualType RRetType = getCanonicalType(rbase->getResultType());
6568447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified) {
6569447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    LRetType = LRetType.getUnqualifiedType();
6570447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    RRetType = RRetType.getUnqualifiedType();
6571447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  }
6572447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6573447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (getCanonicalType(retType) != LRetType)
657461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    allLTypes = false;
6575447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (getCanonicalType(retType) != RRetType)
657661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    allRTypes = false;
65778cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
65786a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  // FIXME: double check this
65796a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  // FIXME: should we error if lbase->getRegParmAttr() != 0 &&
65806a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  //                           rbase->getRegParmAttr() != 0 &&
65816a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  //                           lbase->getRegParmAttr() != rbase->getRegParmAttr()?
6582264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo();
6583264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo();
65848cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
65858cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  // Compatible functions must have compatible calling conventions
65868cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  if (!isSameCallConv(lbaseInfo.getCC(), rbaseInfo.getCC()))
65878cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    return QualType();
65888cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
65898cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  // Regparm is part of the calling convention.
6590a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman  if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm())
6591a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman    return QualType();
65928cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm())
65938cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    return QualType();
65948cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
6595f85e193739c953358c865005855253af4f68a497John McCall  if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult())
6596f85e193739c953358c865005855253af4f68a497John McCall    return QualType();
6597f85e193739c953358c865005855253af4f68a497John McCall
659853c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian  // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'.
659953c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian  bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn();
66001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66018b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola  if (lbaseInfo.getNoReturn() != NoReturn)
66028b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola    allLTypes = false;
66038b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola  if (rbaseInfo.getNoReturn() != NoReturn)
66048b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola    allRTypes = false;
66058b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola
6606f85e193739c953358c865005855253af4f68a497John McCall  FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn);
6607e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
66083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (lproto && rproto) { // two C99 style function prototypes
6609465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl    assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() &&
6610465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl           "C++ shouldn't be here");
66113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned lproto_nargs = lproto->getNumArgs();
66123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned rproto_nargs = rproto->getNumArgs();
66133d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66143d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Compatible functions must have the same number of arguments
66153d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (lproto_nargs != rproto_nargs)
66163d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
66173d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66183d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Variadic and non-variadic functions aren't compatible
66193d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (lproto->isVariadic() != rproto->isVariadic())
66203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
66213d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66227fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis    if (lproto->getTypeQuals() != rproto->getTypeQuals())
66237fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis      return QualType();
66247fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis
662578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    if (LangOpts.ObjCAutoRefCount &&
662678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian        !FunctionTypesMatchOnNSConsumedAttrs(rproto, lproto))
662778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      return QualType();
662878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
66293d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Check argument compatibility
66305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<QualType, 10> types;
66313d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    for (unsigned i = 0; i < lproto_nargs; i++) {
66323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType largtype = lproto->getArgType(i).getUnqualifiedType();
66333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType rargtype = rproto->getArgType(i).getUnqualifiedType();
66344846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      QualType argtype = mergeFunctionArgumentTypes(largtype, rargtype,
66354846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                    OfBlockPointer,
66364846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                    Unqualified);
66373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      if (argtype.isNull()) return QualType();
6638447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6639447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      if (Unqualified)
6640447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        argtype = argtype.getUnqualifiedType();
6641447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
66423d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      types.push_back(argtype);
6643447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      if (Unqualified) {
6644447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        largtype = largtype.getUnqualifiedType();
6645447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        rargtype = rargtype.getUnqualifiedType();
6646447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      }
6647447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
664861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      if (getCanonicalType(argtype) != getCanonicalType(largtype))
664961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner        allLTypes = false;
665061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      if (getCanonicalType(argtype) != getCanonicalType(rargtype))
665161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner        allRTypes = false;
66523d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
665378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
66543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allLTypes) return lhs;
66553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allRTypes) return rhs;
6656e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
6657e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo();
6658e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.ExtInfo = einfo;
6659e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    return getFunctionType(retType, types.begin(), types.size(), EPI);
66603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
66613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66623d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (lproto) allRTypes = false;
66633d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (rproto) allLTypes = false;
66643d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
666572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *proto = lproto ? lproto : rproto;
66663d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (proto) {
6667465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl    assert(!proto->hasExceptionSpec() && "C++ shouldn't be here");
66683d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (proto->isVariadic()) return QualType();
66693d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Check that the types are compatible with the types that
66703d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // would result from default argument promotions (C99 6.7.5.3p15).
66713d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // The only types actually affected are promotable integer
66723d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // types and floats, which would be passed as a different
66733d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // type depending on whether the prototype is visible.
66743d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned proto_nargs = proto->getNumArgs();
66753d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    for (unsigned i = 0; i < proto_nargs; ++i) {
66763d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType argTy = proto->getArgType(i);
6677b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor
6678c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      // Look at the converted type of enum types, since that is the type used
6679b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor      // to pass enum values.
6680c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      if (const EnumType *Enum = argTy->getAs<EnumType>()) {
6681c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman        argTy = Enum->getDecl()->getIntegerType();
6682c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman        if (argTy.isNull())
6683c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman          return QualType();
6684c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      }
6685b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor
66863d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      if (argTy->isPromotableIntegerType() ||
66873d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman          getCanonicalType(argTy).getUnqualifiedType() == FloatTy)
66883d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman        return QualType();
66893d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
66903d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66913d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allLTypes) return lhs;
66923d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allRTypes) return rhs;
6693e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
6694e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo();
6695e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.ExtInfo = einfo;
66963d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return getFunctionType(retType, proto->arg_type_begin(),
6697e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                           proto->getNumArgs(), EPI);
66983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
66993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
67003d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (allLTypes) return lhs;
67013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (allRTypes) return rhs;
67028cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  return getFunctionNoProtoType(retType, einfo);
67033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman}
67043d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6705132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeTypes(QualType LHS, QualType RHS,
6706447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                bool OfBlockPointer,
6707a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                bool Unqualified, bool BlockReturnType) {
670843d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // C++ [expr]: If an expression initially has the type "reference to T", the
670943d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // type is adjusted to "T" prior to any further analysis, the expression
671043d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // designates the object or function denoted by the reference, and the
67117c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // expression is an lvalue unless the reference is an rvalue reference and
67127c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // the expression is a function call (possibly inside parentheses).
67130e709abafbd939326850501f795cc7a92c88a354Douglas Gregor  assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?");
67140e709abafbd939326850501f795cc7a92c88a354Douglas Gregor  assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?");
6715447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6716447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified) {
6717447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    LHS = LHS.getUnqualifiedType();
6718447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    RHS = RHS.getUnqualifiedType();
6719447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  }
67200e709abafbd939326850501f795cc7a92c88a354Douglas Gregor
67213d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  QualType LHSCan = getCanonicalType(LHS),
67223d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman           RHSCan = getCanonicalType(RHS);
67233d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6724f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner  // If two types are identical, they are compatible.
67253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (LHSCan == RHSCan)
67263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return LHS;
67273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
67280953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If the qualifiers are different, the types aren't compatible... mostly.
6729a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers LQuals = LHSCan.getLocalQualifiers();
6730a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers RQuals = RHSCan.getLocalQualifiers();
67310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  if (LQuals != RQuals) {
67320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // If any of these qualifiers are different, we have a type
67330953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // mismatch.
67340953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
6735f85e193739c953358c865005855253af4f68a497John McCall        LQuals.getAddressSpace() != RQuals.getAddressSpace() ||
6736f85e193739c953358c865005855253af4f68a497John McCall        LQuals.getObjCLifetime() != RQuals.getObjCLifetime())
67370953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return QualType();
67380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
67390953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // Exactly one GC qualifier difference is allowed: __strong is
67400953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // okay if the other type has no GC qualifier but is an Objective
67410953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // C object pointer (i.e. implicitly strong by default).  We fix
67420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // this by pretending that the unqualified type was actually
67430953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // qualified __strong.
67440953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
67450953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
67460953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
67470953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
67480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
67490953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return QualType();
67500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
67510953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) {
67520953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong));
67530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    }
67540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) {
67550953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS);
67560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    }
67573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
67580953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  }
67590953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
67600953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Okay, qualifiers are equal.
67613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6762852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman  Type::TypeClass LHSClass = LHSCan->getTypeClass();
6763852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman  Type::TypeClass RHSClass = RHSCan->getTypeClass();
6764f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner
67651adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  // We want to consider the two function types to be the same for these
67661adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  // comparisons, just force one to the other.
67671adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
67681adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
67694c721d381fb279899337d120edd4a24d405e56b2Eli Friedman
67704c721d381fb279899337d120edd4a24d405e56b2Eli Friedman  // Same as above for arrays
6771a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner  if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
6772a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner    LHSClass = Type::ConstantArray;
6773a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner  if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
6774a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner    RHSClass = Type::ConstantArray;
67751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6776c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCInterfaces are just specialized ObjCObjects.
6777c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
6778c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
6779c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
6780213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // Canonicalize ExtVector -> Vector.
6781213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
6782213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
67831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67844e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff  // If the canonical type classes don't match.
67854e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff  if (LHSClass != RHSClass) {
67861adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner    // C99 6.7.2.2p4: Each enumerated type shall be compatible with char,
67871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // a signed integer type, or an unsigned integer type.
6788842aef8d942a880eeb9535d40de31a86838264cbJohn McCall    // Compatibility is based on the underlying type, not the promotion
6789842aef8d942a880eeb9535d40de31a86838264cbJohn McCall    // type.
6790183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const EnumType* ETy = LHS->getAs<EnumType>()) {
6791b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian      QualType TINT = ETy->getDecl()->getIntegerType();
6792b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian      if (!TINT.isNull() && hasSameType(TINT, RHSCan.getUnqualifiedType()))
67933d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman        return RHS;
6794bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman    }
6795183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const EnumType* ETy = RHS->getAs<EnumType>()) {
6796b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian      QualType TINT = ETy->getDecl()->getIntegerType();
6797b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian      if (!TINT.isNull() && hasSameType(TINT, LHSCan.getUnqualifiedType()))
67983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman        return LHS;
6799bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman    }
6800e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian    // allow block pointer type to match an 'id' type.
6801419636316c04d570c183b4797fc811932c588358Fariborz Jahanian    if (OfBlockPointer && !BlockReturnType) {
6802419636316c04d570c183b4797fc811932c588358Fariborz Jahanian       if (LHS->isObjCIdType() && RHS->isBlockPointerType())
6803419636316c04d570c183b4797fc811932c588358Fariborz Jahanian         return LHS;
6804419636316c04d570c183b4797fc811932c588358Fariborz Jahanian      if (RHS->isObjCIdType() && LHS->isBlockPointerType())
6805419636316c04d570c183b4797fc811932c588358Fariborz Jahanian        return RHS;
6806419636316c04d570c183b4797fc811932c588358Fariborz Jahanian    }
6807e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian
68083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
6809ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff  }
68103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68114a74678ed6c3dedac05d02b1ee341f1db869f049Steve Naroff  // The canonical type classes match.
68121adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  switch (LHSClass) {
681372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base)
681472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base)
6815ad5e73887052193afda72db8efcb812bd083a4a8John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
681672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
681772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class:
681872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def"
6819b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Non-canonical and dependent types shouldn't get here");
682072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
68217c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  case Type::LValueReference:
68227c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  case Type::RValueReference:
682372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::MemberPointer:
6824b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("C++ should never be in mergeTypes");
682572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
6826c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCInterface:
682772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::IncompleteArray:
682872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::VariableArray:
682972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::FunctionProto:
683072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::ExtVector:
6831b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Types are eliminated above");
683272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
68331adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::Pointer:
68343d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  {
68353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Merge two pointer types, while trying to preserve typedef info
68366217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType();
68376217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType();
6838447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
6839447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSPointee = LHSPointee.getUnqualifiedType();
6840447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSPointee = RHSPointee.getUnqualifiedType();
6841447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
6842447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false,
6843447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                     Unqualified);
68443d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (ResultType.isNull()) return QualType();
684507d258756dc856c6987c394a0972884e6ed46765Eli Friedman    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
684661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
684707d258756dc856c6987c394a0972884e6ed46765Eli Friedman    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
684861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
68493d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return getPointerType(ResultType);
68503d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
6851c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  case Type::BlockPointer:
6852c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  {
6853c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    // Merge two block pointer types, while trying to preserve typedef info
68546217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType();
68556217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType();
6856447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
6857447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSPointee = LHSPointee.getUnqualifiedType();
6858447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSPointee = RHSPointee.getUnqualifiedType();
6859447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
6860447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer,
6861447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                     Unqualified);
6862c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (ResultType.isNull()) return QualType();
6863c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
6864c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff      return LHS;
6865c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
6866c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff      return RHS;
6867c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    return getBlockPointerType(ResultType);
6868c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  }
6869b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic:
6870b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  {
6871b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    // Merge two pointer types, while trying to preserve typedef info
6872b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType LHSValue = LHS->getAs<AtomicType>()->getValueType();
6873b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType RHSValue = RHS->getAs<AtomicType>()->getValueType();
6874b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (Unqualified) {
6875b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      LHSValue = LHSValue.getUnqualifiedType();
6876b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      RHSValue = RHSValue.getUnqualifiedType();
6877b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    }
6878b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType ResultType = mergeTypes(LHSValue, RHSValue, false,
6879b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman                                     Unqualified);
6880b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (ResultType.isNull()) return QualType();
6881b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (getCanonicalType(LHSValue) == getCanonicalType(ResultType))
6882b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      return LHS;
6883b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (getCanonicalType(RHSValue) == getCanonicalType(ResultType))
6884b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      return RHS;
6885b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    return getAtomicType(ResultType);
6886b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
68871adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::ConstantArray:
68883d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  {
68893d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const ConstantArrayType* LCAT = getAsConstantArrayType(LHS);
68903d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const ConstantArrayType* RCAT = getAsConstantArrayType(RHS);
68913d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize())
68923d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
68933d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68943d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    QualType LHSElem = getAsArrayType(LHS)->getElementType();
68953d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    QualType RHSElem = getAsArrayType(RHS)->getElementType();
6896447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
6897447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSElem = LHSElem.getUnqualifiedType();
6898447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSElem = RHSElem.getUnqualifiedType();
6899447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
6900447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6901447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified);
69023d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (ResultType.isNull()) return QualType();
690361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
690461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
690561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
690661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
69073bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(),
69083bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman                                          ArrayType::ArraySizeModifier(), 0);
69093bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(),
69103bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman                                          ArrayType::ArraySizeModifier(), 0);
69113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const VariableArrayType* LVAT = getAsVariableArrayType(LHS);
69123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const VariableArrayType* RVAT = getAsVariableArrayType(RHS);
691361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
691461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
691561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
691661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
69173d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (LVAT) {
69183d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // FIXME: This isn't correct! But tricky to implement because
69193d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // the array's size has to be the size of LHS, but the type
69203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // has to be different.
69213d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return LHS;
69223d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
69233d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (RVAT) {
69243d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // FIXME: This isn't correct! But tricky to implement because
69253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // the array's size has to be the size of RHS, but the type
69263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // has to be different.
69273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return RHS;
69283d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
69293bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
69303bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
69317e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    return getIncompleteArrayType(ResultType,
69327e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                  ArrayType::ArraySizeModifier(), 0);
69333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
69341adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::FunctionNoProto:
6935447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified);
693672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Record:
693772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Enum:
69383d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
69391adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::Builtin:
69403cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner    // Only exactly equal builtin types are compatible, which is tested above.
69413d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
694264cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar  case Type::Complex:
694364cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar    // Distinct complex types are incompatible.
694464cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar    return QualType();
69453cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner  case Type::Vector:
69465a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // FIXME: The merged type should be an ExtVector!
69471c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall    if (areCompatVectorTypes(LHSCan->getAs<VectorType>(),
69481c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall                             RHSCan->getAs<VectorType>()))
69493d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return LHS;
695061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    return QualType();
6951c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCObject: {
6952c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    // Check if the types are assignment compatible.
69535a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // FIXME: This should be type compatibility, e.g. whether
69545a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // "LHS x; RHS x;" at global scope is legal.
6955c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    const ObjCObjectType* LHSIface = LHS->getAs<ObjCObjectType>();
6956c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    const ObjCObjectType* RHSIface = RHS->getAs<ObjCObjectType>();
6957c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (canAssignObjCInterfaces(LHSIface, RHSIface))
69585fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff      return LHS;
69595fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff
69603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
696161490e9a965cfee8a78c12c6802138844f04250dCedric Venet  }
696214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  case Type::ObjCObjectPointer: {
6963132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    if (OfBlockPointer) {
6964132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (canAssignObjCInterfacesInBlockPointer(
6965132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                          LHS->getAs<ObjCObjectPointerType>(),
6966a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                          RHS->getAs<ObjCObjectPointerType>(),
6967a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                          BlockReturnType))
69687530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie        return LHS;
6969132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      return QualType();
6970132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    }
6971183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(),
6972183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall                                RHS->getAs<ObjCObjectPointerType>()))
697314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return LHS;
697414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
6975bc76dd06eb881c70c9775b74bab8b88cd747f173Steve Naroff    return QualType();
69767530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  }
6977ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff  }
697872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
69797530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid Type::Class!");
6980ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff}
69817192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek
698278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanianbool ASTContext::FunctionTypesMatchOnNSConsumedAttrs(
698378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian                   const FunctionProtoType *FromFunctionType,
698478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian                   const FunctionProtoType *ToFunctionType) {
698578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  if (FromFunctionType->hasAnyConsumedArgs() !=
698678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      ToFunctionType->hasAnyConsumedArgs())
698778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    return false;
698878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  FunctionProtoType::ExtProtoInfo FromEPI =
698978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    FromFunctionType->getExtProtoInfo();
699078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  FunctionProtoType::ExtProtoInfo ToEPI =
699178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    ToFunctionType->getExtProtoInfo();
699278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  if (FromEPI.ConsumedArguments && ToEPI.ConsumedArguments)
699378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs();
699478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian         ArgIdx != NumArgs; ++ArgIdx)  {
699578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      if (FromEPI.ConsumedArguments[ArgIdx] !=
699678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian          ToEPI.ConsumedArguments[ArgIdx])
699778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian        return false;
699878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    }
699978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  return true;
700078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian}
700178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
70022390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and
70032390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// 'RHS' attributes and returns the merged version; including for function
70042390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// return types.
70052390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz JahanianQualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) {
70062390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  QualType LHSCan = getCanonicalType(LHS),
70072390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  RHSCan = getCanonicalType(RHS);
70082390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  // If two types are identical, they are compatible.
70092390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LHSCan == RHSCan)
70102390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return LHS;
70112390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (RHSCan->isFunctionType()) {
70122390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (!LHSCan->isFunctionType())
70132390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
70142390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType OldReturnType =
70152390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      cast<FunctionType>(RHSCan.getTypePtr())->getResultType();
70162390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType NewReturnType =
70172390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      cast<FunctionType>(LHSCan.getTypePtr())->getResultType();
70182390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType ResReturnType =
70192390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      mergeObjCGCQualifiers(NewReturnType, OldReturnType);
70202390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResReturnType.isNull())
70212390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
70222390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
70232390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo();
70242390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      // In either case, use OldReturnType to build the new function type.
70252390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      const FunctionType *F = LHS->getAs<FunctionType>();
70262390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      if (const FunctionProtoType *FPT = cast<FunctionProtoType>(F)) {
7027e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall        FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
7028e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall        EPI.ExtInfo = getFunctionExtInfo(LHS);
70292390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        QualType ResultType
70302390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian          = getFunctionType(OldReturnType, FPT->arg_type_begin(),
7031e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                            FPT->getNumArgs(), EPI);
70322390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        return ResultType;
70332390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      }
70342390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    }
70352390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return QualType();
70362390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
70372390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70382390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  // If the qualifiers are different, the types can still be merged.
70392390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  Qualifiers LQuals = LHSCan.getLocalQualifiers();
70402390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  Qualifiers RQuals = RHSCan.getLocalQualifiers();
70412390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LQuals != RQuals) {
70422390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // If any of these qualifiers are different, we have a type mismatch.
70432390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
70442390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        LQuals.getAddressSpace() != RQuals.getAddressSpace())
70452390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
70462390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70472390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // Exactly one GC qualifier difference is allowed: __strong is
70482390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // okay if the other type has no GC qualifier but is an Objective
70492390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // C object pointer (i.e. implicitly strong by default).  We fix
70502390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // this by pretending that the unqualified type was actually
70512390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // qualified __strong.
70522390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
70532390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
70542390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
70552390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70562390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
70572390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
70582390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70592390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_L == Qualifiers::Strong)
70602390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return LHS;
70612390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_R == Qualifiers::Strong)
70622390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return RHS;
70632390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return QualType();
70642390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
70652390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70662390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) {
70672390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType LHSBaseQT = LHS->getAs<ObjCObjectPointerType>()->getPointeeType();
70682390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType RHSBaseQT = RHS->getAs<ObjCObjectPointerType>()->getPointeeType();
70692390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT);
70702390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResQT == LHSBaseQT)
70712390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return LHS;
70722390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResQT == RHSBaseQT)
70732390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return RHS;
70742390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
70752390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  return QualType();
70762390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian}
70772390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70785426bf6456a5aeac416a9150de157904d101c819Chris Lattner//===----------------------------------------------------------------------===//
7079ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//                         Integer Predicates
7080ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//===----------------------------------------------------------------------===//
708188054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner
70824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getIntWidth(QualType T) const {
7083f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  if (const EnumType *ET = dyn_cast<EnumType>(T))
708429a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman    T = ET->getDecl()->getIntegerType();
70851274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  if (T->isBooleanType())
70861274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor    return 1;
7087f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  // For builtin types, just use the standard type sizing method
7088ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  return (unsigned)getTypeSize(T);
7089ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman}
7090ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman
7091762f159c3295552f1f3e5e1af8b66385bfaed786Abramo BagnaraQualType ASTContext::getCorrespondingUnsignedType(QualType T) const {
7092f60946222721d9ba3c059563935c17b84703187aDouglas Gregor  assert(T->hasSignedIntegerRepresentation() && "Unexpected type");
70936a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
70946a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  // Turn <4 x signed int> -> <4 x unsigned int>
70956a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  if (const VectorType *VTy = T->getAs<VectorType>())
70966a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner    return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()),
7097e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                         VTy->getNumElements(), VTy->getVectorKind());
70986a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
70996a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  // For enums, we return the unsigned version of the base type.
71006a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  if (const EnumType *ETy = T->getAs<EnumType>())
7101ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    T = ETy->getDecl()->getIntegerType();
71026a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
71036a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  const BuiltinType *BTy = T->getAs<BuiltinType>();
71046a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  assert(BTy && "Unexpected signed integer type");
7105ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  switch (BTy->getKind()) {
7106ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Char_S:
7107ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::SChar:
7108ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedCharTy;
7109ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Short:
7110ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedShortTy;
7111ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Int:
7112ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedIntTy;
7113ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Long:
7114ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedLongTy;
7115ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::LongLong:
7116ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedLongLongTy;
71172df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::Int128:
71182df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner    return UnsignedInt128Ty;
7119ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  default:
7120b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Unexpected signed integer type");
7121ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  }
7122ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman}
7123ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman
71247b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios KyrtzidisASTMutationListener::~ASTMutationListener() { }
71257b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
712686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
712786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===//
712886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//                          Builtin Type Computation
712986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===//
713086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
713186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the
713233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// pointer over the consumed characters.  This returns the resultant type.  If
713333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// AllowTypeModifiers is false then modifier like * are not parsed, just basic
713433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// types.  This allows "v2i*" to be parsed as a pointer to a v2i instead of
713533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// a vector of "i*".
713614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner///
713714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// RequiresICE is filled in on return to indicate whether the value is required
713814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// to be an Integer Constant Expression.
71394ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,
714086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner                                  ASTContext::GetBuiltinTypeError &Error,
714114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                  bool &RequiresICE,
714233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner                                  bool AllowTypeModifiers) {
714386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  // Modifiers.
714486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  int HowLong = 0;
714586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  bool Signed = false, Unsigned = false;
714614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  RequiresICE = false;
7147393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner
714833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  // Read the prefixed modifiers first.
714986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  bool Done = false;
715086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (!Done) {
715186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    switch (*Str++) {
71521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    default: Done = true; --Str; break;
7153393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner    case 'I':
715414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner      RequiresICE = true;
7155393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner      break;
715686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'S':
715786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!");
715886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Signed && "Can't use 'S' modifier multiple times!");
715986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Signed = true;
716086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
716186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'U':
716286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Signed && "Can't use both 'S' and 'U' modifiers!");
716386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Unsigned && "Can't use 'S' modifier multiple times!");
716486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Unsigned = true;
716586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
716686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'L':
716786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(HowLong <= 2 && "Can't have LLLL modifier");
716886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      ++HowLong;
716986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
717086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
717186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
717286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
717386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  QualType Type;
71741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
717586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  // Read the base type.
717686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  switch (*Str++) {
7177b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Unknown builtin type letter!");
717886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'v':
717986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned &&
718086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'v'!");
718186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.VoidTy;
718286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
718386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'f':
718486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned &&
718586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'f'!");
718686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.FloatTy;
718786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
718886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'd':
718986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong < 2 && !Signed && !Unsigned &&
719086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'd'!");
719186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (HowLong)
719286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.LongDoubleTy;
719386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
719486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.DoubleTy;
719586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
719686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 's':
719786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && "Bad modifiers used with 's'!");
719886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Unsigned)
719986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.UnsignedShortTy;
720086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
720186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.ShortTy;
720286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
720386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'i':
720486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (HowLong == 3)
720586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
720686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (HowLong == 2)
720786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
720886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (HowLong == 1)
720986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy;
721086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
721186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy;
721286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
721386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'c':
721486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && "Bad modifiers used with 'c'!");
721586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Signed)
721686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.SignedCharTy;
721786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (Unsigned)
721886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.UnsignedCharTy;
721986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
722086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.CharTy;
722186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
722286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'b': // boolean
722386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!");
722486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.BoolTy;
722586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
722686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'z':  // size_t.
722786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!");
722886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getSizeType();
722986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
723086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'F':
723186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getCFConstantStringType();
723286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
7233ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian  case 'G':
7234ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    Type = Context.getObjCIdType();
7235ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    break;
7236ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian  case 'H':
7237ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    Type = Context.getObjCSelType();
7238ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    break;
7239f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  case 'M':
7240f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    Type = Context.getObjCSuperType();
7241f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    break;
724286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'a':
724386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getBuiltinVaListType();
724486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(!Type.isNull() && "builtin va list type not initialized!");
724586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
724686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'A':
724786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // This is a "reference" to a va_list; however, what exactly
724886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // this means depends on how va_list is defined. There are two
724986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // different kinds of va_list: ones passed by value, and ones
725086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // passed by reference.  An example of a by-value va_list is
725186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // x86, where va_list is a char*. An example of by-ref va_list
725286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // is x86-64, where va_list is a __va_list_tag[1]. For x86,
725386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // we want this argument to be a char*&; for x86-64, we want
725486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // it to be a __va_list_tag*.
725586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getBuiltinVaListType();
725686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(!Type.isNull() && "builtin va list type not initialized!");
725714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    if (Type->isArrayType())
725886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.getArrayDecayedType(Type);
725914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    else
726086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.getLValueReferenceType(Type);
726186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
726286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'V': {
726386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    char *End;
726486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    unsigned NumElements = strtoul(Str, &End, 10);
726586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(End != Str && "Missing vector size");
726686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Str = End;
72671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
726814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType ElementType = DecodeTypeFromStr(Str, Context, Error,
726914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                             RequiresICE, false);
727014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    assert(!RequiresICE && "Can't require vector ICE");
727133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner
727233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    // TODO: No way to make AltiVec vectors in builtins yet.
7273788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    Type = Context.getVectorType(ElementType, NumElements,
7274e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                 VectorType::GenericVector);
727586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
727686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
7277b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor  case 'E': {
7278b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    char *End;
7279b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7280b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    unsigned NumElements = strtoul(Str, &End, 10);
7281b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    assert(End != Str && "Missing vector size");
7282b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7283b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    Str = End;
7284b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7285b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
7286b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor                                             false);
7287b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    Type = Context.getExtVectorType(ElementType, NumElements);
7288b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    break;
7289b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor  }
7290d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor  case 'X': {
729114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
729214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                             false);
729314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    assert(!RequiresICE && "Can't require complex ICE");
7294d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor    Type = Context.getComplexType(ElementType);
7295d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor    break;
7296cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  }
7297cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  case 'Y' : {
7298cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian    Type = Context.getPointerDiffType();
7299cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian    break;
7300cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  }
73019a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner  case 'P':
7302c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor    Type = Context.getFILEType();
7303c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor    if (Type.isNull()) {
7304f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Error = ASTContext::GE_Missing_stdio;
730586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      return QualType();
730686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
7307fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    break;
73089a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner  case 'J':
7309f711c41dd9412a8182793259d355c4f6979ed5edMike Stump    if (Signed)
7310782fa308a765aeac2acb39c4e697c937ec21185bMike Stump      Type = Context.getsigjmp_bufType();
7311f711c41dd9412a8182793259d355c4f6979ed5edMike Stump    else
7312f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Type = Context.getjmp_bufType();
7313f711c41dd9412a8182793259d355c4f6979ed5edMike Stump
7314fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    if (Type.isNull()) {
7315f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Error = ASTContext::GE_Missing_setjmp;
7316fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump      return QualType();
7317fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    }
7318fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    break;
7319e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola  case 'K':
7320e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!");
7321e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    Type = Context.getucontext_tType();
7322e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola
7323e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    if (Type.isNull()) {
7324e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      Error = ASTContext::GE_Missing_ucontext;
7325e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      return QualType();
7326e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    }
7327e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    break;
73286902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman  case 'p':
73296902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman    Type = Context.getProcessIDType();
73306902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman    break;
7331782fa308a765aeac2acb39c4e697c937ec21185bMike Stump  }
73321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
733333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  // If there are modifiers and if we're allowed to parse them, go for it.
733433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  Done = !AllowTypeModifiers;
733586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (!Done) {
7336187ab37a05b8f7015b9f39cc8cd9129a0c6d0b48John McCall    switch (char c = *Str++) {
733733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    default: Done = true; --Str; break;
733833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case '*':
733933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case '&': {
734033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      // Both pointers and references can have their pointee types
734133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      // qualified with an address space.
734233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      char *End;
734333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      unsigned AddrSpace = strtoul(Str, &End, 10);
734433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      if (End != Str && AddrSpace != 0) {
734533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getAddrSpaceQualType(Type, AddrSpace);
734633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Str = End;
734733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      }
734833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      if (c == '*')
734933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getPointerType(Type);
735033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      else
735133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getLValueReferenceType(Type);
735233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
735333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    }
735433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    // FIXME: There's no way to have a built-in with an rvalue ref arg.
735533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case 'C':
735633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      Type = Type.withConst();
735733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
735833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case 'D':
735933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      Type = Context.getVolatileType(Type);
736033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
736118932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek    case 'R':
736218932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek      Type = Type.withRestrict();
736318932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek      break;
736486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
736586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
7366393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner
736714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  assert((!RequiresICE || Type->isIntegralOrEnumerationType()) &&
7368393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner         "Integer constant 'I' type must be an integer");
73691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
737086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  return Type;
737186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner}
737286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
737386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// GetBuiltinType - Return the type for the specified builtin.
737433daae66462e8f51ee153463b32bdefd60c801aaChris LattnerQualType ASTContext::GetBuiltinType(unsigned Id,
737514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                    GetBuiltinTypeError &Error,
73764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                    unsigned *IntegerConstantArgs) const {
737733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  const char *TypeStr = BuiltinInfo.GetTypeString(Id);
73781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<QualType, 8> ArgTypes;
73801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
738114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  bool RequiresICE = false;
738286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  Error = GE_None;
738314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error,
738414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                       RequiresICE, true);
738586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  if (Error != GE_None)
738686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    return QualType();
738714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
738814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE");
738914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
739086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (TypeStr[0] && TypeStr[0] != '.') {
739114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true);
739286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Error != GE_None)
739386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      return QualType();
739486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
739514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    // If this argument is required to be an IntegerConstantExpression and the
739614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    // caller cares, fill in the bitmask we return.
739714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    if (RequiresICE && IntegerConstantArgs)
739814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner      *IntegerConstantArgs |= 1 << ArgTypes.size();
739914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
740086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // Do array -> pointer decay.  The builtin should use the decayed type.
740186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Ty->isArrayType())
740286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Ty = getArrayDecayedType(Ty);
74031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
740486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    ArgTypes.push_back(Ty);
740586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
740686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
740786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  assert((TypeStr[0] != '.' || TypeStr[1] == 0) &&
740886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner         "'.' should only occur at end of builtin type list!");
740986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
741000ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  FunctionType::ExtInfo EI;
741100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true);
741200ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall
741300ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  bool Variadic = (TypeStr[0] == '.');
741400ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall
741500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  // We really shouldn't be making a no-proto type here, especially in C++.
741600ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  if (ArgTypes.empty() && Variadic)
741700ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall    return getFunctionNoProtoType(ResType, EI);
7418ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor
7419e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  FunctionProtoType::ExtProtoInfo EPI;
742000ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  EPI.ExtInfo = EI;
742100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  EPI.Variadic = Variadic;
7422e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
7423e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  return getFunctionType(ResType, ArgTypes.data(), ArgTypes.size(), EPI);
742486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner}
7425a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman
742690e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) {
742790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  GVALinkage External = GVA_StrongExternal;
742890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
742990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  Linkage L = FD->getLinkage();
743090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  switch (L) {
743190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case NoLinkage:
743290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case InternalLinkage:
743390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case UniqueExternalLinkage:
743490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_Internal;
743590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
743690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case ExternalLinkage:
743790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    switch (FD->getTemplateSpecializationKind()) {
743890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_Undeclared:
743990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitSpecialization:
744090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      External = GVA_StrongExternal;
744190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      break;
744290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
744390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDefinition:
744490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_ExplicitTemplateInstantiation;
744590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
744690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDeclaration:
744790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ImplicitInstantiation:
744890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      External = GVA_TemplateInstantiation;
744990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      break;
745090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
745190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
745290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
745390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (!FD->isInlined())
745490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return External;
745590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
74564e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getLangOpts().CPlusPlus || FD->hasAttr<GNUInlineAttr>()) {
745790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // GNU or C99 inline semantics. Determine whether this symbol should be
745890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // externally visible.
745990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (FD->isInlineDefinitionExternallyVisible())
746090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return External;
746190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
746290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // C99 inline semantics, where the symbol is not externally visible.
746390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_C99Inline;
746490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
746590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
746690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // C++0x [temp.explicit]p9:
746790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   [ Note: The intent is that an inline function that is the subject of
746890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   an explicit instantiation declaration will still be implicitly
746990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   instantiated when used so that the body can be considered for
747090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   inlining, but that no out-of-line copy of the inline function would be
747190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   generated in the translation unit. -- end note ]
747290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (FD->getTemplateSpecializationKind()
747390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis                                       == TSK_ExplicitInstantiationDeclaration)
747490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_C99Inline;
747590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
747690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  return GVA_CXXInline;
747790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
747890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
747990e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) {
748090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // If this is a static data member, compute the kind of template
748190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // specialization. Otherwise, this variable is not part of a
748290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // template.
748390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  TemplateSpecializationKind TSK = TSK_Undeclared;
748490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (VD->isStaticDataMember())
748590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    TSK = VD->getTemplateSpecializationKind();
748690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
748790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  Linkage L = VD->getLinkage();
748862a833eaebb1867d9950767288debdfa34dd8561Rafael Espindola  assert (!(L == ExternalLinkage && getLangOpts().CPlusPlus &&
748962a833eaebb1867d9950767288debdfa34dd8561Rafael Espindola            VD->getType()->getLinkage() == UniqueExternalLinkage));
749090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
749190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  switch (L) {
749290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case NoLinkage:
749390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case InternalLinkage:
749490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case UniqueExternalLinkage:
749590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_Internal;
749690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
749790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case ExternalLinkage:
749890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    switch (TSK) {
749990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_Undeclared:
750090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitSpecialization:
750190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_StrongExternal;
750290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
750390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDeclaration:
750490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      llvm_unreachable("Variable should not be instantiated");
750590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      // Fall through to treat this like any other instantiation.
750690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
750790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDefinition:
750890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_ExplicitTemplateInstantiation;
750990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
751090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ImplicitInstantiation:
751190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_TemplateInstantiation;
751290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
751390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
751490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
75157530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid Linkage!");
751690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
751790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
75184ac7c0bb39696e92fd220118fedc484c09a69870Argyrios Kyrtzidisbool ASTContext::DeclMustBeEmitted(const Decl *D) {
751990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
752090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (!VD->isFileVarDecl())
752190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return false;
7522144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis  } else if (!isa<FunctionDecl>(D))
752390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return false;
752490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
7525ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  // Weak references don't produce any output by themselves.
7526ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  if (D->hasAttr<WeakRefAttr>())
7527ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis    return false;
7528ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis
752990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // Aliases and used decls are required.
753090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>())
753190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return true;
753290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
753390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
753490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Forward declarations aren't required.
753510620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt    if (!FD->doesThisDeclarationHaveABody())
7536dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky      return FD->doesDeclarationForceExternallyVisibleDefinition();
753790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
753890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Constructors and destructors are required.
753990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>())
754090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return true;
754190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
754290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // The key function for a class is required.
754390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
754490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      const CXXRecordDecl *RD = MD->getParent();
754590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      if (MD->isOutOfLine() && RD->isDynamicClass()) {
754690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis        const CXXMethodDecl *KeyFunc = getKeyFunction(RD);
754790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis        if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl())
754890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis          return true;
754990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      }
755090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
755190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
755290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    GVALinkage Linkage = GetGVALinkageForFunction(FD);
755390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
755490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // static, static inline, always_inline, and extern inline functions can
755590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // always be deferred.  Normal inline functions can be deferred in C99/C++.
755690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Implicit template instantiations can also be deferred in C++.
755790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (Linkage == GVA_Internal  || Linkage == GVA_C99Inline ||
75583a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev        Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation)
755990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return false;
756090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return true;
756190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
756294da1587f7d584fc61df793229d197969f204cd9Douglas Gregor
756390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  const VarDecl *VD = cast<VarDecl>(D);
756490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  assert(VD->isFileVarDecl() && "Expected file scoped var");
756590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
7566ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly)
7567ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis    return false;
7568ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis
75695f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that can be needed in other TUs are required.
757090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  GVALinkage L = GetGVALinkageForVariable(VD);
75715f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (L != GVA_Internal && L != GVA_TemplateInstantiation)
75725f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
757390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
75745f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that have destruction with side-effects are required.
75755f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (VD->getType().isDestructedType())
75765f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
75775f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith
75785f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that have initialization with side-effects are required.
75795f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (VD->getInit() && VD->getInit()->HasSideEffects(*this))
75805f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
75815f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith
75825f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  return false;
758390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
7584071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
75858f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur IskhodzhanovCallingConv ASTContext::getDefaultCXXMethodCallConv(bool isVariadic) {
7586ee743f903858e337434ac0335f147f4de4ecae05Charles Davis  // Pass through to the C++ ABI object
75878f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  return ABI->getDefaultMethodCallConv(isVariadic);
75888f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov}
75898f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov
75908f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur IskhodzhanovCallingConv ASTContext::getCanonicalCallConv(CallingConv CC) const {
75918f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  if (CC == CC_C && !LangOpts.MRTD && getTargetInfo().getCXXABI() != CXXABI_Microsoft)
75928f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    return CC_Default;
75938f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  return CC;
7594ee743f903858e337434ac0335f147f4de4ecae05Charles Davis}
7595ee743f903858e337434ac0335f147f4de4ecae05Charles Davis
75964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const {
7597dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  // Pass through to the C++ ABI object
7598dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  return ABI->isNearlyEmpty(RD);
7599dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson}
7600dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson
760114110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *ASTContext::createMangleContext() {
7602bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  switch (Target->getCXXABI()) {
760314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case CXXABI_ARM:
760414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case CXXABI_Itanium:
760514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return createItaniumMangleContext(*this, getDiagnostics());
760614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case CXXABI_Microsoft:
760714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return createMicrosoftMangleContext(*this, getDiagnostics());
760814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
7609b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unsupported ABI");
761014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
761114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
7612071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI::~CXXABI() {}
7613ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek
7614ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremeneksize_t ASTContext::getSideTableAllocatedMemory() const {
76150c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek  return ASTRecordLayouts.getMemorySize()
76160c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(ObjCLayouts)
76170c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(KeyFunctions)
76180c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(ObjCImpls)
76190c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(BlockVarCopyInits)
76200c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(DeclAttrs)
76210c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromStaticDataMember)
76220c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUsingDecl)
76230c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl)
76240c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl)
76250c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(OverriddenMethods)
76260c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(Types)
7627af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet    + llvm::capacity_in_bytes(VariableArrayTypes)
76280d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet    + llvm::capacity_in_bytes(ClassScopeSpecializationPattern);
7629ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek}
7630d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek
763166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikievoid ASTContext::addUnnamedTag(const TagDecl *Tag) {
763266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  // FIXME: This mangling should be applied to function local classes too
763366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl() ||
763466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie      !isa<CXXRecordDecl>(Tag->getParent()) || Tag->getLinkage() != ExternalLinkage)
763566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    return;
763666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
763766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  std::pair<llvm::DenseMap<const DeclContext *, unsigned>::iterator, bool> P =
763866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    UnnamedMangleContexts.insert(std::make_pair(Tag->getParent(), 0));
763966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  UnnamedMangleNumbers.insert(std::make_pair(Tag, P.first->second++));
764066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
764166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
764266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikieint ASTContext::getUnnamedTagManglingNumber(const TagDecl *Tag) const {
764366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  llvm::DenseMap<const TagDecl *, unsigned>::const_iterator I =
764466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    UnnamedMangleNumbers.find(Tag);
764566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  return I != UnnamedMangleNumbers.end() ? I->second : -1;
764666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
764766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
76489e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorunsigned ASTContext::getLambdaManglingNumber(CXXMethodDecl *CallOperator) {
76499e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  CXXRecordDecl *Lambda = CallOperator->getParent();
76509e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  return LambdaMangleContexts[Lambda->getDeclContext()]
76519e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor           .getManglingNumber(CallOperator);
76529e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor}
76539e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
76549e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
7655d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekvoid ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) {
7656d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  ParamIndices[D] = index;
7657d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek}
7658d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek
7659d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekunsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const {
7660d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  ParameterIndexTable::const_iterator I = ParamIndices.find(D);
7661d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  assert(I != ParamIndices.end() &&
7662d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek         "ParmIndices lacks entry set by ParmVarDecl");
7663d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  return I->second;
7664d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek}
7665