ASTContext.cpp revision 23799e3ec4b341753e4fb63a7e995cf4ac3b6066
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);
41923799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian      if (OMD && OMD->isPropertyAccessor())
42023799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian        if (const ObjCPropertyDecl *PDecl = OMD->findPropertyDecl())
42123799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian          if (comments::FullComment *FC = getCommentForDecl(PDecl, PP))
42223799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian            return cloneFullComment(FC, D);
423c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian      if (OMD)
4241e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko        addRedeclaredMethods(OMD, Overridden);
4251e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko      getOverriddenMethods(dyn_cast<NamedDecl>(D), Overridden);
42623799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian      for (unsigned i = 0, e = Overridden.size(); i < e; i++)
42723799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian        if (comments::FullComment *FC = getCommentForDecl(Overridden[i], PP))
42823799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian          return cloneFullComment(FC, D);
429bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    }
43041170b55ba635afb806394d44f2b7f1f6095df37Fariborz Jahanian    else if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
43123799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian      // Attach enum's documentation to its typedef if latter
43223799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian      // does not have one of its own.
43341170b55ba635afb806394d44f2b7f1f6095df37Fariborz Jahanian      QualType QT = TD->getUnderlyingType();
43423799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian      if (const EnumType *ET = QT->getAs<EnumType>())
43541170b55ba635afb806394d44f2b7f1f6095df37Fariborz Jahanian        if (const EnumDecl *ED = ET->getDecl())
43623799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian          if (comments::FullComment *FC = getCommentForDecl(ED, PP))
43723799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian            return cloneFullComment(FC, D);
43841170b55ba635afb806394d44f2b7f1f6095df37Fariborz Jahanian    }
4398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    return NULL;
440bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  }
441bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
4424b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // If the RawComment was attached to other redeclaration of this Decl, we
4434b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // should parse the comment in context of that other Decl.  This is important
4444b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // because comments can contain references to parameter names which can be
4454b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // different across redeclarations.
4461599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  if (D != OriginalDecl)
4471952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    return getCommentForDecl(OriginalDecl, PP);
4481599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko
4491952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  comments::FullComment *FC = RC->parse(*this, PP, D);
450c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  ParsedComments[Canonical] = FC;
451c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  return FC;
4528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
4538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
4543e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregorvoid
4553e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,
4563e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TemplateTemplateParmDecl *Parm) {
4573e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Parm->getDepth());
4583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Parm->getPosition());
45961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  ID.AddBoolean(Parm->isParameterPack());
4603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
4613e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateParameterList *Params = Parm->getTemplateParameters();
4623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Params->size());
4633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  for (TemplateParameterList::const_iterator P = Params->begin(),
4643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                          PEnd = Params->end();
4653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor       P != PEnd; ++P) {
4663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
4673e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddInteger(0);
4683e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddBoolean(TTP->isParameterPack());
4693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      continue;
4703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    }
4713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
4723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
4733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddInteger(1);
47461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor      ID.AddBoolean(NTTP->isParameterPack());
4759e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman      ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr());
4766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->isExpandedParameterPack()) {
4776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddBoolean(true);
4786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddInteger(NTTP->getNumExpansionTypes());
4799e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman        for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
4809e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman          QualType T = NTTP->getExpansionType(I);
4819e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman          ID.AddPointer(T.getCanonicalType().getAsOpaquePtr());
4829e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman        }
4836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      } else
4846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddBoolean(false);
4853e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      continue;
4863e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    }
4873e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
4883e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P);
4893e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    ID.AddInteger(2);
4903e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    Profile(ID, TTP);
4913e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
4923e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor}
4933e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
4943e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorTemplateTemplateParmDecl *
4953e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::getCanonicalTemplateTemplateParmDecl(
4964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          TemplateTemplateParmDecl *TTP) const {
4973e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Check if we already have a canonical template template parameter.
4983e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  llvm::FoldingSetNodeID ID;
4993e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonicalTemplateTemplateParm::Profile(ID, TTP);
5003e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  void *InsertPos = 0;
5013e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonicalTemplateTemplateParm *Canonical
5023e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
5033e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  if (Canonical)
5043e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    return Canonical->getParam();
5053e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5063e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Build a canonical template parameter list.
5073e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateParameterList *Params = TTP->getTemplateParameters();
5085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<NamedDecl *, 4> CanonParams;
5093e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonParams.reserve(Params->size());
5103e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  for (TemplateParameterList::const_iterator P = Params->begin(),
5113e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                          PEnd = Params->end();
5123e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor       P != PEnd; ++P) {
5133e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P))
5143e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      CanonParams.push_back(
5153e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                  TemplateTypeParmDecl::Create(*this, getTranslationUnitDecl(),
516344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               SourceLocation(),
517344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               SourceLocation(),
518344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               TTP->getDepth(),
5193e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TTP->getIndex(), 0, false,
5203e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TTP->isParameterPack()));
5213e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    else if (NonTypeTemplateParmDecl *NTTP
5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor             = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
5236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      QualType T = getCanonicalType(NTTP->getType());
5246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T);
5256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      NonTypeTemplateParmDecl *Param;
5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->isExpandedParameterPack()) {
5275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        SmallVector<QualType, 2> ExpandedTypes;
5285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        SmallVector<TypeSourceInfo *, 2> ExpandedTInfos;
5296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
5306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I)));
5316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          ExpandedTInfos.push_back(
5326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                getTrivialTypeSourceInfo(ExpandedTypes.back()));
5336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        }
5346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
536ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
537ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getDepth(),
5396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getPosition(), 0,
5406952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                T,
5416952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TInfo,
5426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTypes.data(),
5436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTypes.size(),
5446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTInfos.data());
5456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      } else {
5466952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
547ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
548ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
5496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getDepth(),
5506952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getPosition(), 0,
5516952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                T,
5526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->isParameterPack(),
5536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TInfo);
5546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      }
5556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      CanonParams.push_back(Param);
5566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else
5583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      CanonParams.push_back(getCanonicalTemplateTemplateParmDecl(
5593e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                           cast<TemplateTemplateParmDecl>(*P)));
5603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
5613e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateTemplateParmDecl *CanonTTP
5633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
5643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                       SourceLocation(), TTP->getDepth(),
56561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       TTP->getPosition(),
56661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       TTP->isParameterPack(),
56761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       0,
5683e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                         TemplateParameterList::Create(*this, SourceLocation(),
5693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       SourceLocation(),
5703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       CanonParams.data(),
5713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       CanonParams.size(),
5723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       SourceLocation()));
5733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Get the new insert position for the node we care about.
5753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
5763e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  assert(Canonical == 0 && "Shouldn't be in the map!");
5773e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  (void)Canonical;
5783e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Create the canonical template template parameter entry.
5803e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP);
5813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
5823e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  return CanonTTP;
5833e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor}
5843e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
585071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *ASTContext::createCXXABI(const TargetInfo &T) {
586ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall  if (!LangOpts.CPlusPlus) return 0;
587ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall
588b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  switch (T.getCXXABI().getKind()) {
589b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::GenericARM:
590b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::iOS:
591ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall    return CreateARMCXXABI(*this);
592b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::GenericItanium:
593071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    return CreateItaniumCXXABI(*this);
594b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::Microsoft:
59520cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis    return CreateMicrosoftCXXABI(*this);
59620cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis  }
5977530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid CXXABI type!");
598071cc7deffad608165b1ddd5263e8bf181861520Charles Davis}
599071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
600bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorstatic const LangAS::Map *getAddressSpaceMap(const TargetInfo &T,
601207f4d8543529221932af82836016a2ef066c917Peter Collingbourne                                             const LangOptions &LOpts) {
602207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  if (LOpts.FakeAddressSpaceMap) {
603207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    // The fake address space map must have a distinct entry for each
604207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    // language-specific address space.
605207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    static const unsigned FakeAddrSpaceMap[] = {
606207f4d8543529221932af82836016a2ef066c917Peter Collingbourne      1, // opencl_global
607207f4d8543529221932af82836016a2ef066c917Peter Collingbourne      2, // opencl_local
6084dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      3, // opencl_constant
6094dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      4, // cuda_device
6104dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      5, // cuda_constant
6114dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      6  // cuda_shared
612207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    };
613bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    return &FakeAddrSpaceMap;
614207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  } else {
615bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    return &T.getAddressSpaceMap();
616207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  }
617207f4d8543529221932af82836016a2ef066c917Peter Collingbourne}
618207f4d8543529221932af82836016a2ef066c917Peter Collingbourne
6193e3cd93b2fd9644e970c389e715c13883faf68b6Douglas GregorASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM,
620bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       const TargetInfo *t,
621e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar                       IdentifierTable &idents, SelectorTable &sels,
6221b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner                       Builtin::Context &builtins,
623bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       unsigned size_reserve,
624bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       bool DelayInitialization)
625bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  : FunctionProtoTypes(this_()),
626bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    TemplateSpecializationTypes(this_()),
627bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    DependentTemplateSpecializationTypes(this_()),
628bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    SubstTemplateTemplateParmPacks(this_()),
629bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    GlobalNestedNameSpecifier(0),
630bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Int128Decl(0), UInt128Decl(0),
631c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    BuiltinVaListDecl(0),
632a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    ObjCIdDecl(0), ObjCSelDecl(0), ObjCClassDecl(0), ObjCProtocolClassDecl(0),
633961713055e636170da59d7006a878cb4ba518a5dFariborz Jahanian    BOOLDecl(0),
634e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor    CFConstantStringTypeDecl(0), ObjCInstanceTypeDecl(0),
635bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    FILEDecl(0),
636e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    jmp_bufDecl(0), sigjmp_bufDecl(0), ucontext_tDecl(0),
637e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    BlockDescriptorType(0), BlockDescriptorExtendedType(0),
638e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    cudaConfigureCallDecl(0),
639e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    NullTypeSourceInfo(QualType()),
640e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    FirstLocalImport(), LastLocalImport(),
641bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    SourceMgr(SM), LangOpts(LOpts),
64230c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor    AddrSpaceMap(0), Target(t), PrintingPolicy(LOpts),
643bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Idents(idents), Selectors(sels),
644bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    BuiltinInfo(builtins),
645bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    DeclarationNames(*this),
64630c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor    ExternalSource(0), Listener(0),
647aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    Comments(SM), CommentsLoaded(false),
648e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko    CommentCommandTraits(BumpAlloc),
649bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    LastSDM(0, 0),
650f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    UniqueBlockByRefTypeID(0)
651bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor{
6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (size_reserve > 0) Types.reserve(size_reserve);
653e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar  TUDecl = TranslationUnitDecl::Create(*this);
654bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
655bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  if (!DelayInitialization) {
656bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    assert(t && "No target supplied for ASTContext initialization");
657bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    InitBuiltinTypes(*t);
658bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  }
659e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar}
660e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar
6615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext::~ASTContext() {
6623478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  // Release the DenseMaps associated with DeclContext objects.
6633478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  // FIXME: Is this the ideal solution?
6643478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  ReleaseDeclContextMaps();
6657d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
66663fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  // Call all of the deallocation functions.
66763fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  for (unsigned I = 0, N = Deallocations.size(); I != N; ++I)
66863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    Deallocations[I].first(Deallocations[I].second);
6690054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
670dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed
67163fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  // because they can contain DenseMaps.
67263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  for (llvm::DenseMap<const ObjCContainerDecl*,
67363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor       const ASTRecordLayout*>::iterator
67463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor       I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; )
67563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    // Increment in loop to prevent using deallocated memory.
67663fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
67763fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor      R->Destroy(*this);
67863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor
679dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
680dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek       I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
681dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek    // Increment in loop to prevent using deallocated memory.
682dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek    if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
683dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek      R->Destroy(*this);
684dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  }
6856320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
6866320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
6876320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor                                                    AEnd = DeclAttrs.end();
6886320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor       A != AEnd; ++A)
6896320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    A->second->~AttrVec();
6906320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
691ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
6920054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) {
6930054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  Deallocations.push_back(std::make_pair(Callback, Data));
6940054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
6950054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
6976f42b62b6194f53bcbc349f5d17388e1936535d7Dylan NoblesmithASTContext::setExternalSource(OwningPtr<ExternalASTSource> &Source) {
6982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ExternalSource.reset(Source.take());
6992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
7002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
7015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ASTContext::PrintStats() const {
702cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "\n*** AST Context Stats:\n";
703cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "  " << Types.size() << " types total.\n";
7047c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
705dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned counts[] = {
7061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define TYPE(Name, Parent) 0,
707dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent)
708dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def"
709dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor    0 // Extra
710dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  };
711c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor
7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Types.size(); i != e; ++i) {
7135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Type *T = Types[i];
714dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor    counts[(unsigned)T->getTypeClass()]++;
7155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
717dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned Idx = 0;
718dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned TotalBytes = 0;
719dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define TYPE(Name, Parent)                                              \
720dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  if (counts[Idx])                                                      \
721cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << "    " << counts[Idx] << " " << #Name               \
722cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " types\n";                                         \
723dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  TotalBytes += counts[Idx] * sizeof(Name##Type);                       \
724dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  ++Idx;
725dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent)
726dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def"
7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
728cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "Total bytes = " << TotalBytes << "\n";
729cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
7304923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor  // Implicit special member functions.
731cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/"
732cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitDefaultConstructors
733cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit default constructors created\n";
734cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitCopyConstructorsDeclared << "/"
735cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitCopyConstructors
736cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit copy constructors created\n";
7374e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
738cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << NumImplicitMoveConstructorsDeclared << "/"
739cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << NumImplicitMoveConstructors
740cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " implicit move constructors created\n";
741cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/"
742cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitCopyAssignmentOperators
743cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit copy assignment operators created\n";
7444e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
745cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/"
746cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << NumImplicitMoveAssignmentOperators
747cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " implicit move assignment operators created\n";
748cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitDestructorsDeclared << "/"
749cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitDestructors
750cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit destructors created\n";
751cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
7522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  if (ExternalSource.get()) {
753cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << "\n";
7542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    ExternalSource->PrintStats();
7552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
756cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
75763fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  BumpAlloc.PrintStats();
7585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
760772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getInt128Decl() const {
761772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (!Int128Decl) {
762772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(Int128Ty);
763772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    Int128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
764772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     getTranslationUnitDecl(),
765772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
766772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
767772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     &Idents.get("__int128_t"),
768772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     TInfo);
769772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  }
770772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
771772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  return Int128Decl;
772772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor}
773772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
774772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getUInt128Decl() const {
775772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (!UInt128Decl) {
776772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(UnsignedInt128Ty);
777772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    UInt128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
778772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     getTranslationUnitDecl(),
779772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
780772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
781772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     &Idents.get("__uint128_t"),
782772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     TInfo);
783772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  }
784772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
785772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  return UInt128Decl;
786772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor}
7875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
788e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallvoid ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) {
7896b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K);
790e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall  R = CanQualType::CreateUnsafe(QualType(Ty, 0));
7916b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  Types.push_back(Ty);
7925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
794bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorvoid ASTContext::InitBuiltinTypes(const TargetInfo &Target) {
795bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  assert((!this->Target || this->Target == &Target) &&
796bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor         "Incorrect target reinitialization");
7975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(VoidTy.isNull() && "Context reinitialized?");
7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
799bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  this->Target = &Target;
800bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
801bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  ABI.reset(createCXXABI(Target));
802bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  AddrSpaceMap = getAddressSpaceMap(Target, LangOpts);
803bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
8045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p19.
8055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(VoidTy,              BuiltinType::Void);
8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p2.
8085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(BoolTy,              BuiltinType::Bool);
8095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p3.
81015b91764d08e886391c865c4a444d7b51141c284Eli Friedman  if (LangOpts.CharIsSigned)
8115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InitBuiltinType(CharTy,            BuiltinType::Char_S);
8125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
8135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InitBuiltinType(CharTy,            BuiltinType::Char_U);
8145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p4.
8155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(SignedCharTy,        BuiltinType::SChar);
8165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(ShortTy,             BuiltinType::Short);
8175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(IntTy,               BuiltinType::Int);
8185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongTy,              BuiltinType::Long);
8195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongLongTy,          BuiltinType::LongLong);
8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p6.
8225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedCharTy,      BuiltinType::UChar);
8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedShortTy,     BuiltinType::UShort);
8245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedIntTy,       BuiltinType::UInt);
8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedLongTy,      BuiltinType::ULong);
8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedLongLongTy,  BuiltinType::ULongLong);
8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p10.
8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(FloatTy,             BuiltinType::Float);
8305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(DoubleTy,            BuiltinType::Double);
8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongDoubleTy,        BuiltinType::LongDouble);
83264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
8332df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  // GNU extension, 128-bit integers.
8342df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  InitBuiltinType(Int128Ty,            BuiltinType::Int128);
8352df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  InitBuiltinType(UnsignedInt128Ty,    BuiltinType::UInt128);
8362df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner
837e75bb61f1b876afaa6b2f4a2b860c2889ea1d050Abramo Bagnara  if (LangOpts.CPlusPlus && LangOpts.WChar) { // C++ 3.9.1p5
838d3d77cd138f8e830f6547b6f83fcd5721ccf5f5dEli Friedman    if (TargetInfo::isTypeSigned(Target.getWCharType()))
8393f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner      InitBuiltinType(WCharTy,           BuiltinType::WChar_S);
8403f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    else  // -fshort-wchar makes wchar_t be unsigned.
8413f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner      InitBuiltinType(WCharTy,           BuiltinType::WChar_U);
842e75bb61f1b876afaa6b2f4a2b860c2889ea1d050Abramo Bagnara  } else // C99 (or C++ using -fno-wchar)
8433a2503227c3db04a3619735127483263c1075ef7Chris Lattner    WCharTy = getFromTargetType(Target.getWCharType());
84464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
845392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy  WIntTy = getFromTargetType(Target.getWIntType());
846392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy
847f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
848f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    InitBuiltinType(Char16Ty,           BuiltinType::Char16);
849f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  else // C99
850f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    Char16Ty = getFromTargetType(Target.getChar16Type());
851f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
852f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
853f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    InitBuiltinType(Char32Ty,           BuiltinType::Char32);
854f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  else // C99
855f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    Char32Ty = getFromTargetType(Target.getChar32Type());
856f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
857898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // Placeholder type for type-dependent expressions whose type is
858898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // completely unknown. No code should ever check a type against
859898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // DependentTy and users should never see it; however, it is here to
860898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // help diagnose failures to properly check for type-dependent
861898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // expressions.
862898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  InitBuiltinType(DependentTy,         BuiltinType::Dependent);
8638e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor
8642a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  // Placeholder type for functions.
8652a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  InitBuiltinType(OverloadTy,          BuiltinType::Overload);
8662a984cad5ac3fdceeff2bd99daa7b90979313475John McCall
867864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  // Placeholder type for bound members.
868864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  InitBuiltinType(BoundMemberTy,       BuiltinType::BoundMember);
869864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
8703c3b7f90a863af43fa63043d396553ecf205351cJohn McCall  // Placeholder type for pseudo-objects.
8713c3b7f90a863af43fa63043d396553ecf205351cJohn McCall  InitBuiltinType(PseudoObjectTy,      BuiltinType::PseudoObject);
8723c3b7f90a863af43fa63043d396553ecf205351cJohn McCall
8731de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall  // "any" type; useful for debugger-like clients.
8741de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall  InitBuiltinType(UnknownAnyTy,        BuiltinType::UnknownAny);
8751de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall
8760ddaeb9b031070ec64afe92d9892875ac44df427John McCall  // Placeholder type for unbridged ARC casts.
8770ddaeb9b031070ec64afe92d9892875ac44df427John McCall  InitBuiltinType(ARCUnbridgedCastTy,  BuiltinType::ARCUnbridgedCast);
8780ddaeb9b031070ec64afe92d9892875ac44df427John McCall
879a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  // Placeholder type for builtin functions.
880a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  InitBuiltinType(BuiltinFnTy,  BuiltinType::BuiltinFn);
881a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman
8825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p11.
8835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  FloatComplexTy      = getComplexType(FloatTy);
8845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DoubleComplexTy     = getComplexType(DoubleTy);
8855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LongDoubleComplexTy = getComplexType(LongDoubleTy);
8868e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor
88713dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian  // Builtin types for 'id', 'Class', and 'SEL'.
888de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId);
889de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
89013dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian  InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
891b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei
892b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  if (LangOpts.OpenCL) {
893b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dTy, BuiltinType::OCLImage1d);
894b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dArrayTy, BuiltinType::OCLImage1dArray);
895b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dBufferTy, BuiltinType::OCLImage1dBuffer);
896b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage2dTy, BuiltinType::OCLImage2d);
897b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage2dArrayTy, BuiltinType::OCLImage2dArray);
898b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage3dTy, BuiltinType::OCLImage3d);
899e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei
900e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei    InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
901b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  }
902ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
903ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  // Builtin type for __objc_yes and __objc_no
90493a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian  ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ?
90593a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian                       SignedCharTy : BoolTy);
906ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
907a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCConstantStringType = QualType();
908f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian
909f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  ObjCSuperType = QualType();
9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
91133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // void * type
91233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  VoidPtrTy = getPointerType(VoidTy);
9136e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
9146e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // nullptr type (C++0x 2.14.7)
9156e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  InitBuiltinType(NullPtrTy,           BuiltinType::NullPtr);
916aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov
917aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  // half type (OpenCL 6.1.1.1) / ARM NEON __fp16
918aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  InitBuiltinType(HalfTy, BuiltinType::Half);
919fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
920fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // Builtin type used to help define __builtin_va_list.
921fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  VaListTagTy = QualType();
9225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
924d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikieDiagnosticsEngine &ASTContext::getDiagnostics() const {
92578a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  return SourceMgr.getDiagnostics();
92678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis}
92778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
9286320064d0c60fa8683f5623881c9394fd4aa7689Douglas GregorAttrVec& ASTContext::getDeclAttrs(const Decl *D) {
9296320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  AttrVec *&Result = DeclAttrs[D];
9306320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  if (!Result) {
9316320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    void *Mem = Allocate(sizeof(AttrVec));
9326320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    Result = new (Mem) AttrVec;
9336320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  }
9346320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
9356320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  return *Result;
9366320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
9376320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
9386320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor/// \brief Erase the attributes corresponding to the given declaration.
9396320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregorvoid ASTContext::eraseDeclAttrs(const Decl *D) {
9406320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
9416320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  if (Pos != DeclAttrs.end()) {
9426320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    Pos->second->~AttrVec();
9436320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    DeclAttrs.erase(Pos);
9446320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  }
9456320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
9466320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
947251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorMemberSpecializationInfo *
948663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas GregorASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) {
9497caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Var->isStaticDataMember() && "Not a static data member");
950663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor  llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos
9517caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    = InstantiatedFromStaticDataMember.find(Var);
9527caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  if (Pos == InstantiatedFromStaticDataMember.end())
9537caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    return 0;
9541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9557caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  return Pos->second;
9567caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor}
9577caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor
9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
959251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl,
9609421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis                                                TemplateSpecializationKind TSK,
9619421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis                                          SourceLocation PointOfInstantiation) {
9627caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Inst->isStaticDataMember() && "Not a static data member");
9637caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Tmpl->isStaticDataMember() && "Not a static data member");
9647caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(!InstantiatedFromStaticDataMember[Inst] &&
9657caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor         "Already noted what static data member was instantiated from");
966251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor  InstantiatedFromStaticDataMember[Inst]
9679421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    = new (*this) MemberSpecializationInfo(Tmpl, TSK, PointOfInstantiation);
9687caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor}
9697caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor
970af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetFunctionDecl *ASTContext::getClassScopeSpecializationPattern(
971af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet                                                     const FunctionDecl *FD){
972af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(FD && "Specialization is 0");
973af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  llvm::DenseMap<const FunctionDecl*, FunctionDecl *>::const_iterator Pos
9740d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet    = ClassScopeSpecializationPattern.find(FD);
9750d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet  if (Pos == ClassScopeSpecializationPattern.end())
976af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet    return 0;
977af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
978af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  return Pos->second;
979af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet}
980af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
981af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichetvoid ASTContext::setClassScopeSpecializationPattern(FunctionDecl *FD,
982af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet                                        FunctionDecl *Pattern) {
983af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(FD && "Specialization is 0");
984af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(Pattern && "Class scope specialization pattern is 0");
9850d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet  ClassScopeSpecializationPattern[FD] = Pattern;
986af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet}
987af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
9887ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallNamedDecl *
989ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) {
9907ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall  llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos
991ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    = InstantiatedFromUsingDecl.find(UUD);
992ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (Pos == InstantiatedFromUsingDecl.end())
9930d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    return 0;
9941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9950d8df780aef1acda5962347a32591efc629b6748Anders Carlsson  return Pos->second;
9960d8df780aef1acda5962347a32591efc629b6748Anders Carlsson}
9970d8df780aef1acda5962347a32591efc629b6748Anders Carlsson
9980d8df780aef1acda5962347a32591efc629b6748Anders Carlssonvoid
999ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) {
1000ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert((isa<UsingDecl>(Pattern) ||
1001ed97649e9574b9d854fa4d6109c9333ae0993554John McCall          isa<UnresolvedUsingValueDecl>(Pattern) ||
1002ed97649e9574b9d854fa4d6109c9333ae0993554John McCall          isa<UnresolvedUsingTypenameDecl>(Pattern)) &&
1003ed97649e9574b9d854fa4d6109c9333ae0993554John McCall         "pattern decl is not a using decl");
1004ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists");
1005ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  InstantiatedFromUsingDecl[Inst] = Pattern;
1006ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
1007ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1008ed97649e9574b9d854fa4d6109c9333ae0993554John McCallUsingShadowDecl *
1009ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) {
1010ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos
1011ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    = InstantiatedFromUsingShadowDecl.find(Inst);
1012ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (Pos == InstantiatedFromUsingShadowDecl.end())
1013ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return 0;
1014ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1015ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Pos->second;
1016ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
1017ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1018ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid
1019ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst,
1020ed97649e9574b9d854fa4d6109c9333ae0993554John McCall                                               UsingShadowDecl *Pattern) {
1021ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists");
1022ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  InstantiatedFromUsingShadowDecl[Inst] = Pattern;
10230d8df780aef1acda5962347a32591efc629b6748Anders Carlsson}
10240d8df780aef1acda5962347a32591efc629b6748Anders Carlsson
1025d8b285fee4471f393da8ee30f552ceacdc362afaAnders CarlssonFieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) {
1026d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos
1027d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    = InstantiatedFromUnnamedFieldDecl.find(Field);
1028d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  if (Pos == InstantiatedFromUnnamedFieldDecl.end())
1029d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    return 0;
10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1031d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  return Pos->second;
1032d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson}
1033d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson
1034d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlssonvoid ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst,
1035d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                                     FieldDecl *Tmpl) {
1036d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed");
1037d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!Tmpl->getDeclName() && "Template field decl is not unnamed");
1038d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1039d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson         "Already noted what unnamed field was instantiated from");
10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1041d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1042d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson}
1043d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson
104414d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanianbool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD,
104514d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian                                    const FieldDecl *LastFD) const {
104614d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian  return (FD->isBitField() && LastFD && !LastFD->isBitField() &&
1047a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) == 0);
104814d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian}
104914d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian
1050340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanianbool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD,
1051340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian                                             const FieldDecl *LastFD) const {
1052340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian  return (FD->isBitField() && LastFD && LastFD->isBitField() &&
1053a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) == 0 &&
1054a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this) != 0);
1055340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian}
1056340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian
10579b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanianbool ASTContext::BitfieldFollowsBitfield(const FieldDecl *FD,
10589b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian                                         const FieldDecl *LastFD) const {
10599b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian  return (FD->isBitField() && LastFD && LastFD->isBitField() &&
1060a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) &&
1061a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this));
10629b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian}
10639b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian
1064dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::NonBitfieldFollowsBitfield(const FieldDecl *FD,
106552bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian                                         const FieldDecl *LastFD) const {
106652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian  return (!FD->isBitField() && LastFD && LastFD->isBitField() &&
1067a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this));
106852bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian}
106952bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian
1070dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::BitfieldFollowsNonBitfield(const FieldDecl *FD,
107152bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian                                             const FieldDecl *LastFD) const {
107252bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian  return (FD->isBitField() && LastFD && !LastFD->isBitField() &&
1073a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this));
107452bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian}
107552bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian
10767d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator
10777d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const {
10787d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
107938eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
10807d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  if (Pos == OverriddenMethods.end())
10817d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor    return 0;
10827d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
10837d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  return Pos->second.begin();
10847d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
10857d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
10867d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator
10877d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_end(const CXXMethodDecl *Method) const {
10887d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
108938eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
10907d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  if (Pos == OverriddenMethods.end())
10917d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor    return 0;
10927d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
10937d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  return Pos->second.end();
10947d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
10957d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
1096c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned
1097c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios KyrtzidisASTContext::overridden_methods_size(const CXXMethodDecl *Method) const {
1098c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
109938eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
1100c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pos == OverriddenMethods.end())
1101c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    return 0;
1102c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis
1103c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  return Pos->second.size();
1104c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis}
1105c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis
11067d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregorvoid ASTContext::addOverriddenMethod(const CXXMethodDecl *Method,
11077d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor                                     const CXXMethodDecl *Overridden) {
110838eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis  assert(Method->isCanonicalDecl() && Overridden->isCanonicalDecl());
11097d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  OverriddenMethods[Method].push_back(Overridden);
11107d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
11117d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
11121e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenkovoid ASTContext::getOverriddenMethods(
11131e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko                      const NamedDecl *D,
11141e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko                      SmallVectorImpl<const NamedDecl *> &Overridden) const {
111521c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  assert(D);
111621c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
111721c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  if (const CXXMethodDecl *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1118bc0a2bb8dc122f8daae890ec82cecfe2054859ebArgyrios Kyrtzidis    Overridden.append(CXXMethod->begin_overridden_methods(),
1119bc0a2bb8dc122f8daae890ec82cecfe2054859ebArgyrios Kyrtzidis                      CXXMethod->end_overridden_methods());
112021c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis    return;
112121c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  }
112221c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
112321c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D);
112421c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  if (!Method)
112521c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis    return;
112621c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
1127740ae67dbf8dac44dbc8d6593a60f4f37a0a2aa5Argyrios Kyrtzidis  SmallVector<const ObjCMethodDecl *, 8> OverDecls;
1128740ae67dbf8dac44dbc8d6593a60f4f37a0a2aa5Argyrios Kyrtzidis  Method->getOverriddenMethods(OverDecls);
1129bc0a2bb8dc122f8daae890ec82cecfe2054859ebArgyrios Kyrtzidis  Overridden.append(OverDecls.begin(), OverDecls.end());
113021c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis}
113121c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
1132e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregorvoid ASTContext::addedLocalImportDecl(ImportDecl *Import) {
1133e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  assert(!Import->NextLocalImport && "Import declaration already in the chain");
1134e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  assert(!Import->isFromASTFile() && "Non-local import declaration");
1135e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  if (!FirstLocalImport) {
1136e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    FirstLocalImport = Import;
1137e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    LastLocalImport = Import;
1138e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    return;
1139e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  }
1140e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor
1141e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  LastLocalImport->NextLocalImport = Import;
1142e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  LastLocalImport = Import;
1143e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor}
1144e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor
1145464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===//
1146464175bba1318bef7905122e9fda20cff926df78Chris Lattner//                         Type Sizing and Analysis
1147464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===//
1148a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
1149b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified
1150b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// scalar floating point type.
1151b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattnerconst llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
1152183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const BuiltinType *BT = T->getAs<BuiltinType>();
1153b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  assert(BT && "Not a floating point type!");
1154b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  switch (BT->getKind()) {
1155b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Not a floating point type!");
1156aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case BuiltinType::Half:       return Target->getHalfFormat();
1157bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::Float:      return Target->getFloatFormat();
1158bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::Double:     return Target->getDoubleFormat();
1159bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::LongDouble: return Target->getLongDoubleFormat();
1160b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  }
1161b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner}
1162b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
11638b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck/// getDeclAlign - Return a conservative estimate of the alignment of the
1164af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// specified decl.  Note that bitfields do not have a valid alignment, so
1165af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// this method will assert on them.
11665d484e8cf710207010720589d89602233de61d01Sebastian Redl/// If @p RefAsPointee, references are treated like their underlying type
11675d484e8cf710207010720589d89602233de61d01Sebastian Redl/// (for alignof), else they're treated like pointers (for CodeGen).
11684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const {
1169bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  unsigned Align = Target->getCharWidth();
1170dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
11714081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  bool UseAlignAttrOnly = false;
11724081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  if (unsigned AlignFromAttr = D->getMaxAlignment()) {
11734081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    Align = AlignFromAttr;
11744081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall
11754081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // __attribute__((aligned)) can increase or decrease alignment
11764081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // *except* on a struct or struct member, where it only increases
11774081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // alignment unless 'packed' is also specified.
11784081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    //
117982d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne    // It is an error for alignas to decrease alignment, so we can
11804081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // ignore that possibility;  Sema should diagnose it.
11814081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    if (isa<FieldDecl>(D)) {
11824081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall      UseAlignAttrOnly = D->hasAttr<PackedAttr>() ||
11834081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall        cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
11844081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    } else {
11854081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall      UseAlignAttrOnly = true;
11864081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    }
11874081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  }
118878a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian  else if (isa<FieldDecl>(D))
118978a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian      UseAlignAttrOnly =
119078a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian        D->hasAttr<PackedAttr>() ||
119178a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian        cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
1192dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
1193ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall  // If we're using the align attribute only, just ignore everything
1194ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall  // else about the declaration and its type.
11954081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  if (UseAlignAttrOnly) {
1196ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // do nothing
1197ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
11984081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  } else if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
1199af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner    QualType T = VD->getType();
12006217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    if (const ReferenceType* RT = T->getAs<ReferenceType>()) {
12015d484e8cf710207010720589d89602233de61d01Sebastian Redl      if (RefAsPointee)
12025d484e8cf710207010720589d89602233de61d01Sebastian Redl        T = RT->getPointeeType();
12035d484e8cf710207010720589d89602233de61d01Sebastian Redl      else
12045d484e8cf710207010720589d89602233de61d01Sebastian Redl        T = getPointerType(RT->getPointeeType());
12055d484e8cf710207010720589d89602233de61d01Sebastian Redl    }
12065d484e8cf710207010720589d89602233de61d01Sebastian Redl    if (!T->isIncompleteType() && !T->isFunctionType()) {
12073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      // Adjust alignments of declarations with array type by the
12083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      // large-array alignment on the target.
1209bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      unsigned MinWidth = Target->getLargeArrayMinWidth();
12103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      const ArrayType *arrayType;
12113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      if (MinWidth && (arrayType = getAsArrayType(T))) {
12123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        if (isa<VariableArrayType>(arrayType))
1213bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor          Align = std::max(Align, Target->getLargeArrayAlign());
12143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        else if (isa<ConstantArrayType>(arrayType) &&
12153b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                 MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType)))
1216bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor          Align = std::max(Align, Target->getLargeArrayAlign());
12173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
12183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        // Walk through any array types while we're at it.
12193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        T = getBaseElementType(arrayType);
12206deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola      }
12219f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier      Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr()));
1222dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman    }
1223ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1224ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // Fields can be subject to extra alignment constraints, like if
1225ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // the field is packed, the struct is packed, or the struct has a
1226ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // a max-field-alignment constraint (#pragma pack).  So calculate
1227ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // the actual alignment of the field within the struct, and then
1228ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // (as we're expected to) constrain that by the alignment of the type.
1229ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    if (const FieldDecl *field = dyn_cast<FieldDecl>(VD)) {
1230ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // So calculate the alignment of the field.
1231ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      const ASTRecordLayout &layout = getASTRecordLayout(field->getParent());
1232ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1233ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // Start with the record's overall alignment.
1234dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck      unsigned fieldAlign = toBits(layout.getAlignment());
1235ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1236ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // Use the GCD of that and the offset within the record.
1237ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      uint64_t offset = layout.getFieldOffset(field->getFieldIndex());
1238ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      if (offset > 0) {
1239ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        // Alignment is always a power of 2, so the GCD will be a power of 2,
1240ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        // which means we get to do this crazy thing instead of Euclid's.
1241ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        uint64_t lowBitOfOffset = offset & (~offset + 1);
1242ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        if (lowBitOfOffset < fieldAlign)
1243ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall          fieldAlign = static_cast<unsigned>(lowBitOfOffset);
1244ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      }
1245ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1246ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      Align = std::min(Align, fieldAlign);
124705f62474dd2b0f1cb69adbe0787f2868788aa949Charles Davis    }
1248af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  }
1249dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
1250eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(Align);
1251af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner}
1252b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
1253929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// getTypeInfoDataSizeInChars - Return the size of a type, in
1254929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// chars. If the type is a record, its data size is returned.  This is
1255929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// the size of the memcpy that's performed when assigning this type
1256929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// using a trivial copy/move assignment operator.
1257929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCallstd::pair<CharUnits, CharUnits>
1258929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCallASTContext::getTypeInfoDataSizeInChars(QualType T) const {
1259929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  std::pair<CharUnits, CharUnits> sizeAndAlign = getTypeInfoInChars(T);
1260929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1261929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // In C++, objects can sometimes be allocated into the tail padding
1262929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // of a base-class subobject.  We decide whether that's possible
1263929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // during class layout, so here we can just trust the layout results.
1264929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  if (getLangOpts().CPlusPlus) {
1265929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall    if (const RecordType *RT = T->getAs<RecordType>()) {
1266929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall      const ASTRecordLayout &layout = getASTRecordLayout(RT->getDecl());
1267929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall      sizeAndAlign.first = layout.getDataSize();
1268929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall    }
1269929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  }
1270929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1271929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  return sizeAndAlign;
1272929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall}
1273929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1274ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits>
1275bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(const Type *T) const {
1276ea1471e0e967548c596a71469702f8846dbaf3c0John McCall  std::pair<uint64_t, unsigned> Info = getTypeInfo(T);
1277eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return std::make_pair(toCharUnitsFromBits(Info.first),
1278eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck                        toCharUnitsFromBits(Info.second));
1279ea1471e0e967548c596a71469702f8846dbaf3c0John McCall}
1280ea1471e0e967548c596a71469702f8846dbaf3c0John McCall
1281ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits>
1282bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(QualType T) const {
1283ea1471e0e967548c596a71469702f8846dbaf3c0John McCall  return getTypeInfoInChars(T.getTypePtr());
1284ea1471e0e967548c596a71469702f8846dbaf3c0John McCall}
1285ea1471e0e967548c596a71469702f8846dbaf3c0John McCall
1286bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbarstd::pair<uint64_t, unsigned> ASTContext::getTypeInfo(const Type *T) const {
1287bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  TypeInfoMap::iterator it = MemoizedTypeInfo.find(T);
1288bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  if (it != MemoizedTypeInfo.end())
1289bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar    return it->second;
1290bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar
1291bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  std::pair<uint64_t, unsigned> Info = getTypeInfoImpl(T);
1292bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  MemoizedTypeInfo.insert(std::make_pair(T, Info));
1293bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  return Info;
1294bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar}
1295bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar
1296bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// getTypeInfoImpl - Return the size of the specified type, in bits.  This
1297bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// method does not work on incomplete types.
12980953e767ff7817f97b3ab20896b229891eeff45bJohn McCall///
12990953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// FIXME: Pointers into different addr spaces could have different sizes and
13000953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// alignment requirements: getPointerInfo should take an AddrSpace, this
13010953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// should take a QualType, &c.
1302d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattnerstd::pair<uint64_t, unsigned>
1303bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel DunbarASTContext::getTypeInfoImpl(const Type *T) const {
13045e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump  uint64_t Width=0;
13055e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump  unsigned Align=8;
1306a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner  switch (T->getTypeClass()) {
130772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base)
130872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base)
130918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor#define NON_CANONICAL_TYPE(Class, Base)
131072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class:
131172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def"
1312d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    llvm_unreachable("Should not see dependent types");
131372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
13145d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::FunctionNoProto:
13155d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::FunctionProto:
131618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    // GCC extension: alignof(function) = 32 bits
131718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Width = 0;
131818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Align = 32;
131918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    break;
132018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
132172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::IncompleteArray:
1322fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case Type::VariableArray:
132318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Width = 0;
132418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Align = getTypeAlign(cast<ArrayType>(T)->getElementType());
132518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    break;
132618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
1327fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case Type::ConstantArray: {
13281d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const ConstantArrayType *CAT = cast<ConstantArrayType>(T);
13291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
133098be4943e8dc4f3905629a7102668960873cf863Chris Lattner    std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType());
1331fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara    uint64_t Size = CAT->getSize().getZExtValue();
1332bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar    assert((Size == 0 || EltInfo.first <= (uint64_t)(-1)/Size) &&
1333bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar           "Overflow in array type bit size evaluation");
1334fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara    Width = EltInfo.first*Size;
1335030d8846c7e520330007087e949f621989876e3aChris Lattner    Align = EltInfo.second;
1336cd88b4171753dcb2bc0a21d78f1597c796bb8a20Argyrios Kyrtzidis    Width = llvm::RoundUpToAlignment(Width, Align);
1337030d8846c7e520330007087e949f621989876e3aChris Lattner    break;
13385c09a02a5db85e08a432b6eeced9aa656349710dChristopher Lamb  }
1339213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  case Type::ExtVector:
1340030d8846c7e520330007087e949f621989876e3aChris Lattner  case Type::Vector: {
13419fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    const VectorType *VT = cast<VectorType>(T);
13429fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType());
13439fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    Width = EltInfo.first*VT->getNumElements();
13444bd998bbc228915d2b9cae5b67879de48940d05eEli Friedman    Align = Width;
13456fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // If the alignment is not a power of 2, round up to the next power of 2.
13466fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // This happens for non-power-of-2 length vectors.
13478eefcd353c1d06a10104f69e5079ebab3183f9a3Dan Gohman    if (Align & (Align-1)) {
13489fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner      Align = llvm::NextPowerOf2(Align);
13499fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner      Width = llvm::RoundUpToAlignment(Width, Align);
13509fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    }
1351f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    // Adjust the alignment based on the target max.
1352f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
1353f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    if (TargetVectorAlign && TargetVectorAlign < Align)
1354f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier      Align = TargetVectorAlign;
1355030d8846c7e520330007087e949f621989876e3aChris Lattner    break;
1356030d8846c7e520330007087e949f621989876e3aChris Lattner  }
13575d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner
13589e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  case Type::Builtin:
1359a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner    switch (cast<BuiltinType>(T)->getKind()) {
1360b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    default: llvm_unreachable("Unknown builtin type!");
1361d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    case BuiltinType::Void:
136218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      // GCC extension: alignof(void) = 8 bits.
136318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      Width = 0;
136418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      Align = 8;
136518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      break;
136618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
13676f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Bool:
1368bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getBoolWidth();
1369bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getBoolAlign();
13706f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1371692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::Char_S:
1372692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::Char_U:
1373692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UChar:
13746f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::SChar:
1375bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getCharWidth();
1376bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getCharAlign();
13776f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
13783f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_S:
13793f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_U:
1380bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getWCharWidth();
1381bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getWCharAlign();
138264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis      break;
1383f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    case BuiltinType::Char16:
1384bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getChar16Width();
1385bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getChar16Align();
1386f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      break;
1387f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    case BuiltinType::Char32:
1388bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getChar32Width();
1389bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getChar32Align();
1390f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      break;
1391692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UShort:
13926f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Short:
1393bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getShortWidth();
1394bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getShortAlign();
13956f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1396692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UInt:
13976f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Int:
1398bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getIntWidth();
1399bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getIntAlign();
14006f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1401692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::ULong:
14026f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Long:
1403bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongWidth();
1404bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongAlign();
14056f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1406692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::ULongLong:
14076f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::LongLong:
1408bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongLongWidth();
1409bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongLongAlign();
14106f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1411ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner    case BuiltinType::Int128:
1412ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner    case BuiltinType::UInt128:
1413ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      Width = 128;
1414ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      Align = 128; // int128_t is 128-bit aligned on all targets.
1415ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      break;
1416aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov    case BuiltinType::Half:
1417aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      Width = Target->getHalfWidth();
1418aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      Align = Target->getHalfAlign();
1419aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      break;
14206f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Float:
1421bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getFloatWidth();
1422bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getFloatAlign();
14236f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14246f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Double:
1425bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getDoubleWidth();
1426bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getDoubleAlign();
14276f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14286f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::LongDouble:
1429bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongDoubleWidth();
1430bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongDoubleAlign();
14316f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14326e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl    case BuiltinType::NullPtr:
1433bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t)
1434bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getPointerAlign(0); //   == sizeof(void*)
14351590d9c0fec4c710c2962e4bb71f76979b5163d3Sebastian Redl      break;
1436e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCId:
1437e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCClass:
1438e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCSel:
1439bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getPointerWidth(0);
1440bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getPointerAlign(0);
1441e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian      break;
1442e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei    case BuiltinType::OCLEvent:
1443b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1d:
1444b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1dArray:
1445b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1dBuffer:
1446b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage2d:
1447b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage2dArray:
1448b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage3d:
1449b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      // Currently these types are pointers to opaque types.
1450b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      Width = Target->getPointerWidth(0);
1451b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      Align = Target->getPointerAlign(0);
1452b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      break;
1453a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner    }
1454bfef6d7c67831a135d6ab79931f010f750a730adChris Lattner    break;
1455d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  case Type::ObjCObjectPointer:
1456bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(0);
1457bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(0);
14586f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    break;
1459485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff  case Type::BlockPointer: {
1460207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(
1461207f4d8543529221932af82836016a2ef066c917Peter Collingbourne        cast<BlockPointerType>(T)->getPointeeType());
1462bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1463bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
1464485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff    break;
1465485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff  }
14665d484e8cf710207010720589d89602233de61d01Sebastian Redl  case Type::LValueReference:
14675d484e8cf710207010720589d89602233de61d01Sebastian Redl  case Type::RValueReference: {
14685d484e8cf710207010720589d89602233de61d01Sebastian Redl    // alignof and sizeof should never enter this code path here, so we go
14695d484e8cf710207010720589d89602233de61d01Sebastian Redl    // the pointer route.
1470207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(
1471207f4d8543529221932af82836016a2ef066c917Peter Collingbourne        cast<ReferenceType>(T)->getPointeeType());
1472bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1473bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
14745d484e8cf710207010720589d89602233de61d01Sebastian Redl    break;
14755d484e8cf710207010720589d89602233de61d01Sebastian Redl  }
1476f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  case Type::Pointer: {
1477207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType());
1478bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1479bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
1480f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner    break;
1481f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  }
1482f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  case Type::MemberPointer: {
1483071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    const MemberPointerType *MPT = cast<MemberPointerType>(T);
14841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    std::pair<uint64_t, unsigned> PtrDiffInfo =
14851cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson      getTypeInfo(getPointerDiffType());
1486071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    Width = PtrDiffInfo.first * ABI->getMemberPointerSize(MPT);
14871cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson    Align = PtrDiffInfo.second;
14881cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson    break;
1489f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  }
14905d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::Complex: {
14915d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    // Complex types have the same alignment as their elements, but twice the
14925d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    // size.
14931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    std::pair<uint64_t, unsigned> EltInfo =
149498be4943e8dc4f3905629a7102668960873cf863Chris Lattner      getTypeInfo(cast<ComplexType>(T)->getElementType());
14959e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner    Width = EltInfo.first*2;
14965d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    Align = EltInfo.second;
14975d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    break;
14985d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  }
1499c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCObject:
1500c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr());
150144a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel  case Type::ObjCInterface: {
15021d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
150344a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel    const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
1504dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck    Width = toBits(Layout.getSize());
1505dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck    Align = toBits(Layout.getAlignment());
150644a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel    break;
150744a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel  }
150872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Record:
150972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Enum: {
15101d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const TagType *TT = cast<TagType>(T);
15111d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar
15121d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    if (TT->getDecl()->isInvalidDecl()) {
151322ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor      Width = 8;
151422ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor      Align = 8;
15158389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner      break;
15168389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner    }
15171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15181d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    if (const EnumType *ET = dyn_cast<EnumType>(TT))
15197176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner      return getTypeInfo(ET->getDecl()->getIntegerType());
15207176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner
15211d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const RecordType *RT = cast<RecordType>(TT);
15227176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner    const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
1523dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck    Width = toBits(Layout.getSize());
1524dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck    Align = toBits(Layout.getAlignment());
1525dc0d73e6495404418acf8548875aeaff07791a74Chris Lattner    break;
1526a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner  }
15277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
15289fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner  case Type::SubstTemplateTypeParm:
152949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    return getTypeInfo(cast<SubstTemplateTypeParmType>(T)->
153049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                       getReplacementType().getTypePtr());
153149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
153234b41d939a1328f484511c6002ba2456db879a29Richard Smith  case Type::Auto: {
153334b41d939a1328f484511c6002ba2456db879a29Richard Smith    const AutoType *A = cast<AutoType>(T);
153434b41d939a1328f484511c6002ba2456db879a29Richard Smith    assert(A->isDeduced() && "Cannot request the size of a dependent type");
1535dc856aff4428380baa9afb5577ea04f8fb6beb13Matt Beaumont-Gay    return getTypeInfo(A->getDeducedType().getTypePtr());
153634b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
153734b41d939a1328f484511c6002ba2456db879a29Richard Smith
1538075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  case Type::Paren:
1539075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr());
1540075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
154118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::Typedef: {
1542162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl();
1543df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor    std::pair<uint64_t, unsigned> Info
1544df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor      = getTypeInfo(Typedef->getUnderlyingType().getTypePtr());
1545c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // If the typedef has an aligned attribute on it, it overrides any computed
1546c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // alignment we have.  This violates the GCC documentation (which says that
1547c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // attribute(aligned) can only round up) but matches its implementation.
1548c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    if (unsigned AttrAlign = Typedef->getMaxAlignment())
1549c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner      Align = AttrAlign;
1550c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    else
1551c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner      Align = Info.second;
1552df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor    Width = Info.first;
15537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    break;
15547176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner  }
155518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
155618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::TypeOfExpr:
155718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType()
155818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor                         .getTypePtr());
155918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
156018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::TypeOf:
156118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr());
156218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
1563395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  case Type::Decltype:
1564395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType()
1565395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson                        .getTypePtr());
1566395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
1567ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  case Type::UnaryTransform:
1568ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType());
1569ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
1570465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  case Type::Elaborated:
1571465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr());
15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15739d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  case Type::Attributed:
15749d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    return getTypeInfo(
15759d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                  cast<AttributedType>(T)->getEquivalentType().getTypePtr());
15769d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
15773e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  case Type::TemplateSpecialization: {
15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(getCanonicalType(T) != T &&
157918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor           "Cannot request the size of a dependent type");
15803e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T);
15813e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    // A type alias template specialization may refer to a typedef with the
15823e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    // aligned attribute on it.
15833e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    if (TST->isTypeAlias())
15843e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith      return getTypeInfo(TST->getAliasedType().getTypePtr());
15853e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    else
15863e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith      return getTypeInfo(getCanonicalType(T));
15873e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  }
15883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
1589b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic: {
15902be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    std::pair<uint64_t, unsigned> Info
15912be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      = getTypeInfo(cast<AtomicType>(T)->getValueType());
15922be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    Width = Info.first;
15932be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    Align = Info.second;
15942be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    if (Width != 0 && Width <= Target->getMaxAtomicPromoteWidth() &&
15952be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman        llvm::isPowerOf2_64(Width)) {
15962be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // We can potentially perform lock-free atomic operations for this
15972be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // type; promote the alignment appropriately.
15982be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // FIXME: We could potentially promote the width here as well...
15992be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // is that worthwhile?  (Non-struct atomic types generally have
16002be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // power-of-two size anyway, but structs might not.  Requires a bit
16012be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      // of implementation work to make sure we zero out the extra bits.)
16022be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      Align = static_cast<unsigned>(Width);
16032be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    }
1604b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
1605b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
160618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  }
16071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16082be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman  assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2");
16099e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  return std::make_pair(Width, Align);
1610a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner}
1611a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
1612eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck/// toCharUnitsFromBits - Convert a size in bits to a size in characters.
1613eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen DyckCharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const {
1614eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return CharUnits::fromQuantity(BitSize / getCharWidth());
1615eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck}
1616eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck
1617dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck/// toBits - Convert a size in characters to a size in characters.
1618dd76a9ab9ea675671200f94b18ce95766841952bKen Dyckint64_t ASTContext::toBits(CharUnits CharSize) const {
1619dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck  return CharSize.getQuantity() * getCharWidth();
1620dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck}
1621dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck
1622bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// getTypeSizeInChars - Return the size of the specified type, in characters.
1623bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// This method does not work on incomplete types.
16244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(QualType T) const {
1625eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeSize(T));
1626bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck}
16274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(const Type *T) const {
1628eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeSize(T));
1629bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck}
1630bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck
163116e20cce43385001f33f8e3f90ee345609c805d1Ken Dyck/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in
163286fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck/// characters. This method does not work on incomplete types.
16334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(QualType T) const {
1634eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeAlign(T));
163586fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck}
16364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(const Type *T) const {
1637eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeAlign(T));
163886fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck}
163986fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck
164034ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// getPreferredTypeAlign - Return the "preferred" alignment of the specified
164134ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// type for the current target in bits.  This can be different than the ABI
164234ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// alignment in cases where it is beneficial for performance to overalign
164334ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// a data type.
16444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
164534ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner  unsigned ABIAlign = getTypeAlign(T);
16461eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman
16471eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman  // Double and long long should be naturally aligned if possible.
1648183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  if (const ComplexType* CT = T->getAs<ComplexType>())
16491eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman    T = CT->getElementType().getTypePtr();
16501eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman  if (T->isSpecificBuiltinType(BuiltinType::Double) ||
1651cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier      T->isSpecificBuiltinType(BuiltinType::LongLong) ||
1652cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier      T->isSpecificBuiltinType(BuiltinType::ULongLong))
16531eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman    return std::max(ABIAlign, (unsigned)getTypeSize(T));
16541eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman
165534ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner  return ABIAlign;
165634ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner}
165734ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner
16582c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// DeepCollectObjCIvars -
16592c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// This routine first collects all declared, but not synthesized, ivars in
16602c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// super class and then collects all ivars, including those synthesized for
16612c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// current class. This routine is used for implementation of current class
16622c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// when all ivars, declared and synthesized are known.
16639820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian///
16642c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanianvoid ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI,
16652c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian                                      bool leafClass,
1666db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose                            SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const {
16672c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass())
16682c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    DeepCollectObjCIvars(SuperClass, false, Ivars);
16692c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  if (!leafClass) {
16702c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(),
16712c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian         E = OI->ivar_end(); I != E; ++I)
1672581deb3da481053c4993c7600f97acf7768caac5David Blaikie      Ivars.push_back(*I);
16733060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  } else {
1674bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian    ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI);
1675db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose    for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
1676bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian         Iv= Iv->getNextIvar())
1677bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian      Ivars.push_back(Iv);
1678bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian  }
16799820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian}
16809820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian
1681e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// CollectInheritedProtocols - Collect all protocols in current class and
1682e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// those inherited by it.
1683e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid ASTContext::CollectInheritedProtocols(const Decl *CDecl,
1684432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian                          llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) {
1685e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
168653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    // We can use protocol_iterator here instead of
168753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    // all_referenced_protocol_iterator since we are walking all categories.
168853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    for (ObjCInterfaceDecl::all_protocol_iterator P = OI->all_referenced_protocol_begin(),
168953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek         PE = OI->all_referenced_protocol_end(); P != PE; ++P) {
1690e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
16913fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1692e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1693b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P) {
16943fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor        Protocols.insert((*P)->getCanonicalDecl());
1695e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1696e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      }
1697b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian    }
1698e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
1699e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    // Categories of this Interface.
1700d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    for (ObjCInterfaceDecl::visible_categories_iterator
1701d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           Cat = OI->visible_categories_begin(),
1702d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           CatEnd = OI->visible_categories_end();
1703d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         Cat != CatEnd; ++Cat) {
1704d329724745b49f894b768d47275b7c2713106e89Douglas Gregor      CollectInheritedProtocols(*Cat, Protocols);
1705d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    }
1706d329724745b49f894b768d47275b7c2713106e89Douglas Gregor
1707e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    if (ObjCInterfaceDecl *SD = OI->getSuperClass())
1708e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      while (SD) {
1709e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(SD, Protocols);
1710e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        SD = SD->getSuperClass();
1711e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      }
1712b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer  } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
171353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    for (ObjCCategoryDecl::protocol_iterator P = OC->protocol_begin(),
1714e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian         PE = OC->protocol_end(); P != PE; ++P) {
1715e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
17163fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1717e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1718e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P)
1719e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1720e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
1721b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer  } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
1722e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(),
1723e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian         PE = OP->protocol_end(); P != PE; ++P) {
1724e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
17253fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1726e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1727e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P)
1728e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1729e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
1730e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
1731e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian}
1732e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
17334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const {
17343bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  unsigned count = 0;
17353bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // Count ivars declared in class extension.
1736d329724745b49f894b768d47275b7c2713106e89Douglas Gregor  for (ObjCInterfaceDecl::known_extensions_iterator
1737d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         Ext = OI->known_extensions_begin(),
1738d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         ExtEnd = OI->known_extensions_end();
1739d329724745b49f894b768d47275b7c2713106e89Douglas Gregor       Ext != ExtEnd; ++Ext) {
1740d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    count += Ext->ivar_size();
1741d329724745b49f894b768d47275b7c2713106e89Douglas Gregor  }
1742d329724745b49f894b768d47275b7c2713106e89Douglas Gregor
17433bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // Count ivar defined in this class's implementation.  This
17443bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // includes synthesized ivars.
17453bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  if (ObjCImplementationDecl *ImplDecl = OI->getImplementation())
1746b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer    count += ImplDecl->ivar_size();
1747b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer
17488e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian  return count;
17498e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian}
17508e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian
17518deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidisbool ASTContext::isSentinelNullExpr(const Expr *E) {
17528deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (!E)
17538deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis    return false;
17548deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17558deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  // nullptr_t is always treated as null.
17568deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (E->getType()->isNullPtrType()) return true;
17578deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17588deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (E->getType()->isAnyPointerType() &&
17598deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis      E->IgnoreParenCasts()->isNullPointerConstant(*this,
17608deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis                                                Expr::NPC_ValueDependentIsNull))
17618deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis    return true;
17628deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17638deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  // Unfortunately, __null has type 'int'.
17648deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (isa<GNUNullExpr>(E)) return true;
17658deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17668deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  return false;
17678deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis}
17688deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
17698a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists.
17708a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) {
17718a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
17728a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    I = ObjCImpls.find(D);
17738a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  if (I != ObjCImpls.end())
17748a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    return cast<ObjCImplementationDecl>(I->second);
17758a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  return 0;
17768a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
17778a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists.
17788a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) {
17798a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
17808a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    I = ObjCImpls.find(D);
17818a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  if (I != ObjCImpls.end())
17828a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    return cast<ObjCCategoryImplDecl>(I->second);
17838a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  return 0;
17848a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
17858a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis
17868a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCInterfaceDecl.
17878a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD,
17888a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis                           ObjCImplementationDecl *ImplD) {
17898a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  assert(IFaceD && ImplD && "Passed null params");
17908a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  ObjCImpls[IFaceD] = ImplD;
17918a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
17928a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCCategoryDecl.
17938a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD,
17948a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis                           ObjCCategoryImplDecl *ImplD) {
17958a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  assert(CatD && ImplD && "Passed null params");
17968a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  ObjCImpls[CatD] = ImplD;
17978a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
17988a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis
179987ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios KyrtzidisObjCInterfaceDecl *ASTContext::getObjContainingInterface(NamedDecl *ND) const {
180087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext()))
180187ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return ID;
180287ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ND->getDeclContext()))
180387ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return CD->getClassInterface();
180487ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  if (ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(ND->getDeclContext()))
180587ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return IMD->getClassInterface();
180687ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis
180787ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  return 0;
180887ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis}
180987ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis
18101ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Get the copy initialization expression of VarDecl,or NULL if
18111ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// none exists.
1812830937bc1100fba7682f7c32c40512085870f50cFariborz JahanianExpr *ASTContext::getBlockVarCopyInits(const VarDecl*VD) {
1813d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD && "Passed null params");
1814d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD->hasAttr<BlocksAttr>() &&
1815d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian         "getBlockVarCopyInits - not __block var");
1816830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian  llvm::DenseMap<const VarDecl*, Expr*>::iterator
1817d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian    I = BlockVarCopyInits.find(VD);
18181ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  return (I != BlockVarCopyInits.end()) ? cast<Expr>(I->second) : 0;
18191ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian}
18201ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian
18211ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Set the copy inialization expression of a block var decl.
18221ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanianvoid ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) {
18231ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  assert(VD && Init && "Passed null params");
1824d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD->hasAttr<BlocksAttr>() &&
1825d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian         "setBlockVarCopyInits - not __block var");
18261ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  BlockVarCopyInits[VD] = Init;
18271ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian}
18281ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian
1829a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T,
18304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                 unsigned DataSize) const {
1831109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall  if (!DataSize)
1832109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall    DataSize = TypeLoc::getFullDataSizeForType(T);
1833109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall  else
1834109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall    assert(DataSize == TypeLoc::getFullDataSizeForType(T) &&
1835a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall           "incorrect data size provided to CreateTypeSourceInfo!");
1836109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall
1837a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *TInfo =
1838a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8);
1839a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  new (TInfo) TypeSourceInfo(T);
1840a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TInfo;
1841b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
1842b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
1843a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T,
18446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                     SourceLocation L) const {
1845a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = CreateTypeSourceInfo(T);
1846c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L);
1847a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall  return DI;
1848a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall}
1849a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall
1850b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout &
18514ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const {
1852b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar  return getObjCLayout(D, 0);
1853b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar}
1854b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar
1855b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout &
18564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCImplementationLayout(
18574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                        const ObjCImplementationDecl *D) const {
1858b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar  return getObjCLayout(D->getClassInterface(), D);
1859b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar}
1860b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar
1861a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===//
1862a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//                   Type creation/memoization methods
1863a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===//
1864a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
18654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
18663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const {
18673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  unsigned fastQuals = quals.getFastQualifiers();
18683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  quals.removeFastQualifiers();
18690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
18700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Check if we've already instantiated this type.
18710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  llvm::FoldingSetNodeID ID;
18723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQuals::Profile(ID, baseType, quals);
18733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
18743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
18753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    assert(eq->getQualifiers() == quals);
18763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(eq, fastQuals);
18770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  }
18780953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
18793b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If the base type is not canonical, make the appropriate canonical type.
18803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon;
18813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!baseType->isCanonicalUnqualified()) {
18823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split();
1883200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canonSplit.Quals.addConsistentQualifiers(quals);
1884200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getExtQualType(canonSplit.Ty, canonSplit.Quals);
18853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
18863b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    // Re-find the insert position.
18873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
18883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
18893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
18903b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQuals *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals);
18913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQualNodes.InsertNode(eq, insertPos);
18923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(eq, fastQuals);
18930953e767ff7817f97b3ab20896b229891eeff45bJohn McCall}
18940953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
18954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
18964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const {
1897f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  QualType CanT = getCanonicalType(T);
1898f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  if (CanT.getAddressSpace() == AddressSpace)
1899f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    return T;
1900b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner
19010953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If we are composing extended qualifiers together, merge together
19020953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // into one ExtQuals node.
19030953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  QualifierCollector Quals;
19040953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  const Type *TypeNode = Quals.strip(T);
19051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19060953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If this type already has an address space specified, it cannot get
19070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // another one.
19080953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  assert(!Quals.hasAddressSpace() &&
19090953e767ff7817f97b3ab20896b229891eeff45bJohn McCall         "Type cannot be in multiple addr spaces!");
19100953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  Quals.addAddressSpace(AddressSpace);
19111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19120953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getExtQualType(TypeNode, Quals);
1913ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb}
1914ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
1915b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris LattnerQualType ASTContext::getObjCGCQualType(QualType T,
19164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                       Qualifiers::GC GCAttr) const {
1917d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  QualType CanT = getCanonicalType(T);
1918b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner  if (CanT.getObjCGCAttr() == GCAttr)
1919d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    return T;
19201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19217f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall  if (const PointerType *ptr = T->getAs<PointerType>()) {
19227f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall    QualType Pointee = ptr->getPointeeType();
192358f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff    if (Pointee->isAnyPointerType()) {
19244027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian      QualType ResultType = getObjCGCQualType(Pointee, GCAttr);
19254027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian      return getPointerType(ResultType);
19264027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian    }
19274027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian  }
19281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19290953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If we are composing extended qualifiers together, merge together
19300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // into one ExtQuals node.
19310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  QualifierCollector Quals;
19320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  const Type *TypeNode = Quals.strip(T);
19331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19340953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If this type already has an ObjCGC specified, it cannot get
19350953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // another one.
19360953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  assert(!Quals.hasObjCGCAttr() &&
19370953e767ff7817f97b3ab20896b229891eeff45bJohn McCall         "Type cannot have multiple ObjCGCs!");
19380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  Quals.addObjCGCAttr(GCAttr);
19391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19400953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getExtQualType(TypeNode, Quals);
1941d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian}
1942a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
1943e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCallconst FunctionType *ASTContext::adjustFunctionType(const FunctionType *T,
1944e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall                                                   FunctionType::ExtInfo Info) {
1945e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  if (T->getExtInfo() == Info)
1946e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    return T;
1947e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
1948e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  QualType Result;
1949e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
1950e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    Result = getFunctionNoProtoType(FNPT->getResultType(), Info);
1951e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  } else {
1952e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    const FunctionProtoType *FPT = cast<FunctionProtoType>(T);
1953e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
1954e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    EPI.ExtInfo = Info;
1955e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    Result = getFunctionType(FPT->getResultType(), FPT->arg_type_begin(),
1956e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall                             FPT->getNumArgs(), EPI);
1957e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  }
1958e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
1959e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  return cast<FunctionType>(Result.getTypePtr());
1960e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall}
1961e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
19625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getComplexType - Return the uniqued reference to the type for a complex
19635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// number with the specified element type.
19644ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getComplexType(QualType T) const {
19655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
19665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
19675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
19685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ComplexType::Profile(ID, T);
19691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
19715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
19725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(CT, 0);
19731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the pointee type isn't canonical, this won't be a canonical type either,
19755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
19765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
1977467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!T.isCanonical()) {
1978f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner    Canonical = getComplexType(getCanonicalType(T));
19791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
19815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
1982c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
19835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
19846b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical);
19855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
19865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ComplexTypes.InsertNode(New, InsertPos);
19875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
19885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
19895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
19905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getPointerType - Return the uniqued reference to the type for a pointer to
19915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the specified type.
19924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPointerType(QualType T) const {
19935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
19945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
19955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
19965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PointerType::Profile(ID, T);
19971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
19995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
20005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(PT, 0);
20011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the pointee type isn't canonical, this won't be a canonical type either,
20035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
20045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2005467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!T.isCanonical()) {
2006f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner    Canonical = getPointerType(getCanonicalType(T));
20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
20095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2010c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
20115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
20126b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical);
20135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
20145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PointerTypes.InsertNode(New, InsertPos);
20155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
20165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
20175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
20181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getBlockPointerType - Return the uniqued reference to the type for
20195618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff/// a pointer to the specified block.
20204ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockPointerType(QualType T) const {
2021296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff  assert(T->isFunctionType() && "block of function types only");
2022296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff  // Unique pointers, to guarantee there is only one block of a particular
20235618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  // structure.
20245618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  llvm::FoldingSetNodeID ID;
20255618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  BlockPointerType::Profile(ID, T);
20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20275618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  void *InsertPos = 0;
20285618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  if (BlockPointerType *PT =
20295618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff        BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
20305618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    return QualType(PT, 0);
20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // If the block pointee type isn't canonical, this won't be a canonical
20335618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  // type either so fill in the canonical type field.
20345618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  QualType Canonical;
2035467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!T.isCanonical()) {
20365618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    Canonical = getBlockPointerType(getCanonicalType(T));
20371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20385618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    // Get the new insert position for the node we care about.
20395618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    BlockPointerType *NewIP =
20405618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff      BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2041c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
20425618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  }
20436b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  BlockPointerType *New
20446b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) BlockPointerType(T, Canonical);
20455618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  Types.push_back(New);
20465618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  BlockPointerTypes.InsertNode(New, InsertPos);
20475618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  return QualType(New, 0);
20485618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff}
20495618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff
20507c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getLValueReferenceType - Return the uniqued reference to the type for an
20517c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// lvalue reference to the specified type.
20524ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
20534ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const {
20549625e44c0252485277a340746ed8ac950686156fDouglas Gregor  assert(getCanonicalType(T) != OverloadTy &&
20559625e44c0252485277a340746ed8ac950686156fDouglas Gregor         "Unresolved overloaded function type");
20569625e44c0252485277a340746ed8ac950686156fDouglas Gregor
20575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
20585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
20595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
206054e14c4db764c0636160d26c5bbf491637c83a76John McCall  ReferenceType::Profile(ID, T, SpelledAsLValue);
20615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
20625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
20637c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  if (LValueReferenceType *RT =
20647c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl        LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
20655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(RT, 0);
20667c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
206754e14c4db764c0636160d26c5bbf491637c83a76John McCall  const ReferenceType *InnerRef = T->getAs<ReferenceType>();
206854e14c4db764c0636160d26c5bbf491637c83a76John McCall
20695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the referencee type isn't canonical, this won't be a canonical type
20705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // either, so fill in the canonical type field.
20715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
207254e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
207354e14c4db764c0636160d26c5bbf491637c83a76John McCall    QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
207454e14c4db764c0636160d26c5bbf491637c83a76John McCall    Canonical = getLValueReferenceType(getCanonicalType(PointeeType));
20757c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
20767c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    // Get the new insert position for the node we care about.
20777c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    LValueReferenceType *NewIP =
20787c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl      LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
2079c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
20807c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  }
20817c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
20826b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  LValueReferenceType *New
208354e14c4db764c0636160d26c5bbf491637c83a76John McCall    = new (*this, TypeAlignment) LValueReferenceType(T, Canonical,
208454e14c4db764c0636160d26c5bbf491637c83a76John McCall                                                     SpelledAsLValue);
20857c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  Types.push_back(New);
20867c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  LValueReferenceTypes.InsertNode(New, InsertPos);
208754e14c4db764c0636160d26c5bbf491637c83a76John McCall
20887c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  return QualType(New, 0);
20897c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl}
20907c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
20917c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getRValueReferenceType - Return the uniqued reference to the type for an
20927c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// rvalue reference to the specified type.
20934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRValueReferenceType(QualType T) const {
20947c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // Unique pointers, to guarantee there is only one pointer of a particular
20957c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // structure.
20967c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  llvm::FoldingSetNodeID ID;
209754e14c4db764c0636160d26c5bbf491637c83a76John McCall  ReferenceType::Profile(ID, T, false);
20987c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
20997c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  void *InsertPos = 0;
21007c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  if (RValueReferenceType *RT =
21017c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl        RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
21027c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    return QualType(RT, 0);
21037c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
210454e14c4db764c0636160d26c5bbf491637c83a76John McCall  const ReferenceType *InnerRef = T->getAs<ReferenceType>();
210554e14c4db764c0636160d26c5bbf491637c83a76John McCall
21067c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // If the referencee type isn't canonical, this won't be a canonical type
21077c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // either, so fill in the canonical type field.
21087c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  QualType Canonical;
210954e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (InnerRef || !T.isCanonical()) {
211054e14c4db764c0636160d26c5bbf491637c83a76John McCall    QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
211154e14c4db764c0636160d26c5bbf491637c83a76John McCall    Canonical = getRValueReferenceType(getCanonicalType(PointeeType));
21127c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
21135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
21147c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    RValueReferenceType *NewIP =
21157c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl      RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
2116c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
21175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
21185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
21196b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  RValueReferenceType *New
21206b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) RValueReferenceType(T, Canonical);
21215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
21227c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  RValueReferenceTypes.InsertNode(New, InsertPos);
21235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
21245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
21255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2126f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// getMemberPointerType - Return the uniqued reference to the type for a
2127f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// member pointer to the specified type, in the specified class.
21284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const {
2129f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // Unique pointers, to guarantee there is only one pointer of a particular
2130f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // structure.
2131f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  llvm::FoldingSetNodeID ID;
2132f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  MemberPointerType::Profile(ID, T, Cls);
2133f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2134f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  void *InsertPos = 0;
2135f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  if (MemberPointerType *PT =
2136f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
2137f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    return QualType(PT, 0);
2138f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2139f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // If the pointee or class type isn't canonical, this won't be a canonical
2140f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // type either, so fill in the canonical type field.
2141f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  QualType Canonical;
214287c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor  if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) {
2143f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls));
2144f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2145f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    // Get the new insert position for the node we care about.
2146f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    MemberPointerType *NewIP =
2147f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2148c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
2149f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  }
21506b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  MemberPointerType *New
21516b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical);
2152f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  Types.push_back(New);
2153f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  MemberPointerTypes.InsertNode(New, InsertPos);
2154f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  return QualType(New, 0);
2155f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl}
2156f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
21571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getConstantArrayType - Return the unique reference to the type for an
2158fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff/// array of the specified element type.
21591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getConstantArrayType(QualType EltTy,
216038aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner                                          const llvm::APInt &ArySizeIn,
2161c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff                                          ArrayType::ArraySizeModifier ASM,
216263e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                          unsigned IndexTypeQuals) const {
2163923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  assert((EltTy->isDependentType() ||
2164923d56d436f750bc1f29db50e641078725558a1bSebastian Redl          EltTy->isIncompleteType() || EltTy->isConstantSizeType()) &&
2165587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman         "Constant array of VLAs is illegal!");
2166587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman
216738aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  // Convert the array size into a canonical width matching the pointer size for
216838aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  // the target.
216938aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  llvm::APInt ArySize(ArySizeIn);
21709f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad  ArySize =
2171bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    ArySize.zextOrTrunc(Target->getPointerWidth(getTargetAddressSpace(EltTy)));
21721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
217463e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara  ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, IndexTypeQuals);
21751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (ConstantArrayType *ATP =
21787192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek      ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
21795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(ATP, 0);
21801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If the element type isn't canonical or has qualifiers, this won't
21823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // be a canonical type either, so fill in the canonical type field.
21833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType Canon;
21843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) {
21853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(EltTy).split();
2186200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize,
218763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                 ASM, IndexTypeQuals);
2188200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getQualifiedType(Canon, canonSplit.Quals);
21893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
21905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ConstantArrayType *NewIP =
21927192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek      ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
2193c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
21945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
21951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21966b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ConstantArrayType *New = new(*this,TypeAlignment)
219763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara    ConstantArrayType(EltTy, Canon, ArySize, ASM, IndexTypeQuals);
21987192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek  ConstantArrayTypes.InsertNode(New, InsertPos);
21995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
22005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
22015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
22025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2203ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// getVariableArrayDecayedType - Turns the given type, which may be
2204ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// variably-modified, into the corresponding type with all the known
2205ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// sizes replaced with [*].
2206ce8890371fcdb983ae487c87fa40606a34896ff7John McCallQualType ASTContext::getVariableArrayDecayedType(QualType type) const {
2207ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Vastly most common case.
2208ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  if (!type->isVariablyModifiedType()) return type;
2209ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2210ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  QualType result;
2211ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2212ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  SplitQualType split = type.getSplitDesugaredType();
2213200fa53fd420aa8369586f569dbece04930ad6a3John McCall  const Type *ty = split.Ty;
2214ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  switch (ty->getTypeClass()) {
2215ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define TYPE(Class, Base)
2216ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define ABSTRACT_TYPE(Class, Base)
2217ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2218ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#include "clang/AST/TypeNodes.def"
2219ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    llvm_unreachable("didn't desugar past all non-canonical types?");
2220ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2221ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types should never be variably-modified.
2222ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Builtin:
2223ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Complex:
2224ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Vector:
2225ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ExtVector:
2226ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentSizedExtVector:
2227ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCObject:
2228ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCInterface:
2229ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCObjectPointer:
2230ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Record:
2231ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Enum:
2232ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::UnresolvedUsing:
2233ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TypeOfExpr:
2234ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TypeOf:
2235ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Decltype:
2236ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  case Type::UnaryTransform:
2237ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentName:
2238ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::InjectedClassName:
2239ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TemplateSpecialization:
2240ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentTemplateSpecialization:
2241ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TemplateTypeParm:
2242ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::SubstTemplateTypeParmPack:
224334b41d939a1328f484511c6002ba2456db879a29Richard Smith  case Type::Auto:
2244ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::PackExpansion:
2245ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    llvm_unreachable("type should never be variably-modified");
2246ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2247ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types can be variably-modified but should never need to
2248ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // further decay.
2249ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::FunctionNoProto:
2250ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::FunctionProto:
2251ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::BlockPointer:
2252ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::MemberPointer:
2253ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    return type;
2254ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2255ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types can be variably-modified.  All these modifications
2256ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // preserve structure except as noted by comments.
2257ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // TODO: if we ever care about optimizing VLAs, there are no-op
2258ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // optimizations available here.
2259ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Pointer:
2260ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getPointerType(getVariableArrayDecayedType(
2261ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                              cast<PointerType>(ty)->getPointeeType()));
2262ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2263ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2264ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::LValueReference: {
2265ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const LValueReferenceType *lv = cast<LValueReferenceType>(ty);
2266ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getLValueReferenceType(
2267ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(lv->getPointeeType()),
2268ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                    lv->isSpelledAsLValue());
2269ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2270745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2271ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2272ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::RValueReference: {
2273ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const RValueReferenceType *lv = cast<RValueReferenceType>(ty);
2274ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getRValueReferenceType(
2275ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(lv->getPointeeType()));
2276ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2277745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2278745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2279b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic: {
2280b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    const AtomicType *at = cast<AtomicType>(ty);
2281b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    result = getAtomicType(getVariableArrayDecayedType(at->getValueType()));
2282b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    break;
2283b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
2284b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
2285ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ConstantArray: {
2286ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const ConstantArrayType *cat = cast<ConstantArrayType>(ty);
2287ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getConstantArrayType(
2288ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(cat->getElementType()),
2289ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getSize(),
2290ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getSizeModifier(),
2291ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getIndexTypeCVRQualifiers());
2292ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2293745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2294745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2295ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentSizedArray: {
2296ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const DependentSizedArrayType *dat = cast<DependentSizedArrayType>(ty);
2297ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getDependentSizedArrayType(
2298ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(dat->getElementType()),
2299ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getSizeExpr(),
2300ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getSizeModifier(),
2301ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getIndexTypeCVRQualifiers(),
2302ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getBracketsRange());
2303ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2304ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2305ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2306ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Turn incomplete types into [*] types.
2307ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::IncompleteArray: {
2308ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const IncompleteArrayType *iat = cast<IncompleteArrayType>(ty);
2309ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getVariableArrayType(
2310ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(iat->getElementType()),
2311ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  /*size*/ 0,
2312ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  ArrayType::Normal,
2313ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  iat->getIndexTypeCVRQualifiers(),
2314ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  SourceRange());
2315ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2316ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2317ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2318ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Turn VLA types into [*] types.
2319ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::VariableArray: {
2320ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const VariableArrayType *vat = cast<VariableArrayType>(ty);
2321ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getVariableArrayType(
2322ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(vat->getElementType()),
2323ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  /*size*/ 0,
2324ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  ArrayType::Star,
2325ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  vat->getIndexTypeCVRQualifiers(),
2326ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  vat->getBracketsRange());
2327ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2328ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2329ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2330ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2331ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Apply the top-level qualifiers from the original.
2332200fa53fd420aa8369586f569dbece04930ad6a3John McCall  return getQualifiedType(result, split.Quals);
2333ce8890371fcdb983ae487c87fa40606a34896ff7John McCall}
2334745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2335bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// getVariableArrayType - Returns a non-unique reference to the type for a
2336bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// variable array of the specified element type.
23377e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas GregorQualType ASTContext::getVariableArrayType(QualType EltTy,
23387e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                          Expr *NumElts,
2339c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff                                          ArrayType::ArraySizeModifier ASM,
234063e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                          unsigned IndexTypeQuals,
23414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          SourceRange Brackets) const {
2342c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // Since we don't unique expressions, it isn't possible to unique VLA's
2343c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // that have an expression provided for their size.
23443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType Canon;
2345715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor
23463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Be sure to pull qualifiers off the element type.
23473b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) {
23483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(EltTy).split();
2349200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM,
235063e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                 IndexTypeQuals, Brackets);
2351200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getQualifiedType(Canon, canonSplit.Quals);
2352715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor  }
2353715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor
23546b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  VariableArrayType *New = new(*this, TypeAlignment)
235563e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara    VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets);
2356c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2357c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  VariableArrayTypes.push_back(New);
2358c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  Types.push_back(New);
2359c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return QualType(New, 0);
2360c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman}
2361c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2362898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// getDependentSizedArrayType - Returns a non-unique reference to
2363898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// the type for a dependently-sized array of the specified element
236404d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor/// type.
23653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getDependentSizedArrayType(QualType elementType,
23663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                Expr *numElements,
2367898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                                                ArrayType::ArraySizeModifier ASM,
23683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                unsigned elementTypeQuals,
23693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                SourceRange brackets) const {
23703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  assert((!numElements || numElements->isTypeDependent() ||
23713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall          numElements->isValueDependent()) &&
2372898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor         "Size must be type- or value-dependent!");
2373898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
23743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Dependently-sized array types that do not have a specified number
23753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // of elements will have their sizes deduced from a dependent
23763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // initializer.  We do no canonicalization here at all, which is okay
23773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // because they can't be used in most locations.
23783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!numElements) {
23793b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayType *newType
23803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      = new (*this, TypeAlignment)
23813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall          DependentSizedArrayType(*this, elementType, QualType(),
23823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                  numElements, ASM, elementTypeQuals,
23833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                  brackets);
23843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    Types.push_back(newType);
23853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(newType, 0);
2386cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor  }
2387cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor
23883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Otherwise, we actually build a new type every time, but we
23893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // also build a canonical type.
23901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  SplitQualType canonElementType = getCanonicalType(elementType).split();
2392898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
23933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
23943b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  llvm::FoldingSetNodeID ID;
23953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType::Profile(ID, *this,
2396200fa53fd420aa8369586f569dbece04930ad6a3John McCall                                   QualType(canonElementType.Ty, 0),
23973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                   ASM, elementTypeQuals, numElements);
23983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
23993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Look for an existing type with these properties.
24003b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType *canonTy =
24013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
24023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24033b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If we don't have one, build one.
24043b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!canonTy) {
24053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    canonTy = new (*this, TypeAlignment)
2406200fa53fd420aa8369586f569dbece04930ad6a3John McCall      DependentSizedArrayType(*this, QualType(canonElementType.Ty, 0),
24073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                              QualType(), numElements, ASM, elementTypeQuals,
24083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                              brackets);
24093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
24103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    Types.push_back(canonTy);
24113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
24123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24133b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Apply qualifiers from the element type to the array.
24143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon = getQualifiedType(QualType(canonTy,0),
2415200fa53fd420aa8369586f569dbece04930ad6a3John McCall                                    canonElementType.Quals);
24163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If we didn't need extra canonicalization for the element type,
24183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // then just use that as our result.
2419200fa53fd420aa8369586f569dbece04930ad6a3John McCall  if (QualType(canonElementType.Ty, 0) == elementType)
24203b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return canon;
24213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Otherwise, we need to build a type which follows the spelling
24233b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // of the element type.
24243b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType *sugaredType
24253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    = new (*this, TypeAlignment)
24263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        DependentSizedArrayType(*this, elementType, canon, numElements,
24273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                ASM, elementTypeQuals, brackets);
24283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Types.push_back(sugaredType);
24293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(sugaredType, 0);
24303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall}
24313b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getIncompleteArrayType(QualType elementType,
2433c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman                                            ArrayType::ArraySizeModifier ASM,
24343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                            unsigned elementTypeQuals) const {
2435c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  llvm::FoldingSetNodeID ID;
24363b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals);
2437c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
24383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
24393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (IncompleteArrayType *iat =
24403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall       IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
24413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(iat, 0);
2442c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2443c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If the element type isn't canonical, this won't be a canonical type
24443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // either, so fill in the canonical type field.  We also have to pull
24453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // qualifiers off the element type.
24463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon;
2447c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
24483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) {
24493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(elementType).split();
2450200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0),
24513b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                   ASM, elementTypeQuals);
2452200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getQualifiedType(canon, canonSplit.Quals);
2453c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2454c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    // Get the new insert position for the node we care about.
24553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    IncompleteArrayType *existing =
24563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
24573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    assert(!existing && "Shouldn't be in the map!"); (void) existing;
24582bd24ba6d10f8c811c8e2a57c8397e07082ba497Ted Kremenek  }
2459c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
24603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayType *newType = new (*this, TypeAlignment)
24613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    IncompleteArrayType(elementType, canon, ASM, elementTypeQuals);
2462c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
24633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayTypes.InsertNode(newType, insertPos);
24643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Types.push_back(newType);
24653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(newType, 0);
2466fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff}
2467fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
246873322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// getVectorType - Return the unique reference to a vector type of
246973322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type.
247082287d19ded35248c4ce6a425ce74116a13ce44eJohn ThompsonQualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
24714ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                   VectorType::VectorKind VecKind) const {
24723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  assert(vecType->isBuiltinType());
24731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Check if we've already instantiated a vector of this type.
24755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
2476e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson  VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind);
2477788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner
24785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
24795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
24805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(VTP, 0);
24815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
24825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the element type isn't canonical, this won't be a canonical type either,
24835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
24845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2485255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  if (!vecType.isCanonical()) {
2486231da7eb3dd13007e5e40fffe48998e5ef284e06Bob Wilson    Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind);
24871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
24895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2490c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
24915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
24926b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  VectorType *New = new (*this, TypeAlignment)
2493e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson    VectorType(vecType, NumElts, Canonical, VecKind);
24945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  VectorTypes.InsertNode(New, InsertPos);
24955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
24965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
24975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
24985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2499213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman/// getExtVectorType - Return the unique reference to an extended vector type of
250073322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type.
25014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
25024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const {
25034ac01401b1ec602a1f58c217544d3dcb5fcbd7f1Douglas Gregor  assert(vecType->isBuiltinType() || vecType->isDependentType());
25041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
250573322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // Check if we've already instantiated a vector of this type.
250673322924127c873c13101b705dd823f5539ffa5fSteve Naroff  llvm::FoldingSetNodeID ID;
2507788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  VectorType::Profile(ID, vecType, NumElts, Type::ExtVector,
2508e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                      VectorType::GenericVector);
250973322924127c873c13101b705dd823f5539ffa5fSteve Naroff  void *InsertPos = 0;
251073322924127c873c13101b705dd823f5539ffa5fSteve Naroff  if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
251173322924127c873c13101b705dd823f5539ffa5fSteve Naroff    return QualType(VTP, 0);
251273322924127c873c13101b705dd823f5539ffa5fSteve Naroff
251373322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // If the element type isn't canonical, this won't be a canonical type either,
251473322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // so fill in the canonical type field.
251573322924127c873c13101b705dd823f5539ffa5fSteve Naroff  QualType Canonical;
2516467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!vecType.isCanonical()) {
2517213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    Canonical = getExtVectorType(getCanonicalType(vecType), NumElts);
25181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
251973322924127c873c13101b705dd823f5539ffa5fSteve Naroff    // Get the new insert position for the node we care about.
252073322924127c873c13101b705dd823f5539ffa5fSteve Naroff    VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2521c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
252273322924127c873c13101b705dd823f5539ffa5fSteve Naroff  }
25236b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ExtVectorType *New = new (*this, TypeAlignment)
25246b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    ExtVectorType(vecType, NumElts, Canonical);
252573322924127c873c13101b705dd823f5539ffa5fSteve Naroff  VectorTypes.InsertNode(New, InsertPos);
252673322924127c873c13101b705dd823f5539ffa5fSteve Naroff  Types.push_back(New);
252773322924127c873c13101b705dd823f5539ffa5fSteve Naroff  return QualType(New, 0);
252873322924127c873c13101b705dd823f5539ffa5fSteve Naroff}
252973322924127c873c13101b705dd823f5539ffa5fSteve Naroff
25304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
25314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentSizedExtVectorType(QualType vecType,
25324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           Expr *SizeExpr,
25334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           SourceLocation AttrLoc) const {
25342ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  llvm::FoldingSetNodeID ID;
25351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType),
25362ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor                                       SizeExpr);
25371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25382ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  void *InsertPos = 0;
25392ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  DependentSizedExtVectorType *Canon
25402ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
25412ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  DependentSizedExtVectorType *New;
25422ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  if (Canon) {
25432ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    // We already have a canonical version of this array type; use it as
25442ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    // the canonical type for a newly-built type.
25456b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    New = new (*this, TypeAlignment)
25466b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0),
25476b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                                  SizeExpr, AttrLoc);
25482ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  } else {
25492ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    QualType CanonVecTy = getCanonicalType(vecType);
25502ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    if (CanonVecTy == vecType) {
25516b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      New = new (*this, TypeAlignment)
25526b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr,
25536b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                                    AttrLoc);
2554789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
2555789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      DependentSizedExtVectorType *CanonCheck
2556789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor        = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2557789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken");
2558789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      (void)CanonCheck;
25592ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor      DependentSizedExtVectorTypes.InsertNode(New, InsertPos);
25602ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    } else {
25612ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor      QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr,
25622ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor                                                      SourceLocation());
25636b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      New = new (*this, TypeAlignment)
25646b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc);
25652ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    }
25662ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  }
25671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25689cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  Types.push_back(New);
25699cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  return QualType(New, 0);
25709cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor}
25719cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor
257272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'.
25735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
25744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
25754ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionNoProtoType(QualType ResultTy,
25764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                   const FunctionType::ExtInfo &Info) const {
2577cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv DefaultCC = Info.getCC();
2578cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ?
2579cfe9af250f466e7e38becea4428990448ae07737Roman Divacky                               CC_X86StdCall : DefaultCC;
25805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique functions, to guarantee there is only one function of a particular
25815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
25825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
2583264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionNoProtoType::Profile(ID, ResultTy, Info);
25841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
25861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (FunctionNoProtoType *FT =
258772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor        FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
25885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(FT, 0);
25891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2591ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor  if (!ResultTy.isCanonical() ||
259204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      getCanonicalCallConv(CallConv) != CallConv) {
2593264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola    Canonical =
2594264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      getFunctionNoProtoType(getCanonicalType(ResultTy),
2595264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                     Info.withCallingConv(getCanonicalCallConv(CallConv)));
25961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
259872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    FunctionNoProtoType *NewIP =
259972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor      FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
2600c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
26015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
26021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2603cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  FunctionProtoType::ExtInfo newInfo = Info.withCallingConv(CallConv);
26046b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  FunctionNoProtoType *New = new (*this, TypeAlignment)
2605cfe9af250f466e7e38becea4428990448ae07737Roman Divacky    FunctionNoProtoType(ResultTy, Canonical, newInfo);
26065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
260772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  FunctionNoProtoTypes.InsertNode(New, InsertPos);
26085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
26095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
26105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
261102dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor/// \brief Determine whether \p T is canonical as the result type of a function.
261202dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregorstatic bool isCanonicalResultType(QualType T) {
261302dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor  return T.isCanonical() &&
261402dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor         (T.getObjCLifetime() == Qualifiers::OCL_None ||
261502dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor          T.getObjCLifetime() == Qualifiers::OCL_ExplicitNone);
261602dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor}
261702dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor
26185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFunctionType - Return a normal function type with a typed argument
26195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// list.  isVariadic indicates whether the argument list includes '...'.
26204ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
26214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionType(QualType ResultTy,
26224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                            const QualType *ArgArray, unsigned NumArgs,
26234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                            const FunctionProtoType::ExtProtoInfo &EPI) const {
26245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique functions, to guarantee there is only one function of a particular
26255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
26265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
26278026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl  FunctionProtoType::Profile(ID, ResultTy, ArgArray, NumArgs, EPI, *this);
26285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
26295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
26301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (FunctionProtoType *FTP =
263172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor        FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
26325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(FTP, 0);
2633465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2634465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  // Determine whether the type being created is already canonical or not.
2635eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith  bool isCanonical =
263602dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    EPI.ExceptionSpecType == EST_None && isCanonicalResultType(ResultTy) &&
2637eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith    !EPI.HasTrailingReturn;
26385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0; i != NumArgs && isCanonical; ++i)
263954e14c4db764c0636160d26c5bbf491637c83a76John McCall    if (!ArgArray[i].isCanonicalAsParam())
26405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      isCanonical = false;
26415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2642cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv DefaultCC = EPI.ExtInfo.getCC();
2643cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ?
2644cfe9af250f466e7e38becea4428990448ae07737Roman Divacky                               CC_X86StdCall : DefaultCC;
2645e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
26465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this type isn't canonical, get the canonical version of it.
2647465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  // The exception spec is not part of the canonical type.
26485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
264904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) {
26505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<QualType, 16> CanonicalArgs;
26515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CanonicalArgs.reserve(NumArgs);
26525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    for (unsigned i = 0; i != NumArgs; ++i)
265354e14c4db764c0636160d26c5bbf491637c83a76John McCall      CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i]));
2654465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2655e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
2656eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith    CanonicalEPI.HasTrailingReturn = false;
26578b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl    CanonicalEPI.ExceptionSpecType = EST_None;
26588b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl    CanonicalEPI.NumExceptions = 0;
2659e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    CanonicalEPI.ExtInfo
2660e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall      = CanonicalEPI.ExtInfo.withCallingConv(getCanonicalCallConv(CallConv));
2661e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
266202dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    // Result types do not have ARC lifetime qualifiers.
266302dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    QualType CanResultTy = getCanonicalType(ResultTy);
266402dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    if (ResultTy.getQualifiers().hasObjCLifetime()) {
266502dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor      Qualifiers Qs = CanResultTy.getQualifiers();
266602dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor      Qs.removeObjCLifetime();
266702dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor      CanResultTy = getQualifiedType(CanResultTy.getUnqualifiedType(), Qs);
266802dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    }
266902dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor
267002dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    Canonical = getFunctionType(CanResultTy,
2671beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad                                CanonicalArgs.data(), NumArgs,
2672e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                                CanonicalEPI);
2673465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
26745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
267572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    FunctionProtoType *NewIP =
267672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor      FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
2677c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
26785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2679465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2680f85e193739c953358c865005855253af4f68a497John McCall  // FunctionProtoType objects are allocated with extra bytes after
2681f85e193739c953358c865005855253af4f68a497John McCall  // them for three variable size arrays at the end:
2682f85e193739c953358c865005855253af4f68a497John McCall  //  - parameter types
2683f85e193739c953358c865005855253af4f68a497John McCall  //  - exception types
2684f85e193739c953358c865005855253af4f68a497John McCall  //  - consumed-arguments flags
2685f85e193739c953358c865005855253af4f68a497John McCall  // Instead of the exception types, there could be a noexcept
2686b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  // expression, or information used to resolve the exception
2687b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  // specification.
2688e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  size_t Size = sizeof(FunctionProtoType) +
268960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl                NumArgs * sizeof(QualType);
2690b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  if (EPI.ExceptionSpecType == EST_Dynamic) {
269160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    Size += EPI.NumExceptions * sizeof(QualType);
2692b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  } else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) {
26938026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl    Size += sizeof(Expr*);
2694e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  } else if (EPI.ExceptionSpecType == EST_Uninstantiated) {
269513bffc532bafd45d4a77867993c1afb83c7661beRichard Smith    Size += 2 * sizeof(FunctionDecl*);
2696b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  } else if (EPI.ExceptionSpecType == EST_Unevaluated) {
2697b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith    Size += sizeof(FunctionDecl*);
269860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  }
2699f85e193739c953358c865005855253af4f68a497John McCall  if (EPI.ConsumedArguments)
2700f85e193739c953358c865005855253af4f68a497John McCall    Size += NumArgs * sizeof(bool);
2701f85e193739c953358c865005855253af4f68a497John McCall
2702e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment);
2703cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  FunctionProtoType::ExtProtoInfo newEPI = EPI;
2704cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv);
27058026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl  new (FTP) FunctionProtoType(ResultTy, ArgArray, NumArgs, Canonical, newEPI);
27065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(FTP);
270772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  FunctionProtoTypes.InsertNode(FTP, InsertPos);
27085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(FTP, 0);
27095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
27105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
27113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#ifndef NDEBUG
27123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallstatic bool NeedsInjectedClassNameType(const RecordDecl *D) {
27133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!isa<CXXRecordDecl>(D)) return false;
27143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  const CXXRecordDecl *RD = cast<CXXRecordDecl>(D);
27153cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (isa<ClassTemplatePartialSpecializationDecl>(RD))
27163cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    return true;
27173cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (RD->getDescribedClassTemplate() &&
27183cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall      !isa<ClassTemplateSpecializationDecl>(RD))
27193cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    return true;
27203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return false;
27213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
27223cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif
27233cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
27243cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// getInjectedClassNameType - Return the unique reference to the
27253cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// injected class name type for the specified templated declaration.
27263cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl,
27274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                              QualType TST) const {
27283cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  assert(NeedsInjectedClassNameType(Decl));
27293cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (Decl->TypeForDecl) {
27303cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
2731ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) {
27323cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(PrevDecl->TypeForDecl && "previous declaration has no type");
27333cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    Decl->TypeForDecl = PrevDecl->TypeForDecl;
27343cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
27353cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  } else {
2736f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Type *newType =
273731f17ecbef57b5679c017c375db330546b7b5145John McCall      new (*this, TypeAlignment) InjectedClassNameType(Decl, TST);
2738f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Decl->TypeForDecl = newType;
2739f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Types.push_back(newType);
27403cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  }
27413cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return QualType(Decl->TypeForDecl, 0);
27423cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
27433cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
27442ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// getTypeDeclType - Return the unique reference to the type for the
27452ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// specified type declaration.
27464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const {
27471e6759e9e33dcaa73ce14c8a908ac9f87ac16463Argyrios Kyrtzidis  assert(Decl && "Passed null for Decl param");
2748becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall  assert(!Decl->TypeForDecl && "TypeForDecl present in slow case");
27491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2750162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  if (const TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Decl))
27512ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    return getTypedefType(Typedef);
2752becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall
2753becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall  assert(!isa<TemplateTypeParmDecl>(Decl) &&
2754becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall         "Template type parameter types are always available.");
2755becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall
275619c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) {
2757ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    assert(!Record->getPreviousDecl() &&
2758becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall           "struct/union has previous declaration");
2759becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall    assert(!NeedsInjectedClassNameType(Record));
2760400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    return getRecordType(Record);
276119c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) {
2762ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    assert(!Enum->getPreviousDecl() &&
2763becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall           "enum has previous declaration");
2764400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    return getEnumType(Enum);
276519c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  } else if (const UnresolvedUsingTypenameDecl *Using =
2766ed97649e9574b9d854fa4d6109c9333ae0993554John McCall               dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) {
2767f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using);
2768f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Decl->TypeForDecl = newType;
2769f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Types.push_back(newType);
27709fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump  } else
2771becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall    llvm_unreachable("TypeDecl without a type?");
277249aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis
277349aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis  return QualType(Decl->TypeForDecl, 0);
27742ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor}
27752ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor
27765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTypedefType - Return the unique reference to the type for the
2777162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// specified typedef name decl.
27789763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType
2779162e1c1b487352434552147967c3dd296ebee2f7Richard SmithASTContext::getTypedefType(const TypedefNameDecl *Decl,
2780162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                           QualType Canonical) const {
27815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
27821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27839763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  if (Canonical.isNull())
27849763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Canonical = getCanonicalType(Decl->getUnderlyingType());
2785f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  TypedefType *newType = new(*this, TypeAlignment)
27866b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    TypedefType(Type::Typedef, Decl, Canonical);
2787f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2788f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2789f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
27905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
27915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
27924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRecordType(const RecordDecl *Decl) const {
2793400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
2794400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2795ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  if (const RecordDecl *PrevDecl = Decl->getPreviousDecl())
2796400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    if (PrevDecl->TypeForDecl)
2797400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis      return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
2798400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2799f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  RecordType *newType = new (*this, TypeAlignment) RecordType(Decl);
2800f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2801f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2802f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
2803400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis}
2804400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
28054ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getEnumType(const EnumDecl *Decl) const {
2806400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
2807400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2808ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  if (const EnumDecl *PrevDecl = Decl->getPreviousDecl())
2809400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    if (PrevDecl->TypeForDecl)
2810400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis      return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
2811400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2812f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  EnumType *newType = new (*this, TypeAlignment) EnumType(Decl);
2813f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2814f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2815f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
2816400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis}
2817400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
28189d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType ASTContext::getAttributedType(AttributedType::Kind attrKind,
28199d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                       QualType modifiedType,
28209d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                       QualType equivalentType) {
28219d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  llvm::FoldingSetNodeID id;
28229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedType::Profile(id, attrKind, modifiedType, equivalentType);
28239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28249d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  void *insertPos = 0;
28259d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos);
28269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (type) return QualType(type, 0);
28279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  QualType canon = getCanonicalType(equivalentType);
28299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  type = new (*this, TypeAlignment)
28309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall           AttributedType(canon, attrKind, modifiedType, equivalentType);
28319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  Types.push_back(type);
28339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedTypes.InsertNode(type, insertPos);
28349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  return QualType(type, 0);
28369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
28379d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
283949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/// \brief Retrieve a substitution-result type.
284049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType
284149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,
28424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                         QualType Replacement) const {
2843467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(Replacement.isCanonical()
284449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall         && "replacement types must always be canonical");
284549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
284649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  llvm::FoldingSetNodeID ID;
284749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  SubstTemplateTypeParmType::Profile(ID, Parm, Replacement);
284849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  void *InsertPos = 0;
284949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  SubstTemplateTypeParmType *SubstParm
285049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
285149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
285249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  if (!SubstParm) {
285349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    SubstParm = new (*this, TypeAlignment)
285449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall      SubstTemplateTypeParmType(Parm, Replacement);
285549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    Types.push_back(SubstParm);
285649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
285749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  }
285849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
285949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  return QualType(SubstParm, 0);
286049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
286149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
2862c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor/// \brief Retrieve a
2863c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType ASTContext::getSubstTemplateTypeParmPackType(
2864c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                          const TemplateTypeParmType *Parm,
2865c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                              const TemplateArgument &ArgPack) {
2866c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifndef NDEBUG
2867c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(),
2868c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                    PEnd = ArgPack.pack_end();
2869c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor       P != PEnd; ++P) {
2870c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type");
2871c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    assert(P->getAsType().isCanonical() && "Pack contains non-canonical type");
2872c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  }
2873c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#endif
2874c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2875c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  llvm::FoldingSetNodeID ID;
2876c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack);
2877c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  void *InsertPos = 0;
2878c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  if (SubstTemplateTypeParmPackType *SubstParm
2879c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor        = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
2880c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    return QualType(SubstParm, 0);
2881c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2882c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  QualType Canon;
2883c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  if (!Parm->isCanonicalUnqualified()) {
2884c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    Canon = getCanonicalType(QualType(Parm, 0));
2885c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon),
2886c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                             ArgPack);
2887c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
2888c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  }
2889c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2890c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmPackType *SubstParm
2891c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon,
2892c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                                               ArgPack);
2893c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  Types.push_back(SubstParm);
2894c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
2895c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  return QualType(SubstParm, 0);
2896c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
2897c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2898fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor/// \brief Retrieve the template type parameter type for a template
28991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parameter or parameter pack with the given depth, index, and (optionally)
290076e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson/// name.
29011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
290276e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson                                             bool ParameterPack,
29034fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth                                             TemplateTypeParmDecl *TTPDecl) const {
2904fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  llvm::FoldingSetNodeID ID;
29054fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
2906fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  void *InsertPos = 0;
29071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateTypeParmType *TypeParm
2908fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor    = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
2909fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
2910fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  if (TypeParm)
2911fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor    return QualType(TypeParm, 0);
29121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29134fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  if (TTPDecl) {
291476e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson    QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
29154fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon);
2916789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
2917789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    TemplateTypeParmType *TypeCheck
2918789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
2919789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!TypeCheck && "Template type parameter canonical type broken");
2920789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)TypeCheck;
292176e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson  } else
29226b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    TypeParm = new (*this, TypeAlignment)
29236b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      TemplateTypeParmType(Depth, Index, ParameterPack);
2924fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
2925fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  Types.push_back(TypeParm);
2926fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
2927fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
2928fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  return QualType(TypeParm, 0);
2929fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor}
2930fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
29313cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallTypeSourceInfo *
29323cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
29333cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                              SourceLocation NameLoc,
29343cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                        const TemplateArgumentListInfo &Args,
29353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                              QualType Underlying) const {
29367c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Name.getAsDependentTemplateName() &&
29377c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
29383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  QualType TST = getTemplateSpecializationType(Name, Args, Underlying);
29393cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
29403cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TypeSourceInfo *DI = CreateTypeSourceInfo(TST);
29413cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TemplateSpecializationTypeLoc TL
29423cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc());
294355d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  TL.setTemplateKeywordLoc(SourceLocation());
29443cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setTemplateNameLoc(NameLoc);
29453cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setLAngleLoc(Args.getLAngleLoc());
29463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setRAngleLoc(Args.getRAngleLoc());
29473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
29483cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    TL.setArgLocInfo(i, Args[i].getLocInfo());
29493cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return DI;
29503cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
29513cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
29521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
29537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorASTContext::getTemplateSpecializationType(TemplateName Template,
2954d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                          const TemplateArgumentListInfo &Args,
29553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                          QualType Underlying) const {
29567c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
29577c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
29587c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
2959d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned NumArgs = Args.size();
2960d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
29615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 4> ArgVec;
2962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ArgVec.reserve(NumArgs);
2963833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0; i != NumArgs; ++i)
2964833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ArgVec.push_back(Args[i].getArgument());
2965833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
296631f17ecbef57b5679c017c375db330546b7b5145John McCall  return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs,
29673e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                       Underlying);
2968833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2969833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2970b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#ifndef NDEBUG
2971b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregorstatic bool hasAnyPackExpansions(const TemplateArgument *Args,
2972b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                                 unsigned NumArgs) {
2973b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  for (unsigned I = 0; I != NumArgs; ++I)
2974b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    if (Args[I].isPackExpansion())
2975b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor      return true;
2976b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor
2977b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  return true;
2978b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor}
2979b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#endif
2980b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor
2981833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType
2982833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallASTContext::getTemplateSpecializationType(TemplateName Template,
29837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                          const TemplateArgument *Args,
29847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                          unsigned NumArgs,
29853e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                          QualType Underlying) const {
29867c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
29877c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
29880f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  // Look through qualified template names.
29890f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
29900f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor    Template = TemplateName(QTN->getTemplateDecl());
29917c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
2992b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  bool IsTypeAlias =
29933e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    Template.getAsTemplateDecl() &&
29943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl());
29953e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  QualType CanonType;
29963e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  if (!Underlying.isNull())
29973e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    CanonType = getCanonicalType(Underlying);
29983e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  else {
2999b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    // We can get here with an alias template when the specialization contains
3000b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    // a pack expansion that does not match up with a parameter pack.
3001b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    assert((!IsTypeAlias || hasAnyPackExpansions(Args, NumArgs)) &&
3002b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor           "Caller must compute aliased type");
3003b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    IsTypeAlias = false;
30043e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    CanonType = getCanonicalTemplateSpecializationType(Template, Args,
30053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                       NumArgs);
30063e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  }
3007fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor
30081275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // Allocate the (non-canonical) template specialization type, but don't
30091275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // try to unique it: these types typically have location information that
30101275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // we don't unique and don't want to lose.
30113e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  void *Mem = Allocate(sizeof(TemplateSpecializationType) +
30123e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                       sizeof(TemplateArgument) * NumArgs +
3013b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                       (IsTypeAlias? sizeof(QualType) : 0),
30146b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                       TypeAlignment);
30151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateSpecializationType *Spec
3016b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, CanonType,
3017b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                                         IsTypeAlias ? Underlying : QualType());
30181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301955f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  Types.push_back(Spec);
30201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(Spec, 0);
302155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
302255f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
30231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
30249763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
30259763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                                   const TemplateArgument *Args,
30264ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                   unsigned NumArgs) const {
30277c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
30287c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
30293e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
30300f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  // Look through qualified template names.
30310f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
30320f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor    Template = TemplateName(QTN->getTemplateDecl());
30337c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
30349763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // Build the canonical template specialization type.
30359763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateName CanonTemplate = getCanonicalTemplateName(Template);
30365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 4> CanonArgs;
30379763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  CanonArgs.reserve(NumArgs);
30389763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  for (unsigned I = 0; I != NumArgs; ++I)
30399763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    CanonArgs.push_back(getCanonicalTemplateArgument(Args[I]));
30409763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30419763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // Determine whether this canonical template specialization type already
30429763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // exists.
30439763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  llvm::FoldingSetNodeID ID;
30449763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateSpecializationType::Profile(ID, CanonTemplate,
30459763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                      CanonArgs.data(), NumArgs, *this);
30469763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30479763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  void *InsertPos = 0;
30489763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateSpecializationType *Spec
30499763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
30509763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30519763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  if (!Spec) {
30529763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    // Allocate a new canonical template specialization type.
30539763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    void *Mem = Allocate((sizeof(TemplateSpecializationType) +
30549763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                          sizeof(TemplateArgument) * NumArgs),
30559763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                         TypeAlignment);
30569763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Spec = new (Mem) TemplateSpecializationType(CanonTemplate,
30579763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                                CanonArgs.data(), NumArgs,
30583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                QualType(), QualType());
30599763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Types.push_back(Spec);
30609763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
30619763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  }
30629763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30639763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  assert(Spec->isDependentType() &&
30649763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis         "Non-dependent template-id type must have a canonical type");
30659763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  return QualType(Spec, 0);
30669763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis}
30679763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
30689763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType
3069465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword,
3070465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                              NestedNameSpecifier *NNS,
30714ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                              QualType NamedType) const {
3072e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  llvm::FoldingSetNodeID ID;
3073465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType::Profile(ID, Keyword, NNS, NamedType);
3074e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3075e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  void *InsertPos = 0;
3076465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
3077e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  if (T)
3078e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor    return QualType(T, 0);
3079e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3080789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  QualType Canon = NamedType;
3081789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  if (!Canon.isCanonical()) {
3082789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    Canon = getCanonicalType(NamedType);
3083465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
3084465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    assert(!CheckT && "Elaborated canonical type broken");
3085789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckT;
3086789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  }
3087789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
3088465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  T = new (*this) ElaboratedType(Keyword, NNS, NamedType, Canon);
3089e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  Types.push_back(T);
3090465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypes.InsertNode(T, InsertPos);
3091e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  return QualType(T, 0);
3092e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor}
3093e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3094075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType
30954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getParenType(QualType InnerType) const {
3096075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  llvm::FoldingSetNodeID ID;
3097075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenType::Profile(ID, InnerType);
3098075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3099075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  void *InsertPos = 0;
3100075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
3101075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (T)
3102075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return QualType(T, 0);
3103075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3104075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType Canon = InnerType;
3105075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (!Canon.isCanonical()) {
3106075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    Canon = getCanonicalType(InnerType);
3107075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
3108075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    assert(!CheckT && "Paren canonical type broken");
3109075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    (void)CheckT;
3110075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
3111075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3112075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  T = new (*this) ParenType(InnerType, Canon);
3113075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  Types.push_back(T);
3114075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenTypes.InsertNode(T, InsertPos);
3115075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  return QualType(T, 0);
3116075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara}
3117075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
31184a2023f5014e82389d5980d307b89c545dbbac81Douglas GregorQualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword,
31194a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                          NestedNameSpecifier *NNS,
31204a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                          const IdentifierInfo *Name,
31214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          QualType Canon) const {
3122d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  assert(NNS->isDependent() && "nested-name-specifier must be dependent");
3123d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3124d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  if (Canon.isNull()) {
3125d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
31264a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    ElaboratedTypeKeyword CanonKeyword = Keyword;
31274a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    if (Keyword == ETK_None)
31284a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor      CanonKeyword = ETK_Typename;
31294a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor
31304a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    if (CanonNNS != NNS || CanonKeyword != Keyword)
31314a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor      Canon = getDependentNameType(CanonKeyword, CanonNNS, Name);
3132d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
3133d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3134d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  llvm::FoldingSetNodeID ID;
31354a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor  DependentNameType::Profile(ID, Keyword, NNS, Name);
3136d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3137d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  void *InsertPos = 0;
31384714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T
31394714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
3140d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  if (T)
3141d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return QualType(T, 0);
3142d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
31434a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor  T = new (*this) DependentNameType(Keyword, NNS, Name, Canon);
3144d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  Types.push_back(T);
31454714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameTypes.InsertNode(T, InsertPos);
31461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
3147d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
3148d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
31491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
315033500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType(
315133500955d731c73717af52088b7fc0e7a85681e7John McCall                                 ElaboratedTypeKeyword Keyword,
31524a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                 NestedNameSpecifier *NNS,
315333500955d731c73717af52088b7fc0e7a85681e7John McCall                                 const IdentifierInfo *Name,
31544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                 const TemplateArgumentListInfo &Args) const {
315533500955d731c73717af52088b7fc0e7a85681e7John McCall  // TODO: avoid this copy
31565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> ArgCopy;
315733500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = Args.size(); I != E; ++I)
315833500955d731c73717af52088b7fc0e7a85681e7John McCall    ArgCopy.push_back(Args[I].getArgument());
315933500955d731c73717af52088b7fc0e7a85681e7John McCall  return getDependentTemplateSpecializationType(Keyword, NNS, Name,
316033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ArgCopy.size(),
316133500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ArgCopy.data());
316233500955d731c73717af52088b7fc0e7a85681e7John McCall}
316333500955d731c73717af52088b7fc0e7a85681e7John McCall
316433500955d731c73717af52088b7fc0e7a85681e7John McCallQualType
316533500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType(
316633500955d731c73717af52088b7fc0e7a85681e7John McCall                                 ElaboratedTypeKeyword Keyword,
316733500955d731c73717af52088b7fc0e7a85681e7John McCall                                 NestedNameSpecifier *NNS,
316833500955d731c73717af52088b7fc0e7a85681e7John McCall                                 const IdentifierInfo *Name,
316933500955d731c73717af52088b7fc0e7a85681e7John McCall                                 unsigned NumArgs,
31704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                 const TemplateArgument *Args) const {
3171aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor  assert((!NNS || NNS->isDependent()) &&
3172aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor         "nested-name-specifier must be dependent");
31731734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
3174789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  llvm::FoldingSetNodeID ID;
317533500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS,
317633500955d731c73717af52088b7fc0e7a85681e7John McCall                                               Name, NumArgs, Args);
3177789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
3178789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  void *InsertPos = 0;
317933500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType *T
318033500955d731c73717af52088b7fc0e7a85681e7John McCall    = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
3181789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  if (T)
3182789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    return QualType(T, 0);
3183789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
318433500955d731c73717af52088b7fc0e7a85681e7John McCall  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
318533500955d731c73717af52088b7fc0e7a85681e7John McCall
318633500955d731c73717af52088b7fc0e7a85681e7John McCall  ElaboratedTypeKeyword CanonKeyword = Keyword;
318733500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Keyword == ETK_None) CanonKeyword = ETK_Typename;
31881734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
318933500955d731c73717af52088b7fc0e7a85681e7John McCall  bool AnyNonCanonArgs = false;
31905f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> CanonArgs(NumArgs);
319133500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0; I != NumArgs; ++I) {
319233500955d731c73717af52088b7fc0e7a85681e7John McCall    CanonArgs[I] = getCanonicalTemplateArgument(Args[I]);
319333500955d731c73717af52088b7fc0e7a85681e7John McCall    if (!CanonArgs[I].structurallyEquals(Args[I]))
319433500955d731c73717af52088b7fc0e7a85681e7John McCall      AnyNonCanonArgs = true;
3195789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  }
31961734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
319733500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Canon;
319833500955d731c73717af52088b7fc0e7a85681e7John McCall  if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {
319933500955d731c73717af52088b7fc0e7a85681e7John McCall    Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS,
320033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                   Name, NumArgs,
320133500955d731c73717af52088b7fc0e7a85681e7John McCall                                                   CanonArgs.data());
320233500955d731c73717af52088b7fc0e7a85681e7John McCall
320333500955d731c73717af52088b7fc0e7a85681e7John McCall    // Find the insert position again.
320433500955d731c73717af52088b7fc0e7a85681e7John McCall    DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
320533500955d731c73717af52088b7fc0e7a85681e7John McCall  }
320633500955d731c73717af52088b7fc0e7a85681e7John McCall
320733500955d731c73717af52088b7fc0e7a85681e7John McCall  void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) +
320833500955d731c73717af52088b7fc0e7a85681e7John McCall                        sizeof(TemplateArgument) * NumArgs),
320933500955d731c73717af52088b7fc0e7a85681e7John McCall                       TypeAlignment);
3210ef99001908e799c388f1363b1e607dad5f5b57d3John McCall  T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS,
321133500955d731c73717af52088b7fc0e7a85681e7John McCall                                                    Name, NumArgs, Args, Canon);
32121734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  Types.push_back(T);
321333500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationTypes.InsertNode(T, InsertPos);
32141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
32151734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor}
32161734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
3217cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas GregorQualType ASTContext::getPackExpansionType(QualType Pattern,
3218cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                      llvm::Optional<unsigned> NumExpansions) {
32197536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  llvm::FoldingSetNodeID ID;
3220cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  PackExpansionType::Profile(ID, Pattern, NumExpansions);
32217536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
32227536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  assert(Pattern->containsUnexpandedParameterPack() &&
32237536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor         "Pack expansions must expand one or more parameter packs");
32247536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  void *InsertPos = 0;
32257536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  PackExpansionType *T
32267536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
32277536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (T)
32287536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    return QualType(T, 0);
32297536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
32307536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  QualType Canon;
32317536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (!Pattern.isCanonical()) {
3232d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    Canon = getCanonicalType(Pattern);
3233d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // The canonical type might not contain an unexpanded parameter pack, if it
3234d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // contains an alias template specialization which ignores one of its
3235d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // parameters.
3236d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    if (Canon->containsUnexpandedParameterPack()) {
3237d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions);
3238d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith
3239d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      // Find the insert position again, in case we inserted an element into
3240d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      // PackExpansionTypes and invalidated our insert position.
3241d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
3242d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    }
32437536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  }
32447536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
3245cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  T = new (*this) PackExpansionType(Pattern, Canon, NumExpansions);
32467536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  Types.push_back(T);
32477536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  PackExpansionTypes.InsertNode(T, InsertPos);
32487536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  return QualType(T, 0);
32497536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
32507536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
325188cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// CmpProtocolNames - Comparison predicate for sorting protocols
325288cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// alphabetically.
325388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattnerstatic bool CmpProtocolNames(const ObjCProtocolDecl *LHS,
325488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner                            const ObjCProtocolDecl *RHS) {
32552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return LHS->getDeclName() < RHS->getDeclName();
325688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner}
325788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3258c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallstatic bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols,
325954e14c4db764c0636160d26c5bbf491637c83a76John McCall                                unsigned NumProtocols) {
326054e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (NumProtocols == 0) return true;
326154e14c4db764c0636160d26c5bbf491637c83a76John McCall
326261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  if (Protocols[0]->getCanonicalDecl() != Protocols[0])
326361cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    return false;
326461cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor
326554e14c4db764c0636160d26c5bbf491637c83a76John McCall  for (unsigned i = 1; i != NumProtocols; ++i)
326661cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    if (!CmpProtocolNames(Protocols[i-1], Protocols[i]) ||
326761cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor        Protocols[i]->getCanonicalDecl() != Protocols[i])
326854e14c4db764c0636160d26c5bbf491637c83a76John McCall      return false;
326954e14c4db764c0636160d26c5bbf491637c83a76John McCall  return true;
327054e14c4db764c0636160d26c5bbf491637c83a76John McCall}
327154e14c4db764c0636160d26c5bbf491637c83a76John McCall
327254e14c4db764c0636160d26c5bbf491637c83a76John McCallstatic void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols,
327388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner                                   unsigned &NumProtocols) {
327488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols;
32751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
327688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  // Sort protocols, keyed by name.
327788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames);
327888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
327961cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  // Canonicalize.
328061cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  for (unsigned I = 0, N = NumProtocols; I != N; ++I)
328161cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    Protocols[I] = Protocols[I]->getCanonicalDecl();
328261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor
328388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  // Remove duplicates.
328488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  ProtocolsEnd = std::unique(Protocols, ProtocolsEnd);
328588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  NumProtocols = ProtocolsEnd-Protocols;
328688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner}
328788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3288c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType ASTContext::getObjCObjectType(QualType BaseType,
3289c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                       ObjCProtocolDecl * const *Protocols,
32904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                       unsigned NumProtocols) const {
3291c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // If the base type is an interface and there aren't any protocols
3292c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // to add, then the interface type will do just fine.
3293c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!NumProtocols && isa<ObjCInterfaceType>(BaseType))
3294c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return BaseType;
3295d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
3296c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Look in the folding set for an existing type.
3297c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  llvm::FoldingSetNodeID ID;
3298c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypeImpl::Profile(ID, BaseType, Protocols, NumProtocols);
3299d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  void *InsertPos = 0;
3300c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
3301c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return QualType(QT, 0);
3302d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
3303c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Build the canonical type, which has the canonical base type and
3304c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // a sorted-and-uniqued list of protocols.
330554e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Canonical;
3306c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  bool ProtocolsSorted = areSortedAndUniqued(Protocols, NumProtocols);
3307c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!ProtocolsSorted || !BaseType.isCanonical()) {
3308c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (!ProtocolsSorted) {
33095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols,
33100237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer                                                     Protocols + NumProtocols);
331154e14c4db764c0636160d26c5bbf491637c83a76John McCall      unsigned UniqueCount = NumProtocols;
331254e14c4db764c0636160d26c5bbf491637c83a76John McCall
331354e14c4db764c0636160d26c5bbf491637c83a76John McCall      SortAndUniqueProtocols(&Sorted[0], UniqueCount);
3314c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Canonical = getObjCObjectType(getCanonicalType(BaseType),
3315c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                    &Sorted[0], UniqueCount);
331654e14c4db764c0636160d26c5bbf491637c83a76John McCall    } else {
3317c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Canonical = getObjCObjectType(getCanonicalType(BaseType),
3318c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                    Protocols, NumProtocols);
331954e14c4db764c0636160d26c5bbf491637c83a76John McCall    }
332054e14c4db764c0636160d26c5bbf491637c83a76John McCall
332154e14c4db764c0636160d26c5bbf491637c83a76John McCall    // Regenerate InsertPos.
3322c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
332354e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
332454e14c4db764c0636160d26c5bbf491637c83a76John McCall
3325c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  unsigned Size = sizeof(ObjCObjectTypeImpl);
3326c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  Size += NumProtocols * sizeof(ObjCProtocolDecl *);
3327fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor  void *Mem = Allocate(Size, TypeAlignment);
3328c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypeImpl *T =
3329c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    new (Mem) ObjCObjectTypeImpl(Canonical, BaseType, Protocols, NumProtocols);
33301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3331c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  Types.push_back(T);
3332c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypes.InsertNode(T, InsertPos);
3333c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return QualType(T, 0);
3334d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff}
333588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3336c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for
3337c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// the given object type.
33384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const {
33394b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  llvm::FoldingSetNodeID ID;
3340c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerType::Profile(ID, ObjectT);
33411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33424b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  void *InsertPos = 0;
3343c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (ObjCObjectPointerType *QT =
3344c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall              ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
33454b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian    return QualType(QT, 0);
33461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3347c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Find the canonical object type.
334854e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Canonical;
3349c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!ObjectT.isCanonical()) {
3350c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT));
335154e14c4db764c0636160d26c5bbf491637c83a76John McCall
3352c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    // Regenerate InsertPos.
3353c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
335454e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
335554e14c4db764c0636160d26c5bbf491637c83a76John McCall
3356c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // No match.
3357c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment);
3358c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerType *QType =
3359c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    new (Mem) ObjCObjectPointerType(Canonical, ObjectT);
336024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
336124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis  Types.push_back(QType);
3362c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
336324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis  return QualType(QType, 0);
336424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
336524fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3366deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// getObjCInterfaceType - Return the unique reference to the type for the
3367deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// specified ObjC interface decl. The list of protocols is optional.
33680af550115df1f57f17a4f125ff0e8b34820c65d1Douglas GregorQualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl,
33690af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor                                          ObjCInterfaceDecl *PrevDecl) const {
3370deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  if (Decl->TypeForDecl)
3371deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    return QualType(Decl->TypeForDecl, 0);
337274c730ad1f6818b676b0bad46d806a9176950328Sebastian Redl
33730af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor  if (PrevDecl) {
33740af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl");
33750af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    Decl->TypeForDecl = PrevDecl->TypeForDecl;
33760af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    return QualType(PrevDecl->TypeForDecl, 0);
33770af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor  }
33780af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor
33798d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor  // Prefer the definition, if there is one.
33808d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor  if (const ObjCInterfaceDecl *Def = Decl->getDefinition())
33818d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor    Decl = Def;
33828d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor
3383deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment);
3384deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ObjCInterfaceType *T = new (Mem) ObjCInterfaceType(Decl);
3385deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  Decl->TypeForDecl = T;
3386deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  Types.push_back(T);
3387deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  return QualType(T, 0);
3388c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3389c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
339072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique
339172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// TypeOfExprType AST's (since expression's are never shared). For example,
33929752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// multiple declarations that refer to "typeof(x)" all contain different
33931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// DeclRefExpr's. This doesn't effect the type checker, since it operates
33949752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique).
33954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfExprType(Expr *tofExpr) const {
3396dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  TypeOfExprType *toe;
3397b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor  if (tofExpr->isTypeDependent()) {
3398b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    llvm::FoldingSetNodeID ID;
3399b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    DependentTypeOfExprType::Profile(ID, *this, tofExpr);
34001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3401b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    void *InsertPos = 0;
3402b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    DependentTypeOfExprType *Canon
3403b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
3404b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    if (Canon) {
3405b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // We already have a "canonical" version of an identical, dependent
3406b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // typeof(expr) type. Use that as our canonical type.
34076b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr,
3408b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor                                          QualType((TypeOfExprType*)Canon, 0));
34093060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    } else {
3410b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // Build a new, canonical typeof(expr) type.
34116b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      Canon
34126b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr);
3413b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
3414b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      toe = Canon;
3415b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    }
3416b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor  } else {
3417dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor    QualType Canonical = getCanonicalType(tofExpr->getType());
34186b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical);
3419dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  }
34209752f25748d954df99087d741ea35db37ff16beaSteve Naroff  Types.push_back(toe);
34219752f25748d954df99087d741ea35db37ff16beaSteve Naroff  return QualType(toe, 0);
3422d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
3423d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
34249752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// getTypeOfType -  Unlike many "get<Type>" functions, we don't unique
34259752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// TypeOfType AST's. The only motivation to unique these nodes would be
34269752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be
34271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates
34289752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique).
34294ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfType(QualType tofType) const {
3430f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  QualType Canonical = getCanonicalType(tofType);
34316b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical);
34329752f25748d954df99087d741ea35db37ff16beaSteve Naroff  Types.push_back(tot);
34339752f25748d954df99087d741ea35db37ff16beaSteve Naroff  return QualType(tot, 0);
3434d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
3435d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
343660a9a2a404a4cf259d39133383e922aa00ca9043Anders Carlsson
3437395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// getDecltypeType -  Unlike many "get<Type>" functions, we don't unique
3438395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// DecltypeType AST's. The only motivation to unique these nodes would be
3439395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be
34401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates
344139e02032b01874a0d02ba85a4cd3922adda81376David Blaikie/// on canonical types (which are always unique).
3442f8af98286022f72157d84951b48fde5fb369ab29Douglas GregorQualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const {
3443dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  DecltypeType *dt;
3444561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
3445561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  // C++0x [temp.type]p2:
3446561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   If an expression e involves a template parameter, decltype(e) denotes a
3447561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   unique dependent type. Two such decltype-specifiers refer to the same
3448561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   type only if their expressions are equivalent (14.5.6.1).
3449561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  if (e->isInstantiationDependent()) {
34509d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    llvm::FoldingSetNodeID ID;
34519d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    DependentDecltypeType::Profile(ID, *this, e);
34521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34539d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    void *InsertPos = 0;
34549d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    DependentDecltypeType *Canon
34559d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos);
34569d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    if (Canon) {
34579d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // We already have a "canonical" version of an equivalent, dependent
34589d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // decltype type. Use that as our canonical type.
34590d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith      dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType,
34609d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor                                       QualType((DecltypeType*)Canon, 0));
34613060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    } else {
34629d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // Build a new, canonical typeof(expr) type.
34636b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e);
34649d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      DependentDecltypeTypes.InsertNode(Canon, InsertPos);
34659d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      dt = Canon;
34669d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    }
34679d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor  } else {
3468f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor    dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType,
3469f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor                                      getCanonicalType(UnderlyingType));
3470dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  }
3471395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  Types.push_back(dt);
3472395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  return QualType(dt, 0);
3473395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson}
3474395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
3475ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// getUnaryTransformationType - We don't unique these, since the memory
3476ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// savings are minimal and these are rare.
3477ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTContext::getUnaryTransformType(QualType BaseType,
3478ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt                                           QualType UnderlyingType,
3479ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt                                           UnaryTransformType::UTTKind Kind)
3480ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    const {
3481ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  UnaryTransformType *Ty =
348269d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor    new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType,
348369d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor                                                   Kind,
348469d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor                                 UnderlyingType->isDependentType() ?
348512fc4b0624706b474fa10308631fa8daf92f340fPeter Collingbourne                                 QualType() : getCanonicalType(UnderlyingType));
3486ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  Types.push_back(Ty);
3487ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  return QualType(Ty, 0);
3488ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt}
3489ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
3490483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith/// getAutoType - We only unique auto types after they've been deduced.
349134b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTContext::getAutoType(QualType DeducedType) const {
3492483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  void *InsertPos = 0;
3493483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  if (!DeducedType.isNull()) {
3494483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    // Look in the folding set for an existing type.
3495483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    llvm::FoldingSetNodeID ID;
3496483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    AutoType::Profile(ID, DeducedType);
3497483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos))
3498483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith      return QualType(AT, 0);
3499483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  }
3500483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith
3501483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType);
3502483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  Types.push_back(AT);
3503483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  if (InsertPos)
3504483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    AutoTypes.InsertNode(AT, InsertPos);
3505483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  return QualType(AT, 0);
350634b41d939a1328f484511c6002ba2456db879a29Richard Smith}
350734b41d939a1328f484511c6002ba2456db879a29Richard Smith
3508b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// getAtomicType - Return the uniqued reference to the atomic type for
3509b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// the given value type.
3510b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanQualType ASTContext::getAtomicType(QualType T) const {
3511b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // Unique pointers, to guarantee there is only one pointer of a particular
3512b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // structure.
3513b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  llvm::FoldingSetNodeID ID;
3514b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicType::Profile(ID, T);
3515b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3516b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  void *InsertPos = 0;
3517b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
3518b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    return QualType(AT, 0);
3519b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3520b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // If the atomic value type isn't canonical, this won't be a canonical type
3521b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // either, so fill in the canonical type field.
3522b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  QualType Canonical;
3523b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  if (!T.isCanonical()) {
3524b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    Canonical = getAtomicType(getCanonicalType(T));
3525b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3526b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    // Get the new insert position for the node we care about.
3527b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
3528b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
3529b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
3530b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicType *New = new (*this, TypeAlignment) AtomicType(T, Canonical);
3531b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  Types.push_back(New);
3532b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicTypes.InsertNode(New, InsertPos);
3533b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  return QualType(New, 0);
3534b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman}
3535b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3536ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoDeductType - Get type pattern for deducing against 'auto'.
3537ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoDeductType() const {
3538ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  if (AutoDeductTy.isNull())
3539ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    AutoDeductTy = getAutoType(QualType());
3540ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  assert(!AutoDeductTy.isNull() && "can't build 'auto' pattern");
3541ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  return AutoDeductTy;
3542ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
3543ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
3544ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'.
3545ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoRRefDeductType() const {
3546ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  if (AutoRRefDeductTy.isNull())
3547ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType());
3548ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern");
3549ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  return AutoRRefDeductTy;
3550ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
3551ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
35525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTagDeclType - Return the unique reference to the type for the
35535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified TagDecl (struct/union/class/enum) decl.
35544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTagDeclType(const TagDecl *Decl) const {
3555d778f88d32b96a74c9edb7342c81357606a7cdc0Ted Kremenek  assert (Decl);
3556e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  // FIXME: What is the design on getTagDeclType when it requires casting
3557e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  // away const?  mutable?
3558e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  return getTypeDeclType(const_cast<TagDecl*>(Decl));
35595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
35605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
35611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result
35621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and
35631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// needs to agree with the definition in <stddef.h>.
3564a3ccda58913cc1a4b8564e349448b12acc462da7Anders CarlssonCanQualType ASTContext::getSizeType() const {
3565bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  return getFromTargetType(Target->getSizeType());
35665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
35675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
356829e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5).
356929e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getIntMaxType() const {
357029e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg  return getFromTargetType(Target->getIntMaxType());
357129e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg}
357229e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg
357329e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5).
357429e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getUIntMaxType() const {
357529e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg  return getFromTargetType(Target->getUIntMaxType());
357629e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg}
357729e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg
357864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getSignedWCharType - Return the type of "signed wchar_t".
357964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension.
358064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getSignedWCharType() const {
358164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  // FIXME: derive from "Target" ?
358264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  return WCharTy;
358364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis}
358464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
358564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getUnsignedWCharType - Return the type of "unsigned wchar_t".
358664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension.
358764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getUnsignedWCharType() const {
358864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  // FIXME: derive from "Target" ?
358964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  return UnsignedIntTy;
359064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis}
359164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
359229e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17)
35938b9023ba35a86838789e2c9034a6128728c547aaChris Lattner/// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
35948b9023ba35a86838789e2c9034a6128728c547aaChris LattnerQualType ASTContext::getPointerDiffType() const {
3595bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  return getFromTargetType(Target->getPtrDiffType(0));
35968b9023ba35a86838789e2c9034a6128728c547aaChris Lattner}
35978b9023ba35a86838789e2c9034a6128728c547aaChris Lattner
35986902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman/// \brief Return the unique type for "pid_t" defined in
35996902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman/// <sys/types.h>. We need this to compute the correct type for vfork().
36006902e4146d426998ff6a94b16776c1b3f805a048Eli FriedmanQualType ASTContext::getProcessIDType() const {
36016902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman  return getFromTargetType(Target->getProcessIDType());
36026902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman}
36036902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman
3604e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===//
3605e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//                              Type Operators
3606e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===//
3607e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
36084ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCanQualType ASTContext::getCanonicalParamType(QualType T) const {
360954e14c4db764c0636160d26c5bbf491637c83a76John McCall  // Push qualifiers into arrays, and then discard any remaining
361054e14c4db764c0636160d26c5bbf491637c83a76John McCall  // qualifiers.
361154e14c4db764c0636160d26c5bbf491637c83a76John McCall  T = getCanonicalType(T);
3612745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  T = getVariableArrayDecayedType(T);
361354e14c4db764c0636160d26c5bbf491637c83a76John McCall  const Type *Ty = T.getTypePtr();
361454e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Result;
361554e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (isa<ArrayType>(Ty)) {
361654e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = getArrayDecayedType(QualType(Ty,0));
361754e14c4db764c0636160d26c5bbf491637c83a76John McCall  } else if (isa<FunctionType>(Ty)) {
361854e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = getPointerType(QualType(Ty, 0));
361954e14c4db764c0636160d26c5bbf491637c83a76John McCall  } else {
362054e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = QualType(Ty, 0);
362154e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
362254e14c4db764c0636160d26c5bbf491637c83a76John McCall
362354e14c4db764c0636160d26c5bbf491637c83a76John McCall  return CanQualType::CreateUnsafe(Result);
362454e14c4db764c0636160d26c5bbf491637c83a76John McCall}
362554e14c4db764c0636160d26c5bbf491637c83a76John McCall
362662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCallQualType ASTContext::getUnqualifiedArrayType(QualType type,
362762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall                                             Qualifiers &quals) {
362862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  SplitQualType splitType = type.getSplitUnqualifiedType();
362962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
363062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // FIXME: getSplitUnqualifiedType() actually walks all the way to
363162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // the unqualified desugared type and then drops it on the floor.
363262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // We then have to strip that sugar back off with
363362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // getUnqualifiedDesugaredType(), which is silly.
363462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  const ArrayType *AT =
3635200fa53fd420aa8369586f569dbece04930ad6a3John McCall    dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType());
363662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
363762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // If we don't have an array, just use the results in splitType.
36389dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (!AT) {
3639200fa53fd420aa8369586f569dbece04930ad6a3John McCall    quals = splitType.Quals;
3640200fa53fd420aa8369586f569dbece04930ad6a3John McCall    return QualType(splitType.Ty, 0);
364128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
364228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
364362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // Otherwise, recurse on the array's element type.
364462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  QualType elementType = AT->getElementType();
364562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  QualType unqualElementType = getUnqualifiedArrayType(elementType, quals);
364662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
364762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // If that didn't change the element type, AT has no qualifiers, so we
364862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // can just use the results in splitType.
364962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  if (elementType == unqualElementType) {
365062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    assert(quals.empty()); // from the recursive call
3651200fa53fd420aa8369586f569dbece04930ad6a3John McCall    quals = splitType.Quals;
3652200fa53fd420aa8369586f569dbece04930ad6a3John McCall    return QualType(splitType.Ty, 0);
365362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  }
365462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
365562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // Otherwise, add in the qualifiers from the outermost type, then
365662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // build the type back up.
3657200fa53fd420aa8369586f569dbece04930ad6a3John McCall  quals.addConsistentQualifiers(splitType.Quals);
365828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
36599dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
366062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getConstantArrayType(unqualElementType, CAT->getSize(),
366128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                CAT->getSizeModifier(), 0);
366228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
366328e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
36649dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
366562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0);
366628e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
366728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
36689dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(AT)) {
366962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getVariableArrayType(unqualElementType,
36703fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                VAT->getSizeExpr(),
36719dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getSizeModifier(),
36729dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getIndexTypeCVRQualifiers(),
36739dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getBracketsRange());
36749dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  }
36759dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor
36769dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(AT);
367762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(),
367828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                    DSAT->getSizeModifier(), 0,
367928e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                    SourceRange());
368028e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth}
368128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
36825a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types  that
36835a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// may be similar (C++ 4.4), replaces T1 and T2 with the type that
36845a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// they point to and return true. If T1 and T2 aren't pointer types
36855a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// or pointer-to-member types, or if they are not similar at this
36865a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// level, returns false and leaves T1 and T2 unchanged. Top-level
36875a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// qualifiers on T1 and T2 are ignored. This function will typically
36885a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// be called in a loop that successively "unwraps" pointer and
36895a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// pointer-to-member types to compare them at each level.
36905a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregorbool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) {
36915a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  const PointerType *T1PtrType = T1->getAs<PointerType>(),
36925a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                    *T2PtrType = T2->getAs<PointerType>();
36935a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  if (T1PtrType && T2PtrType) {
36945a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T1 = T1PtrType->getPointeeType();
36955a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T2 = T2PtrType->getPointeeType();
36965a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    return true;
36975a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
36985a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
36995a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(),
37005a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                          *T2MPType = T2->getAs<MemberPointerType>();
37015a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  if (T1MPType && T2MPType &&
37025a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0),
37035a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                             QualType(T2MPType->getClass(), 0))) {
37045a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T1 = T1MPType->getPointeeType();
37055a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T2 = T2MPType->getPointeeType();
37065a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    return true;
37075a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
37085a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
37094e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().ObjC1) {
37105a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    const ObjCObjectPointerType *T1OPType = T1->getAs<ObjCObjectPointerType>(),
37115a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                                *T2OPType = T2->getAs<ObjCObjectPointerType>();
37125a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    if (T1OPType && T2OPType) {
37135a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      T1 = T1OPType->getPointeeType();
37145a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      T2 = T2OPType->getPointeeType();
37155a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      return true;
37165a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    }
37175a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
37185a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
37195a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  // FIXME: Block pointers, too?
37205a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
37215a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  return false;
37225a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor}
37235a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
37244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameInfo
37254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getNameForTemplate(TemplateName Name,
37264ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                               SourceLocation NameLoc) const {
3727146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  switch (Name.getKind()) {
3728146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::QualifiedTemplate:
3729146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::Template:
37302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    // DNInfo work in progress: CHECKME: what about DNLoc?
3731146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(),
3732146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
37332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
3734146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::OverloadedTemplate: {
3735146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate();
3736146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    // DNInfo work in progress: CHECKME: what about DNLoc?
3737146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc);
3738146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3739146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3740146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::DependentTemplate: {
3741146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    DependentTemplateName *DTN = Name.getAsDependentTemplateName();
37422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName DName;
374380ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    if (DTN->isIdentifier()) {
37442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DName = DeclarationNames.getIdentifier(DTN->getIdentifier());
37452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return DeclarationNameInfo(DName, NameLoc);
374680ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    } else {
37472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DName = DeclarationNames.getCXXOperatorName(DTN->getOperator());
37482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      // DNInfo work in progress: FIXME: source locations?
37492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DeclarationNameLoc DNLoc;
37502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DNLoc.CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding();
37512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DNLoc.CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding();
37522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return DeclarationNameInfo(DName, NameLoc, DNLoc);
375380ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    }
375480ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall  }
375580ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall
3756146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParm: {
3757146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmStorage *subst
3758146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParm();
3759146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(subst->getParameter()->getDeclName(),
3760146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
3761146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3762146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3763146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParmPack: {
3764146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmPackStorage *subst
3765146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParmPack();
3766146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(subst->getParameterPack()->getDeclName(),
3767146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
3768146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3769146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3770146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3771146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm_unreachable("bad template name kind!");
377280ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall}
377380ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall
37744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const {
3775146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  switch (Name.getKind()) {
3776146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::QualifiedTemplate:
3777146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::Template: {
3778146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateDecl *Template = Name.getAsTemplateDecl();
37793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTemplateParmDecl *TTP
3780146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall          = dyn_cast<TemplateTemplateParmDecl>(Template))
37813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      Template = getCanonicalTemplateTemplateParmDecl(TTP);
37823e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
37833e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    // The canonical template name is the canonical template declaration.
378497fbaa2a38804268a024f1a104b43fcf8b4411b0Argyrios Kyrtzidis    return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl()));
37853e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
378625a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor
3787146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::OverloadedTemplate:
3788146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    llvm_unreachable("cannot canonicalize overloaded template");
3789146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3790146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::DependentTemplate: {
3791146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    DependentTemplateName *DTN = Name.getAsDependentTemplateName();
3792146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    assert(DTN && "Non-dependent template names must refer to template decls.");
3793146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DTN->CanonicalTemplateName;
3794146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3795146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3796146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParm: {
3797146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmStorage *subst
3798146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParm();
3799146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return getCanonicalTemplateName(subst->getReplacement());
38001aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3802146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParmPack: {
3803146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmPackStorage *subst
3804146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                  = Name.getAsSubstTemplateTemplateParmPack();
3805146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateTemplateParmDecl *canonParameter
3806146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack());
3807146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateArgument canonArgPack
3808146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = getCanonicalTemplateArgument(subst->getArgumentPack());
3809146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack);
3810146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3811146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3812146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3813146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm_unreachable("bad template name!");
381425a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor}
381525a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor
3816db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregorbool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) {
3817db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  X = getCanonicalTemplateName(X);
3818db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  Y = getCanonicalTemplateName(Y);
3819db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  return X.getAsVoidPointer() == Y.getAsVoidPointer();
3820db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor}
3821db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor
38221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument
38234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const {
38241275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  switch (Arg.getKind()) {
38251275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Null:
38261275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      return Arg;
38271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38281275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Expression:
38291275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      return Arg;
38301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3831d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    case TemplateArgument::Declaration: {
3832d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      ValueDecl *D = cast<ValueDecl>(Arg.getAsDecl()->getCanonicalDecl());
3833d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return TemplateArgument(D, Arg.isDeclForReferenceParam());
3834d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    }
38351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3836d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    case TemplateArgument::NullPtr:
3837d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return TemplateArgument(getCanonicalType(Arg.getNullPtrType()),
3838d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman                              /*isNullPtr*/true);
3839d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
3840788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    case TemplateArgument::Template:
3841788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate()));
3842a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
3843a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    case TemplateArgument::TemplateExpansion:
3844a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      return TemplateArgument(getCanonicalTemplateName(
3845a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                         Arg.getAsTemplateOrTemplatePattern()),
38462be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                              Arg.getNumTemplateExpansions());
3847a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
38481275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Integral:
3849855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer      return TemplateArgument(Arg, getCanonicalType(Arg.getIntegralType()));
38501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38511275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Type:
3852833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      return TemplateArgument(getCanonicalType(Arg.getAsType()));
38531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38541275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Pack: {
385587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor      if (Arg.pack_size() == 0)
385687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor        return Arg;
385787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
3858910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      TemplateArgument *CanonArgs
3859910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor        = new (*this) TemplateArgument[Arg.pack_size()];
38601275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      unsigned Idx = 0;
38611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
38621275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                        AEnd = Arg.pack_end();
38631275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor           A != AEnd; (void)++A, ++Idx)
38641275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor        CanonArgs[Idx] = getCanonicalTemplateArgument(*A);
38651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3866910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      return TemplateArgument(CanonArgs, Arg.pack_size());
38671275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    }
38681275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  }
38691275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor
38701275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // Silence GCC warning
3871b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unhandled template argument kind");
38721275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor}
38731275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor
3874d57959af02b4af695276f4204443afe6e5d86bd8Douglas GregorNestedNameSpecifier *
38754ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const {
38761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!NNS)
3877d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return 0;
3878d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3879d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  switch (NNS->getKind()) {
3880d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Identifier:
3881d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // Canonicalize the prefix but keep the identifier the same.
38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return NestedNameSpecifier::Create(*this,
3883d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor                         getCanonicalNestedNameSpecifier(NNS->getPrefix()),
3884d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor                                       NNS->getAsIdentifier());
3885d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3886d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Namespace:
3887d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // A namespace is canonical; build a nested-name-specifier with
3888d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // this namespace and no prefix.
388914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return NestedNameSpecifier::Create(*this, 0,
389014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                 NNS->getAsNamespace()->getOriginalNamespace());
389114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
389214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NestedNameSpecifier::NamespaceAlias:
389314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    // A namespace is canonical; build a nested-name-specifier with
389414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    // this namespace and no prefix.
389514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return NestedNameSpecifier::Create(*this, 0,
389614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                    NNS->getAsNamespaceAlias()->getNamespace()
389714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                      ->getOriginalNamespace());
3898d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3899d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::TypeSpec:
3900d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate: {
3901d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    QualType T = getCanonicalType(QualType(NNS->getAsType(), 0));
3902264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor
3903264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // If we have some kind of dependent-named type (e.g., "typename T::type"),
3904264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // break it apart into its prefix and identifier, then reconsititute those
3905264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // as the canonical nested-name-specifier. This is required to canonicalize
3906264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // a dependent nested-name-specifier involving typedefs of dependent-name
3907264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // types, e.g.,
3908264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    //   typedef typename T::type T1;
3909264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    //   typedef typename T1::type T2;
391016412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    if (const DependentNameType *DNT = T->getAs<DependentNameType>())
391116412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman      return NestedNameSpecifier::Create(*this, DNT->getQualifier(),
3912264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor                           const_cast<IdentifierInfo *>(DNT->getIdentifier()));
3913264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor
391416412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // Otherwise, just canonicalize the type, and force it to be a TypeSpec.
391516412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // FIXME: Why are TypeSpec and TypeSpecWithTemplate distinct in the
391616412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // first place?
39173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return NestedNameSpecifier::Create(*this, 0, false,
39183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                       const_cast<Type*>(T.getTypePtr()));
3919d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
3920d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3921d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Global:
3922d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // The global specifier is canonical and unique.
3923d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return NNS;
3924d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
3925d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
39267530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid NestedNameSpecifier::Kind!");
3927d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
3928d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3929c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner
39304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadconst ArrayType *ASTContext::getAsArrayType(QualType T) const {
3931c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Handle the non-qualified case efficiently.
3932a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  if (!T.hasLocalQualifiers()) {
3933c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    // Handle the common positive case fast.
3934c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    if (const ArrayType *AT = dyn_cast<ArrayType>(T))
3935c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner      return AT;
3936c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  }
39371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Handle the common negative case fast.
39393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!isa<ArrayType>(T.getCanonicalType()))
3940c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return 0;
39411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Apply any qualifiers from the array type to the element type.  This
3943c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // implements C99 6.7.3p8: "If the specification of an array type includes
3944c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // any type qualifiers, the element type is so qualified, not the array type."
39451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3946c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If we get here, we either have type qualifiers on the type, or we have
3947c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // sugar such as a typedef in the way.  If we have type qualifiers on the type
394850d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor  // we must propagate them down into the element type.
39490953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
39503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  SplitQualType split = T.getSplitDesugaredType();
3951200fa53fd420aa8369586f569dbece04930ad6a3John McCall  Qualifiers qs = split.Quals;
39521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3953c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If we have a simple case, just return now.
3954200fa53fd420aa8369586f569dbece04930ad6a3John McCall  const ArrayType *ATy = dyn_cast<ArrayType>(split.Ty);
39553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (ATy == 0 || qs.empty())
3956c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return ATy;
39571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3958c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Otherwise, we have an array and we have qualifiers on it.  Push the
3959c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // qualifiers into the array element type and return a new array type.
39603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs);
39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3962c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy))
3963c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(),
3964c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                                CAT->getSizeModifier(),
39650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                           CAT->getIndexTypeCVRQualifiers()));
3966c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy))
3967c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return cast<ArrayType>(getIncompleteArrayType(NewEltTy,
3968c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                                  IAT->getSizeModifier(),
39690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                           IAT->getIndexTypeCVRQualifiers()));
3970898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
39711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (const DependentSizedArrayType *DSAT
3972898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor        = dyn_cast<DependentSizedArrayType>(ATy))
3973898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    return cast<ArrayType>(
39741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                     getDependentSizedArrayType(NewEltTy,
39753fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                                DSAT->getSizeExpr(),
3976898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                                                DSAT->getSizeModifier(),
39770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                              DSAT->getIndexTypeCVRQualifiers(),
39787e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                                DSAT->getBracketsRange()));
39791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3980c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  const VariableArrayType *VAT = cast<VariableArrayType>(ATy);
39817e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  return cast<ArrayType>(getVariableArrayType(NewEltTy,
39823fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                              VAT->getSizeExpr(),
3983c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                              VAT->getSizeModifier(),
39840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                              VAT->getIndexTypeCVRQualifiers(),
39857e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                              VAT->getBracketsRange()));
398677c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner}
398777c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner
3988ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getAdjustedParameterType(QualType T) const {
398979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  // C99 6.7.5.3p7:
399079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   A declaration of a parameter as "array of type" shall be
399179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   adjusted to "qualified pointer to type", where the type
399279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   qualifiers (if any) are those specified within the [ and ] of
399379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   the array type derivation.
399479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  if (T->isArrayType())
399579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor    return getArrayDecayedType(T);
399679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
399779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  // C99 6.7.5.3p8:
399879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   A declaration of a parameter as "function returning type"
399979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   shall be adjusted to "pointer to function returning type", as
400079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   in 6.3.2.1.
400179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  if (T->isFunctionType())
400279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor    return getPointerType(T);
400379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
400479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  return T;
400579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor}
400679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
4007ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getSignatureParameterType(QualType T) const {
400879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  T = getVariableArrayDecayedType(T);
400979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  T = getAdjustedParameterType(T);
401079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  return T.getUnqualifiedType();
401179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor}
401279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
4013e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// getArrayDecayedType - Return the properly qualified result of decaying the
4014e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// specified array type to a pointer.  This operation is non-trivial when
4015e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// handling typedefs etc.  The canonical type of "T" must be an array type,
4016e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// this returns a pointer to a properly qualified element of the array.
4017e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner///
4018e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
40194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getArrayDecayedType(QualType Ty) const {
4020c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Get the element type with 'getAsArrayType' so that we don't lose any
4021c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // typedefs in the element type of the array.  This also handles propagation
4022c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // of type qualifiers from the array type into the element type if present
4023c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // (C99 6.7.3p8).
4024c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  const ArrayType *PrettyArrayType = getAsArrayType(Ty);
4025c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  assert(PrettyArrayType && "Not an array type!");
40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4027c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  QualType PtrTy = getPointerType(PrettyArrayType->getElementType());
4028e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
4029e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner  // int x[restrict 4] ->  int *restrict
40300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers());
4031e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner}
4032e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
40333b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(const ArrayType *array) const {
40343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return getBaseElementType(array->getElementType());
40355e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor}
40365e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor
40373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(QualType type) const {
40383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Qualifiers qs;
40393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  while (true) {
40403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType split = type.getSplitDesugaredType();
4041200fa53fd420aa8369586f569dbece04930ad6a3John McCall    const ArrayType *array = split.Ty->getAsArrayTypeUnsafe();
40423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    if (!array) break;
40431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    type = array->getElementType();
4045200fa53fd420aa8369586f569dbece04930ad6a3John McCall    qs.addConsistentQualifiers(split.Quals);
40463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
40471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return getQualifiedType(type, qs);
40496183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson}
40506183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson
40510de78998e7bda473b408437053e48661b510d453Fariborz Jahanian/// getConstantArrayElementCount - Returns number of constant array elements.
40521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpuint64_t
40530de78998e7bda473b408437053e48661b510d453Fariborz JahanianASTContext::getConstantArrayElementCount(const ConstantArrayType *CA)  const {
40540de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  uint64_t ElementCount = 1;
40550de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  do {
40560de78998e7bda473b408437053e48661b510d453Fariborz Jahanian    ElementCount *= CA->getSize().getZExtValue();
4057d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith    CA = dyn_cast_or_null<ConstantArrayType>(
4058d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith      CA->getElementType()->getAsArrayTypeUnsafe());
40590de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  } while (CA);
40600de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  return ElementCount;
40610de78998e7bda473b408437053e48661b510d453Fariborz Jahanian}
40620de78998e7bda473b408437053e48661b510d453Fariborz Jahanian
40635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFloatingRank - Return a relative rank for floating point types.
40645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// This routine will assert if passed a built-in type that isn't a float.
4065a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattnerstatic FloatingRank getFloatingRank(QualType T) {
4066183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  if (const ComplexType *CT = T->getAs<ComplexType>())
40675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return getFloatingRank(CT->getElementType());
4068a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner
4069183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type");
4070183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  switch (T->getAs<BuiltinType>()->getKind()) {
4071b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("getFloatingRank(): not a floating type");
4072aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case BuiltinType::Half:       return HalfRank;
40735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Float:      return FloatRank;
40745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Double:     return DoubleRank;
40755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::LongDouble: return LongDoubleRank;
40765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
40775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
40785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
40791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getFloatingTypeOfSizeWithinDomain - Returns a real floating
40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// point or a complex type (based on typeDomain/typeSize).
4081716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeDomain' is a real floating point or complex type.
4082716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeSize' is a real floating point or complex type.
40831361b11066239ea15764a2a844405352d87296b3Chris LattnerQualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size,
40841361b11066239ea15764a2a844405352d87296b3Chris Lattner                                                       QualType Domain) const {
40851361b11066239ea15764a2a844405352d87296b3Chris Lattner  FloatingRank EltRank = getFloatingRank(Size);
40861361b11066239ea15764a2a844405352d87296b3Chris Lattner  if (Domain->isComplexType()) {
40871361b11066239ea15764a2a844405352d87296b3Chris Lattner    switch (EltRank) {
4088561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie    case HalfRank: llvm_unreachable("Complex half is not supported");
4089f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case FloatRank:      return FloatComplexTy;
4090f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case DoubleRank:     return DoubleComplexTy;
4091f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case LongDoubleRank: return LongDoubleComplexTy;
4092f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    }
4093f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff  }
40941361b11066239ea15764a2a844405352d87296b3Chris Lattner
40951361b11066239ea15764a2a844405352d87296b3Chris Lattner  assert(Domain->isRealFloatingType() && "Unknown domain!");
40961361b11066239ea15764a2a844405352d87296b3Chris Lattner  switch (EltRank) {
409719dbb20ac4371fae3190379a7e7bd467af3c00aaJoey Gouly  case HalfRank:       return HalfTy;
40981361b11066239ea15764a2a844405352d87296b3Chris Lattner  case FloatRank:      return FloatTy;
40991361b11066239ea15764a2a844405352d87296b3Chris Lattner  case DoubleRank:     return DoubleTy;
41001361b11066239ea15764a2a844405352d87296b3Chris Lattner  case LongDoubleRank: return LongDoubleTy;
41015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4102561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie  llvm_unreachable("getFloatingRank(): illegal value for rank");
41035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
41045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
41057cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// getFloatingTypeOrder - Compare the rank of the two specified floating
41067cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// point types, ignoring the domain of the type (i.e. 'double' ==
41077cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// '_Complex double').  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
41081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1.
41094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const {
4110a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  FloatingRank LHSR = getFloatingRank(LHS);
4111a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  FloatingRank RHSR = getFloatingRank(RHS);
41121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4113a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  if (LHSR == RHSR)
4114fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff    return 0;
4115a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  if (LHSR > RHSR)
4116fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff    return 1;
4117fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff  return -1;
41185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
41195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4120f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This
4121f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// routine will assert if passed a built-in type that isn't an integer or enum,
4122f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// or if it is not canonicalized.
4123f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallunsigned ASTContext::getIntegerRank(const Type *T) const {
4124467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(T->isCanonicalUnqualified() && "T should be canonicalized");
4125f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
4126f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  switch (cast<BuiltinType>(T)->getKind()) {
4127b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("getIntegerRank(): not a built-in integer");
41287cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Bool:
4129f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 1 + (getIntWidth(BoolTy) << 3);
41307cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Char_S:
41317cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Char_U:
41327cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::SChar:
41337cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UChar:
4134f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 2 + (getIntWidth(CharTy) << 3);
41357cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Short:
41367cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UShort:
4137f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 3 + (getIntWidth(ShortTy) << 3);
41387cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Int:
41397cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UInt:
4140f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 4 + (getIntWidth(IntTy) << 3);
41417cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Long:
41427cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::ULong:
4143f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 5 + (getIntWidth(LongTy) << 3);
41447cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::LongLong:
41457cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::ULongLong:
4146f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 6 + (getIntWidth(LongLongTy) << 3);
41472df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::Int128:
41482df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::UInt128:
41492df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner    return 7 + (getIntWidth(Int128Ty) << 3);
4150f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  }
4151f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner}
4152f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner
415304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \brief Whether this is a promotable bitfield reference according
415404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
415504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman///
415604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \returns the type this bit-field will promote to, or NULL if no
415704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// promotion occurs.
41584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::isPromotableBitField(Expr *E) const {
4159ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor  if (E->isTypeDependent() || E->isValueDependent())
4160ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor    return QualType();
4161ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor
416204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  FieldDecl *Field = E->getBitField();
416304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (!Field)
416404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return QualType();
416504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
416604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  QualType FT = Field->getType();
416704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
4168a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  uint64_t BitWidth = Field->getBitWidthValue(*this);
416904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  uint64_t IntSize = getTypeSize(IntTy);
417004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // GCC extension compatibility: if the bit-field size is less than or equal
417104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // to the size of int, it gets promoted no matter what its type is.
417204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // For instance, unsigned long bf : 4 gets promoted to signed int.
417304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (BitWidth < IntSize)
417404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return IntTy;
417504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
417604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (BitWidth == IntSize)
417704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy;
417804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
417904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // Types bigger than int are not subject to promotions, and therefore act
418004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // like the base type.
418104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // FIXME: This doesn't quite match what gcc does, but what gcc does here
418204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // is ridiculous.
418304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  return QualType();
418404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman}
418504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
4186a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// getPromotedIntegerType - Returns the type that Promotable will
4187a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable
4188a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// integer type.
41894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPromotedIntegerType(QualType Promotable) const {
4190a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(!Promotable.isNull());
4191a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(Promotable->isPromotableIntegerType());
4192842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  if (const EnumType *ET = Promotable->getAs<EnumType>())
4193842aef8d942a880eeb9535d40de31a86838264cbJohn McCall    return ET->getDecl()->getPromotionType();
419468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman
419568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  if (const BuiltinType *BT = Promotable->getAs<BuiltinType>()) {
419668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t
419768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // (3.9.1) can be converted to a prvalue of the first of the following
419868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // types that can represent all the values of its underlying type:
419968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // int, unsigned int, long int, unsigned long int, long long int, or
420068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // unsigned long long int [...]
420168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // FIXME: Is there some better way to compute this?
420268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    if (BT->getKind() == BuiltinType::WChar_S ||
420368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::WChar_U ||
420468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::Char16 ||
420568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::Char32) {
420668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
420768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      uint64_t FromSize = getTypeSize(BT);
420868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy,
420968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman                                  LongLongTy, UnsignedLongLongTy };
421068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      for (size_t Idx = 0; Idx < llvm::array_lengthof(PromoteTypes); ++Idx) {
421168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        uint64_t ToSize = getTypeSize(PromoteTypes[Idx]);
421268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        if (FromSize < ToSize ||
421368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman            (FromSize == ToSize &&
421468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman             FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType()))
421568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman          return PromoteTypes[Idx];
421668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      }
421768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      llvm_unreachable("char type should fit into long long");
421868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    }
421968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  }
422068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman
422168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  // At this point, we should have a signed or unsigned integer type.
4222a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  if (Promotable->isSignedIntegerType())
4223a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman    return IntTy;
42245b64e77c2d51ca3e9313ed4107d3c4d927895cd6Eli Friedman  uint64_t PromotableSize = getIntWidth(Promotable);
42255b64e77c2d51ca3e9313ed4107d3c4d927895cd6Eli Friedman  uint64_t IntSize = getIntWidth(IntTy);
4226a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize);
4227a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy;
4228a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman}
4229a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman
423031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// \brief Recurses in pointer/array types until it finds an objc retainable
423131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// type and returns its ownership.
423231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios KyrtzidisQualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const {
423331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  while (!T.isNull()) {
423431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    if (T.getObjCLifetime() != Qualifiers::OCL_None)
423531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      return T.getObjCLifetime();
423631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    if (T->isArrayType())
423731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      T = getBaseElementType(T);
423831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else if (const PointerType *PT = T->getAs<PointerType>())
423931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      T = PT->getPointeeType();
424031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else if (const ReferenceType *RT = T->getAs<ReferenceType>())
424128445f0b62f6aed851ff87ce64d9b19200d3211fArgyrios Kyrtzidis      T = RT->getPointeeType();
424231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else
424331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      break;
424431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  }
424531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis
424631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  return Qualifiers::OCL_None;
424731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis}
424831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis
42491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getIntegerTypeOrder - Returns the highest ranked integer type:
42507cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// C99 6.3.1.8p1.  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
42511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1.
42524ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const {
4253f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const Type *LHSC = getCanonicalType(LHS).getTypePtr();
4254f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const Type *RHSC = getCanonicalType(RHS).getTypePtr();
42557cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSC == RHSC) return 0;
42561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4257f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  bool LHSUnsigned = LHSC->isUnsignedIntegerType();
4258f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  bool RHSUnsigned = RHSC->isUnsignedIntegerType();
42591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42607cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  unsigned LHSRank = getIntegerRank(LHSC);
42617cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  unsigned RHSRank = getIntegerRank(RHSC);
42621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42637cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSUnsigned == RHSUnsigned) {  // Both signed or both unsigned.
42647cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    if (LHSRank == RHSRank) return 0;
42657cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return LHSRank > RHSRank ? 1 : -1;
42667cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  }
42671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42687cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // Otherwise, the LHS is signed and the RHS is unsigned or visa versa.
42697cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSUnsigned) {
42707cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // If the unsigned [LHS] type is larger, return it.
42717cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    if (LHSRank >= RHSRank)
42727cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner      return 1;
42731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42747cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // If the signed type can represent all values of the unsigned type, it
42757cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // wins.  Because we are dealing with 2's complement and types that are
42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // powers of two larger than each other, this is always safe.
42777cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return -1;
42787cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  }
42797cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner
42807cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // If the unsigned [RHS] type is larger, return it.
42817cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (RHSRank >= LHSRank)
42827cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return -1;
42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42847cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // If the signed type can represent all values of the unsigned type, it
42857cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // wins.  Because we are dealing with 2's complement and types that are
42861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // powers of two larger than each other, this is always safe.
42877cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  return 1;
42885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
428971993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson
429079cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlssonstatic RecordDecl *
4291ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK,
4292ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                 DeclContext *DC, IdentifierInfo *Id) {
4293ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  SourceLocation Loc;
42944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (Ctx.getLangOpts().CPlusPlus)
4295ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id);
429679cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson  else
4297ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id);
429879cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson}
4299ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara
43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// getCFConstantStringType - Return the type used for constant CFStrings.
43014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getCFConstantStringType() const {
430271993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  if (!CFConstantStringTypeDecl) {
43031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CFConstantStringTypeDecl =
4304ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara      CreateRecordDecl(*this, TTK_Struct, TUDecl,
430579cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("NSConstantString"));
43065cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall    CFConstantStringTypeDecl->startDefinition();
430779cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson
4308f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    QualType FieldTypes[4];
43091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
431071993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // const int *isa;
43110953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    FieldTypes[0] = getPointerType(IntTy.withConst());
4312f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    // int flags;
4313f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    FieldTypes[1] = IntTy;
431471993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // const char *str;
43150953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    FieldTypes[2] = getPointerType(CharTy.withConst());
431671993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // long length;
43171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    FieldTypes[3] = LongTy;
43181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
431944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    // Create fields
432044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    for (unsigned i = 0; i < 4; ++i) {
43211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl,
4322ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           SourceLocation(),
432344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                                           SourceLocation(), 0,
4324a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                           FieldTypes[i], /*TInfo=*/0,
43251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                           /*BitWidth=*/0,
43267a614d8380297fcd2bc23986241905d97222948cRichard Smith                                           /*Mutable=*/false,
4327ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                           ICIS_NoInit);
43282888b65aae768f54062505330df7be230a0510c7John McCall      Field->setAccess(AS_public);
432917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      CFConstantStringTypeDecl->addDecl(Field);
433044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    }
433144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
4332838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor    CFConstantStringTypeDecl->completeDefinition();
433371993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  }
43341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
433571993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  return getTagDeclType(CFConstantStringTypeDecl);
43368467583c2704e7a9691ea56939a029015f0ade0aGabor Greif}
4337b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson
4338f7992132207d7ddc8810a135cec97ebe5805e500Fariborz JahanianQualType ASTContext::getObjCSuperType() const {
4339f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  if (ObjCSuperType.isNull()) {
4340f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    RecordDecl *ObjCSuperTypeDecl  =
4341f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian      CreateRecordDecl(*this, TTK_Struct, TUDecl, &Idents.get("objc_super"));
4342f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    TUDecl->addDecl(ObjCSuperTypeDecl);
4343f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    ObjCSuperType = getTagDeclType(ObjCSuperTypeDecl);
4344f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  }
4345f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  return ObjCSuperType;
4346f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian}
4347f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian
4348319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregorvoid ASTContext::setCFConstantStringType(QualType T) {
43496217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  const RecordType *Rec = T->getAs<RecordType>();
4350319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor  assert(Rec && "Invalid CFConstantStringType");
4351319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor  CFConstantStringTypeDecl = Rec->getDecl();
4352319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor}
4353319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor
43544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorType() const {
4355adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  if (BlockDescriptorType)
4356adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    return getTagDeclType(BlockDescriptorType);
4357adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4358adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  RecordDecl *T;
4359adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  // FIXME: Needs the FlagAppleBlock bit.
4360ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  T = CreateRecordDecl(*this, TTK_Struct, TUDecl,
436179cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("__block_descriptor"));
43625cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall  T->startDefinition();
4363adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4364adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  QualType FieldTypes[] = {
4365adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    UnsignedLongTy,
4366adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    UnsignedLongTy,
4367adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  };
4368adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4369adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  const char *FieldNames[] = {
4370adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    "reserved",
4371083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "Size"
4372adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  };
4373adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4374adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  for (size_t i = 0; i < 2; ++i) {
4375ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
4376adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         SourceLocation(),
4377adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         &Idents.get(FieldNames[i]),
4378a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                         FieldTypes[i], /*TInfo=*/0,
4379adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         /*BitWidth=*/0,
43807a614d8380297fcd2bc23986241905d97222948cRichard Smith                                         /*Mutable=*/false,
4381ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                         ICIS_NoInit);
43822888b65aae768f54062505330df7be230a0510c7John McCall    Field->setAccess(AS_public);
4383adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    T->addDecl(Field);
4384adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  }
4385adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4386838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  T->completeDefinition();
4387adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4388adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  BlockDescriptorType = T;
4389adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4390adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  return getTagDeclType(BlockDescriptorType);
4391adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump}
4392adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
43934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorExtendedType() const {
4394083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  if (BlockDescriptorExtendedType)
4395083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    return getTagDeclType(BlockDescriptorExtendedType);
4396083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4397083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  RecordDecl *T;
4398083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  // FIXME: Needs the FlagAppleBlock bit.
4399ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  T = CreateRecordDecl(*this, TTK_Struct, TUDecl,
440079cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("__block_descriptor_withcopydispose"));
44015cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall  T->startDefinition();
4402083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4403083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  QualType FieldTypes[] = {
4404083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    UnsignedLongTy,
4405083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    UnsignedLongTy,
4406083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    getPointerType(VoidPtrTy),
4407083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    getPointerType(VoidPtrTy)
4408083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  };
4409083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4410083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  const char *FieldNames[] = {
4411083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "reserved",
4412083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "Size",
4413083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "CopyFuncPtr",
4414083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "DestroyFuncPtr"
4415083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  };
4416083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4417083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  for (size_t i = 0; i < 4; ++i) {
4418ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
4419083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         SourceLocation(),
4420083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         &Idents.get(FieldNames[i]),
4421a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                         FieldTypes[i], /*TInfo=*/0,
4422083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         /*BitWidth=*/0,
44237a614d8380297fcd2bc23986241905d97222948cRichard Smith                                         /*Mutable=*/false,
4424ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                         ICIS_NoInit);
44252888b65aae768f54062505330df7be230a0510c7John McCall    Field->setAccess(AS_public);
4426083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    T->addDecl(Field);
4427083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  }
4428083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4429838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  T->completeDefinition();
4430083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4431083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  BlockDescriptorExtendedType = T;
4432083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4433083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  return getTagDeclType(BlockDescriptorExtendedType);
4434083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump}
4435083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4436b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// BlockRequiresCopying - Returns true if byref variable "D" of type "Ty"
4437b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// requires copy/dispose. Note that this must match the logic
4438b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// in buildByrefHelpers.
4439b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanianbool ASTContext::BlockRequiresCopying(QualType Ty,
4440b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian                                      const VarDecl *D) {
4441b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (const CXXRecordDecl *record = Ty->getAsCXXRecordDecl()) {
4442b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    const Expr *copyExpr = getBlockVarCopyInits(D);
4443b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    if (!copyExpr && record->hasTrivialDestructor()) return false;
4444b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4445af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump    return true;
4446b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  }
4447b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4448b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (!Ty->isObjCRetainableType()) return false;
4449b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4450b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  Qualifiers qs = Ty.getQualifiers();
4451b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4452b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  // If we have lifetime, that dominates.
4453b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (Qualifiers::ObjCLifetime lifetime = qs.getObjCLifetime()) {
4454b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    assert(getLangOpts().ObjCAutoRefCount);
4455b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4456b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    switch (lifetime) {
4457b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_None: llvm_unreachable("impossible");
4458b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4459b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // These are just bits as far as the runtime is concerned.
4460b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_ExplicitNone:
4461b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Autoreleasing:
4462b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian        return false;
4463b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4464b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // Tell the runtime that this is ARC __weak, called by the
4465b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // byref routines.
4466b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Weak:
4467b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // ARC __strong __block variables need to be retained.
4468b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Strong:
4469b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian        return true;
4470e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian    }
4471b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    llvm_unreachable("fell out of lifetime switch!");
4472e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian  }
4473b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  return (Ty->isBlockPointerType() || isObjCNSObjectType(Ty) ||
4474b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian          Ty->isObjCObjectPointerType());
4475af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump}
4476af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump
44773ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanianbool ASTContext::getByrefLifetime(QualType Ty,
44783ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian                              Qualifiers::ObjCLifetime &LifeTime,
44793ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian                              bool &HasByrefExtendedLayout) const {
44803ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
44813ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  if (!getLangOpts().ObjC1 ||
44823ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian      getLangOpts().getGC() != LangOptions::NonGC)
44833ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    return false;
44843ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
44853ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  HasByrefExtendedLayout = false;
448634db84fdb092f89ea3678a0792074a5b9253829aFariborz Jahanian  if (Ty->isRecordType()) {
44873ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    HasByrefExtendedLayout = true;
44883ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_None;
44893ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  }
44903ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else if (getLangOpts().ObjCAutoRefCount)
44913ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Ty.getObjCLifetime();
44923ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  // MRR.
44933ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
44943ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_ExplicitNone;
44953ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else
44963ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_None;
44973ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  return true;
44983ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian}
44993ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
4500e97179c675b341927807c718be215c8d1aab8acbDouglas GregorTypedefDecl *ASTContext::getObjCInstanceTypeDecl() {
4501e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor  if (!ObjCInstanceTypeDecl)
4502e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor    ObjCInstanceTypeDecl = TypedefDecl::Create(*this,
4503e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               getTranslationUnitDecl(),
4504e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               SourceLocation(),
4505e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               SourceLocation(),
4506e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               &Idents.get("instancetype"),
4507e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                     getTrivialTypeSourceInfo(getObjCIdType()));
4508e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor  return ObjCInstanceTypeDecl;
4509e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor}
4510e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor
4511e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// This returns true if a type has been typedefed to BOOL:
4512e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// typedef <type> BOOL;
45132d99833e8c956775f2183601cd120b65b569c867Chris Lattnerstatic bool isTypeTypedefedAsBOOL(QualType T) {
4514e8c49533521c40643653f943d47229e62d277f88Anders Carlsson  if (const TypedefType *TT = dyn_cast<TypedefType>(T))
4515bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner    if (IdentifierInfo *II = TT->getDecl()->getIdentifier())
4516bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner      return II->isStr("BOOL");
45171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
451885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson  return false;
451985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson}
452085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson
4521a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingTypeSize returns size of type for objective-c encoding
452233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// purpose.
45234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const {
4524f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  if (!type->isIncompleteArrayType() && type->isIncompleteType())
4525f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    return CharUnits::Zero();
4526f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4527199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits sz = getTypeSizeInChars(type);
45281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
452933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Make all integer and enum types at least as large as an int
45302ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor  if (sz.isPositive() && type->isIntegralOrEnumerationType())
4531199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    sz = std::max(sz, getTypeSizeInChars(IntTy));
453233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Treat arrays as pointers, since that's how they're passed in.
453333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  else if (type->isArrayType())
4534199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    sz = getTypeSizeInChars(VoidPtrTy);
4535aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck  return sz;
4536199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck}
4537199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck
4538199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstatic inline
4539199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstd::string charUnitsToString(const CharUnits &CU) {
4540199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  return llvm::itostr(CU.getQuantity());
454133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
454233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
45436b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// getObjCEncodingForBlock - Return the encoded type for this block
45445e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall/// declaration.
45456b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallstd::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const {
45466b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  std::string S;
45476b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
45485e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  const BlockDecl *Decl = Expr->getBlockDecl();
45495e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  QualType BlockTy =
45505e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      Expr->getType()->getAs<BlockPointerType>()->getPointeeType();
45515e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Encode result type.
45523d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian  if (getLangOpts().EncodeExtendedBlockSig)
455306cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None,
455406cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                            BlockTy->getAs<FunctionType>()->getResultType(),
455506cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                            S, true /*Extended*/);
455606cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian  else
455706cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    getObjCEncodingForType(BlockTy->getAs<FunctionType>()->getResultType(),
455806cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                           S);
45595e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Compute size of all parameters.
45605e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Start with computing size of a pointer in number of bytes.
45615e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // FIXME: There might(should) be a better way of doing this computation!
45625e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  SourceLocation Loc;
4563199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
4564199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits ParmOffset = PtrSize;
45656f46c2653c1545cc3fef0c0df996d18160160ce8Fariborz Jahanian  for (BlockDecl::param_const_iterator PI = Decl->param_begin(),
45665e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall       E = Decl->param_end(); PI != E; ++PI) {
45675e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    QualType PType = (*PI)->getType();
4568aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    CharUnits sz = getObjCEncodingTypeSize(PType);
4569075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian    if (sz.isZero())
4570075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian      continue;
4571199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    assert (sz.isPositive() && "BlockExpr - Incomplete param type");
45725e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    ParmOffset += sz;
45735e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
45745e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Size of the argument frame
4575199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(ParmOffset);
45765e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Block pointer and offset.
45775e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  S += "@?0";
45785e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall
45795e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Argument types.
45805e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  ParmOffset = PtrSize;
45815e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E =
45825e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall       Decl->param_end(); PI != E; ++PI) {
45835e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    ParmVarDecl *PVDecl = *PI;
45845e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    QualType PType = PVDecl->getOriginalType();
45855e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    if (const ArrayType *AT =
45865e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
45875e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      // Use array's original type only if it has known number of
45885389f48b24937ad7b4093307128b3cbf25235654David Chisnall      // elements.
45895389f48b24937ad7b4093307128b3cbf25235654David Chisnall      if (!isa<ConstantArrayType>(AT))
45905389f48b24937ad7b4093307128b3cbf25235654David Chisnall        PType = PVDecl->getType();
45915389f48b24937ad7b4093307128b3cbf25235654David Chisnall    } else if (PType->isFunctionType())
45925389f48b24937ad7b4093307128b3cbf25235654David Chisnall      PType = PVDecl->getType();
45933d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian    if (getLangOpts().EncodeExtendedBlockSig)
459406cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian      getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, PType,
459506cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                                      S, true /*Extended*/);
459606cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    else
459706cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian      getObjCEncodingForType(PType, S);
45985389f48b24937ad7b4093307128b3cbf25235654David Chisnall    S += charUnitsToString(ParmOffset);
45995389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmOffset += getObjCEncodingTypeSize(PType);
46005389f48b24937ad7b4093307128b3cbf25235654David Chisnall  }
46016b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
46026b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  return S;
46035389f48b24937ad7b4093307128b3cbf25235654David Chisnall}
46045389f48b24937ad7b4093307128b3cbf25235654David Chisnall
4605f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl,
46065389f48b24937ad7b4093307128b3cbf25235654David Chisnall                                                std::string& S) {
46075389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Encode result type.
46085389f48b24937ad7b4093307128b3cbf25235654David Chisnall  getObjCEncodingForType(Decl->getResultType(), S);
46095389f48b24937ad7b4093307128b3cbf25235654David Chisnall  CharUnits ParmOffset;
46105389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Compute size of all parameters.
46115389f48b24937ad7b4093307128b3cbf25235654David Chisnall  for (FunctionDecl::param_const_iterator PI = Decl->param_begin(),
46125389f48b24937ad7b4093307128b3cbf25235654David Chisnall       E = Decl->param_end(); PI != E; ++PI) {
46135389f48b24937ad7b4093307128b3cbf25235654David Chisnall    QualType PType = (*PI)->getType();
46145389f48b24937ad7b4093307128b3cbf25235654David Chisnall    CharUnits sz = getObjCEncodingTypeSize(PType);
4615f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    if (sz.isZero())
46167e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian      continue;
46177e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian
46185389f48b24937ad7b4093307128b3cbf25235654David Chisnall    assert (sz.isPositive() &&
4619f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor        "getObjCEncodingForFunctionDecl - Incomplete param type");
46205389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmOffset += sz;
46215389f48b24937ad7b4093307128b3cbf25235654David Chisnall  }
46225389f48b24937ad7b4093307128b3cbf25235654David Chisnall  S += charUnitsToString(ParmOffset);
46235389f48b24937ad7b4093307128b3cbf25235654David Chisnall  ParmOffset = CharUnits::Zero();
46245389f48b24937ad7b4093307128b3cbf25235654David Chisnall
46255389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Argument types.
46265389f48b24937ad7b4093307128b3cbf25235654David Chisnall  for (FunctionDecl::param_const_iterator PI = Decl->param_begin(),
46275389f48b24937ad7b4093307128b3cbf25235654David Chisnall       E = Decl->param_end(); PI != E; ++PI) {
46285389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmVarDecl *PVDecl = *PI;
46295389f48b24937ad7b4093307128b3cbf25235654David Chisnall    QualType PType = PVDecl->getOriginalType();
46305389f48b24937ad7b4093307128b3cbf25235654David Chisnall    if (const ArrayType *AT =
46315389f48b24937ad7b4093307128b3cbf25235654David Chisnall          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
46325389f48b24937ad7b4093307128b3cbf25235654David Chisnall      // Use array's original type only if it has known number of
46335e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      // elements.
46345e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      if (!isa<ConstantArrayType>(AT))
46355e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall        PType = PVDecl->getType();
46365e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    } else if (PType->isFunctionType())
46375e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      PType = PVDecl->getType();
46385e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    getObjCEncodingForType(PType, S);
4639199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    S += charUnitsToString(ParmOffset);
4640aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    ParmOffset += getObjCEncodingTypeSize(PType);
46415e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
4642f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4643f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  return false;
46445e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall}
46455e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall
4646dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// getObjCEncodingForMethodParameter - Return the encoded type for a single
4647dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// method parameter or return type. If Extended, include class names and
4648dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// block object types.
4649dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilsonvoid ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT,
4650dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                                   QualType T, std::string& S,
4651dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                                   bool Extended) const {
4652dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode type qualifer, 'in', 'inout', etc. for the parameter.
4653dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForTypeQualifier(QT, S);
4654dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode parameter type.
4655dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForTypeImpl(T, S, true, true, 0,
4656dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             true     /*OutermostType*/,
4657dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             false    /*EncodingProperty*/,
4658dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             false    /*StructField*/,
4659dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             Extended /*EncodeBlockParameters*/,
4660dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             Extended /*EncodeClassNames*/);
4661dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson}
4662dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson
4663a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingForMethodDecl - Return the encoded type for this method
466433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// declaration.
4665f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
4666dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                              std::string& S,
4667dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                              bool Extended) const {
4668c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: This is not very efficient.
4669dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode return type.
4670dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(),
4671dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                    Decl->getResultType(), S, Extended);
467233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Compute size of all parameters.
467333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Start with computing size of a pointer in number of bytes.
467433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // FIXME: There might(should) be a better way of doing this computation!
467533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  SourceLocation Loc;
4676199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
467733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // The first two arguments (self and _cmd) are pointers; account for
467833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // their size.
4679199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits ParmOffset = 2 * PtrSize;
4680491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis  for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
46817732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian       E = Decl->sel_param_end(); PI != E; ++PI) {
468289951a86b594513c2a013532ed45d197413b1087Chris Lattner    QualType PType = (*PI)->getType();
4683aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    CharUnits sz = getObjCEncodingTypeSize(PType);
4684f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    if (sz.isZero())
46857e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian      continue;
46867e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian
4687199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    assert (sz.isPositive() &&
4688199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        "getObjCEncodingForMethodDecl - Incomplete param type");
468933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    ParmOffset += sz;
469033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  }
4691199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(ParmOffset);
469233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  S += "@0:";
4693199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(PtrSize);
46941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
469533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Argument types.
469633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  ParmOffset = 2 * PtrSize;
4697491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis  for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
46987732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian       E = Decl->sel_param_end(); PI != E; ++PI) {
4699491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis    const ParmVarDecl *PVDecl = *PI;
47001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType PType = PVDecl->getOriginalType();
47014306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian    if (const ArrayType *AT =
4702ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
4703ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      // Use array's original type only if it has known number of
4704ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      // elements.
4705bb3fde337fb712c0e6da8790d431621be4793048Steve Naroff      if (!isa<ConstantArrayType>(AT))
4706ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff        PType = PVDecl->getType();
4707ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff    } else if (PType->isFunctionType())
4708ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      PType = PVDecl->getType();
4709dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(),
4710dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                      PType, S, Extended);
4711199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    S += charUnitsToString(ParmOffset);
4712aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    ParmOffset += getObjCEncodingTypeSize(PType);
471333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  }
4714f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4715f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  return false;
471633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
471733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
4718c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// getObjCEncodingForPropertyDecl - Return the encoded type for this
471983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// property declaration. If non-NULL, Container must be either an
4720c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be
4721c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// NULL when getting encodings for protocol properties.
47221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Property attributes are stored as a comma-delimited C string. The simple
47231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// attributes readonly and bycopy are encoded as single characters. The
47241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parametrized attributes, getter=name, setter=name, and ivar=name, are
47251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// encoded as single characters, followed by an identifier. Property types
47261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// are also encoded as a parametrized attribute. The characters used to encode
472783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// these attributes are defined by the following enumeration:
472883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @code
472983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// enum PropertyAttributes {
473083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyReadOnly = 'R',   // property is read-only.
473183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyBycopy = 'C',     // property is a copy of the value last assigned
473283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyByref = '&',  // property is a reference to the value last assigned
473383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyDynamic = 'D',    // property is dynamic
473483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyGetter = 'G',     // followed by getter selector name
473583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertySetter = 'S',     // followed by setter selector name
473683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyInstanceVariable = 'V'  // followed by instance variable  name
47370d4cb85130d91da61c45aecb9fd31c7097a7cfccBob Wilson/// kPropertyType = 'T'              // followed by old-style type encoding.
473883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyWeak = 'W'              // 'weak' property
473983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyStrong = 'P'            // property GC'able
474083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyNonAtomic = 'N'         // property non-atomic
474183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// };
474283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @endcode
47431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
4744c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar                                                const Decl *Container,
47454ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                std::string& S) const {
4746c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // Collect information from the property implementation decl(s).
4747c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  bool Dynamic = false;
4748c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  ObjCPropertyImplDecl *SynthesizePID = 0;
4749c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4750c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: Duplicated code due to poor abstraction.
4751c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (Container) {
47521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const ObjCCategoryImplDecl *CID =
4753c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        dyn_cast<ObjCCategoryImplDecl>(Container)) {
4754c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      for (ObjCCategoryImplDecl::propimpl_iterator
475517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis             i = CID->propimpl_begin(), e = CID->propimpl_end();
4756653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor           i != e; ++i) {
4757581deb3da481053c4993c7600f97acf7768caac5David Blaikie        ObjCPropertyImplDecl *PID = *i;
4758c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        if (PID->getPropertyDecl() == PD) {
4759c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
4760c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            Dynamic = true;
4761c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          } else {
4762c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            SynthesizePID = PID;
4763c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          }
4764c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        }
4765c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      }
4766c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    } else {
476761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container);
4768c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      for (ObjCCategoryImplDecl::propimpl_iterator
476917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis             i = OID->propimpl_begin(), e = OID->propimpl_end();
4770653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor           i != e; ++i) {
4771581deb3da481053c4993c7600f97acf7768caac5David Blaikie        ObjCPropertyImplDecl *PID = *i;
4772c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        if (PID->getPropertyDecl() == PD) {
4773c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
4774c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            Dynamic = true;
4775c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          } else {
4776c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            SynthesizePID = PID;
4777c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          }
4778c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        }
47791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
4780c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    }
4781c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4782c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4783c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: This is not very efficient.
4784c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  S = "T";
4785c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4786c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // Encode result type.
4787090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  // GCC has some special rules regarding encoding of properties which
4788090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  // closely resembles encoding of ivars.
47891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0,
4790090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                             true /* outermost type */,
4791090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                             true /* encoding for property */);
4792c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4793c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->isReadOnly()) {
4794c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",R";
4795c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  } else {
4796c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    switch (PD->getSetterKind()) {
4797c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    case ObjCPropertyDecl::Assign: break;
4798c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    case ObjCPropertyDecl::Copy:   S += ",C"; break;
47991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case ObjCPropertyDecl::Retain: S += ",&"; break;
48003a02b44e3948f7762dbfba94b7961281ca29d022Fariborz Jahanian    case ObjCPropertyDecl::Weak:   S += ",W"; break;
4801c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    }
4802c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4803c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4804c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // It really isn't clear at all what this means, since properties
4805c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // are "dynamic by default".
4806c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (Dynamic)
4807c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",D";
4808c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4809090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic)
4810090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian    S += ",N";
48111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4812c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
4813c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",G";
4814077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    S += PD->getGetterName().getAsString();
4815c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4816c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4817c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
4818c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",S";
4819077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    S += PD->getSetterName().getAsString();
4820c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4821c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4822c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (SynthesizePID) {
4823c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl();
4824c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",V";
482539f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner    S += OID->getNameAsString();
4826c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4827c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4828c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: OBJCGC: weak & strong
4829c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar}
4830c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4831a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// getLegacyIntegralTypeEncoding -
48321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Another legacy compatibility encoding: 32-bit longs are encoded as
48331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 'l' or 'L' , but not always.  For typedefs, we need to use
4834a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 'i' or 'I' instead if encoding a struct field, or a pointer!
4835a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian///
4836a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanianvoid ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const {
48378e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump  if (isa<TypedefType>(PointeeTy.getTypePtr())) {
4838183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) {
48394ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad      if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32)
4840a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        PointeeTy = UnsignedIntTy;
48411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      else
48424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32)
4843a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian          PointeeTy = IntTy;
4844a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
4845a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian  }
4846a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian}
4847a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian
48487d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanianvoid ASTContext::getObjCEncodingForType(QualType T, std::string& S,
48494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                        const FieldDecl *Field) const {
485082a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // We follow the behavior of gcc, expanding structures which are
485182a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // directly pointed to, and expanding embedded structures. Note that
485282a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // these rules are sufficient to prevent recursive encoding of the
485382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // same type.
48541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getObjCEncodingForTypeImpl(T, S, true, true, Field,
48555b8c7d9fb620ba3a71e996d61e7b9bdf763b5c09Fariborz Jahanian                             true /* outermost type */);
485682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar}
485782a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar
48583624e9e55d98507863d0731a0942cd874f2a1574John McCallstatic char getObjCEncodingForPrimitiveKind(const ASTContext *C,
48593624e9e55d98507863d0731a0942cd874f2a1574John McCall                                            BuiltinType::Kind kind) {
48603624e9e55d98507863d0731a0942cd874f2a1574John McCall    switch (kind) {
486164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Void:       return 'v';
486264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Bool:       return 'B';
486364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Char_U:
486464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UChar:      return 'C';
48653624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Char16:
486664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UShort:     return 'S';
48673624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Char32:
486864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UInt:       return 'I';
486964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::ULong:
48703624e9e55d98507863d0731a0942cd874f2a1574John McCall        return C->getTargetInfo().getLongWidth() == 32 ? 'L' : 'Q';
487164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UInt128:    return 'T';
487264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::ULongLong:  return 'Q';
487364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Char_S:
487464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::SChar:      return 'c';
487564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Short:      return 's';
48763f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_S:
48773f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_U:
487864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Int:        return 'i';
487964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Long:
48803624e9e55d98507863d0731a0942cd874f2a1574John McCall      return C->getTargetInfo().getLongWidth() == 32 ? 'l' : 'q';
488164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::LongLong:   return 'q';
488264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Int128:     return 't';
488364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Float:      return 'f';
488464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Double:     return 'd';
48853a0be84b2aed8563150cdbd976a98838afa261ebDaniel Dunbar    case BuiltinType::LongDouble: return 'D';
48863624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::NullPtr:    return '*'; // like char*
48873624e9e55d98507863d0731a0942cd874f2a1574John McCall
48883624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Half:
48893624e9e55d98507863d0731a0942cd874f2a1574John McCall      // FIXME: potentially need @encodes for these!
48903624e9e55d98507863d0731a0942cd874f2a1574John McCall      return ' ';
48913624e9e55d98507863d0731a0942cd874f2a1574John McCall
48923624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCId:
48933624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCClass:
48943624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCSel:
48953624e9e55d98507863d0731a0942cd874f2a1574John McCall      llvm_unreachable("@encoding ObjC primitive type");
48963624e9e55d98507863d0731a0942cd874f2a1574John McCall
48973624e9e55d98507863d0731a0942cd874f2a1574John McCall    // OpenCL and placeholder types don't need @encodings.
48983624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1d:
48993624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1dArray:
49003624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1dBuffer:
49013624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage2d:
49023624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage2dArray:
49033624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage3d:
4904e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei    case BuiltinType::OCLEvent:
49053624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Dependent:
49063624e9e55d98507863d0731a0942cd874f2a1574John McCall#define BUILTIN_TYPE(KIND, ID)
49073624e9e55d98507863d0731a0942cd874f2a1574John McCall#define PLACEHOLDER_TYPE(KIND, ID) \
49083624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::KIND:
49093624e9e55d98507863d0731a0942cd874f2a1574John McCall#include "clang/AST/BuiltinTypes.def"
49103624e9e55d98507863d0731a0942cd874f2a1574John McCall      llvm_unreachable("invalid builtin type for @encode");
491164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    }
4912719e53f64637c5ac41aac0c711e1977487ffc0d7David Blaikie    llvm_unreachable("invalid BuiltinType::Kind value");
491364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall}
491464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall
49155471bc85b69912e3b448de004498a80c0de32296Douglas Gregorstatic char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) {
49165471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  EnumDecl *Enum = ET->getDecl();
49175471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
49185471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  // The encoding of an non-fixed enum type is always 'i', regardless of size.
49195471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  if (!Enum->isFixed())
49205471bc85b69912e3b448de004498a80c0de32296Douglas Gregor    return 'i';
49215471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
49225471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  // The encoding of a fixed enum type matches its fixed underlying type.
49233624e9e55d98507863d0731a0942cd874f2a1574John McCall  const BuiltinType *BT = Enum->getIntegerType()->castAs<BuiltinType>();
49243624e9e55d98507863d0731a0942cd874f2a1574John McCall  return getObjCEncodingForPrimitiveKind(C, BT->getKind());
49255471bc85b69912e3b448de004498a80c0de32296Douglas Gregor}
49265471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
49274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic void EncodeBitField(const ASTContext *Ctx, std::string& S,
492864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall                           QualType T, const FieldDecl *FD) {
4929a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl");
49308b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian  S += 'b';
493164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // The NeXT runtime encodes bit fields as b followed by the number of bits.
493264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // The GNU runtime requires more information; bitfields are encoded as b,
493364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // then the offset (in bits) of the first element, then the type of the
493464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // bitfield, then the size in bits.  For example, in this structure:
493564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //
493664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // struct
493764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // {
493864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //    int integer;
493964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //    int flags:2;
494064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // };
494164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // On a 32-bit system, the encoding for flags would be b2 for the NeXT
494264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // runtime, but b32i2 for the GNU runtime.  The reason for this extra
494364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // information is not especially sensible, but we're stuck with it for
494464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // compatibility with GCC, although providing it breaks anything that
494564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // actually uses runtime introspection and wants to work on both runtimes...
4946260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (Ctx->getLangOpts().ObjCRuntime.isGNUFamily()) {
494764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    const RecordDecl *RD = FD->getParent();
494864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD);
494982905749d5c8d8b4edec11de754a73349cb96603Eli Friedman    S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex()));
49505471bc85b69912e3b448de004498a80c0de32296Douglas Gregor    if (const EnumType *ET = T->getAs<EnumType>())
49515471bc85b69912e3b448de004498a80c0de32296Douglas Gregor      S += ObjCEncodingForEnumType(Ctx, ET);
49523624e9e55d98507863d0731a0942cd874f2a1574John McCall    else {
49533624e9e55d98507863d0731a0942cd874f2a1574John McCall      const BuiltinType *BT = T->castAs<BuiltinType>();
49543624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += getObjCEncodingForPrimitiveKind(Ctx, BT->getKind());
49553624e9e55d98507863d0731a0942cd874f2a1574John McCall    }
495664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  }
4957a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  S += llvm::utostr(FD->getBitWidthValue(*Ctx));
49588b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian}
49598b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian
496001eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar// FIXME: Use SmallString for accumulating string.
496182a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbarvoid ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
496282a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar                                            bool ExpandPointedToStructures,
496382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar                                            bool ExpandStructures,
4964153bfe5795e2c1a5a738e73d3784964e082237fcDaniel Dunbar                                            const FieldDecl *FD,
4965090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                                            bool OutermostType,
49662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                            bool EncodingProperty,
4967dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                            bool StructField,
4968dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                            bool EncodeBlockParameters,
4969dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                            bool EncodeClassNames) const {
49703624e9e55d98507863d0731a0942cd874f2a1574John McCall  CanQualType CT = getCanonicalType(T);
49713624e9e55d98507863d0731a0942cd874f2a1574John McCall  switch (CT->getTypeClass()) {
49723624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Builtin:
49733624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Enum:
4974ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (FD && FD->isBitField())
497564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall      return EncodeBitField(this, S, T, FD);
49763624e9e55d98507863d0731a0942cd874f2a1574John McCall    if (const BuiltinType *BT = dyn_cast<BuiltinType>(CT))
49773624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += getObjCEncodingForPrimitiveKind(this, BT->getKind());
49783624e9e55d98507863d0731a0942cd874f2a1574John McCall    else
49793624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += ObjCEncodingForEnumType(this, cast<EnumType>(CT));
4980ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
49811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49823624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Complex: {
49833624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ComplexType *CT = T->castAs<ComplexType>();
4984c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson    S += 'j';
49851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false,
4986c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson                               false);
4987ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
4988ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
49893624e9e55d98507863d0731a0942cd874f2a1574John McCall
49903624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Atomic: {
49913624e9e55d98507863d0731a0942cd874f2a1574John McCall    const AtomicType *AT = T->castAs<AtomicType>();
49923624e9e55d98507863d0731a0942cd874f2a1574John McCall    S += 'A';
49933624e9e55d98507863d0731a0942cd874f2a1574John McCall    getObjCEncodingForTypeImpl(AT->getValueType(), S, false, false, 0,
49943624e9e55d98507863d0731a0942cd874f2a1574John McCall                               false, false);
49953624e9e55d98507863d0731a0942cd874f2a1574John McCall    return;
4996aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian  }
49973624e9e55d98507863d0731a0942cd874f2a1574John McCall
49983624e9e55d98507863d0731a0942cd874f2a1574John McCall  // encoding for pointer or reference types.
49993624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Pointer:
50003624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::LValueReference:
50013624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::RValueReference: {
50023624e9e55d98507863d0731a0942cd874f2a1574John McCall    QualType PointeeTy;
50033624e9e55d98507863d0731a0942cd874f2a1574John McCall    if (isa<PointerType>(CT)) {
50043624e9e55d98507863d0731a0942cd874f2a1574John McCall      const PointerType *PT = T->castAs<PointerType>();
50053624e9e55d98507863d0731a0942cd874f2a1574John McCall      if (PT->isObjCSelType()) {
50063624e9e55d98507863d0731a0942cd874f2a1574John McCall        S += ':';
50073624e9e55d98507863d0731a0942cd874f2a1574John McCall        return;
50083624e9e55d98507863d0731a0942cd874f2a1574John McCall      }
50093624e9e55d98507863d0731a0942cd874f2a1574John McCall      PointeeTy = PT->getPointeeType();
50103624e9e55d98507863d0731a0942cd874f2a1574John McCall    } else {
50113624e9e55d98507863d0731a0942cd874f2a1574John McCall      PointeeTy = T->castAs<ReferenceType>()->getPointeeType();
50123624e9e55d98507863d0731a0942cd874f2a1574John McCall    }
50133624e9e55d98507863d0731a0942cd874f2a1574John McCall
5014a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    bool isReadOnly = false;
5015a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // For historical/compatibility reasons, the read-only qualifier of the
5016a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // pointee gets emitted _before_ the '^'.  The read-only qualifier of
5017a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // the pointer itself gets ignored, _unless_ we are looking at a typedef!
50181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Also, do not emit the 'r' for anything but the outermost type!
50198e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump    if (isa<TypedefType>(T.getTypePtr())) {
5020a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      if (OutermostType && T.isConstQualified()) {
5021a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        isReadOnly = true;
5022a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        S += 'r';
5023a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      }
50249fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump    } else if (OutermostType) {
5025a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      QualType P = PointeeTy;
50266217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      while (P->getAs<PointerType>())
50276217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek        P = P->getAs<PointerType>()->getPointeeType();
5028a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      if (P.isConstQualified()) {
5029a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        isReadOnly = true;
5030a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        S += 'r';
5031a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      }
5032a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
5033a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    if (isReadOnly) {
5034a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // Another legacy compatibility encoding. Some ObjC qualifier and type
5035a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // combinations need to be rearranged.
5036a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // Rewrite "in const" from "nr" to "rn"
50375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (StringRef(S).endswith("nr"))
50380237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer        S.replace(S.end()-2, S.end(), "rn");
5039a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
50401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
504185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    if (PointeeTy->isCharType()) {
504285f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      // char pointer types should be encoded as '*' unless it is a
504385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      // type that has been typedef'd to 'BOOL'.
5044e8c49533521c40643653f943d47229e62d277f88Anders Carlsson      if (!isTypeTypedefedAsBOOL(PointeeTy)) {
504585f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson        S += '*';
504685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson        return;
504785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      }
50486217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) {
50499533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // GCC binary compat: Need to convert "struct objc_class *" to "#".
50509533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) {
50519533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        S += '#';
50529533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        return;
50539533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      }
50549533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // GCC binary compat: Need to convert "struct objc_object *" to "@".
50559533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) {
50569533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        S += '@';
50579533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        return;
50589533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      }
50599533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // fall through...
506085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    }
506185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    S += '^';
5062a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    getLegacyIntegralTypeEncoding(PointeeTy);
5063a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian
50641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures,
506543822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian                               NULL);
5066ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5067ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
50683624e9e55d98507863d0731a0942cd874f2a1574John McCall
50693624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ConstantArray:
50703624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::IncompleteArray:
50713624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::VariableArray: {
50723624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ArrayType *AT = cast<ArrayType>(CT);
50733624e9e55d98507863d0731a0942cd874f2a1574John McCall
50742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (isa<IncompleteArrayType>(AT) && !StructField) {
5075559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      // Incomplete arrays are encoded as a pointer to the array element.
5076559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += '^';
5077559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson
50781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(AT->getElementType(), S,
5079559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson                                 false, ExpandStructures, FD);
5080559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson    } else {
5081559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += '[';
50821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
50842636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        if (getTypeSize(CAT->getElementType()) == 0)
50852636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          S += '0';
50862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        else
50872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          S += llvm::utostr(CAT->getSize().getZExtValue());
50882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
5089559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson        //Variable length arrays are encoded as a regular array with 0 elements.
50902636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) &&
50912636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis               "Unknown array type!");
5092559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson        S += '0';
5093559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      }
50941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(AT->getElementType(), S,
5096559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson                                 false, ExpandStructures, FD);
5097559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += ']';
5098559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson    }
5099ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5100ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
51011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51023624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::FunctionNoProto:
51033624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::FunctionProto:
5104c0a87b7db06643178ad2cbce0767548c139ea387Anders Carlsson    S += '?';
5105ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
51061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51073624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Record: {
51083624e9e55d98507863d0731a0942cd874f2a1574John McCall    RecordDecl *RDecl = cast<RecordType>(CT)->getDecl();
5109d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar    S += RDecl->isUnion() ? '(' : '{';
5110502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    // Anonymous structures print as '?'
5111502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    if (const IdentifierInfo *II = RDecl->getIdentifier()) {
5112502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar      S += II->getName();
51136fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian      if (ClassTemplateSpecializationDecl *Spec
51146fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian          = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
51156fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian        const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
51166fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian        std::string TemplateArgsStr
51176fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian          = TemplateSpecializationType::PrintTemplateArgumentList(
5118910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                            TemplateArgs.data(),
5119910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                            TemplateArgs.size(),
512030c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor                                            (*this).getPrintingPolicy());
51216fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian
51226fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian        S += TemplateArgsStr;
51236fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian      }
5124502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    } else {
5125502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar      S += '?';
5126502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    }
51270d504c1da852e58ff802545c823ecff3b6c654b8Daniel Dunbar    if (ExpandStructures) {
51287d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian      S += '=';
51292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (!RDecl->isUnion()) {
51302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getObjCEncodingForStructureImpl(RDecl, S, FD);
51312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
51322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        for (RecordDecl::field_iterator Field = RDecl->field_begin(),
51332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                     FieldEnd = RDecl->field_end();
51342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis             Field != FieldEnd; ++Field) {
51352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          if (FD) {
51362636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += '"';
51372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += Field->getNameAsString();
51382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += '"';
51392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          }
51401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          // Special case bit-fields.
51422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          if (Field->isBitField()) {
51432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getObjCEncodingForTypeImpl(Field->getType(), S, false, true,
5144581deb3da481053c4993c7600f97acf7768caac5David Blaikie                                       *Field);
51452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          } else {
51462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            QualType qt = Field->getType();
51472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getLegacyIntegralTypeEncoding(qt);
51482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getObjCEncodingForTypeImpl(qt, S, false, true,
51492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       FD, /*OutermostType*/false,
51502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       /*EncodingProperty*/false,
51512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       /*StructField*/true);
51522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          }
5153d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar        }
51547d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian      }
51556de88a873a4cbe06d72602eef57d68006730a80bFariborz Jahanian    }
5156d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar    S += RDecl->isUnion() ? ')' : '}';
5157ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5158ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
51591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51603624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::BlockPointer: {
51613624e9e55d98507863d0731a0942cd874f2a1574John McCall    const BlockPointerType *BT = T->castAs<BlockPointerType>();
516221a98b188857d690aa4510c52ac4317ffa0908a8Steve Naroff    S += "@?"; // Unlike a pointer-to-function, which is "^?".
5163dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    if (EncodeBlockParameters) {
51643624e9e55d98507863d0731a0942cd874f2a1574John McCall      const FunctionType *FT = BT->getPointeeType()->castAs<FunctionType>();
5165dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson
5166dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += '<';
5167dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block return type
5168dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      getObjCEncodingForTypeImpl(FT->getResultType(), S,
5169dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 ExpandPointedToStructures, ExpandStructures,
5170dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 FD,
5171dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 false /* OutermostType */,
5172dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodingProperty,
5173dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 false /* StructField */,
5174dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodeBlockParameters,
5175dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodeClassNames);
5176dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block self
5177dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += "@?";
5178dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block parameters
5179dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) {
5180dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        for (FunctionProtoType::arg_type_iterator I = FPT->arg_type_begin(),
5181dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson               E = FPT->arg_type_end(); I && (I != E); ++I) {
5182dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson          getObjCEncodingForTypeImpl(*I, S,
5183dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     ExpandPointedToStructures,
5184dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     ExpandStructures,
5185dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     FD,
5186dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     false /* OutermostType */,
5187dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodingProperty,
5188dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     false /* StructField */,
5189dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodeBlockParameters,
5190dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodeClassNames);
5191dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        }
5192dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      }
5193dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += '>';
5194dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    }
5195ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5196ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
51971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51983624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCObject:
51993624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCInterface: {
52003624e9e55d98507863d0731a0942cd874f2a1574John McCall    // Ignore protocol qualifiers when mangling at this level.
52013624e9e55d98507863d0731a0942cd874f2a1574John McCall    T = T->castAs<ObjCObjectType>()->getBaseType();
5202c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
52033624e9e55d98507863d0731a0942cd874f2a1574John McCall    // The assumption seems to be that this assert will succeed
52043624e9e55d98507863d0731a0942cd874f2a1574John McCall    // because nested levels will have filtered out 'id' and 'Class'.
52053624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ObjCInterfaceType *OIT = T->castAs<ObjCInterfaceType>();
520643822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    // @encode(class_name)
52070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    ObjCInterfaceDecl *OI = OIT->getDecl();
520843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '{';
520943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    const IdentifierInfo *II = OI->getIdentifier();
521043822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += II->getName();
521143822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '=';
5212db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose    SmallVector<const ObjCIvarDecl*, 32> Ivars;
52132c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    DeepCollectObjCIvars(OI, true, Ivars);
52142c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    for (unsigned i = 0, e = Ivars.size(); i != e; ++i) {
5215db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose      const FieldDecl *Field = cast<FieldDecl>(Ivars[i]);
52162c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian      if (Field->isBitField())
52172c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian        getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field);
521843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian      else
52192c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian        getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD);
522043822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    }
522143822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '}';
5222ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
522343822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian  }
52241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52253624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCObjectPointer: {
52263624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ObjCObjectPointerType *OPT = T->castAs<ObjCObjectPointerType>();
522714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    if (OPT->isObjCIdType()) {
522814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      S += '@';
522914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5230ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
523227d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff    if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
523327d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // FIXME: Consider if we need to output qualifiers for 'Class<p>'.
523427d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // Since this is a binary compatibility issue, need to consult with runtime
523527d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // folks. Fortunately, this is a *very* obsure construct.
523614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      S += '#';
523714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5238ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
52391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5240ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (OPT->isObjCQualifiedIdType()) {
52411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(getObjCIdType(), S,
524214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff                                 ExpandPointedToStructures,
524314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff                                 ExpandStructures, FD);
5244dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      if (FD || EncodingProperty || EncodeClassNames) {
524514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        // Note that we do extended encoding of protocol qualifer list
524614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        // Only when doing ivar or property encoding.
524714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        S += '"';
524867ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
524967ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff             E = OPT->qual_end(); I != E; ++I) {
525014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += '<';
525114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += (*I)->getNameAsString();
525214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += '>';
525314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        }
525414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        S += '"';
525514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      }
525614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5257ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
52581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5259ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    QualType PointeeTy = OPT->getPointeeType();
5260ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (!EncodingProperty &&
5261ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        isa<TypedefType>(PointeeTy.getTypePtr())) {
5262ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      // Another historical/compatibility reason.
52631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // We encode the underlying type which comes out as
5264ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      // {...};
5265ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '^';
52661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(PointeeTy, S,
52671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 false, ExpandPointedToStructures,
5268ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner                                 NULL);
526914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
527014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    }
5271ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner
5272ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    S += '@';
5273dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    if (OPT->getInterfaceDecl() &&
5274dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        (FD || EncodingProperty || EncodeClassNames)) {
5275ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '"';
527627d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      S += OPT->getInterfaceDecl()->getIdentifier()->getName();
527767ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff      for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
527867ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff           E = OPT->qual_end(); I != E; ++I) {
5279ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += '<';
5280ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += (*I)->getNameAsString();
5281ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += '>';
52821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
5283ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '"';
5284ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
5285ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5286ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
52871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5288532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall  // gcc just blithely ignores member pointers.
52893624e9e55d98507863d0731a0942cd874f2a1574John McCall  // FIXME: we shoul do better than that.  'M' is available.
52903624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::MemberPointer:
5291532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall    return;
5292e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian
52933624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Vector:
52943624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ExtVector:
5295e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // This matches gcc's encoding, even though technically it is
5296e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // insufficient.
5297e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // FIXME. We should do a better job than gcc.
5298e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    return;
52993624e9e55d98507863d0731a0942cd874f2a1574John McCall
53003624e9e55d98507863d0731a0942cd874f2a1574John McCall#define ABSTRACT_TYPE(KIND, BASE)
53013624e9e55d98507863d0731a0942cd874f2a1574John McCall#define TYPE(KIND, BASE)
53023624e9e55d98507863d0731a0942cd874f2a1574John McCall#define DEPENDENT_TYPE(KIND, BASE) \
53033624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
53043624e9e55d98507863d0731a0942cd874f2a1574John McCall#define NON_CANONICAL_TYPE(KIND, BASE) \
53053624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
53063624e9e55d98507863d0731a0942cd874f2a1574John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
53073624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
53083624e9e55d98507863d0731a0942cd874f2a1574John McCall#include "clang/AST/TypeNodes.def"
53093624e9e55d98507863d0731a0942cd874f2a1574John McCall    llvm_unreachable("@encode for dependent type!");
5310e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian  }
53113624e9e55d98507863d0731a0942cd874f2a1574John McCall  llvm_unreachable("bad type kind!");
531285f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson}
531385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson
53142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidisvoid ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
53152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 std::string &S,
53162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 const FieldDecl *FD,
53172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 bool includeVBases) const {
53182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  assert(RDecl && "Expected non-null RecordDecl");
53192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  assert(!RDecl->isUnion() && "Should not be called for unions");
53202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (!RDecl->getDefinition())
53212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    return;
53222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
53242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
53252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  const ASTRecordLayout &layout = getASTRecordLayout(RDecl);
53262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec) {
53282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    for (CXXRecordDecl::base_class_iterator
53292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BI = CXXRec->bases_begin(),
53302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BE = CXXRec->bases_end(); BI != BE; ++BI) {
53312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (!BI->isVirtual()) {
53322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
5333829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis        if (base->isEmpty())
5334829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis          continue;
5335d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer        uint64_t offs = toBits(layout.getBaseClassOffset(base));
53362636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
53372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                  std::make_pair(offs, base));
53382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
53392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
53402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  unsigned i = 0;
53432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  for (RecordDecl::field_iterator Field = RDecl->field_begin(),
53442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                               FieldEnd = RDecl->field_end();
53452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis       Field != FieldEnd; ++Field, ++i) {
53462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    uint64_t offs = layout.getFieldOffset(i);
53472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
5348581deb3da481053c4993c7600f97acf7768caac5David Blaikie                              std::make_pair(offs, *Field));
53492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec && includeVBases) {
53522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    for (CXXRecordDecl::base_class_iterator
53532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BI = CXXRec->vbases_begin(),
53542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BE = CXXRec->vbases_end(); BI != BE; ++BI) {
53552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
5356829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      if (base->isEmpty())
5357829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis        continue;
5358d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer      uint64_t offs = toBits(layout.getVBaseClassOffset(base));
535919aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis      if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
536019aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis        FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
536119aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis                                  std::make_pair(offs, base));
53622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
53632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  CharUnits size;
53662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec) {
53672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    size = includeVBases ? layout.getSize() : layout.getNonVirtualSize();
53682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  } else {
53692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    size = layout.getSize();
53702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53712636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  uint64_t CurOffs = 0;
53732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  std::multimap<uint64_t, NamedDecl *>::iterator
53742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    CurLayObj = FieldOrBaseOffsets.begin();
53752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
537658db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor  if (CXXRec && CXXRec->isDynamicClass() &&
537758db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor      (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
53782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (FD) {
53792636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += "\"_vptr$";
53802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      std::string recname = CXXRec->getNameAsString();
53812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (recname.empty()) recname = "?";
53822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += recname;
53832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += '"';
53842636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
53852636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    S += "^^?";
53862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    CurOffs += getTypeSize(VoidPtrTy);
53872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (!RDecl->hasFlexibleArrayMember()) {
53902636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    // Mark the end of the structure.
53912636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    uint64_t offs = toBits(size);
53922636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
53932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                              std::make_pair(offs, (NamedDecl*)0));
53942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
53952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
53972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    assert(CurOffs <= CurLayObj->first);
53982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
53992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (CurOffs < CurLayObj->first) {
54002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      uint64_t padding = CurLayObj->first - CurOffs;
54012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // FIXME: There doesn't seem to be a way to indicate in the encoding that
54022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // packing/alignment of members is different that normal, in which case
54032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // the encoding will be out-of-sync with the real layout.
54042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // If the runtime switches to just consider the size of types without
54052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // taking into account alignment, we could make padding explicit in the
54062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // encoding (e.g. using arrays of chars). The encoding strings would be
54072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // longer then though.
54082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      CurOffs += padding;
54092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
54102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    NamedDecl *dcl = CurLayObj->second;
54122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (dcl == 0)
54132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      break; // reached end of structure.
54142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) {
54162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // We expand the bases without their virtual bases since those are going
54172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // in the initial structure. Note that this differs from gcc which
54182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // expands virtual bases each time one is encountered in the hierarchy,
54192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // making the encoding type bigger than it really is.
54202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false);
5421829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      assert(!base->isEmpty());
5422829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
54232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    } else {
54242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      FieldDecl *field = cast<FieldDecl>(dcl);
54252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (FD) {
54262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += '"';
54272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += field->getNameAsString();
54282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += '"';
54292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
54302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (field->isBitField()) {
54322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        EncodeBitField(this, S, field->getType(), field);
5433a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith        CurOffs += field->getBitWidthValue(*this);
54342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
54352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        QualType qt = field->getType();
54362636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getLegacyIntegralTypeEncoding(qt);
54372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getObjCEncodingForTypeImpl(qt, S, false, true, FD,
54382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*OutermostType*/false,
54392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*EncodingProperty*/false,
54402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*StructField*/true);
54412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        CurOffs += getTypeSize(field->getType());
54422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
54432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
54442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
54452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis}
54462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,
5448ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian                                                 std::string& S) const {
5449ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_In)
5450ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'n';
5451ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Inout)
5452ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'N';
5453ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Out)
5454ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'o';
5455ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Bycopy)
5456ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'O';
5457ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Byref)
5458ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'R';
5459ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Oneway)
5460ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'V';
5461ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian}
5462ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian
54634dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas GregorTypedefDecl *ASTContext::getObjCIdDecl() const {
54644dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  if (!ObjCIdDecl) {
54654dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0);
54664dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    T = getObjCObjectPointerType(T);
54674dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T);
54684dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
54694dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     getTranslationUnitDecl(),
54704dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     SourceLocation(), SourceLocation(),
54714dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     &Idents.get("id"), IdInfo);
54724dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  }
54734dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor
54744dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  return ObjCIdDecl;
54757e219e47de26346885d667131977bd9ca2d7662aSteve Naroff}
54767e219e47de26346885d667131977bd9ca2d7662aSteve Naroff
54777a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas GregorTypedefDecl *ASTContext::getObjCSelDecl() const {
54787a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  if (!ObjCSelDecl) {
54797a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    QualType SelT = getPointerType(ObjCBuiltinSelTy);
54807a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    TypeSourceInfo *SelInfo = getTrivialTypeSourceInfo(SelT);
54817a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    ObjCSelDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
54827a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      getTranslationUnitDecl(),
54837a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      SourceLocation(), SourceLocation(),
54847a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      &Idents.get("SEL"), SelInfo);
54857a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  }
54867a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  return ObjCSelDecl;
5487b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
5488b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
548979d6726921897811232554ed94c5d77b5b7b3fc0Douglas GregorTypedefDecl *ASTContext::getObjCClassDecl() const {
549079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  if (!ObjCClassDecl) {
549179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    QualType T = getObjCObjectType(ObjCBuiltinClassTy, 0, 0);
549279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    T = getObjCObjectPointerType(T);
549379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    TypeSourceInfo *ClassInfo = getTrivialTypeSourceInfo(T);
549479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    ObjCClassDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
549579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        getTranslationUnitDecl(),
549679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        SourceLocation(), SourceLocation(),
549779d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        &Idents.get("Class"), ClassInfo);
549879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  }
549979d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor
550079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  return ObjCClassDecl;
5501a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor}
5502a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor
5503a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas GregorObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const {
5504a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  if (!ObjCProtocolClassDecl) {
5505a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    ObjCProtocolClassDecl
5506a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor      = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(),
5507a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  SourceLocation(),
5508a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  &Idents.get("Protocol"),
5509a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  /*PrevDecl=*/0,
5510a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  SourceLocation(), true);
5511a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  }
5512a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor
5513a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  return ObjCProtocolClassDecl;
55148baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson}
55158baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson
5516c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===//
5517c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge// __builtin_va_list Construction Functions
5518c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===//
5519c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5520c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateCharPtrBuiltinVaListDecl(const ASTContext *Context) {
5521c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef char* __builtin_va_list;
5522c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType CharPtrType = Context->getPointerType(Context->CharTy);
5523c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5524c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(CharPtrType);
5525c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5526c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypeDecl
5527c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5528c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5529c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5530c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5531c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5532c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypeDecl;
5533c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5534c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5535c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) {
5536c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef void* __builtin_va_list;
5537c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VoidPtrType = Context->getPointerType(Context->VoidTy);
5538c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5539c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VoidPtrType);
5540c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5541c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypeDecl
5542c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5543c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5544c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5545c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5546c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5547c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypeDecl;
5548c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5549c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5550c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePowerABIBuiltinVaListDecl(const ASTContext *Context) {
5551c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef struct __va_list_tag {
5552c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  RecordDecl *VaListTagDecl;
5553c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5554c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct,
5555c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   Context->getTranslationUnitDecl(),
5556c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   &Context->Idents.get("__va_list_tag"));
5557c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->startDefinition();
5558c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5559c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const size_t NumFields = 5;
5560c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType FieldTypes[NumFields];
5561c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const char *FieldNames[NumFields];
5562c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5563c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned char gpr;
5564c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[0] = Context->UnsignedCharTy;
5565c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[0] = "gpr";
5566c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5567c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned char fpr;
5568c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[1] = Context->UnsignedCharTy;
5569c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[1] = "fpr";
5570c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5571c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned short reserved;
5572c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[2] = Context->UnsignedShortTy;
5573c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[2] = "reserved";
5574c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5575c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* overflow_arg_area;
5576c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[3] = Context->getPointerType(Context->VoidTy);
5577c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[3] = "overflow_arg_area";
5578c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5579c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* reg_save_area;
5580c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[4] = Context->getPointerType(Context->VoidTy);
5581c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[4] = "reg_save_area";
5582c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5583c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // Create fields
5584c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  for (unsigned i = 0; i < NumFields; ++i) {
5585c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    FieldDecl *Field = FieldDecl::Create(*Context, VaListTagDecl,
5586c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5587c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5588c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         &Context->Idents.get(FieldNames[i]),
5589c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         FieldTypes[i], /*TInfo=*/0,
5590c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*BitWidth=*/0,
5591c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*Mutable=*/false,
5592c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         ICIS_NoInit);
5593c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Field->setAccess(AS_public);
5594c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    VaListTagDecl->addDecl(Field);
5595c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5596c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->completeDefinition();
5597c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagType = Context->getRecordType(VaListTagDecl);
5598fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  Context->VaListTagTy = VaListTagType;
5599c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5600c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // } __va_list_tag;
5601c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTagTypedefDecl
5602c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5603c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5604c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5605c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__va_list_tag"),
5606c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(VaListTagType));
5607c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagTypedefType =
5608c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Context->getTypedefType(VaListTagTypedefDecl);
5609c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5610c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef __va_list_tag __builtin_va_list[1];
5611c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
5612c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagArrayType
5613c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(VaListTagTypedefType,
5614c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                    Size, ArrayType::Normal, 0);
5615c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5616c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VaListTagArrayType);
5617c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5618c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5619c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5620c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5621c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5622c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5623c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5624c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5625c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5626c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5627c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *
5628c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeCreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context) {
5629c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef struct __va_list_tag {
5630c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  RecordDecl *VaListTagDecl;
5631c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct,
5632c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   Context->getTranslationUnitDecl(),
5633c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   &Context->Idents.get("__va_list_tag"));
5634c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->startDefinition();
5635c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5636c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const size_t NumFields = 4;
5637c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType FieldTypes[NumFields];
5638c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const char *FieldNames[NumFields];
5639c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5640c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned gp_offset;
5641c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[0] = Context->UnsignedIntTy;
5642c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[0] = "gp_offset";
5643c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5644c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned fp_offset;
5645c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[1] = Context->UnsignedIntTy;
5646c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[1] = "fp_offset";
5647c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5648c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* overflow_arg_area;
5649c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[2] = Context->getPointerType(Context->VoidTy);
5650c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[2] = "overflow_arg_area";
5651c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5652c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* reg_save_area;
5653c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[3] = Context->getPointerType(Context->VoidTy);
5654c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[3] = "reg_save_area";
5655c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5656c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // Create fields
5657c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  for (unsigned i = 0; i < NumFields; ++i) {
5658c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
5659c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         VaListTagDecl,
5660c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5661c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5662c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         &Context->Idents.get(FieldNames[i]),
5663c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         FieldTypes[i], /*TInfo=*/0,
5664c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*BitWidth=*/0,
5665c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*Mutable=*/false,
5666c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         ICIS_NoInit);
5667c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Field->setAccess(AS_public);
5668c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    VaListTagDecl->addDecl(Field);
5669c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5670c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->completeDefinition();
5671c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagType = Context->getRecordType(VaListTagDecl);
5672fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  Context->VaListTagTy = VaListTagType;
5673c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5674c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // } __va_list_tag;
5675c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTagTypedefDecl
5676c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5677c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5678c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5679c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__va_list_tag"),
5680c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(VaListTagType));
5681c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagTypedefType =
5682c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Context->getTypedefType(VaListTagTypedefDecl);
5683c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5684c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef __va_list_tag __builtin_va_list[1];
5685c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
5686c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagArrayType
5687c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(VaListTagTypedefType,
5688c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                      Size, ArrayType::Normal,0);
5689c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5690c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VaListTagArrayType);
5691c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5692c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5693c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5694c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5695c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5696c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5697c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5698c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5699c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5700c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5701c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context) {
5702c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef int __builtin_va_list[4];
5703c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 4);
5704c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType IntArrayType
5705c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(Context->IntTy,
5706c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge				    Size, ArrayType::Normal, 0);
5707c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5708c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5709c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5710c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5711c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5712c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(IntArrayType));
5713c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5714c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5715c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5716c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5717eae5a820bced67465c8517793a1602dfaeed8a06Logan Chienstatic TypedefDecl *
5718eae5a820bced67465c8517793a1602dfaeed8a06Logan ChienCreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context) {
5719eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  RecordDecl *VaListDecl;
5720eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  if (Context->getLangOpts().CPlusPlus) {
5721eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    // namespace std { struct __va_list {
5722eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    NamespaceDecl *NS;
5723eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    NS = NamespaceDecl::Create(const_cast<ASTContext &>(*Context),
5724eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               Context->getTranslationUnitDecl(),
5725eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               /*Inline*/false, SourceLocation(),
5726eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               SourceLocation(), &Context->Idents.get("std"),
5727eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               /*PrevDecl*/0);
5728eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5729eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl = CXXRecordDecl::Create(*Context, TTK_Struct,
5730eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       Context->getTranslationUnitDecl(),
5731eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(), SourceLocation(),
5732eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       &Context->Idents.get("__va_list"));
5733eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5734eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl->setDeclContext(NS);
5735eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5736eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  } else {
5737eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    // struct __va_list {
5738eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl = CreateRecordDecl(*Context, TTK_Struct,
5739eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                  Context->getTranslationUnitDecl(),
5740eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                  &Context->Idents.get("__va_list"));
5741eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  }
5742eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5743eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->startDefinition();
5744eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5745eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // void * __ap;
5746eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
5747eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       VaListDecl,
5748eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(),
5749eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(),
5750eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       &Context->Idents.get("__ap"),
5751eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       Context->getPointerType(Context->VoidTy),
5752eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*TInfo=*/0,
5753eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*BitWidth=*/0,
5754eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*Mutable=*/false,
5755eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       ICIS_NoInit);
5756eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  Field->setAccess(AS_public);
5757eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->addDecl(Field);
5758eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5759eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // };
5760eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->completeDefinition();
5761eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5762eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // typedef struct __va_list __builtin_va_list;
5763eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  TypeSourceInfo *TInfo
5764eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    = Context->getTrivialTypeSourceInfo(Context->getRecordType(VaListDecl));
5765eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5766eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  TypedefDecl *VaListTypeDecl
5767eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5768eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          Context->getTranslationUnitDecl(),
5769eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          SourceLocation(), SourceLocation(),
5770eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          &Context->Idents.get("__builtin_va_list"),
5771eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          TInfo);
5772eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5773eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  return VaListTypeDecl;
5774eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien}
5775eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5776c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVaListDecl(const ASTContext *Context,
5777c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                     TargetInfo::BuiltinVaListKind Kind) {
5778c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  switch (Kind) {
5779c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::CharPtrBuiltinVaList:
5780c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateCharPtrBuiltinVaListDecl(Context);
5781c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::VoidPtrBuiltinVaList:
5782c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateVoidPtrBuiltinVaListDecl(Context);
5783c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::PowerABIBuiltinVaList:
5784c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreatePowerABIBuiltinVaListDecl(Context);
5785c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::X86_64ABIBuiltinVaList:
5786c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateX86_64ABIBuiltinVaListDecl(Context);
5787c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::PNaClABIBuiltinVaList:
5788c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreatePNaClABIBuiltinVaListDecl(Context);
5789eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  case TargetInfo::AAPCSABIBuiltinVaList:
5790eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    return CreateAAPCSABIBuiltinVaListDecl(Context);
5791c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5792c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5793c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm_unreachable("Unhandled __builtin_va_list type kind");
5794c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5795c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5796c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeTypedefDecl *ASTContext::getBuiltinVaListDecl() const {
5797c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  if (!BuiltinVaListDecl)
5798c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    BuiltinVaListDecl = CreateVaListDecl(this, Target->getBuiltinVaListKind());
5799c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5800c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return BuiltinVaListDecl;
5801c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5802c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5803fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador IngeQualType ASTContext::getVaListTagType() const {
5804fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // Force the creation of VaListTagTy by building the __builtin_va_list
5805fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // declaration.
5806fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  if (VaListTagTy.isNull())
5807fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge    (void) getBuiltinVaListDecl();
5808fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
5809fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  return VaListTagTy;
5810fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge}
5811fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
5812a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) {
58131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(ObjCConstantStringType.isNull() &&
58142198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff         "'NSConstantString' type already set!");
58151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5816a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCConstantStringType = getObjCInterfaceType(Decl);
58172198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff}
58182198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff
58190bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// \brief Retrieve the template name that corresponds to a non-empty
58200bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// lookup.
58214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
58224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
58234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                      UnresolvedSetIterator End) const {
58240bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  unsigned size = End - Begin;
58250bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  assert(size > 1 && "set is not overloaded!");
58267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58270bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  void *memory = Allocate(sizeof(OverloadedTemplateStorage) +
58280bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall                          size * sizeof(FunctionTemplateDecl*));
58290bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size);
58300bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
58310bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  NamedDecl **Storage = OT->getStorage();
5832eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall  for (UnresolvedSetIterator I = Begin; I != End; ++I) {
58330bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    NamedDecl *D = *I;
58340bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    assert(isa<FunctionTemplateDecl>(D) ||
58350bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall           (isa<UsingShadowDecl>(D) &&
58360bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall            isa<FunctionTemplateDecl>(D->getUnderlyingDecl())));
58370bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    *Storage++ = D;
58387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
58397532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58400bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  return TemplateName(OT);
58417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
58427532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5843d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// \brief Retrieve the template name that represents a qualified
5844d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// template name such as \c std::vector.
58454ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
58464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
58474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     bool TemplateKeyword,
58484ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     TemplateDecl *Template) const {
58490f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  assert(NNS && "Missing nested-name-specifier in qualified template name");
58500f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor
5851789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  // FIXME: Canonicalization?
5852d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  llvm::FoldingSetNodeID ID;
5853d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template);
58541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5855d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  void *InsertPos = 0;
5856d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  QualifiedTemplateName *QTN =
58570bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
5858d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  if (!QTN) {
58592f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<QualifiedTemplateName>())
58602f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        QualifiedTemplateName(NNS, TemplateKeyword, Template);
5861d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    QualifiedTemplateNames.InsertNode(QTN, InsertPos);
5862d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  }
58631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5864d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  return TemplateName(QTN);
5865d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor}
5866d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
58677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Retrieve the template name that represents a dependent
58687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name such as \c MetaFun::template apply.
58694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
58704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
58714ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     const IdentifierInfo *Name) const {
58721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert((!NNS || NNS->isDependent()) &&
58733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor         "Nested name specifier must be dependent");
58747532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  llvm::FoldingSetNodeID ID;
58767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateName::Profile(ID, NNS, Name);
58777532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58787532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void *InsertPos = 0;
58797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateName *QTN =
58807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
58817532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (QTN)
58837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return TemplateName(QTN);
58847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
58867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (CanonNNS == NNS) {
58872f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
58882f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Name);
58897532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  } else {
58907532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    TemplateName Canon = getDependentTemplateName(CanonNNS, Name);
58912f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
58922f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Name, Canon);
5893789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    DependentTemplateName *CheckQTN =
5894789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
5895789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!CheckQTN && "Dependent type name canonicalization broken");
5896789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckQTN;
58977532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
58987532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
58997532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateNames.InsertNode(QTN, InsertPos);
59007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  return TemplateName(QTN);
59017532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
59027532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5903ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// \brief Retrieve the template name that represents a dependent
5904ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// template name such as \c MetaFun::template operator+.
5905ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
5906ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
59074ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     OverloadedOperatorKind Operator) const {
5908ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  assert((!NNS || NNS->isDependent()) &&
5909ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor         "Nested name specifier must be dependent");
5910ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5911ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  llvm::FoldingSetNodeID ID;
5912ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateName::Profile(ID, NNS, Operator);
5913ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5914ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  void *InsertPos = 0;
5915789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  DependentTemplateName *QTN
5916789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
5917ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5918ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  if (QTN)
5919ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return TemplateName(QTN);
5920ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5921ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
5922ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  if (CanonNNS == NNS) {
59232f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
59242f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Operator);
5925ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  } else {
5926ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    TemplateName Canon = getDependentTemplateName(CanonNNS, Operator);
59272f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
59282f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Operator, Canon);
5929789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
5930789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    DependentTemplateName *CheckQTN
5931789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
5932789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!CheckQTN && "Dependent template name canonicalization broken");
5933789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckQTN;
5934ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
5935ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5936ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateNames.InsertNode(QTN, InsertPos);
5937ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return TemplateName(QTN);
5938ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
5939ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
59401aee05d08b2184acadeb36de300e216390780d6cDouglas GregorTemplateName
5941146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param,
5942146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                         TemplateName replacement) const {
5943146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm::FoldingSetNodeID ID;
5944146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage::Profile(ID, param, replacement);
5945146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5946146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  void *insertPos = 0;
5947146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage *subst
5948146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
5949146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5950146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  if (!subst) {
5951146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement);
5952146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParms.InsertNode(subst, insertPos);
5953146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
5954146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5955146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  return TemplateName(subst);
5956146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall}
5957146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5958146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallTemplateName
59591aee05d08b2184acadeb36de300e216390780d6cDouglas GregorASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param,
59601aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                       const TemplateArgument &ArgPack) const {
59611aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ASTContext &Self = const_cast<ASTContext &>(*this);
59621aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  llvm::FoldingSetNodeID ID;
59631aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack);
59641aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
59651aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  void *InsertPos = 0;
59661aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage *Subst
59671aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
59681aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
59691aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  if (!Subst) {
5970146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param,
59711aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                                           ArgPack.pack_size(),
59721aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                                         ArgPack.pack_begin());
59731aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
59741aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
59751aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
59761aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  return TemplateName(Subst);
59771aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor}
59781aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
5979b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor/// getFromTargetType - Given one of the integer types provided by
5980d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// TargetInfo, produce the corresponding type. The unsigned @p Type
5981d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// is actually a value of type @c TargetInfo::IntType.
5982e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallCanQualType ASTContext::getFromTargetType(unsigned Type) const {
5983b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  switch (Type) {
5984e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall  case TargetInfo::NoInt: return CanQualType();
5985b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedShort: return ShortTy;
5986b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedShort: return UnsignedShortTy;
5987b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedInt: return IntTy;
5988b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedInt: return UnsignedIntTy;
5989b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedLong: return LongTy;
5990b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedLong: return UnsignedLongTy;
5991b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedLongLong: return LongLongTy;
5992b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy;
5993b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  }
5994b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor
5995b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unhandled TargetInfo::IntType value");
5996b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor}
5997b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek
5998b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===//
5999b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//                        Type Predicates.
6000b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===//
6001b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek
60024fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
60034fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// garbage collection attribute.
60044fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian///
6005ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCallQualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const {
60064e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().getGC() == LangOptions::NonGC)
6007ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    return Qualifiers::GCNone;
6008ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall
60094e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  assert(getLangOpts().ObjC1);
6010ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  Qualifiers::GC GCAttrs = Ty.getObjCGCAttr();
6011ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall
6012ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // Default behaviour under objective-C's gc is for ObjC pointers
6013ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // (or pointers to them) be treated as though they were declared
6014ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // as __strong.
6015ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  if (GCAttrs == Qualifiers::GCNone) {
6016ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
6017ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      return Qualifiers::Strong;
6018ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    else if (Ty->isPointerType())
6019ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType());
6020ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  } else {
6021ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    // It's not valid to set GC attributes on anything that isn't a
6022ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    // pointer.
6023ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#ifndef NDEBUG
6024ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    QualType CT = Ty->getCanonicalTypeInternal();
6025ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    while (const ArrayType *AT = dyn_cast<ArrayType>(CT))
6026ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      CT = AT->getElementType();
6027ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    assert(CT->isAnyPointerType() || CT->isBlockPointerType());
6028ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#endif
60294fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian  }
6030b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner  return GCAttrs;
60314fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian}
60324fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian
60336ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===//
60346ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//                        Type Compatibility Testing
60356ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===//
6036770951b5bb6028a8d326ddb4a13cef7d4a128162Chris Lattner
60371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// areCompatVectorTypes - Return true if the two specified vector types are
60386ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner/// compatible.
60396ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattnerstatic bool areCompatVectorTypes(const VectorType *LHS,
60406ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner                                 const VectorType *RHS) {
6041467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified());
60426ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  return LHS->getElementType() == RHS->getElementType() &&
604361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner         LHS->getNumElements() == RHS->getNumElements();
60446ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner}
60456ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner
6046255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregorbool ASTContext::areCompatibleVectorTypes(QualType FirstVec,
6047255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor                                          QualType SecondVec) {
6048255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  assert(FirstVec->isVectorType() && "FirstVec should be a vector type");
6049255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  assert(SecondVec->isVectorType() && "SecondVec should be a vector type");
6050255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6051255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  if (hasSameUnqualifiedType(FirstVec, SecondVec))
6052255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor    return true;
6053255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6054f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  // Treat Neon vector types and most AltiVec vector types as if they are the
6055f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  // equivalent GCC vector types.
6056255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  const VectorType *First = FirstVec->getAs<VectorType>();
6057255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  const VectorType *Second = SecondVec->getAs<VectorType>();
6058f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  if (First->getNumElements() == Second->getNumElements() &&
6059255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor      hasSameType(First->getElementType(), Second->getElementType()) &&
6060f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      First->getVectorKind() != VectorType::AltiVecPixel &&
6061f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      First->getVectorKind() != VectorType::AltiVecBool &&
6062f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      Second->getVectorKind() != VectorType::AltiVecPixel &&
6063f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      Second->getVectorKind() != VectorType::AltiVecBool)
6064255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor    return true;
6065255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6066255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  return false;
6067255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor}
6068255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
60694084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===//
60704084c306635b70f37029dca938444e6013f08684Steve Naroff// ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's.
60714084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===//
60724084c306635b70f37029dca938444e6013f08684Steve Naroff
60734084c306635b70f37029dca938444e6013f08684Steve Naroff/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the
60744084c306635b70f37029dca938444e6013f08684Steve Naroff/// inheritance hierarchy of 'rProto'.
60754ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool
60764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
60774ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           ObjCProtocolDecl *rProto) const {
60783fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor  if (declaresSameEntity(lProto, rProto))
607914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    return true;
60804084c306635b70f37029dca938444e6013f08684Steve Naroff  for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(),
60814084c306635b70f37029dca938444e6013f08684Steve Naroff       E = rProto->protocol_end(); PI != E; ++PI)
60824084c306635b70f37029dca938444e6013f08684Steve Naroff    if (ProtocolCompatibleWithProtocol(lProto, *PI))
60834084c306635b70f37029dca938444e6013f08684Steve Naroff      return true;
60844084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
60854084c306635b70f37029dca938444e6013f08684Steve Naroff}
608614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
60874c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// QualifiedIdConformsQualifiedId - compare id<pr,...> with id<pr1,...>
60884084c306635b70f37029dca938444e6013f08684Steve Naroff/// return true if lhs's protocols conform to rhs's protocol; false
60894084c306635b70f37029dca938444e6013f08684Steve Naroff/// otherwise.
60904084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) {
60914084c306635b70f37029dca938444e6013f08684Steve Naroff  if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType())
60924084c306635b70f37029dca938444e6013f08684Steve Naroff    return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false);
60934084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
60944084c306635b70f37029dca938444e6013f08684Steve Naroff}
60954084c306635b70f37029dca938444e6013f08684Steve Naroff
60964c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// ObjCQualifiedClassTypesAreCompatible - compare  Class<pr,...> and
60974c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// Class<pr1, ...>.
6098a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanianbool ASTContext::ObjCQualifiedClassTypesAreCompatible(QualType lhs,
6099a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian                                                      QualType rhs) {
6100a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  const ObjCObjectPointerType *lhsQID = lhs->getAs<ObjCObjectPointerType>();
6101a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
6102a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  assert ((lhsQID && rhsOPT) && "ObjCQualifiedClassTypesAreCompatible");
6103a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6104a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
6105a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian       E = lhsQID->qual_end(); I != E; ++I) {
6106a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    bool match = false;
6107a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    ObjCProtocolDecl *lhsProto = *I;
6108a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(),
6109a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian         E = rhsOPT->qual_end(); J != E; ++J) {
6110a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      ObjCProtocolDecl *rhsProto = *J;
6111a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) {
6112a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian        match = true;
6113a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian        break;
6114a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      }
6115a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    }
6116a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    if (!match)
6117a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      return false;
6118a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  }
6119a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  return true;
6120a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian}
6121a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
61224084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an
61234084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIDType.
61244084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs,
61254084c306635b70f37029dca938444e6013f08684Steve Naroff                                                   bool compare) {
61264084c306635b70f37029dca938444e6013f08684Steve Naroff  // Allow id<P..> and an 'id' or void* type in all cases.
61271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (lhs->isVoidPointerType() ||
61284084c306635b70f37029dca938444e6013f08684Steve Naroff      lhs->isObjCIdType() || lhs->isObjCClassType())
61294084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
61301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  else if (rhs->isVoidPointerType() ||
61314084c306635b70f37029dca938444e6013f08684Steve Naroff           rhs->isObjCIdType() || rhs->isObjCClassType())
61324084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
61334084c306635b70f37029dca938444e6013f08684Steve Naroff
61344084c306635b70f37029dca938444e6013f08684Steve Naroff  if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) {
6135183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
61361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61374084c306635b70f37029dca938444e6013f08684Steve Naroff    if (!rhsOPT) return false;
61381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61394084c306635b70f37029dca938444e6013f08684Steve Naroff    if (rhsOPT->qual_empty()) {
61401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // If the RHS is a unqualified interface pointer "NSString*",
61414084c306635b70f37029dca938444e6013f08684Steve Naroff      // make sure we check the class hierarchy.
61424084c306635b70f37029dca938444e6013f08684Steve Naroff      if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) {
61434084c306635b70f37029dca938444e6013f08684Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
61444084c306635b70f37029dca938444e6013f08684Steve Naroff             E = lhsQID->qual_end(); I != E; ++I) {
61454084c306635b70f37029dca938444e6013f08684Steve Naroff          // when comparing an id<P> on lhs with a static type on rhs,
61464084c306635b70f37029dca938444e6013f08684Steve Naroff          // see if static class implements all of id's protocols, directly or
61474084c306635b70f37029dca938444e6013f08684Steve Naroff          // through its super class and categories.
61480fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian          if (!rhsID->ClassImplementsProtocol(*I, true))
61494084c306635b70f37029dca938444e6013f08684Steve Naroff            return false;
61504084c306635b70f37029dca938444e6013f08684Steve Naroff        }
61514084c306635b70f37029dca938444e6013f08684Steve Naroff      }
61524084c306635b70f37029dca938444e6013f08684Steve Naroff      // If there are no qualifiers and no interface, we have an 'id'.
61534084c306635b70f37029dca938444e6013f08684Steve Naroff      return true;
61544084c306635b70f37029dca938444e6013f08684Steve Naroff    }
61551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Both the right and left sides have qualifiers.
61564084c306635b70f37029dca938444e6013f08684Steve Naroff    for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
61574084c306635b70f37029dca938444e6013f08684Steve Naroff         E = lhsQID->qual_end(); I != E; ++I) {
61584084c306635b70f37029dca938444e6013f08684Steve Naroff      ObjCProtocolDecl *lhsProto = *I;
61594084c306635b70f37029dca938444e6013f08684Steve Naroff      bool match = false;
6160de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff
6161de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // when comparing an id<P> on lhs with a static type on rhs,
6162de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // see if static class implements all of id's protocols, directly or
6163de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // through its super class and categories.
61644084c306635b70f37029dca938444e6013f08684Steve Naroff      for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(),
61654084c306635b70f37029dca938444e6013f08684Steve Naroff           E = rhsOPT->qual_end(); J != E; ++J) {
61664084c306635b70f37029dca938444e6013f08684Steve Naroff        ObjCProtocolDecl *rhsProto = *J;
61674084c306635b70f37029dca938444e6013f08684Steve Naroff        if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
61684084c306635b70f37029dca938444e6013f08684Steve Naroff            (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
61694084c306635b70f37029dca938444e6013f08684Steve Naroff          match = true;
61708f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff          break;
61718f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff        }
6172de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      }
61731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // If the RHS is a qualified interface pointer "NSString<P>*",
61744084c306635b70f37029dca938444e6013f08684Steve Naroff      // make sure we check the class hierarchy.
61754084c306635b70f37029dca938444e6013f08684Steve Naroff      if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) {
61764084c306635b70f37029dca938444e6013f08684Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
61774084c306635b70f37029dca938444e6013f08684Steve Naroff             E = lhsQID->qual_end(); I != E; ++I) {
61784084c306635b70f37029dca938444e6013f08684Steve Naroff          // when comparing an id<P> on lhs with a static type on rhs,
61794084c306635b70f37029dca938444e6013f08684Steve Naroff          // see if static class implements all of id's protocols, directly or
61804084c306635b70f37029dca938444e6013f08684Steve Naroff          // through its super class and categories.
61810fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian          if (rhsID->ClassImplementsProtocol(*I, true)) {
61824084c306635b70f37029dca938444e6013f08684Steve Naroff            match = true;
61834084c306635b70f37029dca938444e6013f08684Steve Naroff            break;
61844084c306635b70f37029dca938444e6013f08684Steve Naroff          }
61854084c306635b70f37029dca938444e6013f08684Steve Naroff        }
61864084c306635b70f37029dca938444e6013f08684Steve Naroff      }
61874084c306635b70f37029dca938444e6013f08684Steve Naroff      if (!match)
6188de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff        return false;
6189de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    }
61901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6191de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    return true;
6192de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  }
61931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61944084c306635b70f37029dca938444e6013f08684Steve Naroff  const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType();
61954084c306635b70f37029dca938444e6013f08684Steve Naroff  assert(rhsQID && "One of the LHS/RHS should be id<x>");
61964084c306635b70f37029dca938444e6013f08684Steve Naroff
61971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (const ObjCObjectPointerType *lhsOPT =
61984084c306635b70f37029dca938444e6013f08684Steve Naroff        lhs->getAsObjCInterfacePointerType()) {
6199de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // If both the right and left sides have qualifiers.
62004084c306635b70f37029dca938444e6013f08684Steve Naroff    for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(),
62014084c306635b70f37029dca938444e6013f08684Steve Naroff         E = lhsOPT->qual_end(); I != E; ++I) {
62024084c306635b70f37029dca938444e6013f08684Steve Naroff      ObjCProtocolDecl *lhsProto = *I;
62034084c306635b70f37029dca938444e6013f08684Steve Naroff      bool match = false;
62044084c306635b70f37029dca938444e6013f08684Steve Naroff
6205de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // when comparing an id<P> on rhs with a static type on lhs,
62064084c306635b70f37029dca938444e6013f08684Steve Naroff      // see if static class implements all of id's protocols, directly or
62074084c306635b70f37029dca938444e6013f08684Steve Naroff      // through its super class and categories.
6208de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // First, lhs protocols in the qualifier list must be found, direct
6209de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // or indirect in rhs's qualifier list or it is a mismatch.
62104084c306635b70f37029dca938444e6013f08684Steve Naroff      for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
62114084c306635b70f37029dca938444e6013f08684Steve Naroff           E = rhsQID->qual_end(); J != E; ++J) {
62124084c306635b70f37029dca938444e6013f08684Steve Naroff        ObjCProtocolDecl *rhsProto = *J;
62134084c306635b70f37029dca938444e6013f08684Steve Naroff        if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
62144084c306635b70f37029dca938444e6013f08684Steve Naroff            (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
62154084c306635b70f37029dca938444e6013f08684Steve Naroff          match = true;
62164084c306635b70f37029dca938444e6013f08684Steve Naroff          break;
62174084c306635b70f37029dca938444e6013f08684Steve Naroff        }
62184084c306635b70f37029dca938444e6013f08684Steve Naroff      }
62194084c306635b70f37029dca938444e6013f08684Steve Naroff      if (!match)
62204084c306635b70f37029dca938444e6013f08684Steve Naroff        return false;
62214084c306635b70f37029dca938444e6013f08684Steve Naroff    }
6222de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian
6223de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // Static class's protocols, or its super class or category protocols
6224de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // must be found, direct or indirect in rhs's qualifier list or it is a mismatch.
6225de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) {
6226de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
6227de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      CollectInheritedProtocols(lhsID, LHSInheritedProtocols);
6228de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // This is rather dubious but matches gcc's behavior. If lhs has
6229de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // no type qualifier and its class has no static protocol(s)
6230de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // assume that it is mismatch.
6231de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty())
6232de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        return false;
6233de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6234de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian           LHSInheritedProtocols.begin(),
6235de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian           E = LHSInheritedProtocols.end(); I != E; ++I) {
6236de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        bool match = false;
6237de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        ObjCProtocolDecl *lhsProto = (*I);
6238de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
6239de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian             E = rhsQID->qual_end(); J != E; ++J) {
6240de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          ObjCProtocolDecl *rhsProto = *J;
6241de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
6242de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian              (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
6243de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian            match = true;
6244de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian            break;
6245de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          }
6246de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        }
6247de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        if (!match)
6248de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          return false;
6249de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      }
6250de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    }
62514084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
62524084c306635b70f37029dca938444e6013f08684Steve Naroff  }
62534084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
62544084c306635b70f37029dca938444e6013f08684Steve Naroff}
62554084c306635b70f37029dca938444e6013f08684Steve Naroff
62564084c306635b70f37029dca938444e6013f08684Steve Naroff/// canAssignObjCInterfaces - Return true if the two interface types are
62574084c306635b70f37029dca938444e6013f08684Steve Naroff/// compatible for assignment from RHS to LHS.  This handles validation of any
62584084c306635b70f37029dca938444e6013f08684Steve Naroff/// protocol qualifiers on the LHS or RHS.
62594084c306635b70f37029dca938444e6013f08684Steve Naroff///
62604084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT,
62614084c306635b70f37029dca938444e6013f08684Steve Naroff                                         const ObjCObjectPointerType *RHSOPT) {
6262c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* LHS = LHSOPT->getObjectType();
6263c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* RHS = RHSOPT->getObjectType();
6264c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
62654084c306635b70f37029dca938444e6013f08684Steve Naroff  // If either type represents the built-in 'id' or 'Class' types, return true.
6266c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->isObjCUnqualifiedIdOrClass() ||
6267c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      RHS->isObjCUnqualifiedIdOrClass())
62684084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
62694084c306635b70f37029dca938444e6013f08684Steve Naroff
6270c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId())
62711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
62721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             QualType(RHSOPT,0),
62734084c306635b70f37029dca938444e6013f08684Steve Naroff                                             false);
6274a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6275a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass())
6276a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    return ObjCQualifiedClassTypesAreCompatible(QualType(LHSOPT,0),
6277a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian                                                QualType(RHSOPT,0));
6278a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6279c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // If we have 2 user-defined types, fall into that path.
6280c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->getInterface() && RHS->getInterface())
62814084c306635b70f37029dca938444e6013f08684Steve Naroff    return canAssignObjCInterfaces(LHS, RHS);
62821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62834084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
628414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff}
628514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
6286132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// canAssignObjCInterfacesInBlockPointer - This routine is specifically written
6287fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// for providing type-safety for objective-c pointers used to pass/return
6288132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// arguments in block literals. When passed as arguments, passing 'A*' where
6289132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is
6290132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// not OK. For the return type, the opposite is not OK.
6291132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::canAssignObjCInterfacesInBlockPointer(
6292132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                         const ObjCObjectPointerType *LHSOPT,
6293a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                         const ObjCObjectPointerType *RHSOPT,
6294a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                         bool BlockReturnType) {
6295a98344869c278295f38e106583906377520079b8Fariborz Jahanian  if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType())
6296132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return true;
6297132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6298132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  if (LHSOPT->isObjCBuiltinType()) {
6299132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType();
6300132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  }
6301132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6302a98344869c278295f38e106583906377520079b8Fariborz Jahanian  if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType())
6303132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
6304132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                             QualType(RHSOPT,0),
6305132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                             false);
6306132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6307132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
6308132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
6309132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  if (LHS && RHS)  { // We have 2 user-defined types.
6310132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    if (LHS != RHS) {
6311132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (LHS->getDecl()->isSuperClassOf(RHS->getDecl()))
6312a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian        return BlockReturnType;
6313132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (RHS->getDecl()->isSuperClassOf(LHS->getDecl()))
6314a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian        return !BlockReturnType;
6315132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    }
6316132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    else
6317132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      return true;
6318132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  }
6319132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  return false;
6320132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian}
6321132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6322e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// getIntersectionOfProtocols - This routine finds the intersection of set
6323e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// of protocols inherited from two distinct objective-c pointer objects.
6324e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// It is used to build composite qualifier list of the composite type of
6325e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// the conditional expression involving two objective-c pointer objects.
6326e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianstatic
6327e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid getIntersectionOfProtocols(ASTContext &Context,
6328e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                const ObjCObjectPointerType *LHSOPT,
6329e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                const ObjCObjectPointerType *RHSOPT,
63305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) {
6331e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6332c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* LHS = LHSOPT->getObjectType();
6333c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* RHS = RHSOPT->getObjectType();
6334c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(LHS->getInterface() && "LHS must have an interface base");
6335c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(RHS->getInterface() && "RHS must have an interface base");
6336e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6337e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet;
6338e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  unsigned LHSNumProtocols = LHS->getNumProtocols();
6339e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (LHSNumProtocols > 0)
6340e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end());
6341e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  else {
6342432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
6343c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Context.CollectInheritedProtocols(LHS->getInterface(),
6344c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                      LHSInheritedProtocols);
6345e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    InheritedProtocolSet.insert(LHSInheritedProtocols.begin(),
6346e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                LHSInheritedProtocols.end());
6347e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
6348e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6349e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  unsigned RHSNumProtocols = RHS->getNumProtocols();
6350e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (RHSNumProtocols > 0) {
6351cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman    ObjCProtocolDecl **RHSProtocols =
6352cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman      const_cast<ObjCProtocolDecl **>(RHS->qual_begin());
6353e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    for (unsigned i = 0; i < RHSNumProtocols; ++i)
6354e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      if (InheritedProtocolSet.count(RHSProtocols[i]))
6355e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        IntersectionOfProtocols.push_back(RHSProtocols[i]);
63563060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  } else {
6357432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols;
6358c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Context.CollectInheritedProtocols(RHS->getInterface(),
6359c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                      RHSInheritedProtocols);
6360432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6361432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian         RHSInheritedProtocols.begin(),
6362432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian         E = RHSInheritedProtocols.end(); I != E; ++I)
6363432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian      if (InheritedProtocolSet.count((*I)))
6364432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian        IntersectionOfProtocols.push_back((*I));
6365e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
6366e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian}
6367e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6368db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// areCommonBaseCompatible - Returns common base class of the two classes if
6369db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// one found. Note that this is O'2 algorithm. But it will be called as the
6370db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// last type comparison in a ?-exp of ObjC pointer types before a
6371db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// warning is issued. So, its invokation is extremely rare.
6372db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz JahanianQualType ASTContext::areCommonBaseCompatible(
6373c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                          const ObjCObjectPointerType *Lptr,
6374c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                          const ObjCObjectPointerType *Rptr) {
6375c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType *LHS = Lptr->getObjectType();
6376c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType *RHS = Rptr->getObjectType();
6377c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCInterfaceDecl* LDecl = LHS->getInterface();
6378c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCInterfaceDecl* RDecl = RHS->getInterface();
637960ef308e51c71b760d7f598c1b763ceb7b768148Douglas Gregor  if (!LDecl || !RDecl || (declaresSameEntity(LDecl, RDecl)))
6380db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian    return QualType();
6381db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
63827c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian  do {
6383c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    LHS = cast<ObjCInterfaceType>(getObjCInterfaceType(LDecl));
6384e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    if (canAssignObjCInterfaces(LHS, RHS)) {
63855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVector<ObjCProtocolDecl *, 8> Protocols;
6386c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      getIntersectionOfProtocols(*this, Lptr, Rptr, Protocols);
6387c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
6388c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      QualType Result = QualType(LHS, 0);
6389c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      if (!Protocols.empty())
6390c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        Result = getObjCObjectType(Result, Protocols.data(), Protocols.size());
6391c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Result = getObjCObjectPointerType(Result);
6392c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      return Result;
6393e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
63947c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian  } while ((LDecl = LDecl->getSuperClass()));
6395db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
6396db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian  return QualType();
6397db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian}
6398db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
6399c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallbool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS,
6400c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                         const ObjCObjectType *RHS) {
6401c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(LHS->getInterface() && "LHS is not an interface type");
6402c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(RHS->getInterface() && "RHS is not an interface type");
6403c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
64046ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // Verify that the base decls are compatible: the RHS must be a subclass of
64056ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // the LHS.
6406c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!LHS->getInterface()->isSuperClassOf(RHS->getInterface()))
64076ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner    return false;
64081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64096ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // RHS must have a superset of the protocols in the LHS.  If the LHS is not
64106ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // protocol qualified at all, then we are good.
6411c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  if (LHS->getNumProtocols() == 0)
64126ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner    return true;
64131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6414b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  // Okay, we know the LHS has protocol qualifiers.  If the RHS doesn't,
6415b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  // more detailed analysis is required.
6416b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  if (RHS->getNumProtocols() == 0) {
6417b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // OK, if LHS is a superclass of RHS *and*
6418b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // this superclass is assignment compatible with LHS.
6419b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // false otherwise.
6420627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian    bool IsSuperClass =
6421627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian      LHS->getInterface()->isSuperClassOf(RHS->getInterface());
6422627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian    if (IsSuperClass) {
6423b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // OK if conversion of LHS to SuperClass results in narrowing of types
6424b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // ; i.e., SuperClass may implement at least one of the protocols
6425b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok.
6426b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // But not SuperObj<P1,P2,P3> = lhs<P1,P2>.
6427b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols;
6428627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian      CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols);
6429b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // If super class has no protocols, it is not a match.
6430b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      if (SuperClassInheritedProtocols.empty())
6431b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        return false;
6432b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian
6433b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(),
6434b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian           LHSPE = LHS->qual_end();
6435b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian           LHSPI != LHSPE; LHSPI++) {
6436b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        bool SuperImplementsProtocol = false;
6437b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        ObjCProtocolDecl *LHSProto = (*LHSPI);
6438b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian
6439b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6440b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian             SuperClassInheritedProtocols.begin(),
6441b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian             E = SuperClassInheritedProtocols.end(); I != E; ++I) {
6442b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          ObjCProtocolDecl *SuperClassProto = (*I);
6443b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
6444b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian            SuperImplementsProtocol = true;
6445b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian            break;
6446b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          }
6447b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        }
6448b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        if (!SuperImplementsProtocol)
6449b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          return false;
6450b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      }
6451b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      return true;
6452b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    }
6453b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    return false;
6454b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  }
64551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6456c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(),
6457c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                     LHSPE = LHS->qual_end();
645891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff       LHSPI != LHSPE; LHSPI++) {
645991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    bool RHSImplementsProtocol = false;
646091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff
646191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // If the RHS doesn't implement the protocol on the left, the types
646291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // are incompatible.
6463c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    for (ObjCObjectType::qual_iterator RHSPI = RHS->qual_begin(),
6464c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                       RHSPE = RHS->qual_end();
64658f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff         RHSPI != RHSPE; RHSPI++) {
64668f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff      if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) {
646791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff        RHSImplementsProtocol = true;
64688f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff        break;
64698f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff      }
647091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    }
647191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // FIXME: For better diagnostics, consider passing back the protocol name.
647291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    if (!RHSImplementsProtocol)
647391b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff      return false;
647491b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  }
647591b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  // The RHS implements all protocols listed on the LHS.
647691b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  return true;
64776ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner}
64786ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner
6479389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroffbool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) {
6480389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff  // get the "pointed to" types
6481183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>();
6482183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>();
64831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
648414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (!LHSOPT || !RHSOPT)
6485389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff    return false;
648614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
648714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  return canAssignObjCInterfaces(LHSOPT, RHSOPT) ||
648814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff         canAssignObjCInterfaces(RHSOPT, LHSOPT);
6489389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff}
6490389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff
6491569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorbool ASTContext::canBindObjCObjectType(QualType To, QualType From) {
6492569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor  return canAssignObjCInterfaces(
6493569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor                getObjCObjectPointerType(To)->getAs<ObjCObjectPointerType>(),
6494569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor                getObjCObjectPointerType(From)->getAs<ObjCObjectPointerType>());
6495569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor}
6496569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor
64971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible,
6498ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// both shall have the identically qualified version of a compatible type.
64991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// C99 6.2.7p1: Two types have compatible types if their types are the
6500ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// same. See 6.7.[2,3,5] for additional rules.
6501447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregorbool ASTContext::typesAreCompatible(QualType LHS, QualType RHS,
6502447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                    bool CompareUnqualified) {
65034e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
65040e709abafbd939326850501f795cc7a92c88a354Douglas Gregor    return hasSameType(LHS, RHS);
65050e709abafbd939326850501f795cc7a92c88a354Douglas Gregor
6506447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull();
65073d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman}
65083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6509c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanianbool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) {
651082378391dfc3b2fc22f63dbf1552bd9aed39dc42Fariborz Jahanian  return typesAreCompatible(LHS, RHS);
6511c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian}
6512c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian
6513132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) {
6514132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  return !mergeTypes(LHS, RHS, true).isNull();
6515132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian}
6516132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
65174846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeTransparentUnionType - if T is a transparent union type and a member
65184846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// of T is compatible with SubType, return the merged type, else return
65194846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// QualType()
65204846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType,
65214846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                               bool OfBlockPointer,
65224846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                               bool Unqualified) {
65234846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (const RecordType *UT = T->getAsUnionType()) {
65244846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    RecordDecl *UD = UT->getDecl();
65254846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    if (UD->hasAttr<TransparentUnionAttr>()) {
65264846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      for (RecordDecl::field_iterator it = UD->field_begin(),
65274846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne           itend = UD->field_end(); it != itend; ++it) {
6528f91d7572ee7fa6f2926c8e7e816039a1154a59f8Peter Collingbourne        QualType ET = it->getType().getUnqualifiedType();
65294846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne        QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified);
65304846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne        if (!MT.isNull())
65314846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne          return MT;
65324846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      }
65334846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    }
65344846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  }
65354846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
65364846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  return QualType();
65374846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne}
65384846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
65394846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeFunctionArgumentTypes - merge two types which appear as function
65404846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// argument types
65414846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeFunctionArgumentTypes(QualType lhs, QualType rhs,
65424846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                bool OfBlockPointer,
65434846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                bool Unqualified) {
65444846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // GNU extension: two types are compatible if they appear as a function
65454846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // argument, one of the types is a transparent union type and the other
65464846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // type is compatible with a union member
65474846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer,
65484846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                              Unqualified);
65494846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (!lmerge.isNull())
65504846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    return lmerge;
65514846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
65524846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer,
65534846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                              Unqualified);
65544846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (!rmerge.isNull())
65554846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    return rmerge;
65564846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
65574846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified);
65584846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne}
65594846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
6560132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
6561447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                        bool OfBlockPointer,
6562447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                        bool Unqualified) {
6563183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const FunctionType *lbase = lhs->getAs<FunctionType>();
6564183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const FunctionType *rbase = rhs->getAs<FunctionType>();
656572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase);
656672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase);
65673d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  bool allLTypes = true;
65683d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  bool allRTypes = true;
65693d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
65703d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  // Check return type
6571132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  QualType retType;
6572d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian  if (OfBlockPointer) {
6573d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    QualType RHS = rbase->getResultType();
6574d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    QualType LHS = lbase->getResultType();
6575d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    bool UnqualifiedResult = Unqualified;
6576d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    if (!UnqualifiedResult)
6577d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian      UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers());
6578a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian    retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true);
6579d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian  }
6580132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  else
65818cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    retType = mergeTypes(lbase->getResultType(), rbase->getResultType(), false,
65828cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall                         Unqualified);
65833d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (retType.isNull()) return QualType();
6584447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6585447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified)
6586447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    retType = retType.getUnqualifiedType();
6587447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6588447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  CanQualType LRetType = getCanonicalType(lbase->getResultType());
6589447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  CanQualType RRetType = getCanonicalType(rbase->getResultType());
6590447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified) {
6591447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    LRetType = LRetType.getUnqualifiedType();
6592447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    RRetType = RRetType.getUnqualifiedType();
6593447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  }
6594447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6595447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (getCanonicalType(retType) != LRetType)
659661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    allLTypes = false;
6597447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (getCanonicalType(retType) != RRetType)
659861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    allRTypes = false;
65998cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
66006a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  // FIXME: double check this
66016a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  // FIXME: should we error if lbase->getRegParmAttr() != 0 &&
66026a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  //                           rbase->getRegParmAttr() != 0 &&
66036a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  //                           lbase->getRegParmAttr() != rbase->getRegParmAttr()?
6604264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo();
6605264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo();
66068cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
66078cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  // Compatible functions must have compatible calling conventions
66088cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  if (!isSameCallConv(lbaseInfo.getCC(), rbaseInfo.getCC()))
66098cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    return QualType();
66108cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
66118cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  // Regparm is part of the calling convention.
6612a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman  if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm())
6613a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman    return QualType();
66148cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm())
66158cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    return QualType();
66168cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
6617f85e193739c953358c865005855253af4f68a497John McCall  if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult())
6618f85e193739c953358c865005855253af4f68a497John McCall    return QualType();
6619f85e193739c953358c865005855253af4f68a497John McCall
662053c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian  // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'.
662153c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian  bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn();
66221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66238b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola  if (lbaseInfo.getNoReturn() != NoReturn)
66248b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola    allLTypes = false;
66258b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola  if (rbaseInfo.getNoReturn() != NoReturn)
66268b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola    allRTypes = false;
66278b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola
6628f85e193739c953358c865005855253af4f68a497John McCall  FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn);
6629e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
66303d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (lproto && rproto) { // two C99 style function prototypes
6631465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl    assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() &&
6632465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl           "C++ shouldn't be here");
66333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned lproto_nargs = lproto->getNumArgs();
66343d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned rproto_nargs = rproto->getNumArgs();
66353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Compatible functions must have the same number of arguments
66373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (lproto_nargs != rproto_nargs)
66383d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
66393d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66403d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Variadic and non-variadic functions aren't compatible
66413d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (lproto->isVariadic() != rproto->isVariadic())
66423d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
66433d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66447fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis    if (lproto->getTypeQuals() != rproto->getTypeQuals())
66457fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis      return QualType();
66467fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis
664778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    if (LangOpts.ObjCAutoRefCount &&
664878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian        !FunctionTypesMatchOnNSConsumedAttrs(rproto, lproto))
664978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      return QualType();
665078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
66513d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Check argument compatibility
66525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<QualType, 10> types;
66533d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    for (unsigned i = 0; i < lproto_nargs; i++) {
66543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType largtype = lproto->getArgType(i).getUnqualifiedType();
66553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType rargtype = rproto->getArgType(i).getUnqualifiedType();
66564846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      QualType argtype = mergeFunctionArgumentTypes(largtype, rargtype,
66574846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                    OfBlockPointer,
66584846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                    Unqualified);
66593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      if (argtype.isNull()) return QualType();
6660447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6661447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      if (Unqualified)
6662447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        argtype = argtype.getUnqualifiedType();
6663447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
66643d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      types.push_back(argtype);
6665447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      if (Unqualified) {
6666447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        largtype = largtype.getUnqualifiedType();
6667447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        rargtype = rargtype.getUnqualifiedType();
6668447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      }
6669447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
667061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      if (getCanonicalType(argtype) != getCanonicalType(largtype))
667161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner        allLTypes = false;
667261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      if (getCanonicalType(argtype) != getCanonicalType(rargtype))
667361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner        allRTypes = false;
66743d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
667578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
66763d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allLTypes) return lhs;
66773d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allRTypes) return rhs;
6678e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
6679e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo();
6680e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.ExtInfo = einfo;
6681e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    return getFunctionType(retType, types.begin(), types.size(), EPI);
66823d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
66833d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
66843d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (lproto) allRTypes = false;
66853d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (rproto) allLTypes = false;
66863d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
668772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *proto = lproto ? lproto : rproto;
66883d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (proto) {
6689465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl    assert(!proto->hasExceptionSpec() && "C++ shouldn't be here");
66903d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (proto->isVariadic()) return QualType();
66913d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Check that the types are compatible with the types that
66923d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // would result from default argument promotions (C99 6.7.5.3p15).
66933d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // The only types actually affected are promotable integer
66943d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // types and floats, which would be passed as a different
66953d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // type depending on whether the prototype is visible.
66963d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned proto_nargs = proto->getNumArgs();
66973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    for (unsigned i = 0; i < proto_nargs; ++i) {
66983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType argTy = proto->getArgType(i);
6699b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor
6700c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      // Look at the converted type of enum types, since that is the type used
6701b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor      // to pass enum values.
6702c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      if (const EnumType *Enum = argTy->getAs<EnumType>()) {
6703c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman        argTy = Enum->getDecl()->getIntegerType();
6704c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman        if (argTy.isNull())
6705c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman          return QualType();
6706c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      }
6707b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor
67083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      if (argTy->isPromotableIntegerType() ||
67093d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman          getCanonicalType(argTy).getUnqualifiedType() == FloatTy)
67103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman        return QualType();
67113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
67123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
67133d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allLTypes) return lhs;
67143d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allRTypes) return rhs;
6715e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
6716e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo();
6717e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.ExtInfo = einfo;
67183d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return getFunctionType(retType, proto->arg_type_begin(),
6719e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                           proto->getNumArgs(), EPI);
67203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
67213d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
67223d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (allLTypes) return lhs;
67233d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (allRTypes) return rhs;
67248cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  return getFunctionNoProtoType(retType, einfo);
67253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman}
67263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6727132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeTypes(QualType LHS, QualType RHS,
6728447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                bool OfBlockPointer,
6729a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                bool Unqualified, bool BlockReturnType) {
673043d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // C++ [expr]: If an expression initially has the type "reference to T", the
673143d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // type is adjusted to "T" prior to any further analysis, the expression
673243d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // designates the object or function denoted by the reference, and the
67337c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // expression is an lvalue unless the reference is an rvalue reference and
67347c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // the expression is a function call (possibly inside parentheses).
67350e709abafbd939326850501f795cc7a92c88a354Douglas Gregor  assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?");
67360e709abafbd939326850501f795cc7a92c88a354Douglas Gregor  assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?");
6737447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6738447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified) {
6739447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    LHS = LHS.getUnqualifiedType();
6740447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    RHS = RHS.getUnqualifiedType();
6741447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  }
67420e709abafbd939326850501f795cc7a92c88a354Douglas Gregor
67433d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  QualType LHSCan = getCanonicalType(LHS),
67443d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman           RHSCan = getCanonicalType(RHS);
67453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6746f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner  // If two types are identical, they are compatible.
67473d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (LHSCan == RHSCan)
67483d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return LHS;
67493d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
67500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If the qualifiers are different, the types aren't compatible... mostly.
6751a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers LQuals = LHSCan.getLocalQualifiers();
6752a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers RQuals = RHSCan.getLocalQualifiers();
67530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  if (LQuals != RQuals) {
67540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // If any of these qualifiers are different, we have a type
67550953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // mismatch.
67560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
6757f85e193739c953358c865005855253af4f68a497John McCall        LQuals.getAddressSpace() != RQuals.getAddressSpace() ||
6758f85e193739c953358c865005855253af4f68a497John McCall        LQuals.getObjCLifetime() != RQuals.getObjCLifetime())
67590953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return QualType();
67600953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
67610953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // Exactly one GC qualifier difference is allowed: __strong is
67620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // okay if the other type has no GC qualifier but is an Objective
67630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // C object pointer (i.e. implicitly strong by default).  We fix
67640953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // this by pretending that the unqualified type was actually
67650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // qualified __strong.
67660953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
67670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
67680953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
67690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
67700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
67710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return QualType();
67720953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
67730953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) {
67740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong));
67750953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    }
67760953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) {
67770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS);
67780953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    }
67793d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
67800953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  }
67810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
67820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Okay, qualifiers are equal.
67833d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6784852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman  Type::TypeClass LHSClass = LHSCan->getTypeClass();
6785852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman  Type::TypeClass RHSClass = RHSCan->getTypeClass();
6786f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner
67871adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  // We want to consider the two function types to be the same for these
67881adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  // comparisons, just force one to the other.
67891adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
67901adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
67914c721d381fb279899337d120edd4a24d405e56b2Eli Friedman
67924c721d381fb279899337d120edd4a24d405e56b2Eli Friedman  // Same as above for arrays
6793a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner  if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
6794a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner    LHSClass = Type::ConstantArray;
6795a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner  if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
6796a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner    RHSClass = Type::ConstantArray;
67971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6798c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCInterfaces are just specialized ObjCObjects.
6799c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
6800c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
6801c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
6802213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // Canonicalize ExtVector -> Vector.
6803213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
6804213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
68051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68064e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff  // If the canonical type classes don't match.
68074e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff  if (LHSClass != RHSClass) {
68081adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner    // C99 6.7.2.2p4: Each enumerated type shall be compatible with char,
68091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // a signed integer type, or an unsigned integer type.
6810842aef8d942a880eeb9535d40de31a86838264cbJohn McCall    // Compatibility is based on the underlying type, not the promotion
6811842aef8d942a880eeb9535d40de31a86838264cbJohn McCall    // type.
6812183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const EnumType* ETy = LHS->getAs<EnumType>()) {
6813b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian      QualType TINT = ETy->getDecl()->getIntegerType();
6814b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian      if (!TINT.isNull() && hasSameType(TINT, RHSCan.getUnqualifiedType()))
68153d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman        return RHS;
6816bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman    }
6817183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const EnumType* ETy = RHS->getAs<EnumType>()) {
6818b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian      QualType TINT = ETy->getDecl()->getIntegerType();
6819b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian      if (!TINT.isNull() && hasSameType(TINT, LHSCan.getUnqualifiedType()))
68203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman        return LHS;
6821bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman    }
6822e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian    // allow block pointer type to match an 'id' type.
6823419636316c04d570c183b4797fc811932c588358Fariborz Jahanian    if (OfBlockPointer && !BlockReturnType) {
6824419636316c04d570c183b4797fc811932c588358Fariborz Jahanian       if (LHS->isObjCIdType() && RHS->isBlockPointerType())
6825419636316c04d570c183b4797fc811932c588358Fariborz Jahanian         return LHS;
6826419636316c04d570c183b4797fc811932c588358Fariborz Jahanian      if (RHS->isObjCIdType() && LHS->isBlockPointerType())
6827419636316c04d570c183b4797fc811932c588358Fariborz Jahanian        return RHS;
6828419636316c04d570c183b4797fc811932c588358Fariborz Jahanian    }
6829e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian
68303d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
6831ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff  }
68323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68334a74678ed6c3dedac05d02b1ee341f1db869f049Steve Naroff  // The canonical type classes match.
68341adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  switch (LHSClass) {
683572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base)
683672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base)
6837ad5e73887052193afda72db8efcb812bd083a4a8John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
683872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
683972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class:
684072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def"
6841b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Non-canonical and dependent types shouldn't get here");
684272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
68437c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  case Type::LValueReference:
68447c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  case Type::RValueReference:
684572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::MemberPointer:
6846b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("C++ should never be in mergeTypes");
684772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
6848c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCInterface:
684972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::IncompleteArray:
685072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::VariableArray:
685172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::FunctionProto:
685272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::ExtVector:
6853b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Types are eliminated above");
685472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
68551adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::Pointer:
68563d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  {
68573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Merge two pointer types, while trying to preserve typedef info
68586217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType();
68596217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType();
6860447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
6861447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSPointee = LHSPointee.getUnqualifiedType();
6862447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSPointee = RHSPointee.getUnqualifiedType();
6863447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
6864447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false,
6865447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                     Unqualified);
68663d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (ResultType.isNull()) return QualType();
686707d258756dc856c6987c394a0972884e6ed46765Eli Friedman    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
686861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
686907d258756dc856c6987c394a0972884e6ed46765Eli Friedman    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
687061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
68713d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return getPointerType(ResultType);
68723d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
6873c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  case Type::BlockPointer:
6874c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  {
6875c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    // Merge two block pointer types, while trying to preserve typedef info
68766217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType();
68776217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType();
6878447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
6879447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSPointee = LHSPointee.getUnqualifiedType();
6880447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSPointee = RHSPointee.getUnqualifiedType();
6881447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
6882447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer,
6883447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                     Unqualified);
6884c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (ResultType.isNull()) return QualType();
6885c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
6886c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff      return LHS;
6887c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
6888c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff      return RHS;
6889c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    return getBlockPointerType(ResultType);
6890c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  }
6891b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic:
6892b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  {
6893b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    // Merge two pointer types, while trying to preserve typedef info
6894b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType LHSValue = LHS->getAs<AtomicType>()->getValueType();
6895b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType RHSValue = RHS->getAs<AtomicType>()->getValueType();
6896b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (Unqualified) {
6897b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      LHSValue = LHSValue.getUnqualifiedType();
6898b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      RHSValue = RHSValue.getUnqualifiedType();
6899b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    }
6900b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType ResultType = mergeTypes(LHSValue, RHSValue, false,
6901b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman                                     Unqualified);
6902b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (ResultType.isNull()) return QualType();
6903b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (getCanonicalType(LHSValue) == getCanonicalType(ResultType))
6904b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      return LHS;
6905b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (getCanonicalType(RHSValue) == getCanonicalType(ResultType))
6906b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      return RHS;
6907b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    return getAtomicType(ResultType);
6908b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
69091adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::ConstantArray:
69103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  {
69113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const ConstantArrayType* LCAT = getAsConstantArrayType(LHS);
69123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const ConstantArrayType* RCAT = getAsConstantArrayType(RHS);
69133d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize())
69143d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
69153d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
69163d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    QualType LHSElem = getAsArrayType(LHS)->getElementType();
69173d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    QualType RHSElem = getAsArrayType(RHS)->getElementType();
6918447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
6919447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSElem = LHSElem.getUnqualifiedType();
6920447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSElem = RHSElem.getUnqualifiedType();
6921447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
6922447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6923447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified);
69243d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (ResultType.isNull()) return QualType();
692561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
692661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
692761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
692861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
69293bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(),
69303bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman                                          ArrayType::ArraySizeModifier(), 0);
69313bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(),
69323bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman                                          ArrayType::ArraySizeModifier(), 0);
69333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const VariableArrayType* LVAT = getAsVariableArrayType(LHS);
69343d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const VariableArrayType* RVAT = getAsVariableArrayType(RHS);
693561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
693661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
693761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
693861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
69393d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (LVAT) {
69403d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // FIXME: This isn't correct! But tricky to implement because
69413d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // the array's size has to be the size of LHS, but the type
69423d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // has to be different.
69433d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return LHS;
69443d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
69453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (RVAT) {
69463d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // FIXME: This isn't correct! But tricky to implement because
69473d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // the array's size has to be the size of RHS, but the type
69483d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // has to be different.
69493d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return RHS;
69503d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
69513bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
69523bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
69537e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    return getIncompleteArrayType(ResultType,
69547e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                  ArrayType::ArraySizeModifier(), 0);
69553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
69561adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::FunctionNoProto:
6957447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified);
695872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Record:
695972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Enum:
69603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
69611adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::Builtin:
69623cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner    // Only exactly equal builtin types are compatible, which is tested above.
69633d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
696464cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar  case Type::Complex:
696564cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar    // Distinct complex types are incompatible.
696664cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar    return QualType();
69673cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner  case Type::Vector:
69685a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // FIXME: The merged type should be an ExtVector!
69691c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall    if (areCompatVectorTypes(LHSCan->getAs<VectorType>(),
69701c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall                             RHSCan->getAs<VectorType>()))
69713d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return LHS;
697261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    return QualType();
6973c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCObject: {
6974c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    // Check if the types are assignment compatible.
69755a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // FIXME: This should be type compatibility, e.g. whether
69765a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // "LHS x; RHS x;" at global scope is legal.
6977c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    const ObjCObjectType* LHSIface = LHS->getAs<ObjCObjectType>();
6978c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    const ObjCObjectType* RHSIface = RHS->getAs<ObjCObjectType>();
6979c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (canAssignObjCInterfaces(LHSIface, RHSIface))
69805fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff      return LHS;
69815fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff
69823d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
698361490e9a965cfee8a78c12c6802138844f04250dCedric Venet  }
698414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  case Type::ObjCObjectPointer: {
6985132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    if (OfBlockPointer) {
6986132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (canAssignObjCInterfacesInBlockPointer(
6987132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                          LHS->getAs<ObjCObjectPointerType>(),
6988a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                          RHS->getAs<ObjCObjectPointerType>(),
6989a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                          BlockReturnType))
69907530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie        return LHS;
6991132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      return QualType();
6992132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    }
6993183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(),
6994183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall                                RHS->getAs<ObjCObjectPointerType>()))
699514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return LHS;
699614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
6997bc76dd06eb881c70c9775b74bab8b88cd747f173Steve Naroff    return QualType();
69987530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  }
6999ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff  }
700072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
70017530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid Type::Class!");
7002ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff}
70037192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek
700478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanianbool ASTContext::FunctionTypesMatchOnNSConsumedAttrs(
700578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian                   const FunctionProtoType *FromFunctionType,
700678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian                   const FunctionProtoType *ToFunctionType) {
700778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  if (FromFunctionType->hasAnyConsumedArgs() !=
700878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      ToFunctionType->hasAnyConsumedArgs())
700978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    return false;
701078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  FunctionProtoType::ExtProtoInfo FromEPI =
701178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    FromFunctionType->getExtProtoInfo();
701278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  FunctionProtoType::ExtProtoInfo ToEPI =
701378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    ToFunctionType->getExtProtoInfo();
701478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  if (FromEPI.ConsumedArguments && ToEPI.ConsumedArguments)
701578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs();
701678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian         ArgIdx != NumArgs; ++ArgIdx)  {
701778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      if (FromEPI.ConsumedArguments[ArgIdx] !=
701878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian          ToEPI.ConsumedArguments[ArgIdx])
701978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian        return false;
702078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    }
702178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  return true;
702278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian}
702378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
70242390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and
70252390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// 'RHS' attributes and returns the merged version; including for function
70262390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// return types.
70272390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz JahanianQualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) {
70282390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  QualType LHSCan = getCanonicalType(LHS),
70292390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  RHSCan = getCanonicalType(RHS);
70302390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  // If two types are identical, they are compatible.
70312390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LHSCan == RHSCan)
70322390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return LHS;
70332390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (RHSCan->isFunctionType()) {
70342390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (!LHSCan->isFunctionType())
70352390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
70362390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType OldReturnType =
70372390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      cast<FunctionType>(RHSCan.getTypePtr())->getResultType();
70382390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType NewReturnType =
70392390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      cast<FunctionType>(LHSCan.getTypePtr())->getResultType();
70402390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType ResReturnType =
70412390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      mergeObjCGCQualifiers(NewReturnType, OldReturnType);
70422390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResReturnType.isNull())
70432390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
70442390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
70452390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo();
70462390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      // In either case, use OldReturnType to build the new function type.
70472390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      const FunctionType *F = LHS->getAs<FunctionType>();
70482390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      if (const FunctionProtoType *FPT = cast<FunctionProtoType>(F)) {
7049e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall        FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
7050e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall        EPI.ExtInfo = getFunctionExtInfo(LHS);
70512390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        QualType ResultType
70522390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian          = getFunctionType(OldReturnType, FPT->arg_type_begin(),
7053e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                            FPT->getNumArgs(), EPI);
70542390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        return ResultType;
70552390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      }
70562390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    }
70572390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return QualType();
70582390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
70592390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70602390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  // If the qualifiers are different, the types can still be merged.
70612390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  Qualifiers LQuals = LHSCan.getLocalQualifiers();
70622390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  Qualifiers RQuals = RHSCan.getLocalQualifiers();
70632390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LQuals != RQuals) {
70642390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // If any of these qualifiers are different, we have a type mismatch.
70652390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
70662390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        LQuals.getAddressSpace() != RQuals.getAddressSpace())
70672390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
70682390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70692390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // Exactly one GC qualifier difference is allowed: __strong is
70702390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // okay if the other type has no GC qualifier but is an Objective
70712390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // C object pointer (i.e. implicitly strong by default).  We fix
70722390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // this by pretending that the unqualified type was actually
70732390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // qualified __strong.
70742390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
70752390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
70762390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
70772390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70782390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
70792390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
70802390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70812390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_L == Qualifiers::Strong)
70822390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return LHS;
70832390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_R == Qualifiers::Strong)
70842390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return RHS;
70852390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return QualType();
70862390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
70872390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
70882390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) {
70892390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType LHSBaseQT = LHS->getAs<ObjCObjectPointerType>()->getPointeeType();
70902390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType RHSBaseQT = RHS->getAs<ObjCObjectPointerType>()->getPointeeType();
70912390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT);
70922390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResQT == LHSBaseQT)
70932390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return LHS;
70942390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResQT == RHSBaseQT)
70952390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return RHS;
70962390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
70972390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  return QualType();
70982390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian}
70992390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
71005426bf6456a5aeac416a9150de157904d101c819Chris Lattner//===----------------------------------------------------------------------===//
7101ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//                         Integer Predicates
7102ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//===----------------------------------------------------------------------===//
710388054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner
71044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getIntWidth(QualType T) const {
7105f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  if (const EnumType *ET = dyn_cast<EnumType>(T))
710629a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman    T = ET->getDecl()->getIntegerType();
71071274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  if (T->isBooleanType())
71081274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor    return 1;
7109f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  // For builtin types, just use the standard type sizing method
7110ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  return (unsigned)getTypeSize(T);
7111ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman}
7112ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman
7113762f159c3295552f1f3e5e1af8b66385bfaed786Abramo BagnaraQualType ASTContext::getCorrespondingUnsignedType(QualType T) const {
7114f60946222721d9ba3c059563935c17b84703187aDouglas Gregor  assert(T->hasSignedIntegerRepresentation() && "Unexpected type");
71156a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
71166a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  // Turn <4 x signed int> -> <4 x unsigned int>
71176a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  if (const VectorType *VTy = T->getAs<VectorType>())
71186a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner    return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()),
7119e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                         VTy->getNumElements(), VTy->getVectorKind());
71206a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
71216a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  // For enums, we return the unsigned version of the base type.
71226a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  if (const EnumType *ETy = T->getAs<EnumType>())
7123ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    T = ETy->getDecl()->getIntegerType();
71246a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
71256a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  const BuiltinType *BTy = T->getAs<BuiltinType>();
71266a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  assert(BTy && "Unexpected signed integer type");
7127ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  switch (BTy->getKind()) {
7128ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Char_S:
7129ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::SChar:
7130ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedCharTy;
7131ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Short:
7132ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedShortTy;
7133ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Int:
7134ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedIntTy;
7135ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Long:
7136ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedLongTy;
7137ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::LongLong:
7138ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedLongLongTy;
71392df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::Int128:
71402df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner    return UnsignedInt128Ty;
7141ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  default:
7142b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Unexpected signed integer type");
7143ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  }
7144ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman}
7145ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman
71467b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios KyrtzidisASTMutationListener::~ASTMutationListener() { }
71477b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
714886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
714986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===//
715086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//                          Builtin Type Computation
715186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===//
715286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
715386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the
715433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// pointer over the consumed characters.  This returns the resultant type.  If
715533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// AllowTypeModifiers is false then modifier like * are not parsed, just basic
715633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// types.  This allows "v2i*" to be parsed as a pointer to a v2i instead of
715733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// a vector of "i*".
715814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner///
715914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// RequiresICE is filled in on return to indicate whether the value is required
716014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// to be an Integer Constant Expression.
71614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,
716286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner                                  ASTContext::GetBuiltinTypeError &Error,
716314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                  bool &RequiresICE,
716433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner                                  bool AllowTypeModifiers) {
716586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  // Modifiers.
716686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  int HowLong = 0;
716786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  bool Signed = false, Unsigned = false;
716814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  RequiresICE = false;
7169393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner
717033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  // Read the prefixed modifiers first.
717186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  bool Done = false;
717286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (!Done) {
717386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    switch (*Str++) {
71741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    default: Done = true; --Str; break;
7175393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner    case 'I':
717614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner      RequiresICE = true;
7177393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner      break;
717886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'S':
717986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!");
718086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Signed && "Can't use 'S' modifier multiple times!");
718186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Signed = true;
718286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
718386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'U':
718486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Signed && "Can't use both 'S' and 'U' modifiers!");
718586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Unsigned && "Can't use 'S' modifier multiple times!");
718686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Unsigned = true;
718786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
718886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'L':
718986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(HowLong <= 2 && "Can't have LLLL modifier");
719086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      ++HowLong;
719186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
719286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
719386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
719486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
719586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  QualType Type;
71961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
719786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  // Read the base type.
719886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  switch (*Str++) {
7199b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Unknown builtin type letter!");
720086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'v':
720186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned &&
720286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'v'!");
720386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.VoidTy;
720486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
720586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'f':
720686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned &&
720786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'f'!");
720886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.FloatTy;
720986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
721086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'd':
721186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong < 2 && !Signed && !Unsigned &&
721286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'd'!");
721386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (HowLong)
721486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.LongDoubleTy;
721586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
721686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.DoubleTy;
721786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
721886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 's':
721986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && "Bad modifiers used with 's'!");
722086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Unsigned)
722186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.UnsignedShortTy;
722286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
722386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.ShortTy;
722486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
722586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'i':
722686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (HowLong == 3)
722786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
722886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (HowLong == 2)
722986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
723086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (HowLong == 1)
723186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy;
723286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
723386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy;
723486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
723586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'c':
723686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && "Bad modifiers used with 'c'!");
723786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Signed)
723886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.SignedCharTy;
723986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (Unsigned)
724086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.UnsignedCharTy;
724186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
724286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.CharTy;
724386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
724486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'b': // boolean
724586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!");
724686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.BoolTy;
724786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
724886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'z':  // size_t.
724986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!");
725086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getSizeType();
725186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
725286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'F':
725386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getCFConstantStringType();
725486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
7255ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian  case 'G':
7256ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    Type = Context.getObjCIdType();
7257ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    break;
7258ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian  case 'H':
7259ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    Type = Context.getObjCSelType();
7260ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    break;
7261f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  case 'M':
7262f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    Type = Context.getObjCSuperType();
7263f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    break;
726486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'a':
726586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getBuiltinVaListType();
726686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(!Type.isNull() && "builtin va list type not initialized!");
726786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
726886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'A':
726986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // This is a "reference" to a va_list; however, what exactly
727086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // this means depends on how va_list is defined. There are two
727186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // different kinds of va_list: ones passed by value, and ones
727286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // passed by reference.  An example of a by-value va_list is
727386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // x86, where va_list is a char*. An example of by-ref va_list
727486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // is x86-64, where va_list is a __va_list_tag[1]. For x86,
727586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // we want this argument to be a char*&; for x86-64, we want
727686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // it to be a __va_list_tag*.
727786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getBuiltinVaListType();
727886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(!Type.isNull() && "builtin va list type not initialized!");
727914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    if (Type->isArrayType())
728086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.getArrayDecayedType(Type);
728114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    else
728286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.getLValueReferenceType(Type);
728386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
728486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'V': {
728586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    char *End;
728686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    unsigned NumElements = strtoul(Str, &End, 10);
728786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(End != Str && "Missing vector size");
728886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Str = End;
72891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
729014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType ElementType = DecodeTypeFromStr(Str, Context, Error,
729114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                             RequiresICE, false);
729214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    assert(!RequiresICE && "Can't require vector ICE");
729333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner
729433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    // TODO: No way to make AltiVec vectors in builtins yet.
7295788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    Type = Context.getVectorType(ElementType, NumElements,
7296e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                 VectorType::GenericVector);
729786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
729886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
7299b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor  case 'E': {
7300b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    char *End;
7301b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7302b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    unsigned NumElements = strtoul(Str, &End, 10);
7303b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    assert(End != Str && "Missing vector size");
7304b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7305b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    Str = End;
7306b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7307b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
7308b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor                                             false);
7309b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    Type = Context.getExtVectorType(ElementType, NumElements);
7310b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    break;
7311b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor  }
7312d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor  case 'X': {
731314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
731414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                             false);
731514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    assert(!RequiresICE && "Can't require complex ICE");
7316d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor    Type = Context.getComplexType(ElementType);
7317d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor    break;
7318cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  }
7319cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  case 'Y' : {
7320cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian    Type = Context.getPointerDiffType();
7321cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian    break;
7322cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  }
73239a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner  case 'P':
7324c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor    Type = Context.getFILEType();
7325c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor    if (Type.isNull()) {
7326f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Error = ASTContext::GE_Missing_stdio;
732786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      return QualType();
732886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
7329fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    break;
73309a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner  case 'J':
7331f711c41dd9412a8182793259d355c4f6979ed5edMike Stump    if (Signed)
7332782fa308a765aeac2acb39c4e697c937ec21185bMike Stump      Type = Context.getsigjmp_bufType();
7333f711c41dd9412a8182793259d355c4f6979ed5edMike Stump    else
7334f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Type = Context.getjmp_bufType();
7335f711c41dd9412a8182793259d355c4f6979ed5edMike Stump
7336fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    if (Type.isNull()) {
7337f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Error = ASTContext::GE_Missing_setjmp;
7338fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump      return QualType();
7339fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    }
7340fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    break;
7341e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola  case 'K':
7342e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!");
7343e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    Type = Context.getucontext_tType();
7344e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola
7345e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    if (Type.isNull()) {
7346e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      Error = ASTContext::GE_Missing_ucontext;
7347e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      return QualType();
7348e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    }
7349e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    break;
73506902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman  case 'p':
73516902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman    Type = Context.getProcessIDType();
73526902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman    break;
7353782fa308a765aeac2acb39c4e697c937ec21185bMike Stump  }
73541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
735533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  // If there are modifiers and if we're allowed to parse them, go for it.
735633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  Done = !AllowTypeModifiers;
735786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (!Done) {
7358187ab37a05b8f7015b9f39cc8cd9129a0c6d0b48John McCall    switch (char c = *Str++) {
735933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    default: Done = true; --Str; break;
736033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case '*':
736133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case '&': {
736233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      // Both pointers and references can have their pointee types
736333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      // qualified with an address space.
736433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      char *End;
736533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      unsigned AddrSpace = strtoul(Str, &End, 10);
736633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      if (End != Str && AddrSpace != 0) {
736733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getAddrSpaceQualType(Type, AddrSpace);
736833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Str = End;
736933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      }
737033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      if (c == '*')
737133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getPointerType(Type);
737233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      else
737333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getLValueReferenceType(Type);
737433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
737533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    }
737633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    // FIXME: There's no way to have a built-in with an rvalue ref arg.
737733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case 'C':
737833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      Type = Type.withConst();
737933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
738033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case 'D':
738133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      Type = Context.getVolatileType(Type);
738233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
738318932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek    case 'R':
738418932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek      Type = Type.withRestrict();
738518932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek      break;
738686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
738786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
7388393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner
738914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  assert((!RequiresICE || Type->isIntegralOrEnumerationType()) &&
7390393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner         "Integer constant 'I' type must be an integer");
73911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
739286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  return Type;
739386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner}
739486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
739586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// GetBuiltinType - Return the type for the specified builtin.
739633daae66462e8f51ee153463b32bdefd60c801aaChris LattnerQualType ASTContext::GetBuiltinType(unsigned Id,
739714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                    GetBuiltinTypeError &Error,
73984ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                    unsigned *IntegerConstantArgs) const {
739933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  const char *TypeStr = BuiltinInfo.GetTypeString(Id);
74001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<QualType, 8> ArgTypes;
74021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
740314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  bool RequiresICE = false;
740486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  Error = GE_None;
740514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error,
740614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                       RequiresICE, true);
740786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  if (Error != GE_None)
740886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    return QualType();
740914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
741014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE");
741114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
741286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (TypeStr[0] && TypeStr[0] != '.') {
741314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true);
741486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Error != GE_None)
741586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      return QualType();
741686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
741714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    // If this argument is required to be an IntegerConstantExpression and the
741814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    // caller cares, fill in the bitmask we return.
741914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    if (RequiresICE && IntegerConstantArgs)
742014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner      *IntegerConstantArgs |= 1 << ArgTypes.size();
742114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
742286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // Do array -> pointer decay.  The builtin should use the decayed type.
742386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Ty->isArrayType())
742486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Ty = getArrayDecayedType(Ty);
74251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
742686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    ArgTypes.push_back(Ty);
742786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
742886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
742986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  assert((TypeStr[0] != '.' || TypeStr[1] == 0) &&
743086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner         "'.' should only occur at end of builtin type list!");
743186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
743200ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  FunctionType::ExtInfo EI;
743300ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true);
743400ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall
743500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  bool Variadic = (TypeStr[0] == '.');
743600ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall
743700ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  // We really shouldn't be making a no-proto type here, especially in C++.
743800ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  if (ArgTypes.empty() && Variadic)
743900ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall    return getFunctionNoProtoType(ResType, EI);
7440ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor
7441e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  FunctionProtoType::ExtProtoInfo EPI;
744200ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  EPI.ExtInfo = EI;
744300ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  EPI.Variadic = Variadic;
7444e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
7445e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  return getFunctionType(ResType, ArgTypes.data(), ArgTypes.size(), EPI);
744686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner}
7447a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman
744890e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) {
744990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  GVALinkage External = GVA_StrongExternal;
745090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
745190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  Linkage L = FD->getLinkage();
745290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  switch (L) {
745390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case NoLinkage:
745490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case InternalLinkage:
745590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case UniqueExternalLinkage:
745690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_Internal;
745790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
745890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case ExternalLinkage:
745990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    switch (FD->getTemplateSpecializationKind()) {
746090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_Undeclared:
746190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitSpecialization:
746290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      External = GVA_StrongExternal;
746390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      break;
746490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
746590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDefinition:
746690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_ExplicitTemplateInstantiation;
746790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
746890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDeclaration:
746990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ImplicitInstantiation:
747090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      External = GVA_TemplateInstantiation;
747190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      break;
747290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
747390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
747490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
747590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (!FD->isInlined())
747690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return External;
747790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
74784e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getLangOpts().CPlusPlus || FD->hasAttr<GNUInlineAttr>()) {
747990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // GNU or C99 inline semantics. Determine whether this symbol should be
748090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // externally visible.
748190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (FD->isInlineDefinitionExternallyVisible())
748290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return External;
748390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
748490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // C99 inline semantics, where the symbol is not externally visible.
748590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_C99Inline;
748690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
748790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
748890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // C++0x [temp.explicit]p9:
748990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   [ Note: The intent is that an inline function that is the subject of
749090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   an explicit instantiation declaration will still be implicitly
749190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   instantiated when used so that the body can be considered for
749290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   inlining, but that no out-of-line copy of the inline function would be
749390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   generated in the translation unit. -- end note ]
749490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (FD->getTemplateSpecializationKind()
749590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis                                       == TSK_ExplicitInstantiationDeclaration)
749690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_C99Inline;
749790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
749890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  return GVA_CXXInline;
749990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
750090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
750190e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) {
750290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // If this is a static data member, compute the kind of template
750390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // specialization. Otherwise, this variable is not part of a
750490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // template.
750590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  TemplateSpecializationKind TSK = TSK_Undeclared;
750690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (VD->isStaticDataMember())
750790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    TSK = VD->getTemplateSpecializationKind();
750890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
750990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  Linkage L = VD->getLinkage();
751062a833eaebb1867d9950767288debdfa34dd8561Rafael Espindola  assert (!(L == ExternalLinkage && getLangOpts().CPlusPlus &&
751162a833eaebb1867d9950767288debdfa34dd8561Rafael Espindola            VD->getType()->getLinkage() == UniqueExternalLinkage));
751290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
751390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  switch (L) {
751490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case NoLinkage:
751590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case InternalLinkage:
751690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case UniqueExternalLinkage:
751790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_Internal;
751890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
751990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case ExternalLinkage:
752090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    switch (TSK) {
752190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_Undeclared:
752290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitSpecialization:
752390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_StrongExternal;
752490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
752590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDeclaration:
752690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      llvm_unreachable("Variable should not be instantiated");
752790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      // Fall through to treat this like any other instantiation.
752890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
752990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDefinition:
753090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_ExplicitTemplateInstantiation;
753190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
753290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ImplicitInstantiation:
753390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_TemplateInstantiation;
753490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
753590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
753690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
75377530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid Linkage!");
753890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
753990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
75404ac7c0bb39696e92fd220118fedc484c09a69870Argyrios Kyrtzidisbool ASTContext::DeclMustBeEmitted(const Decl *D) {
754190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
754290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (!VD->isFileVarDecl())
754390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return false;
7544144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis  } else if (!isa<FunctionDecl>(D))
754590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return false;
754690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
7547ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  // Weak references don't produce any output by themselves.
7548ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  if (D->hasAttr<WeakRefAttr>())
7549ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis    return false;
7550ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis
755190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // Aliases and used decls are required.
755290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>())
755390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return true;
755490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
755590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
755690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Forward declarations aren't required.
755710620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt    if (!FD->doesThisDeclarationHaveABody())
7558dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky      return FD->doesDeclarationForceExternallyVisibleDefinition();
755990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
756090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Constructors and destructors are required.
756190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>())
756290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return true;
756390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
7564d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    // The key function for a class is required.  This rule only comes
7565d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    // into play when inline functions can be key functions, though.
7566d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    if (getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
7567d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall      if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
7568d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall        const CXXRecordDecl *RD = MD->getParent();
7569d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall        if (MD->isOutOfLine() && RD->isDynamicClass()) {
7570d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall          const CXXMethodDecl *KeyFunc = getCurrentKeyFunction(RD);
7571d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall          if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl())
7572d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall            return true;
7573d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall        }
757490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      }
757590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
757690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
757790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    GVALinkage Linkage = GetGVALinkageForFunction(FD);
757890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
757990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // static, static inline, always_inline, and extern inline functions can
758090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // always be deferred.  Normal inline functions can be deferred in C99/C++.
758190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Implicit template instantiations can also be deferred in C++.
758290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (Linkage == GVA_Internal  || Linkage == GVA_C99Inline ||
75833a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev        Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation)
758490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return false;
758590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return true;
758690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
758794da1587f7d584fc61df793229d197969f204cd9Douglas Gregor
758890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  const VarDecl *VD = cast<VarDecl>(D);
758990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  assert(VD->isFileVarDecl() && "Expected file scoped var");
759090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
7591ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly)
7592ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis    return false;
7593ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis
75945f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that can be needed in other TUs are required.
759590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  GVALinkage L = GetGVALinkageForVariable(VD);
75965f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (L != GVA_Internal && L != GVA_TemplateInstantiation)
75975f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
759890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
75995f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that have destruction with side-effects are required.
76005f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (VD->getType().isDestructedType())
76015f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
76025f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith
76035f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that have initialization with side-effects are required.
76045f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (VD->getInit() && VD->getInit()->HasSideEffects(*this))
76055f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
76065f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith
76075f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  return false;
760890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
7609071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
76108f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur IskhodzhanovCallingConv ASTContext::getDefaultCXXMethodCallConv(bool isVariadic) {
7611ee743f903858e337434ac0335f147f4de4ecae05Charles Davis  // Pass through to the C++ ABI object
76128f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  return ABI->getDefaultMethodCallConv(isVariadic);
76138f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov}
76148f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov
76158f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur IskhodzhanovCallingConv ASTContext::getCanonicalCallConv(CallingConv CC) const {
7616b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  if (CC == CC_C && !LangOpts.MRTD &&
7617b8b2c9da87e7d70a1679db026f40548b3192b705John McCall      getTargetInfo().getCXXABI().isMemberFunctionCCDefault())
76188f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    return CC_Default;
76198f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  return CC;
7620ee743f903858e337434ac0335f147f4de4ecae05Charles Davis}
7621ee743f903858e337434ac0335f147f4de4ecae05Charles Davis
76224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const {
7623dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  // Pass through to the C++ ABI object
7624dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  return ABI->isNearlyEmpty(RD);
7625dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson}
7626dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson
762714110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *ASTContext::createMangleContext() {
7628b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  switch (Target->getCXXABI().getKind()) {
7629b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::GenericItanium:
7630b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::GenericARM:
7631b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::iOS:
763214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return createItaniumMangleContext(*this, getDiagnostics());
7633b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::Microsoft:
763414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return createMicrosoftMangleContext(*this, getDiagnostics());
763514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
7636b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unsupported ABI");
763714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
763814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
7639071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI::~CXXABI() {}
7640ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek
7641ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremeneksize_t ASTContext::getSideTableAllocatedMemory() const {
76420c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek  return ASTRecordLayouts.getMemorySize()
76430c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(ObjCLayouts)
76440c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(KeyFunctions)
76450c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(ObjCImpls)
76460c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(BlockVarCopyInits)
76470c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(DeclAttrs)
76480c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromStaticDataMember)
76490c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUsingDecl)
76500c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl)
76510c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl)
76520c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(OverriddenMethods)
76530c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(Types)
7654af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet    + llvm::capacity_in_bytes(VariableArrayTypes)
76550d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet    + llvm::capacity_in_bytes(ClassScopeSpecializationPattern);
7656ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek}
7657d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek
765866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikievoid ASTContext::addUnnamedTag(const TagDecl *Tag) {
765966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  // FIXME: This mangling should be applied to function local classes too
766066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl() ||
766166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie      !isa<CXXRecordDecl>(Tag->getParent()) || Tag->getLinkage() != ExternalLinkage)
766266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    return;
766366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
766466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  std::pair<llvm::DenseMap<const DeclContext *, unsigned>::iterator, bool> P =
766566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    UnnamedMangleContexts.insert(std::make_pair(Tag->getParent(), 0));
766666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  UnnamedMangleNumbers.insert(std::make_pair(Tag, P.first->second++));
766766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
766866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
766966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikieint ASTContext::getUnnamedTagManglingNumber(const TagDecl *Tag) const {
767066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  llvm::DenseMap<const TagDecl *, unsigned>::const_iterator I =
767166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    UnnamedMangleNumbers.find(Tag);
767266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  return I != UnnamedMangleNumbers.end() ? I->second : -1;
767366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
767466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
76759e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorunsigned ASTContext::getLambdaManglingNumber(CXXMethodDecl *CallOperator) {
76769e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  CXXRecordDecl *Lambda = CallOperator->getParent();
76779e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  return LambdaMangleContexts[Lambda->getDeclContext()]
76789e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor           .getManglingNumber(CallOperator);
76799e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor}
76809e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
76819e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
7682d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekvoid ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) {
7683d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  ParamIndices[D] = index;
7684d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek}
7685d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek
7686d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekunsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const {
7687d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  ParameterIndexTable::const_iterator I = ParamIndices.find(D);
7688d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  assert(I != ParamIndices.end() &&
7689d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek         "ParmIndices lacks entry set by ParmVarDecl");
7690d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  return I->second;
7691d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek}
7692