ASTContext.cpp revision 622bb4acc00fd63bac545ca23f7c42fd909dc0e7
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
88d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko  if (const ClassTemplateSpecializationDecl *CTSD =
89d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko          dyn_cast<ClassTemplateSpecializationDecl>(D)) {
90d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    TemplateSpecializationKind TSK = CTSD->getSpecializationKind();
91d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    if (TSK == TSK_ImplicitInstantiation ||
92d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko        TSK == TSK_Undeclared)
93d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko      return NULL;
94d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko  }
95d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko
96dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko  if (const EnumDecl *ED = dyn_cast<EnumDecl>(D)) {
97dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    if (ED->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
98dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko      return NULL;
99dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko  }
100099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian  if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
101099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian    // When tag declaration (but not definition!) is part of the
102099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian    // decl-specifier-seq of some other declaration, it doesn't get comment
103099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian    if (TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())
104099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian      return NULL;
105099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian  }
106aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // TODO: handle comments for function parameters properly.
107aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (isa<ParmVarDecl>(D))
108aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
109aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
11096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  // TODO: we could look up template parameter documentation in the template
11196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  // documentation.
11296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  if (isa<TemplateTypeParmDecl>(D) ||
11396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      isa<NonTypeTemplateParmDecl>(D) ||
11496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      isa<TemplateTemplateParmDecl>(D))
11596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    return NULL;
11696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
117811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko  ArrayRef<RawComment *> RawComments = Comments.getComments();
118aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
119aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // If there are no comments anywhere, we won't find anything.
120aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (RawComments.empty())
121aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
122aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
123abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // Find declaration location.
124abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // For Objective-C declarations we generally don't expect to have multiple
125abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // declarators, thus use declaration starting location as the "declaration
126abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // location".
127abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // For all other declarations multiple declarators are used quite frequently,
128abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  // so we use the location of the identifier as the "declaration location".
129abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  SourceLocation DeclLoc;
130abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  if (isa<ObjCMethodDecl>(D) || isa<ObjCContainerDecl>(D) ||
13196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko      isa<ObjCPropertyDecl>(D) ||
132c27bc80a98b9558513b50956c930eedc9e461ae0Dmitri Gribenko      isa<RedeclarableTemplateDecl>(D) ||
133c27bc80a98b9558513b50956c930eedc9e461ae0Dmitri Gribenko      isa<ClassTemplateSpecializationDecl>(D))
134abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    DeclLoc = D->getLocStart();
135abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  else
136abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    DeclLoc = D->getLocation();
137abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
138aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // If the declaration doesn't map directly to a location in a file, we
139aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // can't find the comment.
140aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
141aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
142aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
143aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Find the comment that occurs just after this declaration.
144a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko  ArrayRef<RawComment *>::iterator Comment;
145a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko  {
146a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    // When searching for comments during parsing, the comment we are looking
147a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    // for is usually among the last two comments we parsed -- check them
148a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    // first.
1496fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko    RawComment CommentAtDeclLoc(
1506fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko        SourceMgr, SourceRange(DeclLoc), false,
1516fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko        LangOpts.CommentOpts.ParseAllComments);
152a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    BeforeThanCompare<RawComment> Compare(SourceMgr);
153a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    ArrayRef<RawComment *>::iterator MaybeBeforeDecl = RawComments.end() - 1;
154a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    bool Found = Compare(*MaybeBeforeDecl, &CommentAtDeclLoc);
155a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    if (!Found && RawComments.size() >= 2) {
156a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      MaybeBeforeDecl--;
157a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      Found = Compare(*MaybeBeforeDecl, &CommentAtDeclLoc);
158a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    }
159a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko
160a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    if (Found) {
161a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      Comment = MaybeBeforeDecl + 1;
162a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      assert(Comment == std::lower_bound(RawComments.begin(), RawComments.end(),
163a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                         &CommentAtDeclLoc, Compare));
164a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    } else {
165a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      // Slow path.
166a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko      Comment = std::lower_bound(RawComments.begin(), RawComments.end(),
167a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 &CommentAtDeclLoc, Compare);
168a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    }
169a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko  }
170aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
171aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Decompose the location for the declaration and find the beginning of the
172aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // file buffer.
173aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  std::pair<FileID, unsigned> DeclLocDecomp = SourceMgr.getDecomposedLoc(DeclLoc);
174aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
175aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // First check whether we have a trailing comment.
176aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (Comment != RawComments.end() &&
177811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko      (*Comment)->isDocumentation() && (*Comment)->isTrailingComment() &&
1789c00676f2393335dc60c61faf944d4f8f622fac6Dmitri Gribenko      (isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) || isa<VarDecl>(D))) {
179aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    std::pair<FileID, unsigned> CommentBeginDecomp
180811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko      = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getBegin());
181aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // Check that Doxygen trailing comment comes after the declaration, starts
182aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // on the same line and in the same file as the declaration.
183aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    if (DeclLocDecomp.first == CommentBeginDecomp.first &&
184aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second)
185aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko          == SourceMgr.getLineNumber(CommentBeginDecomp.first,
186aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                     CommentBeginDecomp.second)) {
187811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko      return *Comment;
188aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    }
189aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  }
190aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
191aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // The comment just after the declaration was not a trailing comment.
192aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Let's look at the previous comment.
193aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (Comment == RawComments.begin())
194aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
195aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  --Comment;
196aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
197aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Check that we actually have a non-member Doxygen comment.
198811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko  if (!(*Comment)->isDocumentation() || (*Comment)->isTrailingComment())
199aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
200aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
201aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Decompose the end of the comment.
202aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  std::pair<FileID, unsigned> CommentEndDecomp
203811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko    = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getEnd());
204aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
205aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // If the comment and the declaration aren't in the same file, then they
206aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // aren't related.
207aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (DeclLocDecomp.first != CommentEndDecomp.first)
208aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
209aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
210aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Get the corresponding buffer.
211aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  bool Invalid = false;
212aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first,
213aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                               &Invalid).data();
214aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  if (Invalid)
215aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
216aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
217aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  // Extract text between the comment and declaration.
218aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  StringRef Text(Buffer + CommentEndDecomp.second,
219aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                 DeclLocDecomp.second - CommentEndDecomp.second);
220aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
2218bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko  // There should be no other declarations or preprocessor directives between
2228bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko  // comment and declaration.
223abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko  if (Text.find_first_of(",;{}#@") != StringRef::npos)
224aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return NULL;
225aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
226811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko  return *Comment;
227aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
228aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
229c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenkonamespace {
230c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko/// If we have a 'templated' declaration for a template, adjust 'D' to
231c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko/// refer to the actual template.
2322125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko/// If we have an implicit instantiation, adjust 'D' to refer to template.
233c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenkoconst Decl *adjustDeclToTemplate(const Decl *D) {
234cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2352125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Is this function declaration part of a function template?
236cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor    if (const FunctionTemplateDecl *FTD = FD->getDescribedFunctionTemplate())
2372125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return FTD;
2382125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2392125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Nothing to do if function is not an implicit instantiation.
2402125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (FD->getTemplateSpecializationKind() != TSK_ImplicitInstantiation)
2412125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return D;
2422125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2432125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Function is an implicit instantiation of a function template?
2442125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const FunctionTemplateDecl *FTD = FD->getPrimaryTemplate())
2452125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return FTD;
2462125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2472125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Function is instantiated from a member definition of a class template?
2482125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const FunctionDecl *MemberDecl =
2492125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko            FD->getInstantiatedFromMemberFunction())
2502125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return MemberDecl;
2512125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2522125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    return D;
2532125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  }
2542125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2552125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Static data member is instantiated from a member definition of a class
2562125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // template?
2572125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (VD->isStaticDataMember())
2582125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      if (const VarDecl *MemberDecl = VD->getInstantiatedFromStaticDataMember())
2592125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko        return MemberDecl;
2602125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2612125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    return D;
2622125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  }
2632125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(D)) {
2642125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Is this class declaration part of a class template?
2652125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const ClassTemplateDecl *CTD = CRD->getDescribedClassTemplate())
2662125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return CTD;
2672125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2682125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Class is an implicit instantiation of a class template or partial
2692125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // specialization?
2702125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const ClassTemplateSpecializationDecl *CTSD =
2712125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko            dyn_cast<ClassTemplateSpecializationDecl>(CRD)) {
2722125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      if (CTSD->getSpecializationKind() != TSK_ImplicitInstantiation)
2732125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko        return D;
2742125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      llvm::PointerUnion<ClassTemplateDecl *,
2752125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                         ClassTemplatePartialSpecializationDecl *>
2762125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko          PU = CTSD->getSpecializedTemplateOrPartial();
2772125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return PU.is<ClassTemplateDecl*>() ?
2782125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko          static_cast<const Decl*>(PU.get<ClassTemplateDecl *>()) :
2792125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko          static_cast<const Decl*>(
2802125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko              PU.get<ClassTemplatePartialSpecializationDecl *>());
2812125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    }
2822125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2832125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Class is instantiated from a member definition of a class template?
2842125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const MemberSpecializationInfo *Info =
2852125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                   CRD->getMemberSpecializationInfo())
2862125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return Info->getInstantiatedFrom();
2872125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2882125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    return D;
2892125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  }
2902125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  if (const EnumDecl *ED = dyn_cast<EnumDecl>(D)) {
2912125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Enum is instantiated from a member definition of a class template?
2922125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    if (const EnumDecl *MemberDecl = ED->getInstantiatedFromMemberEnum())
2932125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko      return MemberDecl;
2942125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2952125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    return D;
296cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor  }
2972125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko  // FIXME: Adjust alias templates?
298c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  return D;
299c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko}
300c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko} // unnamed namespace
301c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
3021599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenkoconst RawComment *ASTContext::getRawCommentForAnyRedecl(
3031599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko                                                const Decl *D,
3041599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko                                                const Decl **OriginalDecl) const {
305c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  D = adjustDeclToTemplate(D);
306cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor
307f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  // Check whether we have cached a comment for this declaration already.
308f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  {
309f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    llvm::DenseMap<const Decl *, RawCommentAndCacheFlags>::iterator Pos =
310f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        RedeclComments.find(D);
311f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    if (Pos != RedeclComments.end()) {
312f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      const RawCommentAndCacheFlags &Raw = Pos->second;
3131599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko      if (Raw.getKind() != RawCommentAndCacheFlags::NoCommentInDecl) {
3141599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko        if (OriginalDecl)
3151599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko          *OriginalDecl = Raw.getOriginalDecl();
316f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        return Raw.getRaw();
3171599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko      }
318f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    }
319f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  }
320f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
321f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  // Search for comments attached to declarations in the redeclaration chain.
322f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  const RawComment *RC = NULL;
3231599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  const Decl *OriginalDeclForRC = NULL;
324f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  for (Decl::redecl_iterator I = D->redecls_begin(),
325f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko                             E = D->redecls_end();
326f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko       I != E; ++I) {
327f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    llvm::DenseMap<const Decl *, RawCommentAndCacheFlags>::iterator Pos =
328f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        RedeclComments.find(*I);
329f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    if (Pos != RedeclComments.end()) {
330f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      const RawCommentAndCacheFlags &Raw = Pos->second;
331f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      if (Raw.getKind() != RawCommentAndCacheFlags::NoCommentInDecl) {
332f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        RC = Raw.getRaw();
3331599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko        OriginalDeclForRC = Raw.getOriginalDecl();
334f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        break;
335f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      }
336f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    } else {
337f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      RC = getRawCommentForDeclNoCache(*I);
3381599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko      OriginalDeclForRC = *I;
339f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      RawCommentAndCacheFlags Raw;
340f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      if (RC) {
341f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        Raw.setRaw(RC);
342f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        Raw.setKind(RawCommentAndCacheFlags::FromDecl);
343f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      } else
344f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        Raw.setKind(RawCommentAndCacheFlags::NoCommentInDecl);
3451599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko      Raw.setOriginalDecl(*I);
346f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      RedeclComments[*I] = Raw;
347f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      if (RC)
348f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko        break;
349f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    }
3508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko  }
351aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
3528376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko  // If we found a comment, it should be a documentation comment.
3538376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko  assert(!RC || RC->isDocumentation());
354f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
3551599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  if (OriginalDecl)
3561599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko    *OriginalDecl = OriginalDeclForRC;
3571599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko
358f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  // Update cache for every declaration in the redeclaration chain.
359f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  RawCommentAndCacheFlags Raw;
360f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  Raw.setRaw(RC);
361f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  Raw.setKind(RawCommentAndCacheFlags::FromRedecl);
3621599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  Raw.setOriginalDecl(OriginalDeclForRC);
363f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
364f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  for (Decl::redecl_iterator I = D->redecls_begin(),
365f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko                             E = D->redecls_end();
366f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko       I != E; ++I) {
367f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    RawCommentAndCacheFlags &R = RedeclComments[*I];
368f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    if (R.getKind() == RawCommentAndCacheFlags::NoCommentInDecl)
369f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko      R = Raw;
370f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko  }
371f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
372aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  return RC;
373aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
374aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
375bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanianstatic void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod,
376bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian                   SmallVectorImpl<const NamedDecl *> &Redeclared) {
377bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  const DeclContext *DC = ObjCMethod->getDeclContext();
378bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  if (const ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(DC)) {
379bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    const ObjCInterfaceDecl *ID = IMD->getClassInterface();
380bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    if (!ID)
381bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      return;
382bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    // Add redeclared method here.
383d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    for (ObjCInterfaceDecl::known_extensions_iterator
384d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           Ext = ID->known_extensions_begin(),
385d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           ExtEnd = ID->known_extensions_end();
386d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         Ext != ExtEnd; ++Ext) {
387bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      if (ObjCMethodDecl *RedeclaredMethod =
388d329724745b49f894b768d47275b7c2713106e89Douglas Gregor            Ext->getMethod(ObjCMethod->getSelector(),
389bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian                                  ObjCMethod->isInstanceMethod()))
390bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian        Redeclared.push_back(RedeclaredMethod);
391bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    }
392bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  }
393bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian}
394bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
395749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahaniancomments::FullComment *ASTContext::cloneFullComment(comments::FullComment *FC,
396749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian                                                    const Decl *D) const {
397749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  comments::DeclInfo *ThisDeclInfo = new (*this) comments::DeclInfo;
398749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  ThisDeclInfo->CommentDecl = D;
399749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  ThisDeclInfo->IsFilled = false;
400749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  ThisDeclInfo->fill();
401749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  ThisDeclInfo->CommentDecl = FC->getDecl();
402749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  comments::FullComment *CFC =
403749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian    new (*this) comments::FullComment(FC->getBlocks(),
404749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian                                      ThisDeclInfo);
405749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian  return CFC;
406749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian
407749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian}
408749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian
4091952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenkocomments::FullComment *ASTContext::getCommentForDecl(
4101952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko                                              const Decl *D,
4111952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko                                              const Preprocessor *PP) const {
412c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  D = adjustDeclToTemplate(D);
413bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
414c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  const Decl *Canonical = D->getCanonicalDecl();
415c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
416c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko      ParsedComments.find(Canonical);
417bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
418bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  if (Pos != ParsedComments.end()) {
419749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian    if (Canonical != D) {
420bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      comments::FullComment *FC = Pos->second;
421749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian      comments::FullComment *CFC = cloneFullComment(FC, D);
422bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian      return CFC;
423bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    }
424c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    return Pos->second;
425bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  }
426bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
4271599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  const Decl *OriginalDecl;
428bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
4291599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  const RawComment *RC = getRawCommentForAnyRedecl(D, &OriginalDecl);
430bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  if (!RC) {
431bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    if (isa<ObjCMethodDecl>(D) || isa<FunctionDecl>(D)) {
4321e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko      SmallVector<const NamedDecl*, 8> Overridden;
433c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian      const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D);
43423799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian      if (OMD && OMD->isPropertyAccessor())
43523799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian        if (const ObjCPropertyDecl *PDecl = OMD->findPropertyDecl())
43623799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian          if (comments::FullComment *FC = getCommentForDecl(PDecl, PP))
43723799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian            return cloneFullComment(FC, D);
438c328d9c22a4397dd7313d06be5b82d700297b246Fariborz Jahanian      if (OMD)
4391e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko        addRedeclaredMethods(OMD, Overridden);
4401e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko      getOverriddenMethods(dyn_cast<NamedDecl>(D), Overridden);
44123799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian      for (unsigned i = 0, e = Overridden.size(); i < e; i++)
44223799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian        if (comments::FullComment *FC = getCommentForDecl(Overridden[i], PP))
44323799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian          return cloneFullComment(FC, D);
444bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian    }
44541170b55ba635afb806394d44f2b7f1f6095df37Fariborz Jahanian    else if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
446d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko      // Attach any tag type's documentation to its typedef if latter
44723799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian      // does not have one of its own.
44841170b55ba635afb806394d44f2b7f1f6095df37Fariborz Jahanian      QualType QT = TD->getUnderlyingType();
449d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko      if (const TagType *TT = QT->getAs<TagType>())
450d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko        if (const Decl *TD = TT->getDecl())
451d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko          if (comments::FullComment *FC = getCommentForDecl(TD, PP))
45223799e3ec4b341753e4fb63a7e995cf4ac3b6066Fariborz Jahanian            return cloneFullComment(FC, D);
45341170b55ba635afb806394d44f2b7f1f6095df37Fariborz Jahanian    }
454622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian    else if (const ObjCInterfaceDecl *IC = dyn_cast<ObjCInterfaceDecl>(D)) {
455622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      while (IC->getSuperClass()) {
456622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        IC = IC->getSuperClass();
457622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        if (comments::FullComment *FC = getCommentForDecl(IC, PP))
458622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          return cloneFullComment(FC, D);
459622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      }
460622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian    }
461622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian    else if (const ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(D)) {
462622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      if (const ObjCInterfaceDecl *IC = CD->getClassInterface())
463622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        if (comments::FullComment *FC = getCommentForDecl(IC, PP))
464622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          return cloneFullComment(FC, D);
465622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian    }
466622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian    else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
467622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      if (!(RD = RD->getDefinition()))
468622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        return NULL;
469622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      // Check non-virtual bases.
470622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      for (CXXRecordDecl::base_class_const_iterator I =
471622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian           RD->bases_begin(), E = RD->bases_end(); I != E; ++I) {
472622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        if (I->isVirtual())
473622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          continue;
474622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        QualType Ty = I->getType();
475622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        if (Ty.isNull())
476622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          continue;
477622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        if (const CXXRecordDecl *NonVirtualBase = Ty->getAsCXXRecordDecl()) {
478622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          if (!(NonVirtualBase= NonVirtualBase->getDefinition()))
479622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian            continue;
480622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian
481622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          if (comments::FullComment *FC = getCommentForDecl((NonVirtualBase), PP))
482622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian            return cloneFullComment(FC, D);
483622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        }
484622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      }
485622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      // Check virtual bases.
486622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      for (CXXRecordDecl::base_class_const_iterator I =
487622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian           RD->vbases_begin(), E = RD->vbases_end(); I != E; ++I) {
488622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        QualType Ty = I->getType();
489622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        if (Ty.isNull())
490622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          continue;
491622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        if (const CXXRecordDecl *VirtualBase = Ty->getAsCXXRecordDecl()) {
492622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          if (!(VirtualBase= VirtualBase->getDefinition()))
493622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian            continue;
494622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian          if (comments::FullComment *FC = getCommentForDecl((VirtualBase), PP))
495622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian            return cloneFullComment(FC, D);
496622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian        }
497622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian      }
498622bb4acc00fd63bac545ca23f7c42fd909dc0e7Fariborz Jahanian    }
4998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko    return NULL;
500bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian  }
501bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian
5024b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // If the RawComment was attached to other redeclaration of this Decl, we
5034b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // should parse the comment in context of that other Decl.  This is important
5044b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // because comments can contain references to parameter names which can be
5054b41c65feb93eeb6f6d27b49a2045ea1b72de9d1Dmitri Gribenko  // different across redeclarations.
5061599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko  if (D != OriginalDecl)
5071952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    return getCommentForDecl(OriginalDecl, PP);
5081599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko
5091952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  comments::FullComment *FC = RC->parse(*this, PP, D);
510c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  ParsedComments[Canonical] = FC;
511c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko  return FC;
5128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}
5138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko
5143e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregorvoid
5153e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,
5163e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TemplateTemplateParmDecl *Parm) {
5173e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Parm->getDepth());
5183e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Parm->getPosition());
51961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  ID.AddBoolean(Parm->isParameterPack());
5203e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5213e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateParameterList *Params = Parm->getTemplateParameters();
5223e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  ID.AddInteger(Params->size());
5233e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  for (TemplateParameterList::const_iterator P = Params->begin(),
5243e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                          PEnd = Params->end();
5253e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor       P != PEnd; ++P) {
5263e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
5273e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddInteger(0);
5283e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddBoolean(TTP->isParameterPack());
5293e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      continue;
5303e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    }
5313e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5323e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
5333e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      ID.AddInteger(1);
53461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor      ID.AddBoolean(NTTP->isParameterPack());
5359e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman      ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr());
5366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->isExpandedParameterPack()) {
5376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddBoolean(true);
5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddInteger(NTTP->getNumExpansionTypes());
5399e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman        for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
5409e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman          QualType T = NTTP->getExpansionType(I);
5419e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman          ID.AddPointer(T.getCanonicalType().getAsOpaquePtr());
5429e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman        }
5436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      } else
5446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        ID.AddBoolean(false);
5453e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      continue;
5463e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    }
5473e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5483e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P);
5493e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    ID.AddInteger(2);
5503e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    Profile(ID, TTP);
5513e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
5523e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor}
5533e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5543e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorTemplateTemplateParmDecl *
5553e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::getCanonicalTemplateTemplateParmDecl(
5564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          TemplateTemplateParmDecl *TTP) const {
5573e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Check if we already have a canonical template template parameter.
5583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  llvm::FoldingSetNodeID ID;
5593e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonicalTemplateTemplateParm::Profile(ID, TTP);
5603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  void *InsertPos = 0;
5613e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonicalTemplateTemplateParm *Canonical
5623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
5633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  if (Canonical)
5643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    return Canonical->getParam();
5653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
5663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Build a canonical template parameter list.
5673e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateParameterList *Params = TTP->getTemplateParameters();
5685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<NamedDecl *, 4> CanonParams;
5693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonParams.reserve(Params->size());
5703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  for (TemplateParameterList::const_iterator P = Params->begin(),
5713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                          PEnd = Params->end();
5723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor       P != PEnd; ++P) {
5733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P))
5743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      CanonParams.push_back(
5753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                  TemplateTypeParmDecl::Create(*this, getTranslationUnitDecl(),
576344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               SourceLocation(),
577344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               SourceLocation(),
578344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                               TTP->getDepth(),
5793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TTP->getIndex(), 0, false,
5803e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                               TTP->isParameterPack()));
5813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    else if (NonTypeTemplateParmDecl *NTTP
5826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor             = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
5836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      QualType T = getCanonicalType(NTTP->getType());
5846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T);
5856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      NonTypeTemplateParmDecl *Param;
5866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->isExpandedParameterPack()) {
5875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        SmallVector<QualType, 2> ExpandedTypes;
5885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        SmallVector<TypeSourceInfo *, 2> ExpandedTInfos;
5896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
5906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I)));
5916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          ExpandedTInfos.push_back(
5926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                getTrivialTypeSourceInfo(ExpandedTypes.back()));
5936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        }
5946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
596ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
597ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
5986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getDepth(),
5996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getPosition(), 0,
6006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                T,
6016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TInfo,
6026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTypes.data(),
6036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTypes.size(),
6046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                ExpandedTInfos.data());
6056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      } else {
6066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
607ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
608ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                SourceLocation(),
6096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getDepth(),
6106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->getPosition(), 0,
6116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                T,
6126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                NTTP->isParameterPack(),
6136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TInfo);
6146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      }
6156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      CanonParams.push_back(Param);
6166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
6176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else
6183e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      CanonParams.push_back(getCanonicalTemplateTemplateParmDecl(
6193e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                           cast<TemplateTemplateParmDecl>(*P)));
6203e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
6213e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
6223e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  TemplateTemplateParmDecl *CanonTTP
6233e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
6243e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                       SourceLocation(), TTP->getDepth(),
62561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       TTP->getPosition(),
62661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       TTP->isParameterPack(),
62761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                       0,
6283e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                         TemplateParameterList::Create(*this, SourceLocation(),
6293e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       SourceLocation(),
6303e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       CanonParams.data(),
6313e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       CanonParams.size(),
6323e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                                       SourceLocation()));
6333e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
6343e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Get the new insert position for the node we care about.
6353e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
6363e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  assert(Canonical == 0 && "Shouldn't be in the map!");
6373e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  (void)Canonical;
6383e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
6393e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  // Create the canonical template template parameter entry.
6403e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP);
6413e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
6423e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  return CanonTTP;
6433e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor}
6443e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
645071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *ASTContext::createCXXABI(const TargetInfo &T) {
646ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall  if (!LangOpts.CPlusPlus) return 0;
647ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall
648b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  switch (T.getCXXABI().getKind()) {
649b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::GenericARM:
650b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::iOS:
651ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall    return CreateARMCXXABI(*this);
652c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  case TargetCXXABI::GenericAArch64: // Same as Itanium at this level
653b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::GenericItanium:
654071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    return CreateItaniumCXXABI(*this);
655b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::Microsoft:
65620cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis    return CreateMicrosoftCXXABI(*this);
65720cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis  }
6587530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid CXXABI type!");
659071cc7deffad608165b1ddd5263e8bf181861520Charles Davis}
660071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
661bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorstatic const LangAS::Map *getAddressSpaceMap(const TargetInfo &T,
662207f4d8543529221932af82836016a2ef066c917Peter Collingbourne                                             const LangOptions &LOpts) {
663207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  if (LOpts.FakeAddressSpaceMap) {
664207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    // The fake address space map must have a distinct entry for each
665207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    // language-specific address space.
666207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    static const unsigned FakeAddrSpaceMap[] = {
667207f4d8543529221932af82836016a2ef066c917Peter Collingbourne      1, // opencl_global
668207f4d8543529221932af82836016a2ef066c917Peter Collingbourne      2, // opencl_local
6694dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      3, // opencl_constant
6704dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      4, // cuda_device
6714dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      5, // cuda_constant
6724dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne      6  // cuda_shared
673207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    };
674bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    return &FakeAddrSpaceMap;
675207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  } else {
676bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    return &T.getAddressSpaceMap();
677207f4d8543529221932af82836016a2ef066c917Peter Collingbourne  }
678207f4d8543529221932af82836016a2ef066c917Peter Collingbourne}
679207f4d8543529221932af82836016a2ef066c917Peter Collingbourne
6803e3cd93b2fd9644e970c389e715c13883faf68b6Douglas GregorASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM,
681bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       const TargetInfo *t,
682e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar                       IdentifierTable &idents, SelectorTable &sels,
6831b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner                       Builtin::Context &builtins,
684bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       unsigned size_reserve,
685bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor                       bool DelayInitialization)
686bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  : FunctionProtoTypes(this_()),
687bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    TemplateSpecializationTypes(this_()),
688bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    DependentTemplateSpecializationTypes(this_()),
689bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    SubstTemplateTemplateParmPacks(this_()),
690bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    GlobalNestedNameSpecifier(0),
691bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Int128Decl(0), UInt128Decl(0),
692c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    BuiltinVaListDecl(0),
693a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    ObjCIdDecl(0), ObjCSelDecl(0), ObjCClassDecl(0), ObjCProtocolClassDecl(0),
694961713055e636170da59d7006a878cb4ba518a5dFariborz Jahanian    BOOLDecl(0),
695e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor    CFConstantStringTypeDecl(0), ObjCInstanceTypeDecl(0),
696bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    FILEDecl(0),
697e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    jmp_bufDecl(0), sigjmp_bufDecl(0), ucontext_tDecl(0),
698e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    BlockDescriptorType(0), BlockDescriptorExtendedType(0),
699e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    cudaConfigureCallDecl(0),
700e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    NullTypeSourceInfo(QualType()),
701e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    FirstLocalImport(), LastLocalImport(),
702bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    SourceMgr(SM), LangOpts(LOpts),
70330c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor    AddrSpaceMap(0), Target(t), PrintingPolicy(LOpts),
704bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Idents(idents), Selectors(sels),
705bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    BuiltinInfo(builtins),
706bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    DeclarationNames(*this),
70730c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor    ExternalSource(0), Listener(0),
708aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    Comments(SM), CommentsLoaded(false),
7096ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko    CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
710bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    LastSDM(0, 0),
711f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    UniqueBlockByRefTypeID(0)
712bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor{
7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (size_reserve > 0) Types.reserve(size_reserve);
714e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar  TUDecl = TranslationUnitDecl::Create(*this);
715bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
716bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  if (!DelayInitialization) {
717bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    assert(t && "No target supplied for ASTContext initialization");
718bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    InitBuiltinTypes(*t);
719bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  }
720e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar}
721e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar
7225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext::~ASTContext() {
7233478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  // Release the DenseMaps associated with DeclContext objects.
7243478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  // FIXME: Is this the ideal solution?
7253478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek  ReleaseDeclContextMaps();
7267d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
72763fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  // Call all of the deallocation functions.
72863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  for (unsigned I = 0, N = Deallocations.size(); I != N; ++I)
72963fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    Deallocations[I].first(Deallocations[I].second);
7300054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
731dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed
73263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  // because they can contain DenseMaps.
73363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  for (llvm::DenseMap<const ObjCContainerDecl*,
73463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor       const ASTRecordLayout*>::iterator
73563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor       I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; )
73663fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    // Increment in loop to prevent using deallocated memory.
73763fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
73863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor      R->Destroy(*this);
73963fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor
740dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
741dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek       I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
742dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek    // Increment in loop to prevent using deallocated memory.
743dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek    if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second))
744dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek      R->Destroy(*this);
745dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek  }
7466320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
7476320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
7486320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor                                                    AEnd = DeclAttrs.end();
7496320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor       A != AEnd; ++A)
7506320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    A->second->~AttrVec();
7516320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
752ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
7530054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) {
7540054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  Deallocations.push_back(std::make_pair(Callback, Data));
7550054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
7560054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
7586f42b62b6194f53bcbc349f5d17388e1936535d7Dylan NoblesmithASTContext::setExternalSource(OwningPtr<ExternalASTSource> &Source) {
7592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ExternalSource.reset(Source.take());
7602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
7612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
7625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ASTContext::PrintStats() const {
763cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "\n*** AST Context Stats:\n";
764cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "  " << Types.size() << " types total.\n";
7657c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
766dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned counts[] = {
7671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define TYPE(Name, Parent) 0,
768dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent)
769dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def"
770dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor    0 // Extra
771dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  };
772c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor
7735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Types.size(); i != e; ++i) {
7745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Type *T = Types[i];
775dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor    counts[(unsigned)T->getTypeClass()]++;
7765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
778dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned Idx = 0;
779dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  unsigned TotalBytes = 0;
780dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define TYPE(Name, Parent)                                              \
781dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  if (counts[Idx])                                                      \
782cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << "    " << counts[Idx] << " " << #Name               \
783cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " types\n";                                         \
784dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  TotalBytes += counts[Idx] * sizeof(Name##Type);                       \
785dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor  ++Idx;
786dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent)
787dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def"
7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
789cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << "Total bytes = " << TotalBytes << "\n";
790cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
7914923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor  // Implicit special member functions.
792cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/"
793cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitDefaultConstructors
794cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit default constructors created\n";
795cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitCopyConstructorsDeclared << "/"
796cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitCopyConstructors
797cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit copy constructors created\n";
7984e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
799cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << NumImplicitMoveConstructorsDeclared << "/"
800cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << NumImplicitMoveConstructors
801cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " implicit move constructors created\n";
802cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/"
803cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitCopyAssignmentOperators
804cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit copy assignment operators created\n";
8054e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
806cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/"
807cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << NumImplicitMoveAssignmentOperators
808cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth                 << " implicit move assignment operators created\n";
809cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth  llvm::errs() << NumImplicitDestructorsDeclared << "/"
810cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << NumImplicitDestructors
811cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth               << " implicit destructors created\n";
812cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
8132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  if (ExternalSource.get()) {
814cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth    llvm::errs() << "\n";
8152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    ExternalSource->PrintStats();
8162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
817cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth
81863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor  BumpAlloc.PrintStats();
8195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
821772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getInt128Decl() const {
822772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (!Int128Decl) {
823772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(Int128Ty);
824772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    Int128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
825772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     getTranslationUnitDecl(),
826772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
827772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
828772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     &Idents.get("__int128_t"),
829772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     TInfo);
830772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  }
831772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
832772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  return Int128Decl;
833772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor}
834772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
835772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getUInt128Decl() const {
836772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (!UInt128Decl) {
837772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(UnsignedInt128Ty);
838772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    UInt128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
839772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     getTranslationUnitDecl(),
840772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
841772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     SourceLocation(),
842772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     &Idents.get("__uint128_t"),
843772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                     TInfo);
844772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  }
845772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
846772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  return UInt128Decl;
847772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor}
8485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
849e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallvoid ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) {
8506b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K);
851e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall  R = CanQualType::CreateUnsafe(QualType(Ty, 0));
8526b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  Types.push_back(Ty);
8535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
855bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorvoid ASTContext::InitBuiltinTypes(const TargetInfo &Target) {
856bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  assert((!this->Target || this->Target == &Target) &&
857bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor         "Incorrect target reinitialization");
8585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(VoidTy.isNull() && "Context reinitialized?");
8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
860bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  this->Target = &Target;
861bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
862bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  ABI.reset(createCXXABI(Target));
863bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  AddrSpaceMap = getAddressSpaceMap(Target, LangOpts);
864bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor
8655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p19.
8665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(VoidTy,              BuiltinType::Void);
8671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p2.
8695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(BoolTy,              BuiltinType::Bool);
8705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p3.
87115b91764d08e886391c865c4a444d7b51141c284Eli Friedman  if (LangOpts.CharIsSigned)
8725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InitBuiltinType(CharTy,            BuiltinType::Char_S);
8735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
8745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InitBuiltinType(CharTy,            BuiltinType::Char_U);
8755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p4.
8765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(SignedCharTy,        BuiltinType::SChar);
8775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(ShortTy,             BuiltinType::Short);
8785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(IntTy,               BuiltinType::Int);
8795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongTy,              BuiltinType::Long);
8805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongLongTy,          BuiltinType::LongLong);
8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p6.
8835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedCharTy,      BuiltinType::UChar);
8845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedShortTy,     BuiltinType::UShort);
8855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedIntTy,       BuiltinType::UInt);
8865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedLongTy,      BuiltinType::ULong);
8875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(UnsignedLongLongTy,  BuiltinType::ULongLong);
8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p10.
8905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(FloatTy,             BuiltinType::Float);
8915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(DoubleTy,            BuiltinType::Double);
8925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InitBuiltinType(LongDoubleTy,        BuiltinType::LongDouble);
89364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
8942df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  // GNU extension, 128-bit integers.
8952df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  InitBuiltinType(Int128Ty,            BuiltinType::Int128);
8962df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  InitBuiltinType(UnsignedInt128Ty,    BuiltinType::UInt128);
8972df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner
898e75bb61f1b876afaa6b2f4a2b860c2889ea1d050Abramo Bagnara  if (LangOpts.CPlusPlus && LangOpts.WChar) { // C++ 3.9.1p5
899d3d77cd138f8e830f6547b6f83fcd5721ccf5f5dEli Friedman    if (TargetInfo::isTypeSigned(Target.getWCharType()))
9003f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner      InitBuiltinType(WCharTy,           BuiltinType::WChar_S);
9013f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    else  // -fshort-wchar makes wchar_t be unsigned.
9023f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner      InitBuiltinType(WCharTy,           BuiltinType::WChar_U);
903e75bb61f1b876afaa6b2f4a2b860c2889ea1d050Abramo Bagnara  } else // C99 (or C++ using -fno-wchar)
9043a2503227c3db04a3619735127483263c1075ef7Chris Lattner    WCharTy = getFromTargetType(Target.getWCharType());
90564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
906392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy  WIntTy = getFromTargetType(Target.getWIntType());
907392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy
908f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
909f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    InitBuiltinType(Char16Ty,           BuiltinType::Char16);
910f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  else // C99
911f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    Char16Ty = getFromTargetType(Target.getChar16Type());
912f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
913f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
914f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    InitBuiltinType(Char32Ty,           BuiltinType::Char32);
915f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  else // C99
916f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    Char32Ty = getFromTargetType(Target.getChar32Type());
917f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
918898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // Placeholder type for type-dependent expressions whose type is
919898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // completely unknown. No code should ever check a type against
920898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // DependentTy and users should never see it; however, it is here to
921898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // help diagnose failures to properly check for type-dependent
922898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  // expressions.
923898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  InitBuiltinType(DependentTy,         BuiltinType::Dependent);
9248e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor
9252a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  // Placeholder type for functions.
9262a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  InitBuiltinType(OverloadTy,          BuiltinType::Overload);
9272a984cad5ac3fdceeff2bd99daa7b90979313475John McCall
928864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  // Placeholder type for bound members.
929864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  InitBuiltinType(BoundMemberTy,       BuiltinType::BoundMember);
930864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
9313c3b7f90a863af43fa63043d396553ecf205351cJohn McCall  // Placeholder type for pseudo-objects.
9323c3b7f90a863af43fa63043d396553ecf205351cJohn McCall  InitBuiltinType(PseudoObjectTy,      BuiltinType::PseudoObject);
9333c3b7f90a863af43fa63043d396553ecf205351cJohn McCall
9341de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall  // "any" type; useful for debugger-like clients.
9351de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall  InitBuiltinType(UnknownAnyTy,        BuiltinType::UnknownAny);
9361de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall
9370ddaeb9b031070ec64afe92d9892875ac44df427John McCall  // Placeholder type for unbridged ARC casts.
9380ddaeb9b031070ec64afe92d9892875ac44df427John McCall  InitBuiltinType(ARCUnbridgedCastTy,  BuiltinType::ARCUnbridgedCast);
9390ddaeb9b031070ec64afe92d9892875ac44df427John McCall
940a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  // Placeholder type for builtin functions.
941a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  InitBuiltinType(BuiltinFnTy,  BuiltinType::BuiltinFn);
942a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman
9435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C99 6.2.5p11.
9445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  FloatComplexTy      = getComplexType(FloatTy);
9455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DoubleComplexTy     = getComplexType(DoubleTy);
9465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LongDoubleComplexTy = getComplexType(LongDoubleTy);
9478e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor
94813dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian  // Builtin types for 'id', 'Class', and 'SEL'.
949de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId);
950de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
95113dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian  InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
952b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei
953b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  if (LangOpts.OpenCL) {
954b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dTy, BuiltinType::OCLImage1d);
955b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dArrayTy, BuiltinType::OCLImage1dArray);
956b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage1dBufferTy, BuiltinType::OCLImage1dBuffer);
957b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage2dTy, BuiltinType::OCLImage2d);
958b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage2dArrayTy, BuiltinType::OCLImage2dArray);
959b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    InitBuiltinType(OCLImage3dTy, BuiltinType::OCLImage3d);
960e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei
96121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei    InitBuiltinType(OCLSamplerTy, BuiltinType::OCLSampler);
962e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei    InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
963b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei  }
964ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
965ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  // Builtin type for __objc_yes and __objc_no
96693a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian  ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ?
96793a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian                       SignedCharTy : BoolTy);
968ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
969a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCConstantStringType = QualType();
970f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian
971f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  ObjCSuperType = QualType();
9721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
97333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // void * type
97433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  VoidPtrTy = getPointerType(VoidTy);
9756e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
9766e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // nullptr type (C++0x 2.14.7)
9776e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  InitBuiltinType(NullPtrTy,           BuiltinType::NullPtr);
978aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov
979aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  // half type (OpenCL 6.1.1.1) / ARM NEON __fp16
980aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  InitBuiltinType(HalfTy, BuiltinType::Half);
981fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
982fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // Builtin type used to help define __builtin_va_list.
983fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  VaListTagTy = QualType();
9845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
986d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikieDiagnosticsEngine &ASTContext::getDiagnostics() const {
98778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis  return SourceMgr.getDiagnostics();
98878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis}
98978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis
9906320064d0c60fa8683f5623881c9394fd4aa7689Douglas GregorAttrVec& ASTContext::getDeclAttrs(const Decl *D) {
9916320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  AttrVec *&Result = DeclAttrs[D];
9926320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  if (!Result) {
9936320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    void *Mem = Allocate(sizeof(AttrVec));
9946320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    Result = new (Mem) AttrVec;
9956320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  }
9966320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
9976320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  return *Result;
9986320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
9996320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
10006320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor/// \brief Erase the attributes corresponding to the given declaration.
10016320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregorvoid ASTContext::eraseDeclAttrs(const Decl *D) {
10026320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
10036320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  if (Pos != DeclAttrs.end()) {
10046320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    Pos->second->~AttrVec();
10056320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor    DeclAttrs.erase(Pos);
10066320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor  }
10076320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor}
10086320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
1009251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorMemberSpecializationInfo *
1010663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas GregorASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) {
10117caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Var->isStaticDataMember() && "Not a static data member");
1012663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor  llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos
10137caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    = InstantiatedFromStaticDataMember.find(Var);
10147caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  if (Pos == InstantiatedFromStaticDataMember.end())
10157caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    return 0;
10161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10177caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  return Pos->second;
10187caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor}
10197caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor
10201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
1021251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl,
10229421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis                                                TemplateSpecializationKind TSK,
10239421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis                                          SourceLocation PointOfInstantiation) {
10247caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Inst->isStaticDataMember() && "Not a static data member");
10257caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(Tmpl->isStaticDataMember() && "Not a static data member");
10267caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor  assert(!InstantiatedFromStaticDataMember[Inst] &&
10277caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor         "Already noted what static data member was instantiated from");
1028251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor  InstantiatedFromStaticDataMember[Inst]
10299421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    = new (*this) MemberSpecializationInfo(Tmpl, TSK, PointOfInstantiation);
10307caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor}
10317caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor
1032af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetFunctionDecl *ASTContext::getClassScopeSpecializationPattern(
1033af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet                                                     const FunctionDecl *FD){
1034af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(FD && "Specialization is 0");
1035af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  llvm::DenseMap<const FunctionDecl*, FunctionDecl *>::const_iterator Pos
10360d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet    = ClassScopeSpecializationPattern.find(FD);
10370d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet  if (Pos == ClassScopeSpecializationPattern.end())
1038af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet    return 0;
1039af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
1040af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  return Pos->second;
1041af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet}
1042af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
1043af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichetvoid ASTContext::setClassScopeSpecializationPattern(FunctionDecl *FD,
1044af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet                                        FunctionDecl *Pattern) {
1045af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(FD && "Specialization is 0");
1046af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet  assert(Pattern && "Class scope specialization pattern is 0");
10470d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet  ClassScopeSpecializationPattern[FD] = Pattern;
1048af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet}
1049af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
10507ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallNamedDecl *
1051ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) {
10527ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall  llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos
1053ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    = InstantiatedFromUsingDecl.find(UUD);
1054ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (Pos == InstantiatedFromUsingDecl.end())
10550d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    return 0;
10561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10570d8df780aef1acda5962347a32591efc629b6748Anders Carlsson  return Pos->second;
10580d8df780aef1acda5962347a32591efc629b6748Anders Carlsson}
10590d8df780aef1acda5962347a32591efc629b6748Anders Carlsson
10600d8df780aef1acda5962347a32591efc629b6748Anders Carlssonvoid
1061ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) {
1062ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert((isa<UsingDecl>(Pattern) ||
1063ed97649e9574b9d854fa4d6109c9333ae0993554John McCall          isa<UnresolvedUsingValueDecl>(Pattern) ||
1064ed97649e9574b9d854fa4d6109c9333ae0993554John McCall          isa<UnresolvedUsingTypenameDecl>(Pattern)) &&
1065ed97649e9574b9d854fa4d6109c9333ae0993554John McCall         "pattern decl is not a using decl");
1066ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists");
1067ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  InstantiatedFromUsingDecl[Inst] = Pattern;
1068ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
1069ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1070ed97649e9574b9d854fa4d6109c9333ae0993554John McCallUsingShadowDecl *
1071ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) {
1072ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos
1073ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    = InstantiatedFromUsingShadowDecl.find(Inst);
1074ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (Pos == InstantiatedFromUsingShadowDecl.end())
1075ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return 0;
1076ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1077ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Pos->second;
1078ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
1079ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1080ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid
1081ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst,
1082ed97649e9574b9d854fa4d6109c9333ae0993554John McCall                                               UsingShadowDecl *Pattern) {
1083ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists");
1084ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  InstantiatedFromUsingShadowDecl[Inst] = Pattern;
10850d8df780aef1acda5962347a32591efc629b6748Anders Carlsson}
10860d8df780aef1acda5962347a32591efc629b6748Anders Carlsson
1087d8b285fee4471f393da8ee30f552ceacdc362afaAnders CarlssonFieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) {
1088d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos
1089d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    = InstantiatedFromUnnamedFieldDecl.find(Field);
1090d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  if (Pos == InstantiatedFromUnnamedFieldDecl.end())
1091d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    return 0;
10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1093d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  return Pos->second;
1094d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson}
1095d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson
1096d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlssonvoid ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst,
1097d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                                     FieldDecl *Tmpl) {
1098d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed");
1099d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!Tmpl->getDeclName() && "Template field decl is not unnamed");
1100d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1101d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson         "Already noted what unnamed field was instantiated from");
11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1103d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson  InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1104d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson}
1105d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson
110614d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanianbool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD,
110714d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian                                    const FieldDecl *LastFD) const {
110814d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian  return (FD->isBitField() && LastFD && !LastFD->isBitField() &&
1109a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) == 0);
111014d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian}
111114d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian
1112340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanianbool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD,
1113340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian                                             const FieldDecl *LastFD) const {
1114340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian  return (FD->isBitField() && LastFD && LastFD->isBitField() &&
1115a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) == 0 &&
1116a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this) != 0);
1117340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian}
1118340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian
11199b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanianbool ASTContext::BitfieldFollowsBitfield(const FieldDecl *FD,
11209b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian                                         const FieldDecl *LastFD) const {
11219b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian  return (FD->isBitField() && LastFD && LastFD->isBitField() &&
1122a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this) &&
1123a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this));
11249b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian}
11259b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian
1126dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::NonBitfieldFollowsBitfield(const FieldDecl *FD,
112752bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian                                         const FieldDecl *LastFD) const {
112852bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian  return (!FD->isBitField() && LastFD && LastFD->isBitField() &&
1129a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          LastFD->getBitWidthValue(*this));
113052bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian}
113152bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian
1132dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::BitfieldFollowsNonBitfield(const FieldDecl *FD,
113352bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian                                             const FieldDecl *LastFD) const {
113452bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian  return (FD->isBitField() && LastFD && !LastFD->isBitField() &&
1135a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith          FD->getBitWidthValue(*this));
113652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian}
113752bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian
11387d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator
11397d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const {
11407d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
114138eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
11427d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  if (Pos == OverriddenMethods.end())
11437d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor    return 0;
11447d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
11457d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  return Pos->second.begin();
11467d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
11477d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
11487d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator
11497d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_end(const CXXMethodDecl *Method) const {
11507d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
115138eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
11527d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  if (Pos == OverriddenMethods.end())
11537d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor    return 0;
11547d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
11557d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  return Pos->second.end();
11567d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
11577d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
1158c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned
1159c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios KyrtzidisASTContext::overridden_methods_size(const CXXMethodDecl *Method) const {
1160c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos
116138eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis    = OverriddenMethods.find(Method->getCanonicalDecl());
1162c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pos == OverriddenMethods.end())
1163c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    return 0;
1164c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis
1165c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  return Pos->second.size();
1166c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis}
1167c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis
11687d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregorvoid ASTContext::addOverriddenMethod(const CXXMethodDecl *Method,
11697d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor                                     const CXXMethodDecl *Overridden) {
117038eb1e161f602ee810dfb8a5a0d8462572f22689Argyrios Kyrtzidis  assert(Method->isCanonicalDecl() && Overridden->isCanonicalDecl());
11717d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor  OverriddenMethods[Method].push_back(Overridden);
11727d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
11737d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
11741e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenkovoid ASTContext::getOverriddenMethods(
11751e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko                      const NamedDecl *D,
11761e905da74dbfd353d77dfc548fc9d6ff420d515aDmitri Gribenko                      SmallVectorImpl<const NamedDecl *> &Overridden) const {
117721c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  assert(D);
117821c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
117921c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  if (const CXXMethodDecl *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1180685d10462b875f8c056d27488c0a1b4e13ef680fArgyrios Kyrtzidis    Overridden.append(overridden_methods_begin(CXXMethod),
1181685d10462b875f8c056d27488c0a1b4e13ef680fArgyrios Kyrtzidis                      overridden_methods_end(CXXMethod));
118221c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis    return;
118321c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  }
118421c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
118521c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D);
118621c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis  if (!Method)
118721c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis    return;
118821c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
1189740ae67dbf8dac44dbc8d6593a60f4f37a0a2aa5Argyrios Kyrtzidis  SmallVector<const ObjCMethodDecl *, 8> OverDecls;
1190740ae67dbf8dac44dbc8d6593a60f4f37a0a2aa5Argyrios Kyrtzidis  Method->getOverriddenMethods(OverDecls);
1191bc0a2bb8dc122f8daae890ec82cecfe2054859ebArgyrios Kyrtzidis  Overridden.append(OverDecls.begin(), OverDecls.end());
119221c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis}
119321c3607282550779c9ae5fe784928597807fd110Argyrios Kyrtzidis
1194e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregorvoid ASTContext::addedLocalImportDecl(ImportDecl *Import) {
1195e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  assert(!Import->NextLocalImport && "Import declaration already in the chain");
1196e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  assert(!Import->isFromASTFile() && "Non-local import declaration");
1197e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  if (!FirstLocalImport) {
1198e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    FirstLocalImport = Import;
1199e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    LastLocalImport = Import;
1200e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    return;
1201e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  }
1202e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor
1203e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  LastLocalImport->NextLocalImport = Import;
1204e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor  LastLocalImport = Import;
1205e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor}
1206e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor
1207464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===//
1208464175bba1318bef7905122e9fda20cff926df78Chris Lattner//                         Type Sizing and Analysis
1209464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===//
1210a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
1211b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified
1212b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// scalar floating point type.
1213b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattnerconst llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
1214183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const BuiltinType *BT = T->getAs<BuiltinType>();
1215b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  assert(BT && "Not a floating point type!");
1216b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  switch (BT->getKind()) {
1217b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Not a floating point type!");
1218aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case BuiltinType::Half:       return Target->getHalfFormat();
1219bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::Float:      return Target->getFloatFormat();
1220bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::Double:     return Target->getDoubleFormat();
1221bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  case BuiltinType::LongDouble: return Target->getLongDoubleFormat();
1222b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  }
1223b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner}
1224b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
12258b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck/// getDeclAlign - Return a conservative estimate of the alignment of the
1226af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// specified decl.  Note that bitfields do not have a valid alignment, so
1227af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// this method will assert on them.
12285d484e8cf710207010720589d89602233de61d01Sebastian Redl/// If @p RefAsPointee, references are treated like their underlying type
12295d484e8cf710207010720589d89602233de61d01Sebastian Redl/// (for alignof), else they're treated like pointers (for CodeGen).
12304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const {
1231bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  unsigned Align = Target->getCharWidth();
1232dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
12334081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  bool UseAlignAttrOnly = false;
12344081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  if (unsigned AlignFromAttr = D->getMaxAlignment()) {
12354081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    Align = AlignFromAttr;
12364081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall
12374081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // __attribute__((aligned)) can increase or decrease alignment
12384081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // *except* on a struct or struct member, where it only increases
12394081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // alignment unless 'packed' is also specified.
12404081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    //
124182d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne    // It is an error for alignas to decrease alignment, so we can
12424081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    // ignore that possibility;  Sema should diagnose it.
12434081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    if (isa<FieldDecl>(D)) {
12444081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall      UseAlignAttrOnly = D->hasAttr<PackedAttr>() ||
12454081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall        cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
12464081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    } else {
12474081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall      UseAlignAttrOnly = true;
12484081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall    }
12494081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  }
125078a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian  else if (isa<FieldDecl>(D))
125178a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian      UseAlignAttrOnly =
125278a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian        D->hasAttr<PackedAttr>() ||
125378a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian        cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
1254dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
1255ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall  // If we're using the align attribute only, just ignore everything
1256ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall  // else about the declaration and its type.
12574081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  if (UseAlignAttrOnly) {
1258ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // do nothing
1259ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
12604081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall  } else if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
1261af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner    QualType T = VD->getType();
12626217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    if (const ReferenceType* RT = T->getAs<ReferenceType>()) {
12635d484e8cf710207010720589d89602233de61d01Sebastian Redl      if (RefAsPointee)
12645d484e8cf710207010720589d89602233de61d01Sebastian Redl        T = RT->getPointeeType();
12655d484e8cf710207010720589d89602233de61d01Sebastian Redl      else
12665d484e8cf710207010720589d89602233de61d01Sebastian Redl        T = getPointerType(RT->getPointeeType());
12675d484e8cf710207010720589d89602233de61d01Sebastian Redl    }
12685d484e8cf710207010720589d89602233de61d01Sebastian Redl    if (!T->isIncompleteType() && !T->isFunctionType()) {
12693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      // Adjust alignments of declarations with array type by the
12703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      // large-array alignment on the target.
1271bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      unsigned MinWidth = Target->getLargeArrayMinWidth();
12723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      const ArrayType *arrayType;
12733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      if (MinWidth && (arrayType = getAsArrayType(T))) {
12743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        if (isa<VariableArrayType>(arrayType))
1275bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor          Align = std::max(Align, Target->getLargeArrayAlign());
12763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        else if (isa<ConstantArrayType>(arrayType) &&
12773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                 MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType)))
1278bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor          Align = std::max(Align, Target->getLargeArrayAlign());
12793b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
12803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        // Walk through any array types while we're at it.
12813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        T = getBaseElementType(arrayType);
12826deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola      }
12839f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier      Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr()));
1284dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman    }
1285ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1286ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // Fields can be subject to extra alignment constraints, like if
1287ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // the field is packed, the struct is packed, or the struct has a
1288ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // a max-field-alignment constraint (#pragma pack).  So calculate
1289ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // the actual alignment of the field within the struct, and then
1290ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    // (as we're expected to) constrain that by the alignment of the type.
1291ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall    if (const FieldDecl *field = dyn_cast<FieldDecl>(VD)) {
1292ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // So calculate the alignment of the field.
1293ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      const ASTRecordLayout &layout = getASTRecordLayout(field->getParent());
1294ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1295ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // Start with the record's overall alignment.
1296dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck      unsigned fieldAlign = toBits(layout.getAlignment());
1297ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1298ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      // Use the GCD of that and the offset within the record.
1299ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      uint64_t offset = layout.getFieldOffset(field->getFieldIndex());
1300ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      if (offset > 0) {
1301ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        // Alignment is always a power of 2, so the GCD will be a power of 2,
1302ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        // which means we get to do this crazy thing instead of Euclid's.
1303ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        uint64_t lowBitOfOffset = offset & (~offset + 1);
1304ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall        if (lowBitOfOffset < fieldAlign)
1305ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall          fieldAlign = static_cast<unsigned>(lowBitOfOffset);
1306ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      }
1307ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall
1308ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall      Align = std::min(Align, fieldAlign);
130905f62474dd2b0f1cb69adbe0787f2868788aa949Charles Davis    }
1310af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  }
1311dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman
1312eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(Align);
1313af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner}
1314b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
1315929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// getTypeInfoDataSizeInChars - Return the size of a type, in
1316929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// chars. If the type is a record, its data size is returned.  This is
1317929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// the size of the memcpy that's performed when assigning this type
1318929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall// using a trivial copy/move assignment operator.
1319929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCallstd::pair<CharUnits, CharUnits>
1320929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCallASTContext::getTypeInfoDataSizeInChars(QualType T) const {
1321929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  std::pair<CharUnits, CharUnits> sizeAndAlign = getTypeInfoInChars(T);
1322929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1323929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // In C++, objects can sometimes be allocated into the tail padding
1324929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // of a base-class subobject.  We decide whether that's possible
1325929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  // during class layout, so here we can just trust the layout results.
1326929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  if (getLangOpts().CPlusPlus) {
1327929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall    if (const RecordType *RT = T->getAs<RecordType>()) {
1328929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall      const ASTRecordLayout &layout = getASTRecordLayout(RT->getDecl());
1329929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall      sizeAndAlign.first = layout.getDataSize();
1330929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall    }
1331929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  }
1332929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1333929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall  return sizeAndAlign;
1334929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall}
1335929bbfb0b69165b55da3c56abf22aa10e20dadc6John McCall
1336ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits>
1337bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(const Type *T) const {
1338ea1471e0e967548c596a71469702f8846dbaf3c0John McCall  std::pair<uint64_t, unsigned> Info = getTypeInfo(T);
1339eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return std::make_pair(toCharUnitsFromBits(Info.first),
1340eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck                        toCharUnitsFromBits(Info.second));
1341ea1471e0e967548c596a71469702f8846dbaf3c0John McCall}
1342ea1471e0e967548c596a71469702f8846dbaf3c0John McCall
1343ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits>
1344bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(QualType T) const {
1345ea1471e0e967548c596a71469702f8846dbaf3c0John McCall  return getTypeInfoInChars(T.getTypePtr());
1346ea1471e0e967548c596a71469702f8846dbaf3c0John McCall}
1347ea1471e0e967548c596a71469702f8846dbaf3c0John McCall
1348bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbarstd::pair<uint64_t, unsigned> ASTContext::getTypeInfo(const Type *T) const {
1349bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  TypeInfoMap::iterator it = MemoizedTypeInfo.find(T);
1350bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  if (it != MemoizedTypeInfo.end())
1351bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar    return it->second;
1352bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar
1353bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  std::pair<uint64_t, unsigned> Info = getTypeInfoImpl(T);
1354bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  MemoizedTypeInfo.insert(std::make_pair(T, Info));
1355bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar  return Info;
1356bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar}
1357bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar
1358bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// getTypeInfoImpl - Return the size of the specified type, in bits.  This
1359bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// method does not work on incomplete types.
13600953e767ff7817f97b3ab20896b229891eeff45bJohn McCall///
13610953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// FIXME: Pointers into different addr spaces could have different sizes and
13620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// alignment requirements: getPointerInfo should take an AddrSpace, this
13630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// should take a QualType, &c.
1364d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattnerstd::pair<uint64_t, unsigned>
1365bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel DunbarASTContext::getTypeInfoImpl(const Type *T) const {
13665e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump  uint64_t Width=0;
13675e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump  unsigned Align=8;
1368a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner  switch (T->getTypeClass()) {
136972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base)
137072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base)
137118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor#define NON_CANONICAL_TYPE(Class, Base)
137272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class:
137372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def"
1374d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall    llvm_unreachable("Should not see dependent types");
137572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
13765d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::FunctionNoProto:
13775d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::FunctionProto:
137818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    // GCC extension: alignof(function) = 32 bits
137918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Width = 0;
138018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Align = 32;
138118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    break;
138218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
138372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::IncompleteArray:
1384fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case Type::VariableArray:
138518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Width = 0;
138618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    Align = getTypeAlign(cast<ArrayType>(T)->getElementType());
138718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    break;
138818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
1389fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case Type::ConstantArray: {
13901d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const ConstantArrayType *CAT = cast<ConstantArrayType>(T);
13911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
139298be4943e8dc4f3905629a7102668960873cf863Chris Lattner    std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType());
1393fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara    uint64_t Size = CAT->getSize().getZExtValue();
1394bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar    assert((Size == 0 || EltInfo.first <= (uint64_t)(-1)/Size) &&
1395bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar           "Overflow in array type bit size evaluation");
1396fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara    Width = EltInfo.first*Size;
1397030d8846c7e520330007087e949f621989876e3aChris Lattner    Align = EltInfo.second;
1398cd88b4171753dcb2bc0a21d78f1597c796bb8a20Argyrios Kyrtzidis    Width = llvm::RoundUpToAlignment(Width, Align);
1399030d8846c7e520330007087e949f621989876e3aChris Lattner    break;
14005c09a02a5db85e08a432b6eeced9aa656349710dChristopher Lamb  }
1401213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  case Type::ExtVector:
1402030d8846c7e520330007087e949f621989876e3aChris Lattner  case Type::Vector: {
14039fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    const VectorType *VT = cast<VectorType>(T);
14049fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType());
14059fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    Width = EltInfo.first*VT->getNumElements();
14064bd998bbc228915d2b9cae5b67879de48940d05eEli Friedman    Align = Width;
14076fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // If the alignment is not a power of 2, round up to the next power of 2.
14086fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman    // This happens for non-power-of-2 length vectors.
14098eefcd353c1d06a10104f69e5079ebab3183f9a3Dan Gohman    if (Align & (Align-1)) {
14109fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner      Align = llvm::NextPowerOf2(Align);
14119fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner      Width = llvm::RoundUpToAlignment(Width, Align);
14129fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner    }
1413f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    // Adjust the alignment based on the target max.
1414f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
1415f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier    if (TargetVectorAlign && TargetVectorAlign < Align)
1416f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier      Align = TargetVectorAlign;
1417030d8846c7e520330007087e949f621989876e3aChris Lattner    break;
1418030d8846c7e520330007087e949f621989876e3aChris Lattner  }
14195d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner
14209e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  case Type::Builtin:
1421a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner    switch (cast<BuiltinType>(T)->getKind()) {
1422b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    default: llvm_unreachable("Unknown builtin type!");
1423d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    case BuiltinType::Void:
142418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      // GCC extension: alignof(void) = 8 bits.
142518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      Width = 0;
142618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      Align = 8;
142718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor      break;
142818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
14296f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Bool:
1430bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getBoolWidth();
1431bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getBoolAlign();
14326f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1433692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::Char_S:
1434692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::Char_U:
1435692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UChar:
14366f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::SChar:
1437bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getCharWidth();
1438bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getCharAlign();
14396f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14403f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_S:
14413f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_U:
1442bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getWCharWidth();
1443bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getWCharAlign();
144464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis      break;
1445f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    case BuiltinType::Char16:
1446bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getChar16Width();
1447bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getChar16Align();
1448f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      break;
1449f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith    case BuiltinType::Char32:
1450bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getChar32Width();
1451bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getChar32Align();
1452f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith      break;
1453692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UShort:
14546f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Short:
1455bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getShortWidth();
1456bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getShortAlign();
14576f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1458692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::UInt:
14596f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Int:
1460bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getIntWidth();
1461bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getIntAlign();
14626f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1463692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::ULong:
14646f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Long:
1465bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongWidth();
1466bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongAlign();
14676f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1468692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner    case BuiltinType::ULongLong:
14696f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::LongLong:
1470bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongLongWidth();
1471bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongLongAlign();
14726f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
1473ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner    case BuiltinType::Int128:
1474ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner    case BuiltinType::UInt128:
1475ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      Width = 128;
1476ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      Align = 128; // int128_t is 128-bit aligned on all targets.
1477ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner      break;
1478aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov    case BuiltinType::Half:
1479aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      Width = Target->getHalfWidth();
1480aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      Align = Target->getHalfAlign();
1481aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov      break;
14826f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Float:
1483bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getFloatWidth();
1484bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getFloatAlign();
14856f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14866f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::Double:
1487bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getDoubleWidth();
1488bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getDoubleAlign();
14896f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14906f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    case BuiltinType::LongDouble:
1491bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getLongDoubleWidth();
1492bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getLongDoubleAlign();
14936f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner      break;
14946e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl    case BuiltinType::NullPtr:
1495bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t)
1496bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getPointerAlign(0); //   == sizeof(void*)
14971590d9c0fec4c710c2962e4bb71f76979b5163d3Sebastian Redl      break;
1498e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCId:
1499e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCClass:
1500e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian    case BuiltinType::ObjCSel:
1501bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Width = Target->getPointerWidth(0);
1502bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Align = Target->getPointerAlign(0);
1503e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian      break;
150421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei    case BuiltinType::OCLSampler:
150521f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei      // Samplers are modeled as integers.
150621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei      Width = Target->getIntWidth();
150721f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei      Align = Target->getIntAlign();
150821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei      break;
1509e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei    case BuiltinType::OCLEvent:
1510b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1d:
1511b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1dArray:
1512b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage1dBuffer:
1513b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage2d:
1514b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage2dArray:
1515b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei    case BuiltinType::OCLImage3d:
1516b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      // Currently these types are pointers to opaque types.
1517b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      Width = Target->getPointerWidth(0);
1518b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      Align = Target->getPointerAlign(0);
1519b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei      break;
1520a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner    }
1521bfef6d7c67831a135d6ab79931f010f750a730adChris Lattner    break;
1522d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  case Type::ObjCObjectPointer:
1523bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(0);
1524bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(0);
15256f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner    break;
1526485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff  case Type::BlockPointer: {
1527207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(
1528207f4d8543529221932af82836016a2ef066c917Peter Collingbourne        cast<BlockPointerType>(T)->getPointeeType());
1529bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1530bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
1531485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff    break;
1532485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff  }
15335d484e8cf710207010720589d89602233de61d01Sebastian Redl  case Type::LValueReference:
15345d484e8cf710207010720589d89602233de61d01Sebastian Redl  case Type::RValueReference: {
15355d484e8cf710207010720589d89602233de61d01Sebastian Redl    // alignof and sizeof should never enter this code path here, so we go
15365d484e8cf710207010720589d89602233de61d01Sebastian Redl    // the pointer route.
1537207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(
1538207f4d8543529221932af82836016a2ef066c917Peter Collingbourne        cast<ReferenceType>(T)->getPointeeType());
1539bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1540bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
15415d484e8cf710207010720589d89602233de61d01Sebastian Redl    break;
15425d484e8cf710207010720589d89602233de61d01Sebastian Redl  }
1543f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  case Type::Pointer: {
1544207f4d8543529221932af82836016a2ef066c917Peter Collingbourne    unsigned AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType());
1545bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Width = Target->getPointerWidth(AS);
1546bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    Align = Target->getPointerAlign(AS);
1547f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner    break;
1548f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  }
1549f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  case Type::MemberPointer: {
1550071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    const MemberPointerType *MPT = cast<MemberPointerType>(T);
155184e9ab44af3a16f66d62590505db2036ef0aa03bReid Kleckner    llvm::tie(Width, Align) = ABI->getMemberPointerWidthAndAlign(MPT);
15521cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson    break;
1553f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  }
15545d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  case Type::Complex: {
15555d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    // Complex types have the same alignment as their elements, but twice the
15565d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    // size.
15571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    std::pair<uint64_t, unsigned> EltInfo =
155898be4943e8dc4f3905629a7102668960873cf863Chris Lattner      getTypeInfo(cast<ComplexType>(T)->getElementType());
15599e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner    Width = EltInfo.first*2;
15605d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    Align = EltInfo.second;
15615d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner    break;
15625d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner  }
1563c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCObject:
1564c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr());
156544a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel  case Type::ObjCInterface: {
15661d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
156744a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel    const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
1568dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck    Width = toBits(Layout.getSize());
1569dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck    Align = toBits(Layout.getAlignment());
157044a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel    break;
157144a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel  }
157272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Record:
157372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Enum: {
15741d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const TagType *TT = cast<TagType>(T);
15751d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar
15761d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    if (TT->getDecl()->isInvalidDecl()) {
157722ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor      Width = 8;
157822ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor      Align = 8;
15798389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner      break;
15808389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner    }
15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15821d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    if (const EnumType *ET = dyn_cast<EnumType>(TT))
15837176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner      return getTypeInfo(ET->getDecl()->getIntegerType());
15847176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner
15851d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar    const RecordType *RT = cast<RecordType>(TT);
15867176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner    const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
1587dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck    Width = toBits(Layout.getSize());
1588dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck    Align = toBits(Layout.getAlignment());
1589dc0d73e6495404418acf8548875aeaff07791a74Chris Lattner    break;
1590a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner  }
15917532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
15929fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner  case Type::SubstTemplateTypeParm:
159349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    return getTypeInfo(cast<SubstTemplateTypeParmType>(T)->
159449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                       getReplacementType().getTypePtr());
159549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
159634b41d939a1328f484511c6002ba2456db879a29Richard Smith  case Type::Auto: {
159734b41d939a1328f484511c6002ba2456db879a29Richard Smith    const AutoType *A = cast<AutoType>(T);
159834b41d939a1328f484511c6002ba2456db879a29Richard Smith    assert(A->isDeduced() && "Cannot request the size of a dependent type");
1599dc856aff4428380baa9afb5577ea04f8fb6beb13Matt Beaumont-Gay    return getTypeInfo(A->getDeducedType().getTypePtr());
160034b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
160134b41d939a1328f484511c6002ba2456db879a29Richard Smith
1602075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  case Type::Paren:
1603075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr());
1604075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
160518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::Typedef: {
1606162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl();
1607df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor    std::pair<uint64_t, unsigned> Info
1608df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor      = getTypeInfo(Typedef->getUnderlyingType().getTypePtr());
1609c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // If the typedef has an aligned attribute on it, it overrides any computed
1610c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // alignment we have.  This violates the GCC documentation (which says that
1611c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    // attribute(aligned) can only round up) but matches its implementation.
1612c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    if (unsigned AttrAlign = Typedef->getMaxAlignment())
1613c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner      Align = AttrAlign;
1614c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner    else
1615c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner      Align = Info.second;
1616df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor    Width = Info.first;
16177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    break;
16187176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner  }
161918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
162018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::TypeOfExpr:
162118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType()
162218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor                         .getTypePtr());
162318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
162418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  case Type::TypeOf:
162518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor    return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr());
162618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
1627395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  case Type::Decltype:
1628395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType()
1629395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson                        .getTypePtr());
1630395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
1631ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  case Type::UnaryTransform:
1632ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType());
1633ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
1634465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  case Type::Elaborated:
1635465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr());
16361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16379d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  case Type::Attributed:
16389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    return getTypeInfo(
16399d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                  cast<AttributedType>(T)->getEquivalentType().getTypePtr());
16409d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
16413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  case Type::TemplateSpecialization: {
16421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(getCanonicalType(T) != T &&
164318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor           "Cannot request the size of a dependent type");
16443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T);
16453e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    // A type alias template specialization may refer to a typedef with the
16463e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    // aligned attribute on it.
16473e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    if (TST->isTypeAlias())
16483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith      return getTypeInfo(TST->getAliasedType().getTypePtr());
16493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    else
16503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith      return getTypeInfo(getCanonicalType(T));
16513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  }
16523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
1653b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic: {
16549eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall    // Start with the base type information.
16552be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    std::pair<uint64_t, unsigned> Info
16562be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      = getTypeInfo(cast<AtomicType>(T)->getValueType());
16572be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    Width = Info.first;
16582be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    Align = Info.second;
16599eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall
16609eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall    // If the size of the type doesn't exceed the platform's max
16619eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall    // atomic promotion width, make the size and alignment more
16629eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall    // favorable to atomic operations:
16639eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall    if (Width != 0 && Width <= Target->getMaxAtomicPromoteWidth()) {
16649eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall      // Round the size up to a power of 2.
16659eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall      if (!llvm::isPowerOf2_64(Width))
16669eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall        Width = llvm::NextPowerOf2(Width);
16679eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall
16689eda3abe7e183b05834947391c0cdc291f4ee0d8John McCall      // Set the alignment equal to the size.
16692be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman      Align = static_cast<unsigned>(Width);
16702be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman    }
1671b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
1672b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
167318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  }
16741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16752be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman  assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2");
16769e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  return std::make_pair(Width, Align);
1677a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner}
1678a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
1679eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck/// toCharUnitsFromBits - Convert a size in bits to a size in characters.
1680eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen DyckCharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const {
1681eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return CharUnits::fromQuantity(BitSize / getCharWidth());
1682eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck}
1683eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck
1684dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck/// toBits - Convert a size in characters to a size in characters.
1685dd76a9ab9ea675671200f94b18ce95766841952bKen Dyckint64_t ASTContext::toBits(CharUnits CharSize) const {
1686dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck  return CharSize.getQuantity() * getCharWidth();
1687dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck}
1688dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck
1689bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// getTypeSizeInChars - Return the size of the specified type, in characters.
1690bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// This method does not work on incomplete types.
16914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(QualType T) const {
1692eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeSize(T));
1693bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck}
16944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(const Type *T) const {
1695eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeSize(T));
1696bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck}
1697bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck
169816e20cce43385001f33f8e3f90ee345609c805d1Ken Dyck/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in
169986fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck/// characters. This method does not work on incomplete types.
17004ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(QualType T) const {
1701eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeAlign(T));
170286fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck}
17034ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(const Type *T) const {
1704eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck  return toCharUnitsFromBits(getTypeAlign(T));
170586fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck}
170686fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck
170734ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// getPreferredTypeAlign - Return the "preferred" alignment of the specified
170834ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// type for the current target in bits.  This can be different than the ABI
170934ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// alignment in cases where it is beneficial for performance to overalign
171034ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// a data type.
17114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
171234ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner  unsigned ABIAlign = getTypeAlign(T);
17131eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman
17141eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman  // Double and long long should be naturally aligned if possible.
1715183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  if (const ComplexType* CT = T->getAs<ComplexType>())
17161eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman    T = CT->getElementType().getTypePtr();
17171eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman  if (T->isSpecificBuiltinType(BuiltinType::Double) ||
1718cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier      T->isSpecificBuiltinType(BuiltinType::LongLong) ||
1719cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier      T->isSpecificBuiltinType(BuiltinType::ULongLong))
17201eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman    return std::max(ABIAlign, (unsigned)getTypeSize(T));
17211eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman
172234ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner  return ABIAlign;
172334ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner}
172434ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner
17252c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// DeepCollectObjCIvars -
17262c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// This routine first collects all declared, but not synthesized, ivars in
17272c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// super class and then collects all ivars, including those synthesized for
17282c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// current class. This routine is used for implementation of current class
17292c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// when all ivars, declared and synthesized are known.
17309820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian///
17312c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanianvoid ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI,
17322c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian                                      bool leafClass,
1733db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose                            SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const {
17342c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass())
17352c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    DeepCollectObjCIvars(SuperClass, false, Ivars);
17362c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  if (!leafClass) {
17372c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(),
17382c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian         E = OI->ivar_end(); I != E; ++I)
1739581deb3da481053c4993c7600f97acf7768caac5David Blaikie      Ivars.push_back(*I);
17403060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  } else {
1741bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian    ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI);
1742db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose    for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
1743bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian         Iv= Iv->getNextIvar())
1744bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian      Ivars.push_back(Iv);
1745bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian  }
17469820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian}
17479820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian
1748e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// CollectInheritedProtocols - Collect all protocols in current class and
1749e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// those inherited by it.
1750e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid ASTContext::CollectInheritedProtocols(const Decl *CDecl,
1751432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian                          llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) {
1752e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
175353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    // We can use protocol_iterator here instead of
175453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    // all_referenced_protocol_iterator since we are walking all categories.
175553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    for (ObjCInterfaceDecl::all_protocol_iterator P = OI->all_referenced_protocol_begin(),
175653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek         PE = OI->all_referenced_protocol_end(); P != PE; ++P) {
1757e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
17583fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1759e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1760b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P) {
17613fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor        Protocols.insert((*P)->getCanonicalDecl());
1762e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1763e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      }
1764b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian    }
1765e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
1766e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    // Categories of this Interface.
1767d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    for (ObjCInterfaceDecl::visible_categories_iterator
1768d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           Cat = OI->visible_categories_begin(),
1769d329724745b49f894b768d47275b7c2713106e89Douglas Gregor           CatEnd = OI->visible_categories_end();
1770d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         Cat != CatEnd; ++Cat) {
1771d329724745b49f894b768d47275b7c2713106e89Douglas Gregor      CollectInheritedProtocols(*Cat, Protocols);
1772d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    }
1773d329724745b49f894b768d47275b7c2713106e89Douglas Gregor
1774e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    if (ObjCInterfaceDecl *SD = OI->getSuperClass())
1775e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      while (SD) {
1776e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(SD, Protocols);
1777e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        SD = SD->getSuperClass();
1778e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      }
1779b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer  } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
178053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    for (ObjCCategoryDecl::protocol_iterator P = OC->protocol_begin(),
1781e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian         PE = OC->protocol_end(); P != PE; ++P) {
1782e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
17833fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1784e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1785e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P)
1786e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1787e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
1788b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer  } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
1789e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(),
1790e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian         PE = OP->protocol_end(); P != PE; ++P) {
1791e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      ObjCProtocolDecl *Proto = (*P);
17923fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor      Protocols.insert(Proto->getCanonicalDecl());
1793e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(),
1794e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian           PE = Proto->protocol_end(); P != PE; ++P)
1795e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        CollectInheritedProtocols(*P, Protocols);
1796e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
1797e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
1798e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian}
1799e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
18004ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const {
18013bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  unsigned count = 0;
18023bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // Count ivars declared in class extension.
1803d329724745b49f894b768d47275b7c2713106e89Douglas Gregor  for (ObjCInterfaceDecl::known_extensions_iterator
1804d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         Ext = OI->known_extensions_begin(),
1805d329724745b49f894b768d47275b7c2713106e89Douglas Gregor         ExtEnd = OI->known_extensions_end();
1806d329724745b49f894b768d47275b7c2713106e89Douglas Gregor       Ext != ExtEnd; ++Ext) {
1807d329724745b49f894b768d47275b7c2713106e89Douglas Gregor    count += Ext->ivar_size();
1808d329724745b49f894b768d47275b7c2713106e89Douglas Gregor  }
1809d329724745b49f894b768d47275b7c2713106e89Douglas Gregor
18103bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // Count ivar defined in this class's implementation.  This
18113bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  // includes synthesized ivars.
18123bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian  if (ObjCImplementationDecl *ImplDecl = OI->getImplementation())
1813b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer    count += ImplDecl->ivar_size();
1814b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer
18158e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian  return count;
18168e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian}
18178e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian
18188deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidisbool ASTContext::isSentinelNullExpr(const Expr *E) {
18198deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (!E)
18208deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis    return false;
18218deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
18228deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  // nullptr_t is always treated as null.
18238deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (E->getType()->isNullPtrType()) return true;
18248deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
18258deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (E->getType()->isAnyPointerType() &&
18268deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis      E->IgnoreParenCasts()->isNullPointerConstant(*this,
18278deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis                                                Expr::NPC_ValueDependentIsNull))
18288deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis    return true;
18298deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
18308deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  // Unfortunately, __null has type 'int'.
18318deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  if (isa<GNUNullExpr>(E)) return true;
18328deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
18338deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis  return false;
18348deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis}
18358deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis
18368a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists.
18378a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) {
18388a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
18398a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    I = ObjCImpls.find(D);
18408a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  if (I != ObjCImpls.end())
18418a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    return cast<ObjCImplementationDecl>(I->second);
18428a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  return 0;
18438a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
18448a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists.
18458a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) {
18468a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
18478a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    I = ObjCImpls.find(D);
18488a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  if (I != ObjCImpls.end())
18498a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    return cast<ObjCCategoryImplDecl>(I->second);
18508a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  return 0;
18518a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
18528a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis
18538a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCInterfaceDecl.
18548a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD,
18558a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis                           ObjCImplementationDecl *ImplD) {
18568a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  assert(IFaceD && ImplD && "Passed null params");
18578a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  ObjCImpls[IFaceD] = ImplD;
18588a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
18598a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCCategoryDecl.
18608a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD,
18618a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis                           ObjCCategoryImplDecl *ImplD) {
18628a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  assert(CatD && ImplD && "Passed null params");
18638a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis  ObjCImpls[CatD] = ImplD;
18648a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis}
18658a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis
1866b35cc2d46c4188a0b2d094b3104ce69092c34802Dmitri Gribenkoconst ObjCInterfaceDecl *ASTContext::getObjContainingInterface(
1867b35cc2d46c4188a0b2d094b3104ce69092c34802Dmitri Gribenko                                              const NamedDecl *ND) const {
1868b35cc2d46c4188a0b2d094b3104ce69092c34802Dmitri Gribenko  if (const ObjCInterfaceDecl *ID =
1869b35cc2d46c4188a0b2d094b3104ce69092c34802Dmitri Gribenko          dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext()))
187087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return ID;
1871b35cc2d46c4188a0b2d094b3104ce69092c34802Dmitri Gribenko  if (const ObjCCategoryDecl *CD =
1872b35cc2d46c4188a0b2d094b3104ce69092c34802Dmitri Gribenko          dyn_cast<ObjCCategoryDecl>(ND->getDeclContext()))
187387ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return CD->getClassInterface();
1874b35cc2d46c4188a0b2d094b3104ce69092c34802Dmitri Gribenko  if (const ObjCImplDecl *IMD =
1875b35cc2d46c4188a0b2d094b3104ce69092c34802Dmitri Gribenko          dyn_cast<ObjCImplDecl>(ND->getDeclContext()))
187687ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis    return IMD->getClassInterface();
187787ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis
187887ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis  return 0;
187987ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis}
188087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis
18811ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Get the copy initialization expression of VarDecl,or NULL if
18821ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// none exists.
1883830937bc1100fba7682f7c32c40512085870f50cFariborz JahanianExpr *ASTContext::getBlockVarCopyInits(const VarDecl*VD) {
1884d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD && "Passed null params");
1885d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD->hasAttr<BlocksAttr>() &&
1886d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian         "getBlockVarCopyInits - not __block var");
1887830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian  llvm::DenseMap<const VarDecl*, Expr*>::iterator
1888d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian    I = BlockVarCopyInits.find(VD);
18891ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  return (I != BlockVarCopyInits.end()) ? cast<Expr>(I->second) : 0;
18901ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian}
18911ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian
18921ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Set the copy inialization expression of a block var decl.
18931ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanianvoid ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) {
18941ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  assert(VD && Init && "Passed null params");
1895d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian  assert(VD->hasAttr<BlocksAttr>() &&
1896d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian         "setBlockVarCopyInits - not __block var");
18971ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian  BlockVarCopyInits[VD] = Init;
18981ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian}
18991ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian
1900a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T,
19014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                 unsigned DataSize) const {
1902109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall  if (!DataSize)
1903109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall    DataSize = TypeLoc::getFullDataSizeForType(T);
1904109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall  else
1905109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall    assert(DataSize == TypeLoc::getFullDataSizeForType(T) &&
1906a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall           "incorrect data size provided to CreateTypeSourceInfo!");
1907109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall
1908a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *TInfo =
1909a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8);
1910a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  new (TInfo) TypeSourceInfo(T);
1911a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TInfo;
1912b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
1913b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
1914a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T,
19156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                     SourceLocation L) const {
1916a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = CreateTypeSourceInfo(T);
1917c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L);
1918a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall  return DI;
1919a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall}
1920a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall
1921b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout &
19224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const {
1923b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar  return getObjCLayout(D, 0);
1924b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar}
1925b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar
1926b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout &
19274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCImplementationLayout(
19284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                        const ObjCImplementationDecl *D) const {
1929b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar  return getObjCLayout(D->getClassInterface(), D);
1930b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar}
1931b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar
1932a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===//
1933a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//                   Type creation/memoization methods
1934a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===//
1935a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
19364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
19373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const {
19383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  unsigned fastQuals = quals.getFastQualifiers();
19393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  quals.removeFastQualifiers();
19400953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
19410953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Check if we've already instantiated this type.
19420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  llvm::FoldingSetNodeID ID;
19433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQuals::Profile(ID, baseType, quals);
19443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
19453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
19463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    assert(eq->getQualifiers() == quals);
19473b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(eq, fastQuals);
19480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  }
19490953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
19503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If the base type is not canonical, make the appropriate canonical type.
19513b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon;
19523b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!baseType->isCanonicalUnqualified()) {
19533b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split();
1954200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canonSplit.Quals.addConsistentQualifiers(quals);
1955200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getExtQualType(canonSplit.Ty, canonSplit.Quals);
19563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
19573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    // Re-find the insert position.
19583b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
19593b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
19603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
19613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQuals *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals);
19623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExtQualNodes.InsertNode(eq, insertPos);
19633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(eq, fastQuals);
19640953e767ff7817f97b3ab20896b229891eeff45bJohn McCall}
19650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
19664ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
19674ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const {
1968f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  QualType CanT = getCanonicalType(T);
1969f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  if (CanT.getAddressSpace() == AddressSpace)
1970f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    return T;
1971b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner
19720953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If we are composing extended qualifiers together, merge together
19730953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // into one ExtQuals node.
19740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  QualifierCollector Quals;
19750953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  const Type *TypeNode = Quals.strip(T);
19761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If this type already has an address space specified, it cannot get
19780953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // another one.
19790953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  assert(!Quals.hasAddressSpace() &&
19800953e767ff7817f97b3ab20896b229891eeff45bJohn McCall         "Type cannot be in multiple addr spaces!");
19810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  Quals.addAddressSpace(AddressSpace);
19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getExtQualType(TypeNode, Quals);
1984ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb}
1985ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
1986b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris LattnerQualType ASTContext::getObjCGCQualType(QualType T,
19874ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                       Qualifiers::GC GCAttr) const {
1988d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  QualType CanT = getCanonicalType(T);
1989b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner  if (CanT.getObjCGCAttr() == GCAttr)
1990d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    return T;
19911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19927f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall  if (const PointerType *ptr = T->getAs<PointerType>()) {
19937f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall    QualType Pointee = ptr->getPointeeType();
199458f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff    if (Pointee->isAnyPointerType()) {
19954027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian      QualType ResultType = getObjCGCQualType(Pointee, GCAttr);
19964027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian      return getPointerType(ResultType);
19974027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian    }
19984027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian  }
19991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20000953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If we are composing extended qualifiers together, merge together
20010953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // into one ExtQuals node.
20020953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  QualifierCollector Quals;
20030953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  const Type *TypeNode = Quals.strip(T);
20041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20050953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If this type already has an ObjCGC specified, it cannot get
20060953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // another one.
20070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  assert(!Quals.hasObjCGCAttr() &&
20080953e767ff7817f97b3ab20896b229891eeff45bJohn McCall         "Type cannot have multiple ObjCGCs!");
20090953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  Quals.addObjCGCAttr(GCAttr);
20101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20110953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getExtQualType(TypeNode, Quals);
2012d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian}
2013a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner
2014e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCallconst FunctionType *ASTContext::adjustFunctionType(const FunctionType *T,
2015e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall                                                   FunctionType::ExtInfo Info) {
2016e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  if (T->getExtInfo() == Info)
2017e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    return T;
2018e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
2019e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  QualType Result;
2020e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
2021e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    Result = getFunctionNoProtoType(FNPT->getResultType(), Info);
2022e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  } else {
2023e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    const FunctionProtoType *FPT = cast<FunctionProtoType>(T);
2024e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
2025e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall    EPI.ExtInfo = Info;
2026bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose    Result = getFunctionType(FPT->getResultType(),
2027bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                             ArrayRef<QualType>(FPT->arg_type_begin(),
2028bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                                                FPT->getNumArgs()),
2029bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                             EPI);
2030e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  }
2031e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
2032e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall  return cast<FunctionType>(Result.getTypePtr());
2033e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall}
2034e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall
20355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getComplexType - Return the uniqued reference to the type for a complex
20365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// number with the specified element type.
20374ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getComplexType(QualType T) const {
20385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
20395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
20405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
20415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ComplexType::Profile(ID, T);
20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
20445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
20455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(CT, 0);
20461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the pointee type isn't canonical, this won't be a canonical type either,
20485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
20495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2050467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!T.isCanonical()) {
2051f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner    Canonical = getComplexType(getCanonicalType(T));
20521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
20545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
2055c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
20565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
20576b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical);
20585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
20595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ComplexTypes.InsertNode(New, InsertPos);
20605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
20615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
20625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
20635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getPointerType - Return the uniqued reference to the type for a pointer to
20645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the specified type.
20654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPointerType(QualType T) const {
20665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
20675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
20685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
20695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PointerType::Profile(ID, T);
20701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
20725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
20735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(PT, 0);
20741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the pointee type isn't canonical, this won't be a canonical type either,
20765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
20775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2078c90cc9374f18396251760b9fe6468fd1232e9f0eBob Wilson  if (!T.isCanonical()) {
2079f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner    Canonical = getPointerType(getCanonicalType(T));
20801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2081c90cc9374f18396251760b9fe6468fd1232e9f0eBob Wilson    // Get the new insert position for the node we care about.
2082c90cc9374f18396251760b9fe6468fd1232e9f0eBob Wilson    PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2083c90cc9374f18396251760b9fe6468fd1232e9f0eBob Wilson    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
2084c90cc9374f18396251760b9fe6468fd1232e9f0eBob Wilson  }
20856b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical);
20865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
20875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PointerTypes.InsertNode(New, InsertPos);
20885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
20895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
20905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
20911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getBlockPointerType - Return the uniqued reference to the type for
20925618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff/// a pointer to the specified block.
20934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockPointerType(QualType T) const {
2094296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff  assert(T->isFunctionType() && "block of function types only");
2095296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff  // Unique pointers, to guarantee there is only one block of a particular
20965618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  // structure.
20975618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  llvm::FoldingSetNodeID ID;
20985618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  BlockPointerType::Profile(ID, T);
20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21005618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  void *InsertPos = 0;
21015618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  if (BlockPointerType *PT =
21025618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff        BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
21035618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    return QualType(PT, 0);
21041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // If the block pointee type isn't canonical, this won't be a canonical
21065618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  // type either so fill in the canonical type field.
21075618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  QualType Canonical;
2108467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!T.isCanonical()) {
21095618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    Canonical = getBlockPointerType(getCanonicalType(T));
21101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21115618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    // Get the new insert position for the node we care about.
21125618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff    BlockPointerType *NewIP =
21135618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff      BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2114c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
21155618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  }
21166b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  BlockPointerType *New
21176b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) BlockPointerType(T, Canonical);
21185618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  Types.push_back(New);
21195618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  BlockPointerTypes.InsertNode(New, InsertPos);
21205618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  return QualType(New, 0);
21215618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff}
21225618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff
21237c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getLValueReferenceType - Return the uniqued reference to the type for an
21247c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// lvalue reference to the specified type.
21254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
21264ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const {
21279625e44c0252485277a340746ed8ac950686156fDouglas Gregor  assert(getCanonicalType(T) != OverloadTy &&
21289625e44c0252485277a340746ed8ac950686156fDouglas Gregor         "Unresolved overloaded function type");
21299625e44c0252485277a340746ed8ac950686156fDouglas Gregor
21305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique pointers, to guarantee there is only one pointer of a particular
21315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
21325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
213354e14c4db764c0636160d26c5bbf491637c83a76John McCall  ReferenceType::Profile(ID, T, SpelledAsLValue);
21345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
21355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
21367c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  if (LValueReferenceType *RT =
21377c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl        LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
21385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(RT, 0);
21397c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
214054e14c4db764c0636160d26c5bbf491637c83a76John McCall  const ReferenceType *InnerRef = T->getAs<ReferenceType>();
214154e14c4db764c0636160d26c5bbf491637c83a76John McCall
21425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the referencee type isn't canonical, this won't be a canonical type
21435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // either, so fill in the canonical type field.
21445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
214554e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
214654e14c4db764c0636160d26c5bbf491637c83a76John McCall    QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
214754e14c4db764c0636160d26c5bbf491637c83a76John McCall    Canonical = getLValueReferenceType(getCanonicalType(PointeeType));
21487c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
21497c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    // Get the new insert position for the node we care about.
21507c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    LValueReferenceType *NewIP =
21517c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl      LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
2152c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
21537c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  }
21547c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
21556b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  LValueReferenceType *New
215654e14c4db764c0636160d26c5bbf491637c83a76John McCall    = new (*this, TypeAlignment) LValueReferenceType(T, Canonical,
215754e14c4db764c0636160d26c5bbf491637c83a76John McCall                                                     SpelledAsLValue);
21587c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  Types.push_back(New);
21597c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  LValueReferenceTypes.InsertNode(New, InsertPos);
216054e14c4db764c0636160d26c5bbf491637c83a76John McCall
21617c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  return QualType(New, 0);
21627c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl}
21637c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
21647c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getRValueReferenceType - Return the uniqued reference to the type for an
21657c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// rvalue reference to the specified type.
21664ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRValueReferenceType(QualType T) const {
21677c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // Unique pointers, to guarantee there is only one pointer of a particular
21687c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // structure.
21697c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  llvm::FoldingSetNodeID ID;
217054e14c4db764c0636160d26c5bbf491637c83a76John McCall  ReferenceType::Profile(ID, T, false);
21717c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
21727c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  void *InsertPos = 0;
21737c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  if (RValueReferenceType *RT =
21747c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl        RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
21757c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    return QualType(RT, 0);
21767c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
217754e14c4db764c0636160d26c5bbf491637c83a76John McCall  const ReferenceType *InnerRef = T->getAs<ReferenceType>();
217854e14c4db764c0636160d26c5bbf491637c83a76John McCall
21797c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // If the referencee type isn't canonical, this won't be a canonical type
21807c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // either, so fill in the canonical type field.
21817c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  QualType Canonical;
218254e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (InnerRef || !T.isCanonical()) {
218354e14c4db764c0636160d26c5bbf491637c83a76John McCall    QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
218454e14c4db764c0636160d26c5bbf491637c83a76John McCall    Canonical = getRValueReferenceType(getCanonicalType(PointeeType));
21857c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
21865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
21877c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    RValueReferenceType *NewIP =
21887c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl      RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
2189c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
21905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
21915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
21926b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  RValueReferenceType *New
21936b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) RValueReferenceType(T, Canonical);
21945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
21957c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  RValueReferenceTypes.InsertNode(New, InsertPos);
21965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
21975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
21985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2199f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// getMemberPointerType - Return the uniqued reference to the type for a
2200f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// member pointer to the specified type, in the specified class.
22014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const {
2202f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // Unique pointers, to guarantee there is only one pointer of a particular
2203f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // structure.
2204f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  llvm::FoldingSetNodeID ID;
2205f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  MemberPointerType::Profile(ID, T, Cls);
2206f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2207f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  void *InsertPos = 0;
2208f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  if (MemberPointerType *PT =
2209f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
2210f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    return QualType(PT, 0);
2211f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2212f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // If the pointee or class type isn't canonical, this won't be a canonical
2213f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // type either, so fill in the canonical type field.
2214f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  QualType Canonical;
221587c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor  if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) {
2216f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls));
2217f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
2218f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    // Get the new insert position for the node we care about.
2219f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    MemberPointerType *NewIP =
2220f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl      MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
2221c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
2222f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  }
22236b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  MemberPointerType *New
22246b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical);
2225f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  Types.push_back(New);
2226f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  MemberPointerTypes.InsertNode(New, InsertPos);
2227f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  return QualType(New, 0);
2228f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl}
2229f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getConstantArrayType - Return the unique reference to the type for an
2231fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff/// array of the specified element type.
22321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getConstantArrayType(QualType EltTy,
223338aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner                                          const llvm::APInt &ArySizeIn,
2234c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff                                          ArrayType::ArraySizeModifier ASM,
223563e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                          unsigned IndexTypeQuals) const {
2236923d56d436f750bc1f29db50e641078725558a1bSebastian Redl  assert((EltTy->isDependentType() ||
2237923d56d436f750bc1f29db50e641078725558a1bSebastian Redl          EltTy->isIncompleteType() || EltTy->isConstantSizeType()) &&
2238587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman         "Constant array of VLAs is illegal!");
2239587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman
224038aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  // Convert the array size into a canonical width matching the pointer size for
224138aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  // the target.
224238aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner  llvm::APInt ArySize(ArySizeIn);
22439f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad  ArySize =
2244bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    ArySize.zextOrTrunc(Target->getPointerWidth(getTargetAddressSpace(EltTy)));
22451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
224763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara  ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, IndexTypeQuals);
22481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (ConstantArrayType *ATP =
22517192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek      ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
22525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(ATP, 0);
22531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22543b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If the element type isn't canonical or has qualifiers, this won't
22553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // be a canonical type either, so fill in the canonical type field.
22563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType Canon;
22573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) {
22583b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(EltTy).split();
2259200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize,
226063e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                 ASM, IndexTypeQuals);
2261200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getQualifiedType(Canon, canonSplit.Quals);
22623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
22635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
22641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ConstantArrayType *NewIP =
22657192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek      ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
2266c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
22675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
22681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22696b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ConstantArrayType *New = new(*this,TypeAlignment)
227063e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara    ConstantArrayType(EltTy, Canon, ArySize, ASM, IndexTypeQuals);
22717192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek  ConstantArrayTypes.InsertNode(New, InsertPos);
22725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
22735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
22745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
22755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2276ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// getVariableArrayDecayedType - Turns the given type, which may be
2277ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// variably-modified, into the corresponding type with all the known
2278ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// sizes replaced with [*].
2279ce8890371fcdb983ae487c87fa40606a34896ff7John McCallQualType ASTContext::getVariableArrayDecayedType(QualType type) const {
2280ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Vastly most common case.
2281ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  if (!type->isVariablyModifiedType()) return type;
2282ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2283ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  QualType result;
2284ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2285ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  SplitQualType split = type.getSplitDesugaredType();
2286200fa53fd420aa8369586f569dbece04930ad6a3John McCall  const Type *ty = split.Ty;
2287ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  switch (ty->getTypeClass()) {
2288ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define TYPE(Class, Base)
2289ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define ABSTRACT_TYPE(Class, Base)
2290ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2291ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#include "clang/AST/TypeNodes.def"
2292ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    llvm_unreachable("didn't desugar past all non-canonical types?");
2293ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2294ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types should never be variably-modified.
2295ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Builtin:
2296ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Complex:
2297ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Vector:
2298ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ExtVector:
2299ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentSizedExtVector:
2300ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCObject:
2301ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCInterface:
2302ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ObjCObjectPointer:
2303ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Record:
2304ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Enum:
2305ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::UnresolvedUsing:
2306ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TypeOfExpr:
2307ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TypeOf:
2308ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Decltype:
2309ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  case Type::UnaryTransform:
2310ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentName:
2311ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::InjectedClassName:
2312ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TemplateSpecialization:
2313ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentTemplateSpecialization:
2314ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::TemplateTypeParm:
2315ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::SubstTemplateTypeParmPack:
231634b41d939a1328f484511c6002ba2456db879a29Richard Smith  case Type::Auto:
2317ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::PackExpansion:
2318ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    llvm_unreachable("type should never be variably-modified");
2319ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2320ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types can be variably-modified but should never need to
2321ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // further decay.
2322ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::FunctionNoProto:
2323ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::FunctionProto:
2324ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::BlockPointer:
2325ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::MemberPointer:
2326ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    return type;
2327ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2328ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // These types can be variably-modified.  All these modifications
2329ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // preserve structure except as noted by comments.
2330ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // TODO: if we ever care about optimizing VLAs, there are no-op
2331ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // optimizations available here.
2332ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::Pointer:
2333ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getPointerType(getVariableArrayDecayedType(
2334ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                              cast<PointerType>(ty)->getPointeeType()));
2335ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2336ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2337ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::LValueReference: {
2338ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const LValueReferenceType *lv = cast<LValueReferenceType>(ty);
2339ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getLValueReferenceType(
2340ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(lv->getPointeeType()),
2341ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                    lv->isSpelledAsLValue());
2342ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2343745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2344ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2345ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::RValueReference: {
2346ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const RValueReferenceType *lv = cast<RValueReferenceType>(ty);
2347ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getRValueReferenceType(
2348ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(lv->getPointeeType()));
2349ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2350745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2351745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2352b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic: {
2353b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    const AtomicType *at = cast<AtomicType>(ty);
2354b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    result = getAtomicType(getVariableArrayDecayedType(at->getValueType()));
2355b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    break;
2356b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
2357b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
2358ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::ConstantArray: {
2359ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const ConstantArrayType *cat = cast<ConstantArrayType>(ty);
2360ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getConstantArrayType(
2361ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(cat->getElementType()),
2362ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getSize(),
2363ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getSizeModifier(),
2364ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  cat->getIndexTypeCVRQualifiers());
2365ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2366745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  }
2367745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2368ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::DependentSizedArray: {
2369ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const DependentSizedArrayType *dat = cast<DependentSizedArrayType>(ty);
2370ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getDependentSizedArrayType(
2371ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(dat->getElementType()),
2372ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getSizeExpr(),
2373ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getSizeModifier(),
2374ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getIndexTypeCVRQualifiers(),
2375ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                        dat->getBracketsRange());
2376ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2377ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2378ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2379ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Turn incomplete types into [*] types.
2380ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::IncompleteArray: {
2381ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const IncompleteArrayType *iat = cast<IncompleteArrayType>(ty);
2382ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getVariableArrayType(
2383ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(iat->getElementType()),
2384ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  /*size*/ 0,
2385ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  ArrayType::Normal,
2386ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  iat->getIndexTypeCVRQualifiers(),
2387ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  SourceRange());
2388ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2389ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2390ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2391ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Turn VLA types into [*] types.
2392ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  case Type::VariableArray: {
2393ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    const VariableArrayType *vat = cast<VariableArrayType>(ty);
2394ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    result = getVariableArrayType(
2395ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                 getVariableArrayDecayedType(vat->getElementType()),
2396ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  /*size*/ 0,
2397ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  ArrayType::Star,
2398ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  vat->getIndexTypeCVRQualifiers(),
2399ce8890371fcdb983ae487c87fa40606a34896ff7John McCall                                  vat->getBracketsRange());
2400ce8890371fcdb983ae487c87fa40606a34896ff7John McCall    break;
2401ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2402ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  }
2403ce8890371fcdb983ae487c87fa40606a34896ff7John McCall
2404ce8890371fcdb983ae487c87fa40606a34896ff7John McCall  // Apply the top-level qualifiers from the original.
2405200fa53fd420aa8369586f569dbece04930ad6a3John McCall  return getQualifiedType(result, split.Quals);
2406ce8890371fcdb983ae487c87fa40606a34896ff7John McCall}
2407745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
2408bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// getVariableArrayType - Returns a non-unique reference to the type for a
2409bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// variable array of the specified element type.
24107e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas GregorQualType ASTContext::getVariableArrayType(QualType EltTy,
24117e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                          Expr *NumElts,
2412c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff                                          ArrayType::ArraySizeModifier ASM,
241363e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                          unsigned IndexTypeQuals,
24144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          SourceRange Brackets) const {
2415c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // Since we don't unique expressions, it isn't possible to unique VLA's
2416c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // that have an expression provided for their size.
24173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType Canon;
2418715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor
24193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Be sure to pull qualifiers off the element type.
24203b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) {
24213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(EltTy).split();
2422200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM,
242363e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara                                 IndexTypeQuals, Brackets);
2424200fa53fd420aa8369586f569dbece04930ad6a3John McCall    Canon = getQualifiedType(Canon, canonSplit.Quals);
2425715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor  }
2426715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor
24276b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  VariableArrayType *New = new(*this, TypeAlignment)
242863e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara    VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets);
2429c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2430c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  VariableArrayTypes.push_back(New);
2431c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  Types.push_back(New);
2432c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return QualType(New, 0);
2433c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman}
2434c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2435898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// getDependentSizedArrayType - Returns a non-unique reference to
2436898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// the type for a dependently-sized array of the specified element
243704d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor/// type.
24383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getDependentSizedArrayType(QualType elementType,
24393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                Expr *numElements,
2440898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                                                ArrayType::ArraySizeModifier ASM,
24413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                unsigned elementTypeQuals,
24423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                SourceRange brackets) const {
24433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  assert((!numElements || numElements->isTypeDependent() ||
24443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall          numElements->isValueDependent()) &&
2445898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor         "Size must be type- or value-dependent!");
2446898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
24473b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Dependently-sized array types that do not have a specified number
24483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // of elements will have their sizes deduced from a dependent
24493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // initializer.  We do no canonicalization here at all, which is okay
24503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // because they can't be used in most locations.
24513b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!numElements) {
24523b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayType *newType
24533b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      = new (*this, TypeAlignment)
24543b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall          DependentSizedArrayType(*this, elementType, QualType(),
24553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                  numElements, ASM, elementTypeQuals,
24563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                  brackets);
24573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    Types.push_back(newType);
24583b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(newType, 0);
2459cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor  }
2460cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor
24613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Otherwise, we actually build a new type every time, but we
24623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // also build a canonical type.
24631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  SplitQualType canonElementType = getCanonicalType(elementType).split();
2465898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
24663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
24673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  llvm::FoldingSetNodeID ID;
24683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType::Profile(ID, *this,
2469200fa53fd420aa8369586f569dbece04930ad6a3John McCall                                   QualType(canonElementType.Ty, 0),
24703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                   ASM, elementTypeQuals, numElements);
24713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Look for an existing type with these properties.
24733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType *canonTy =
24743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
24753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If we don't have one, build one.
24773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!canonTy) {
24783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    canonTy = new (*this, TypeAlignment)
2479200fa53fd420aa8369586f569dbece04930ad6a3John McCall      DependentSizedArrayType(*this, QualType(canonElementType.Ty, 0),
24803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                              QualType(), numElements, ASM, elementTypeQuals,
24813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                              brackets);
24823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
24833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    Types.push_back(canonTy);
24843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
24853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24863b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Apply qualifiers from the element type to the array.
24873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon = getQualifiedType(QualType(canonTy,0),
2488200fa53fd420aa8369586f569dbece04930ad6a3John McCall                                    canonElementType.Quals);
24893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24903b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // If we didn't need extra canonicalization for the element type,
24913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // then just use that as our result.
2492200fa53fd420aa8369586f569dbece04930ad6a3John McCall  if (QualType(canonElementType.Ty, 0) == elementType)
24933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return canon;
24943b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
24953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Otherwise, we need to build a type which follows the spelling
24963b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // of the element type.
24973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  DependentSizedArrayType *sugaredType
24983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    = new (*this, TypeAlignment)
24993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall        DependentSizedArrayType(*this, elementType, canon, numElements,
25003b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                ASM, elementTypeQuals, brackets);
25013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Types.push_back(sugaredType);
25023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(sugaredType, 0);
25033b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall}
25043b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
25053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getIncompleteArrayType(QualType elementType,
2506c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman                                            ArrayType::ArraySizeModifier ASM,
25073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                            unsigned elementTypeQuals) const {
2508c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  llvm::FoldingSetNodeID ID;
25093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals);
2510c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
25113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  void *insertPos = 0;
25123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (IncompleteArrayType *iat =
25133b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall       IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
25143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return QualType(iat, 0);
2515c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2516c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If the element type isn't canonical, this won't be a canonical type
25173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // either, so fill in the canonical type field.  We also have to pull
25183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // qualifiers off the element type.
25193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType canon;
2520c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
25213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) {
25223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType canonSplit = getCanonicalType(elementType).split();
2523200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0),
25243b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                   ASM, elementTypeQuals);
2525200fa53fd420aa8369586f569dbece04930ad6a3John McCall    canon = getQualifiedType(canon, canonSplit.Quals);
2526c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
2527c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    // Get the new insert position for the node we care about.
25283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    IncompleteArrayType *existing =
25293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
25303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    assert(!existing && "Shouldn't be in the map!"); (void) existing;
25312bd24ba6d10f8c811c8e2a57c8397e07082ba497Ted Kremenek  }
2532c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
25333b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayType *newType = new (*this, TypeAlignment)
25343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    IncompleteArrayType(elementType, canon, ASM, elementTypeQuals);
2535c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
25363b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  IncompleteArrayTypes.InsertNode(newType, insertPos);
25373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Types.push_back(newType);
25383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return QualType(newType, 0);
2539fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff}
2540fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
254173322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// getVectorType - Return the unique reference to a vector type of
254273322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type.
254382287d19ded35248c4ce6a425ce74116a13ce44eJohn ThompsonQualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
25444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                   VectorType::VectorKind VecKind) const {
25453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  assert(vecType->isBuiltinType());
25461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Check if we've already instantiated a vector of this type.
25485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
2549e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson  VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind);
2550788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner
25515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
25525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
25535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(VTP, 0);
25545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
25555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If the element type isn't canonical, this won't be a canonical type either,
25565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // so fill in the canonical type field.
25575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2558255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  if (!vecType.isCanonical()) {
2559231da7eb3dd13007e5e40fffe48998e5ef284e06Bob Wilson    Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind);
25601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
25625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2563c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
25645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
25656b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  VectorType *New = new (*this, TypeAlignment)
2566e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson    VectorType(vecType, NumElts, Canonical, VecKind);
25675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  VectorTypes.InsertNode(New, InsertPos);
25685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
25695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
25705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
25715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2572213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman/// getExtVectorType - Return the unique reference to an extended vector type of
257373322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type.
25744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
25754ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const {
25764ac01401b1ec602a1f58c217544d3dcb5fcbd7f1Douglas Gregor  assert(vecType->isBuiltinType() || vecType->isDependentType());
25771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
257873322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // Check if we've already instantiated a vector of this type.
257973322924127c873c13101b705dd823f5539ffa5fSteve Naroff  llvm::FoldingSetNodeID ID;
2580788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  VectorType::Profile(ID, vecType, NumElts, Type::ExtVector,
2581e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                      VectorType::GenericVector);
258273322924127c873c13101b705dd823f5539ffa5fSteve Naroff  void *InsertPos = 0;
258373322924127c873c13101b705dd823f5539ffa5fSteve Naroff  if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
258473322924127c873c13101b705dd823f5539ffa5fSteve Naroff    return QualType(VTP, 0);
258573322924127c873c13101b705dd823f5539ffa5fSteve Naroff
258673322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // If the element type isn't canonical, this won't be a canonical type either,
258773322924127c873c13101b705dd823f5539ffa5fSteve Naroff  // so fill in the canonical type field.
258873322924127c873c13101b705dd823f5539ffa5fSteve Naroff  QualType Canonical;
2589467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  if (!vecType.isCanonical()) {
2590213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    Canonical = getExtVectorType(getCanonicalType(vecType), NumElts);
25911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259273322924127c873c13101b705dd823f5539ffa5fSteve Naroff    // Get the new insert position for the node we care about.
259373322924127c873c13101b705dd823f5539ffa5fSteve Naroff    VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2594c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
259573322924127c873c13101b705dd823f5539ffa5fSteve Naroff  }
25966b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  ExtVectorType *New = new (*this, TypeAlignment)
25976b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    ExtVectorType(vecType, NumElts, Canonical);
259873322924127c873c13101b705dd823f5539ffa5fSteve Naroff  VectorTypes.InsertNode(New, InsertPos);
259973322924127c873c13101b705dd823f5539ffa5fSteve Naroff  Types.push_back(New);
260073322924127c873c13101b705dd823f5539ffa5fSteve Naroff  return QualType(New, 0);
260173322924127c873c13101b705dd823f5539ffa5fSteve Naroff}
260273322924127c873c13101b705dd823f5539ffa5fSteve Naroff
26034ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
26044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentSizedExtVectorType(QualType vecType,
26054ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           Expr *SizeExpr,
26064ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           SourceLocation AttrLoc) const {
26072ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  llvm::FoldingSetNodeID ID;
26081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType),
26092ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor                                       SizeExpr);
26101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26112ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  void *InsertPos = 0;
26122ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  DependentSizedExtVectorType *Canon
26132ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
26142ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  DependentSizedExtVectorType *New;
26152ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  if (Canon) {
26162ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    // We already have a canonical version of this array type; use it as
26172ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    // the canonical type for a newly-built type.
26186b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    New = new (*this, TypeAlignment)
26196b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0),
26206b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                                  SizeExpr, AttrLoc);
26212ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  } else {
26222ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    QualType CanonVecTy = getCanonicalType(vecType);
26232ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    if (CanonVecTy == vecType) {
26246b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      New = new (*this, TypeAlignment)
26256b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr,
26266b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                                    AttrLoc);
2627789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
2628789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      DependentSizedExtVectorType *CanonCheck
2629789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor        = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
2630789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken");
2631789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      (void)CanonCheck;
26322ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor      DependentSizedExtVectorTypes.InsertNode(New, InsertPos);
26332ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    } else {
26342ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor      QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr,
26352ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor                                                      SourceLocation());
26366b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      New = new (*this, TypeAlignment)
26376b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc);
26382ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor    }
26392ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor  }
26401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26419cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  Types.push_back(New);
26429cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  return QualType(New, 0);
26439cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor}
26449cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor
264572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'.
26465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
26474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
26484ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionNoProtoType(QualType ResultTy,
26494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                   const FunctionType::ExtInfo &Info) const {
2650cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv DefaultCC = Info.getCC();
2651cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ?
2652cfe9af250f466e7e38becea4428990448ae07737Roman Divacky                               CC_X86StdCall : DefaultCC;
26535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique functions, to guarantee there is only one function of a particular
26545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
26555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
2656264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionNoProtoType::Profile(ID, ResultTy, Info);
26571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
26591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (FunctionNoProtoType *FT =
266072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor        FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
26615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(FT, 0);
26621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
2664ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor  if (!ResultTy.isCanonical() ||
266504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall      getCanonicalCallConv(CallConv) != CallConv) {
2666264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola    Canonical =
2667264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      getFunctionNoProtoType(getCanonicalType(ResultTy),
2668264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                     Info.withCallingConv(getCanonicalCallConv(CallConv)));
26691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
267172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    FunctionNoProtoType *NewIP =
267272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor      FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
2673c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
26745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
26751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2676cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  FunctionProtoType::ExtInfo newInfo = Info.withCallingConv(CallConv);
26776b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  FunctionNoProtoType *New = new (*this, TypeAlignment)
2678cfe9af250f466e7e38becea4428990448ae07737Roman Divacky    FunctionNoProtoType(ResultTy, Canonical, newInfo);
26795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(New);
268072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  FunctionNoProtoTypes.InsertNode(New, InsertPos);
26815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(New, 0);
26825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
26835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
268402dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor/// \brief Determine whether \p T is canonical as the result type of a function.
268502dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregorstatic bool isCanonicalResultType(QualType T) {
268602dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor  return T.isCanonical() &&
268702dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor         (T.getObjCLifetime() == Qualifiers::OCL_None ||
268802dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor          T.getObjCLifetime() == Qualifiers::OCL_ExplicitNone);
268902dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor}
269002dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor
26915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFunctionType - Return a normal function type with a typed argument
26925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// list.  isVariadic indicates whether the argument list includes '...'.
26934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType
2694bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan RoseASTContext::getFunctionType(QualType ResultTy, ArrayRef<QualType> ArgArray,
26954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                            const FunctionProtoType::ExtProtoInfo &EPI) const {
2696bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose  size_t NumArgs = ArgArray.size();
2697bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose
26985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Unique functions, to guarantee there is only one function of a particular
26995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // structure.
27005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::FoldingSetNodeID ID;
2701bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose  FunctionProtoType::Profile(ID, ResultTy, ArgArray.begin(), NumArgs, EPI,
2702bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                             *this);
27035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
27045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void *InsertPos = 0;
27051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (FunctionProtoType *FTP =
270672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor        FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
27075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return QualType(FTP, 0);
2708465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2709465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  // Determine whether the type being created is already canonical or not.
2710eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith  bool isCanonical =
271102dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    EPI.ExceptionSpecType == EST_None && isCanonicalResultType(ResultTy) &&
2712eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith    !EPI.HasTrailingReturn;
27135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0; i != NumArgs && isCanonical; ++i)
271454e14c4db764c0636160d26c5bbf491637c83a76John McCall    if (!ArgArray[i].isCanonicalAsParam())
27155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      isCanonical = false;
27165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2717cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv DefaultCC = EPI.ExtInfo.getCC();
2718cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ?
2719cfe9af250f466e7e38becea4428990448ae07737Roman Divacky                               CC_X86StdCall : DefaultCC;
2720e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
27215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this type isn't canonical, get the canonical version of it.
2722465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  // The exception spec is not part of the canonical type.
27235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType Canonical;
272404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall  if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) {
27255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<QualType, 16> CanonicalArgs;
27265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    CanonicalArgs.reserve(NumArgs);
27275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    for (unsigned i = 0; i != NumArgs; ++i)
272854e14c4db764c0636160d26c5bbf491637c83a76John McCall      CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i]));
2729465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2730e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
2731eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith    CanonicalEPI.HasTrailingReturn = false;
27328b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl    CanonicalEPI.ExceptionSpecType = EST_None;
27338b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl    CanonicalEPI.NumExceptions = 0;
2734e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    CanonicalEPI.ExtInfo
2735e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall      = CanonicalEPI.ExtInfo.withCallingConv(getCanonicalCallConv(CallConv));
2736e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
273702dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    // Result types do not have ARC lifetime qualifiers.
273802dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    QualType CanResultTy = getCanonicalType(ResultTy);
273902dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    if (ResultTy.getQualifiers().hasObjCLifetime()) {
274002dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor      Qualifiers Qs = CanResultTy.getQualifiers();
274102dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor      Qs.removeObjCLifetime();
274202dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor      CanResultTy = getQualifiedType(CanResultTy.getUnqualifiedType(), Qs);
274302dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor    }
274402dd79830979e6d83d4420377e8f4c9e4a77439bDouglas Gregor
2745bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose    Canonical = getFunctionType(CanResultTy, CanonicalArgs, CanonicalEPI);
2746465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
27475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Get the new insert position for the node we care about.
274872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    FunctionProtoType *NewIP =
274972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor      FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
2750c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
27515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2752465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
2753f85e193739c953358c865005855253af4f68a497John McCall  // FunctionProtoType objects are allocated with extra bytes after
2754f85e193739c953358c865005855253af4f68a497John McCall  // them for three variable size arrays at the end:
2755f85e193739c953358c865005855253af4f68a497John McCall  //  - parameter types
2756f85e193739c953358c865005855253af4f68a497John McCall  //  - exception types
2757f85e193739c953358c865005855253af4f68a497John McCall  //  - consumed-arguments flags
2758f85e193739c953358c865005855253af4f68a497John McCall  // Instead of the exception types, there could be a noexcept
2759b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  // expression, or information used to resolve the exception
2760b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  // specification.
2761e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  size_t Size = sizeof(FunctionProtoType) +
276260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl                NumArgs * sizeof(QualType);
2763b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  if (EPI.ExceptionSpecType == EST_Dynamic) {
276460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    Size += EPI.NumExceptions * sizeof(QualType);
2765b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  } else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) {
27668026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl    Size += sizeof(Expr*);
2767e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  } else if (EPI.ExceptionSpecType == EST_Uninstantiated) {
276813bffc532bafd45d4a77867993c1afb83c7661beRichard Smith    Size += 2 * sizeof(FunctionDecl*);
2769b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith  } else if (EPI.ExceptionSpecType == EST_Unevaluated) {
2770b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith    Size += sizeof(FunctionDecl*);
277160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  }
2772f85e193739c953358c865005855253af4f68a497John McCall  if (EPI.ConsumedArguments)
2773f85e193739c953358c865005855253af4f68a497John McCall    Size += NumArgs * sizeof(bool);
2774f85e193739c953358c865005855253af4f68a497John McCall
2775e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment);
2776cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  FunctionProtoType::ExtProtoInfo newEPI = EPI;
2777cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv);
2778bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose  new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
27795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Types.push_back(FTP);
278072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  FunctionProtoTypes.InsertNode(FTP, InsertPos);
27815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return QualType(FTP, 0);
27825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
27835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
27843cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#ifndef NDEBUG
27853cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallstatic bool NeedsInjectedClassNameType(const RecordDecl *D) {
27863cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!isa<CXXRecordDecl>(D)) return false;
27873cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  const CXXRecordDecl *RD = cast<CXXRecordDecl>(D);
27883cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (isa<ClassTemplatePartialSpecializationDecl>(RD))
27893cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    return true;
27903cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (RD->getDescribedClassTemplate() &&
27913cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall      !isa<ClassTemplateSpecializationDecl>(RD))
27923cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    return true;
27933cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return false;
27943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
27953cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif
27963cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
27973cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// getInjectedClassNameType - Return the unique reference to the
27983cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// injected class name type for the specified templated declaration.
27993cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl,
28004ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                              QualType TST) const {
28013cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  assert(NeedsInjectedClassNameType(Decl));
28023cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (Decl->TypeForDecl) {
28033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
2804ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) {
28053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(PrevDecl->TypeForDecl && "previous declaration has no type");
28063cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    Decl->TypeForDecl = PrevDecl->TypeForDecl;
28073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
28083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  } else {
2809f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Type *newType =
281031f17ecbef57b5679c017c375db330546b7b5145John McCall      new (*this, TypeAlignment) InjectedClassNameType(Decl, TST);
2811f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Decl->TypeForDecl = newType;
2812f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Types.push_back(newType);
28133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  }
28143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return QualType(Decl->TypeForDecl, 0);
28153cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
28163cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
28172ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// getTypeDeclType - Return the unique reference to the type for the
28182ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// specified type declaration.
28194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const {
28201e6759e9e33dcaa73ce14c8a908ac9f87ac16463Argyrios Kyrtzidis  assert(Decl && "Passed null for Decl param");
2821becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall  assert(!Decl->TypeForDecl && "TypeForDecl present in slow case");
28221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2823162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  if (const TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Decl))
28242ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    return getTypedefType(Typedef);
2825becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall
2826becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall  assert(!isa<TemplateTypeParmDecl>(Decl) &&
2827becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall         "Template type parameter types are always available.");
2828becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall
282919c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) {
2830ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    assert(!Record->getPreviousDecl() &&
2831becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall           "struct/union has previous declaration");
2832becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall    assert(!NeedsInjectedClassNameType(Record));
2833400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    return getRecordType(Record);
283419c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) {
2835ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    assert(!Enum->getPreviousDecl() &&
2836becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall           "enum has previous declaration");
2837400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    return getEnumType(Enum);
283819c8576b7328f4dc2d07682f5da552875c1912efJohn McCall  } else if (const UnresolvedUsingTypenameDecl *Using =
2839ed97649e9574b9d854fa4d6109c9333ae0993554John McCall               dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) {
2840f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using);
2841f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Decl->TypeForDecl = newType;
2842f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    Types.push_back(newType);
28439fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump  } else
2844becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall    llvm_unreachable("TypeDecl without a type?");
284549aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis
284649aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis  return QualType(Decl->TypeForDecl, 0);
28472ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor}
28482ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor
28495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTypedefType - Return the unique reference to the type for the
2850162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// specified typedef name decl.
28519763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType
2852162e1c1b487352434552147967c3dd296ebee2f7Richard SmithASTContext::getTypedefType(const TypedefNameDecl *Decl,
2853162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                           QualType Canonical) const {
28545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
28551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28569763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  if (Canonical.isNull())
28579763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Canonical = getCanonicalType(Decl->getUnderlyingType());
2858f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  TypedefType *newType = new(*this, TypeAlignment)
28596b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    TypedefType(Type::Typedef, Decl, Canonical);
2860f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2861f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2862f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
28635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
28645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
28654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRecordType(const RecordDecl *Decl) const {
2866400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
2867400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2868ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  if (const RecordDecl *PrevDecl = Decl->getPreviousDecl())
2869400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    if (PrevDecl->TypeForDecl)
2870400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis      return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
2871400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2872f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  RecordType *newType = new (*this, TypeAlignment) RecordType(Decl);
2873f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2874f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2875f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
2876400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis}
2877400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
28784ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getEnumType(const EnumDecl *Decl) const {
2879400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis  if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
2880400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2881ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  if (const EnumDecl *PrevDecl = Decl->getPreviousDecl())
2882400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis    if (PrevDecl->TypeForDecl)
2883400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis      return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
2884400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
2885f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  EnumType *newType = new (*this, TypeAlignment) EnumType(Decl);
2886f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Decl->TypeForDecl = newType;
2887f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Types.push_back(newType);
2888f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return QualType(newType, 0);
2889400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis}
2890400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis
28919d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType ASTContext::getAttributedType(AttributedType::Kind attrKind,
28929d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                       QualType modifiedType,
28939d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                       QualType equivalentType) {
28949d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  llvm::FoldingSetNodeID id;
28959d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedType::Profile(id, attrKind, modifiedType, equivalentType);
28969d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
28979d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  void *insertPos = 0;
28989d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos);
28999d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (type) return QualType(type, 0);
29009d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
29019d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  QualType canon = getCanonicalType(equivalentType);
29029d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  type = new (*this, TypeAlignment)
29039d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall           AttributedType(canon, attrKind, modifiedType, equivalentType);
29049d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
29059d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  Types.push_back(type);
29069d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedTypes.InsertNode(type, insertPos);
29079d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
29089d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  return QualType(type, 0);
29099d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
29109d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
29119d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
291249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/// \brief Retrieve a substitution-result type.
291349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType
291449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,
29154ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                         QualType Replacement) const {
2916467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(Replacement.isCanonical()
291749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall         && "replacement types must always be canonical");
291849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
291949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  llvm::FoldingSetNodeID ID;
292049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  SubstTemplateTypeParmType::Profile(ID, Parm, Replacement);
292149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  void *InsertPos = 0;
292249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  SubstTemplateTypeParmType *SubstParm
292349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
292449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
292549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  if (!SubstParm) {
292649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    SubstParm = new (*this, TypeAlignment)
292749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall      SubstTemplateTypeParmType(Parm, Replacement);
292849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    Types.push_back(SubstParm);
292949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
293049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  }
293149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
293249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  return QualType(SubstParm, 0);
293349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
293449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
2935c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor/// \brief Retrieve a
2936c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType ASTContext::getSubstTemplateTypeParmPackType(
2937c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                          const TemplateTypeParmType *Parm,
2938c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                              const TemplateArgument &ArgPack) {
2939c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifndef NDEBUG
2940c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(),
2941c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                    PEnd = ArgPack.pack_end();
2942c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor       P != PEnd; ++P) {
2943c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type");
2944c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    assert(P->getAsType().isCanonical() && "Pack contains non-canonical type");
2945c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  }
2946c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#endif
2947c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2948c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  llvm::FoldingSetNodeID ID;
2949c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack);
2950c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  void *InsertPos = 0;
2951c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  if (SubstTemplateTypeParmPackType *SubstParm
2952c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor        = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
2953c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    return QualType(SubstParm, 0);
2954c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2955c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  QualType Canon;
2956c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  if (!Parm->isCanonicalUnqualified()) {
2957c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    Canon = getCanonicalType(QualType(Parm, 0));
2958c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon),
2959c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                             ArgPack);
2960c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
2961c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  }
2962c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2963c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmPackType *SubstParm
2964c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon,
2965c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                                               ArgPack);
2966c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  Types.push_back(SubstParm);
2967c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
2968c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  return QualType(SubstParm, 0);
2969c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
2970c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
2971fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor/// \brief Retrieve the template type parameter type for a template
29721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parameter or parameter pack with the given depth, index, and (optionally)
297376e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson/// name.
29741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
297576e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson                                             bool ParameterPack,
29764fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth                                             TemplateTypeParmDecl *TTPDecl) const {
2977fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  llvm::FoldingSetNodeID ID;
29784fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
2979fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  void *InsertPos = 0;
29801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateTypeParmType *TypeParm
2981fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor    = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
2982fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
2983fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  if (TypeParm)
2984fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor    return QualType(TypeParm, 0);
29851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29864fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  if (TTPDecl) {
298776e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson    QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
29884fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon);
2989789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
2990789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    TemplateTypeParmType *TypeCheck
2991789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
2992789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!TypeCheck && "Template type parameter canonical type broken");
2993789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)TypeCheck;
299476e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson  } else
29956b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    TypeParm = new (*this, TypeAlignment)
29966b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      TemplateTypeParmType(Depth, Index, ParameterPack);
2997fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
2998fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  Types.push_back(TypeParm);
2999fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
3000fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
3001fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  return QualType(TypeParm, 0);
3002fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor}
3003fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
30043cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallTypeSourceInfo *
30053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
30063cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                              SourceLocation NameLoc,
30073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                        const TemplateArgumentListInfo &Args,
30083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                              QualType Underlying) const {
30097c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Name.getAsDependentTemplateName() &&
30107c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
30113e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  QualType TST = getTemplateSpecializationType(Name, Args, Underlying);
30123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
30133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TypeSourceInfo *DI = CreateTypeSourceInfo(TST);
301439e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie  TemplateSpecializationTypeLoc TL =
301539e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie      DI->getTypeLoc().castAs<TemplateSpecializationTypeLoc>();
301655d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  TL.setTemplateKeywordLoc(SourceLocation());
30173cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setTemplateNameLoc(NameLoc);
30183cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setLAngleLoc(Args.getLAngleLoc());
30193cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TL.setRAngleLoc(Args.getRAngleLoc());
30203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
30213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    TL.setArgLocInfo(i, Args[i].getLocInfo());
30223cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return DI;
30233cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
30243cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
30251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
30267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorASTContext::getTemplateSpecializationType(TemplateName Template,
3027d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                          const TemplateArgumentListInfo &Args,
30283e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                          QualType Underlying) const {
30297c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
30307c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
30317c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
3032d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned NumArgs = Args.size();
3033d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
30345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 4> ArgVec;
3035833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ArgVec.reserve(NumArgs);
3036833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0; i != NumArgs; ++i)
3037833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ArgVec.push_back(Args[i].getArgument());
3038833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
303931f17ecbef57b5679c017c375db330546b7b5145John McCall  return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs,
30403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                       Underlying);
3041833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
3042833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3043b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#ifndef NDEBUG
3044b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregorstatic bool hasAnyPackExpansions(const TemplateArgument *Args,
3045b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                                 unsigned NumArgs) {
3046b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  for (unsigned I = 0; I != NumArgs; ++I)
3047b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    if (Args[I].isPackExpansion())
3048b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor      return true;
3049b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor
3050b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  return true;
3051b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor}
3052b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#endif
3053b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor
3054833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType
3055833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallASTContext::getTemplateSpecializationType(TemplateName Template,
30567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                          const TemplateArgument *Args,
30577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                          unsigned NumArgs,
30583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                          QualType Underlying) const {
30597c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
30607c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
30610f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  // Look through qualified template names.
30620f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
30630f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor    Template = TemplateName(QTN->getTemplateDecl());
30647c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
3065b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor  bool IsTypeAlias =
30663e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    Template.getAsTemplateDecl() &&
30673e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl());
30683e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  QualType CanonType;
30693e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  if (!Underlying.isNull())
30703e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    CanonType = getCanonicalType(Underlying);
30713e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  else {
3072b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    // We can get here with an alias template when the specialization contains
3073b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    // a pack expansion that does not match up with a parameter pack.
3074b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    assert((!IsTypeAlias || hasAnyPackExpansions(Args, NumArgs)) &&
3075b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor           "Caller must compute aliased type");
3076b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    IsTypeAlias = false;
30773e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    CanonType = getCanonicalTemplateSpecializationType(Template, Args,
30783e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                       NumArgs);
30793e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  }
3080fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor
30811275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // Allocate the (non-canonical) template specialization type, but don't
30821275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // try to unique it: these types typically have location information that
30831275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // we don't unique and don't want to lose.
30843e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  void *Mem = Allocate(sizeof(TemplateSpecializationType) +
30853e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                       sizeof(TemplateArgument) * NumArgs +
3086b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                       (IsTypeAlias? sizeof(QualType) : 0),
30876b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall                       TypeAlignment);
30881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateSpecializationType *Spec
3089b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor    = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, CanonType,
3090b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor                                         IsTypeAlias ? Underlying : QualType());
30911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309255f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  Types.push_back(Spec);
30931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(Spec, 0);
309455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
309555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
30961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
30979763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
30989763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                                   const TemplateArgument *Args,
30994ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                   unsigned NumArgs) const {
31007c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  assert(!Template.getAsDependentTemplateName() &&
31017c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor         "No dependent template names here!");
31023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
31030f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  // Look through qualified template names.
31040f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
31050f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor    Template = TemplateName(QTN->getTemplateDecl());
31067c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor
31079763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // Build the canonical template specialization type.
31089763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateName CanonTemplate = getCanonicalTemplateName(Template);
31095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 4> CanonArgs;
31109763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  CanonArgs.reserve(NumArgs);
31119763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  for (unsigned I = 0; I != NumArgs; ++I)
31129763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    CanonArgs.push_back(getCanonicalTemplateArgument(Args[I]));
31139763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
31149763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // Determine whether this canonical template specialization type already
31159763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  // exists.
31169763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  llvm::FoldingSetNodeID ID;
31179763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateSpecializationType::Profile(ID, CanonTemplate,
31189763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                      CanonArgs.data(), NumArgs, *this);
31199763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
31209763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  void *InsertPos = 0;
31219763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  TemplateSpecializationType *Spec
31229763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
31239763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
31249763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  if (!Spec) {
31259763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    // Allocate a new canonical template specialization type.
31269763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    void *Mem = Allocate((sizeof(TemplateSpecializationType) +
31279763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                          sizeof(TemplateArgument) * NumArgs),
31289763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                         TypeAlignment);
31299763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Spec = new (Mem) TemplateSpecializationType(CanonTemplate,
31309763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis                                                CanonArgs.data(), NumArgs,
31313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                QualType(), QualType());
31329763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    Types.push_back(Spec);
31339763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
31349763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  }
31359763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
31369763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  assert(Spec->isDependentType() &&
31379763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis         "Non-dependent template-id type must have a canonical type");
31389763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  return QualType(Spec, 0);
31399763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis}
31409763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
31419763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType
3142465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword,
3143465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                              NestedNameSpecifier *NNS,
31444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                              QualType NamedType) const {
3145e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  llvm::FoldingSetNodeID ID;
3146465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType::Profile(ID, Keyword, NNS, NamedType);
3147e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3148e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  void *InsertPos = 0;
3149465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
3150e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  if (T)
3151e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor    return QualType(T, 0);
3152e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3153789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  QualType Canon = NamedType;
3154789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  if (!Canon.isCanonical()) {
3155789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    Canon = getCanonicalType(NamedType);
3156465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
3157465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    assert(!CheckT && "Elaborated canonical type broken");
3158789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckT;
3159789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  }
3160789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
3161465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  T = new (*this) ElaboratedType(Keyword, NNS, NamedType, Canon);
3162e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  Types.push_back(T);
3163465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypes.InsertNode(T, InsertPos);
3164e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  return QualType(T, 0);
3165e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor}
3166e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
3167075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType
31684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getParenType(QualType InnerType) const {
3169075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  llvm::FoldingSetNodeID ID;
3170075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenType::Profile(ID, InnerType);
3171075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3172075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  void *InsertPos = 0;
3173075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
3174075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (T)
3175075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return QualType(T, 0);
3176075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3177075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType Canon = InnerType;
3178075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (!Canon.isCanonical()) {
3179075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    Canon = getCanonicalType(InnerType);
3180075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
3181075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    assert(!CheckT && "Paren canonical type broken");
3182075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    (void)CheckT;
3183075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
3184075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
3185075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  T = new (*this) ParenType(InnerType, Canon);
3186075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  Types.push_back(T);
3187075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenTypes.InsertNode(T, InsertPos);
3188075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  return QualType(T, 0);
3189075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara}
3190075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
31914a2023f5014e82389d5980d307b89c545dbbac81Douglas GregorQualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword,
31924a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                          NestedNameSpecifier *NNS,
31934a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                          const IdentifierInfo *Name,
31944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                          QualType Canon) const {
3195d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  assert(NNS->isDependent() && "nested-name-specifier must be dependent");
3196d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3197d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  if (Canon.isNull()) {
3198d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
31994a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    ElaboratedTypeKeyword CanonKeyword = Keyword;
32004a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    if (Keyword == ETK_None)
32014a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor      CanonKeyword = ETK_Typename;
32024a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor
32034a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    if (CanonNNS != NNS || CanonKeyword != Keyword)
32044a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor      Canon = getDependentNameType(CanonKeyword, CanonNNS, Name);
3205d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
3206d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3207d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  llvm::FoldingSetNodeID ID;
32084a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor  DependentNameType::Profile(ID, Keyword, NNS, Name);
3209d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3210d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  void *InsertPos = 0;
32114714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T
32124714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
3213d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  if (T)
3214d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return QualType(T, 0);
3215d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
32164a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor  T = new (*this) DependentNameType(Keyword, NNS, Name, Canon);
3217d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  Types.push_back(T);
32184714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameTypes.InsertNode(T, InsertPos);
32191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
3220d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
3221d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
32221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
322333500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType(
322433500955d731c73717af52088b7fc0e7a85681e7John McCall                                 ElaboratedTypeKeyword Keyword,
32254a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                 NestedNameSpecifier *NNS,
322633500955d731c73717af52088b7fc0e7a85681e7John McCall                                 const IdentifierInfo *Name,
32274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                 const TemplateArgumentListInfo &Args) const {
322833500955d731c73717af52088b7fc0e7a85681e7John McCall  // TODO: avoid this copy
32295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> ArgCopy;
323033500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = Args.size(); I != E; ++I)
323133500955d731c73717af52088b7fc0e7a85681e7John McCall    ArgCopy.push_back(Args[I].getArgument());
323233500955d731c73717af52088b7fc0e7a85681e7John McCall  return getDependentTemplateSpecializationType(Keyword, NNS, Name,
323333500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ArgCopy.size(),
323433500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ArgCopy.data());
323533500955d731c73717af52088b7fc0e7a85681e7John McCall}
323633500955d731c73717af52088b7fc0e7a85681e7John McCall
323733500955d731c73717af52088b7fc0e7a85681e7John McCallQualType
323833500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType(
323933500955d731c73717af52088b7fc0e7a85681e7John McCall                                 ElaboratedTypeKeyword Keyword,
324033500955d731c73717af52088b7fc0e7a85681e7John McCall                                 NestedNameSpecifier *NNS,
324133500955d731c73717af52088b7fc0e7a85681e7John McCall                                 const IdentifierInfo *Name,
324233500955d731c73717af52088b7fc0e7a85681e7John McCall                                 unsigned NumArgs,
32434ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                 const TemplateArgument *Args) const {
3244aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor  assert((!NNS || NNS->isDependent()) &&
3245aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor         "nested-name-specifier must be dependent");
32461734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
3247789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  llvm::FoldingSetNodeID ID;
324833500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS,
324933500955d731c73717af52088b7fc0e7a85681e7John McCall                                               Name, NumArgs, Args);
3250789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
3251789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  void *InsertPos = 0;
325233500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType *T
325333500955d731c73717af52088b7fc0e7a85681e7John McCall    = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
3254789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  if (T)
3255789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    return QualType(T, 0);
3256789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
325733500955d731c73717af52088b7fc0e7a85681e7John McCall  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
325833500955d731c73717af52088b7fc0e7a85681e7John McCall
325933500955d731c73717af52088b7fc0e7a85681e7John McCall  ElaboratedTypeKeyword CanonKeyword = Keyword;
326033500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Keyword == ETK_None) CanonKeyword = ETK_Typename;
32611734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
326233500955d731c73717af52088b7fc0e7a85681e7John McCall  bool AnyNonCanonArgs = false;
32635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> CanonArgs(NumArgs);
326433500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0; I != NumArgs; ++I) {
326533500955d731c73717af52088b7fc0e7a85681e7John McCall    CanonArgs[I] = getCanonicalTemplateArgument(Args[I]);
326633500955d731c73717af52088b7fc0e7a85681e7John McCall    if (!CanonArgs[I].structurallyEquals(Args[I]))
326733500955d731c73717af52088b7fc0e7a85681e7John McCall      AnyNonCanonArgs = true;
3268789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  }
32691734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
327033500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Canon;
327133500955d731c73717af52088b7fc0e7a85681e7John McCall  if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {
327233500955d731c73717af52088b7fc0e7a85681e7John McCall    Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS,
327333500955d731c73717af52088b7fc0e7a85681e7John McCall                                                   Name, NumArgs,
327433500955d731c73717af52088b7fc0e7a85681e7John McCall                                                   CanonArgs.data());
327533500955d731c73717af52088b7fc0e7a85681e7John McCall
327633500955d731c73717af52088b7fc0e7a85681e7John McCall    // Find the insert position again.
327733500955d731c73717af52088b7fc0e7a85681e7John McCall    DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
327833500955d731c73717af52088b7fc0e7a85681e7John McCall  }
327933500955d731c73717af52088b7fc0e7a85681e7John McCall
328033500955d731c73717af52088b7fc0e7a85681e7John McCall  void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) +
328133500955d731c73717af52088b7fc0e7a85681e7John McCall                        sizeof(TemplateArgument) * NumArgs),
328233500955d731c73717af52088b7fc0e7a85681e7John McCall                       TypeAlignment);
3283ef99001908e799c388f1363b1e607dad5f5b57d3John McCall  T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS,
328433500955d731c73717af52088b7fc0e7a85681e7John McCall                                                    Name, NumArgs, Args, Canon);
32851734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  Types.push_back(T);
328633500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationTypes.InsertNode(T, InsertPos);
32871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
32881734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor}
32891734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
3290cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas GregorQualType ASTContext::getPackExpansionType(QualType Pattern,
3291dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie                                          Optional<unsigned> NumExpansions) {
32927536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  llvm::FoldingSetNodeID ID;
3293cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  PackExpansionType::Profile(ID, Pattern, NumExpansions);
32947536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
32957536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  assert(Pattern->containsUnexpandedParameterPack() &&
32967536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor         "Pack expansions must expand one or more parameter packs");
32977536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  void *InsertPos = 0;
32987536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  PackExpansionType *T
32997536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
33007536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (T)
33017536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    return QualType(T, 0);
33027536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
33037536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  QualType Canon;
33047536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (!Pattern.isCanonical()) {
3305d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    Canon = getCanonicalType(Pattern);
3306d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // The canonical type might not contain an unexpanded parameter pack, if it
3307d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // contains an alias template specialization which ignores one of its
3308d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    // parameters.
3309d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    if (Canon->containsUnexpandedParameterPack()) {
3310d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions);
3311d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith
3312d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      // Find the insert position again, in case we inserted an element into
3313d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      // PackExpansionTypes and invalidated our insert position.
3314d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith      PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
3315d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith    }
33167536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  }
33177536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
3318cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  T = new (*this) PackExpansionType(Pattern, Canon, NumExpansions);
33197536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  Types.push_back(T);
33207536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  PackExpansionTypes.InsertNode(T, InsertPos);
33217536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  return QualType(T, 0);
33227536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
33237536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
332488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// CmpProtocolNames - Comparison predicate for sorting protocols
332588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// alphabetically.
332688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattnerstatic bool CmpProtocolNames(const ObjCProtocolDecl *LHS,
332788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner                            const ObjCProtocolDecl *RHS) {
33282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return LHS->getDeclName() < RHS->getDeclName();
332988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner}
333088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3331c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallstatic bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols,
333254e14c4db764c0636160d26c5bbf491637c83a76John McCall                                unsigned NumProtocols) {
333354e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (NumProtocols == 0) return true;
333454e14c4db764c0636160d26c5bbf491637c83a76John McCall
333561cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  if (Protocols[0]->getCanonicalDecl() != Protocols[0])
333661cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    return false;
333761cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor
333854e14c4db764c0636160d26c5bbf491637c83a76John McCall  for (unsigned i = 1; i != NumProtocols; ++i)
333961cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    if (!CmpProtocolNames(Protocols[i-1], Protocols[i]) ||
334061cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor        Protocols[i]->getCanonicalDecl() != Protocols[i])
334154e14c4db764c0636160d26c5bbf491637c83a76John McCall      return false;
334254e14c4db764c0636160d26c5bbf491637c83a76John McCall  return true;
334354e14c4db764c0636160d26c5bbf491637c83a76John McCall}
334454e14c4db764c0636160d26c5bbf491637c83a76John McCall
334554e14c4db764c0636160d26c5bbf491637c83a76John McCallstatic void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols,
334688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner                                   unsigned &NumProtocols) {
334788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols;
33481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
334988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  // Sort protocols, keyed by name.
335088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames);
335188cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
335261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  // Canonicalize.
335361cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor  for (unsigned I = 0, N = NumProtocols; I != N; ++I)
335461cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor    Protocols[I] = Protocols[I]->getCanonicalDecl();
335561cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor
335688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  // Remove duplicates.
335788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  ProtocolsEnd = std::unique(Protocols, ProtocolsEnd);
335888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner  NumProtocols = ProtocolsEnd-Protocols;
335988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner}
336088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3361c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType ASTContext::getObjCObjectType(QualType BaseType,
3362c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                       ObjCProtocolDecl * const *Protocols,
33634ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                       unsigned NumProtocols) const {
3364c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // If the base type is an interface and there aren't any protocols
3365c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // to add, then the interface type will do just fine.
3366c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!NumProtocols && isa<ObjCInterfaceType>(BaseType))
3367c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return BaseType;
3368d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
3369c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Look in the folding set for an existing type.
3370c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  llvm::FoldingSetNodeID ID;
3371c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypeImpl::Profile(ID, BaseType, Protocols, NumProtocols);
3372d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  void *InsertPos = 0;
3373c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
3374c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return QualType(QT, 0);
3375d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
3376c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Build the canonical type, which has the canonical base type and
3377c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // a sorted-and-uniqued list of protocols.
337854e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Canonical;
3379c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  bool ProtocolsSorted = areSortedAndUniqued(Protocols, NumProtocols);
3380c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!ProtocolsSorted || !BaseType.isCanonical()) {
3381c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (!ProtocolsSorted) {
33825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols,
33830237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer                                                     Protocols + NumProtocols);
338454e14c4db764c0636160d26c5bbf491637c83a76John McCall      unsigned UniqueCount = NumProtocols;
338554e14c4db764c0636160d26c5bbf491637c83a76John McCall
338654e14c4db764c0636160d26c5bbf491637c83a76John McCall      SortAndUniqueProtocols(&Sorted[0], UniqueCount);
3387c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Canonical = getObjCObjectType(getCanonicalType(BaseType),
3388c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                    &Sorted[0], UniqueCount);
338954e14c4db764c0636160d26c5bbf491637c83a76John McCall    } else {
3390c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Canonical = getObjCObjectType(getCanonicalType(BaseType),
3391c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                    Protocols, NumProtocols);
339254e14c4db764c0636160d26c5bbf491637c83a76John McCall    }
339354e14c4db764c0636160d26c5bbf491637c83a76John McCall
339454e14c4db764c0636160d26c5bbf491637c83a76John McCall    // Regenerate InsertPos.
3395c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
339654e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
339754e14c4db764c0636160d26c5bbf491637c83a76John McCall
3398c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  unsigned Size = sizeof(ObjCObjectTypeImpl);
3399c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  Size += NumProtocols * sizeof(ObjCProtocolDecl *);
3400fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor  void *Mem = Allocate(Size, TypeAlignment);
3401c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypeImpl *T =
3402c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    new (Mem) ObjCObjectTypeImpl(Canonical, BaseType, Protocols, NumProtocols);
34031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3404c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  Types.push_back(T);
3405c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectTypes.InsertNode(T, InsertPos);
3406c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return QualType(T, 0);
3407d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff}
340888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner
3409c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for
3410c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// the given object type.
34114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const {
34124b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  llvm::FoldingSetNodeID ID;
3413c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerType::Profile(ID, ObjectT);
34141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34154b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  void *InsertPos = 0;
3416c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (ObjCObjectPointerType *QT =
3417c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall              ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
34184b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian    return QualType(QT, 0);
34191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3420c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // Find the canonical object type.
342154e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Canonical;
3422c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!ObjectT.isCanonical()) {
3423c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT));
342454e14c4db764c0636160d26c5bbf491637c83a76John McCall
3425c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    // Regenerate InsertPos.
3426c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
342754e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
342854e14c4db764c0636160d26c5bbf491637c83a76John McCall
3429c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // No match.
3430c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment);
3431c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerType *QType =
3432c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    new (Mem) ObjCObjectPointerType(Canonical, ObjectT);
343324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
343424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis  Types.push_back(QType);
3435c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
343624fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis  return QualType(QType, 0);
343724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
343824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3439deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// getObjCInterfaceType - Return the unique reference to the type for the
3440deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// specified ObjC interface decl. The list of protocols is optional.
34410af550115df1f57f17a4f125ff0e8b34820c65d1Douglas GregorQualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl,
34420af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor                                          ObjCInterfaceDecl *PrevDecl) const {
3443deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  if (Decl->TypeForDecl)
3444deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    return QualType(Decl->TypeForDecl, 0);
344574c730ad1f6818b676b0bad46d806a9176950328Sebastian Redl
34460af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor  if (PrevDecl) {
34470af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl");
34480af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    Decl->TypeForDecl = PrevDecl->TypeForDecl;
34490af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor    return QualType(PrevDecl->TypeForDecl, 0);
34500af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor  }
34510af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor
34528d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor  // Prefer the definition, if there is one.
34538d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor  if (const ObjCInterfaceDecl *Def = Decl->getDefinition())
34548d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor    Decl = Def;
34558d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor
3456deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment);
3457deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ObjCInterfaceType *T = new (Mem) ObjCInterfaceType(Decl);
3458deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  Decl->TypeForDecl = T;
3459deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  Types.push_back(T);
3460deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  return QualType(T, 0);
3461c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3462c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
346372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique
346472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// TypeOfExprType AST's (since expression's are never shared). For example,
34659752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// multiple declarations that refer to "typeof(x)" all contain different
34661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// DeclRefExpr's. This doesn't effect the type checker, since it operates
34679752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique).
34684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfExprType(Expr *tofExpr) const {
3469dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  TypeOfExprType *toe;
3470b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor  if (tofExpr->isTypeDependent()) {
3471b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    llvm::FoldingSetNodeID ID;
3472b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    DependentTypeOfExprType::Profile(ID, *this, tofExpr);
34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3474b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    void *InsertPos = 0;
3475b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    DependentTypeOfExprType *Canon
3476b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
3477b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    if (Canon) {
3478b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // We already have a "canonical" version of an identical, dependent
3479b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // typeof(expr) type. Use that as our canonical type.
34806b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr,
3481b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor                                          QualType((TypeOfExprType*)Canon, 0));
34823060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    } else {
3483b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      // Build a new, canonical typeof(expr) type.
34846b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      Canon
34856b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall        = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr);
3486b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
3487b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor      toe = Canon;
3488b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor    }
3489b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor  } else {
3490dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor    QualType Canonical = getCanonicalType(tofExpr->getType());
34916b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall    toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical);
3492dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  }
34939752f25748d954df99087d741ea35db37ff16beaSteve Naroff  Types.push_back(toe);
34949752f25748d954df99087d741ea35db37ff16beaSteve Naroff  return QualType(toe, 0);
3495d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
3496d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
34979752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// getTypeOfType -  Unlike many "get<Type>" functions, we don't unique
34989752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// TypeOfType AST's. The only motivation to unique these nodes would be
34999752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be
35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates
35019752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique).
35024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfType(QualType tofType) const {
3503f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  QualType Canonical = getCanonicalType(tofType);
35046b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall  TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical);
35059752f25748d954df99087d741ea35db37ff16beaSteve Naroff  Types.push_back(tot);
35069752f25748d954df99087d741ea35db37ff16beaSteve Naroff  return QualType(tot, 0);
3507d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
3508d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
350960a9a2a404a4cf259d39133383e922aa00ca9043Anders Carlsson
3510395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// getDecltypeType -  Unlike many "get<Type>" functions, we don't unique
3511395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// DecltypeType AST's. The only motivation to unique these nodes would be
3512395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be
35131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates
351439e02032b01874a0d02ba85a4cd3922adda81376David Blaikie/// on canonical types (which are always unique).
3515f8af98286022f72157d84951b48fde5fb369ab29Douglas GregorQualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const {
3516dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  DecltypeType *dt;
3517561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
3518561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  // C++0x [temp.type]p2:
3519561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   If an expression e involves a template parameter, decltype(e) denotes a
3520561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   unique dependent type. Two such decltype-specifiers refer to the same
3521561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  //   type only if their expressions are equivalent (14.5.6.1).
3522561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  if (e->isInstantiationDependent()) {
35239d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    llvm::FoldingSetNodeID ID;
35249d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    DependentDecltypeType::Profile(ID, *this, e);
35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35269d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    void *InsertPos = 0;
35279d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    DependentDecltypeType *Canon
35289d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos);
35299d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    if (Canon) {
35309d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // We already have a "canonical" version of an equivalent, dependent
35319d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // decltype type. Use that as our canonical type.
35320d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith      dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType,
35339d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor                                       QualType((DecltypeType*)Canon, 0));
35343060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    } else {
35359d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      // Build a new, canonical typeof(expr) type.
35366b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall      Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e);
35379d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      DependentDecltypeTypes.InsertNode(Canon, InsertPos);
35389d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor      dt = Canon;
35399d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor    }
35409d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor  } else {
3541f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor    dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType,
3542f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor                                      getCanonicalType(UnderlyingType));
3543dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor  }
3544395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  Types.push_back(dt);
3545395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  return QualType(dt, 0);
3546395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson}
3547395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
3548ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// getUnaryTransformationType - We don't unique these, since the memory
3549ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// savings are minimal and these are rare.
3550ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTContext::getUnaryTransformType(QualType BaseType,
3551ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt                                           QualType UnderlyingType,
3552ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt                                           UnaryTransformType::UTTKind Kind)
3553ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    const {
3554ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  UnaryTransformType *Ty =
355569d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor    new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType,
355669d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor                                                   Kind,
355769d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor                                 UnderlyingType->isDependentType() ?
355812fc4b0624706b474fa10308631fa8daf92f340fPeter Collingbourne                                 QualType() : getCanonicalType(UnderlyingType));
3559ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  Types.push_back(Ty);
3560ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  return QualType(Ty, 0);
3561ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt}
3562ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
3563483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith/// getAutoType - We only unique auto types after they've been deduced.
3564a2c3646c35dd09d21b74826240aa916545b1873fRichard SmithQualType ASTContext::getAutoType(QualType DeducedType,
3565a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith                                 bool IsDecltypeAuto) const {
3566483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  void *InsertPos = 0;
3567483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  if (!DeducedType.isNull()) {
3568483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    // Look in the folding set for an existing type.
3569483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    llvm::FoldingSetNodeID ID;
3570a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    AutoType::Profile(ID, DeducedType, IsDecltypeAuto);
3571483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos))
3572483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith      return QualType(AT, 0);
3573483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  }
3574483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith
3575a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith  AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType,
3576a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith                                                     IsDecltypeAuto);
3577483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  Types.push_back(AT);
3578483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  if (InsertPos)
3579483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith    AutoTypes.InsertNode(AT, InsertPos);
3580483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  return QualType(AT, 0);
358134b41d939a1328f484511c6002ba2456db879a29Richard Smith}
358234b41d939a1328f484511c6002ba2456db879a29Richard Smith
3583b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// getAtomicType - Return the uniqued reference to the atomic type for
3584b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// the given value type.
3585b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanQualType ASTContext::getAtomicType(QualType T) const {
3586b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // Unique pointers, to guarantee there is only one pointer of a particular
3587b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // structure.
3588b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  llvm::FoldingSetNodeID ID;
3589b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicType::Profile(ID, T);
3590b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3591b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  void *InsertPos = 0;
3592b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
3593b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    return QualType(AT, 0);
3594b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3595b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // If the atomic value type isn't canonical, this won't be a canonical type
3596b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  // either, so fill in the canonical type field.
3597b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  QualType Canonical;
3598b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  if (!T.isCanonical()) {
3599b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    Canonical = getAtomicType(getCanonicalType(T));
3600b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3601b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    // Get the new insert position for the node we care about.
3602b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
3603b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP;
3604b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
3605b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicType *New = new (*this, TypeAlignment) AtomicType(T, Canonical);
3606b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  Types.push_back(New);
3607b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  AtomicTypes.InsertNode(New, InsertPos);
3608b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  return QualType(New, 0);
3609b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman}
3610b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
3611ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoDeductType - Get type pattern for deducing against 'auto'.
3612ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoDeductType() const {
3613ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  if (AutoDeductTy.isNull())
3614a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    AutoDeductTy = getAutoType(QualType(), false);
3615ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  assert(!AutoDeductTy.isNull() && "can't build 'auto' pattern");
3616ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  return AutoDeductTy;
3617ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
3618ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
3619ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'.
3620ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoRRefDeductType() const {
3621ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  if (AutoRRefDeductTy.isNull())
3622ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType());
3623ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern");
3624ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  return AutoRRefDeductTy;
3625ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
3626ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
36275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTagDeclType - Return the unique reference to the type for the
36285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified TagDecl (struct/union/class/enum) decl.
36294ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTagDeclType(const TagDecl *Decl) const {
3630d778f88d32b96a74c9edb7342c81357606a7cdc0Ted Kremenek  assert (Decl);
3631e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  // FIXME: What is the design on getTagDeclType when it requires casting
3632e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  // away const?  mutable?
3633e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump  return getTypeDeclType(const_cast<TagDecl*>(Decl));
36345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
36355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
36361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result
36371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and
36381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// needs to agree with the definition in <stddef.h>.
3639a3ccda58913cc1a4b8564e349448b12acc462da7Anders CarlssonCanQualType ASTContext::getSizeType() const {
3640bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  return getFromTargetType(Target->getSizeType());
36415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
36425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
364329e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5).
364429e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getIntMaxType() const {
364529e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg  return getFromTargetType(Target->getIntMaxType());
364629e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg}
364729e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg
364829e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5).
364929e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getUIntMaxType() const {
365029e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg  return getFromTargetType(Target->getUIntMaxType());
365129e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg}
365229e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg
365364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getSignedWCharType - Return the type of "signed wchar_t".
365464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension.
365564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getSignedWCharType() const {
365664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  // FIXME: derive from "Target" ?
365764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  return WCharTy;
365864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis}
365964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
366064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getUnsignedWCharType - Return the type of "unsigned wchar_t".
366164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension.
366264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getUnsignedWCharType() const {
366364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  // FIXME: derive from "Target" ?
366464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  return UnsignedIntTy;
366564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis}
366664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis
36679677eb864f7354f140cd1bf59557843851e65de4Enea ZaffanellaQualType ASTContext::getIntPtrType() const {
36689677eb864f7354f140cd1bf59557843851e65de4Enea Zaffanella  return getFromTargetType(Target->getIntPtrType());
36699677eb864f7354f140cd1bf59557843851e65de4Enea Zaffanella}
36709677eb864f7354f140cd1bf59557843851e65de4Enea Zaffanella
36719677eb864f7354f140cd1bf59557843851e65de4Enea ZaffanellaQualType ASTContext::getUIntPtrType() const {
36729677eb864f7354f140cd1bf59557843851e65de4Enea Zaffanella  return getCorrespondingUnsignedType(getIntPtrType());
36739677eb864f7354f140cd1bf59557843851e65de4Enea Zaffanella}
36749677eb864f7354f140cd1bf59557843851e65de4Enea Zaffanella
367529e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17)
36768b9023ba35a86838789e2c9034a6128728c547aaChris Lattner/// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
36778b9023ba35a86838789e2c9034a6128728c547aaChris LattnerQualType ASTContext::getPointerDiffType() const {
3678bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor  return getFromTargetType(Target->getPtrDiffType(0));
36798b9023ba35a86838789e2c9034a6128728c547aaChris Lattner}
36808b9023ba35a86838789e2c9034a6128728c547aaChris Lattner
36816902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman/// \brief Return the unique type for "pid_t" defined in
36826902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman/// <sys/types.h>. We need this to compute the correct type for vfork().
36836902e4146d426998ff6a94b16776c1b3f805a048Eli FriedmanQualType ASTContext::getProcessIDType() const {
36846902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman  return getFromTargetType(Target->getProcessIDType());
36856902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman}
36866902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman
3687e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===//
3688e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//                              Type Operators
3689e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===//
3690e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
36914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCanQualType ASTContext::getCanonicalParamType(QualType T) const {
369254e14c4db764c0636160d26c5bbf491637c83a76John McCall  // Push qualifiers into arrays, and then discard any remaining
369354e14c4db764c0636160d26c5bbf491637c83a76John McCall  // qualifiers.
369454e14c4db764c0636160d26c5bbf491637c83a76John McCall  T = getCanonicalType(T);
3695745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian  T = getVariableArrayDecayedType(T);
369654e14c4db764c0636160d26c5bbf491637c83a76John McCall  const Type *Ty = T.getTypePtr();
369754e14c4db764c0636160d26c5bbf491637c83a76John McCall  QualType Result;
369854e14c4db764c0636160d26c5bbf491637c83a76John McCall  if (isa<ArrayType>(Ty)) {
369954e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = getArrayDecayedType(QualType(Ty,0));
370054e14c4db764c0636160d26c5bbf491637c83a76John McCall  } else if (isa<FunctionType>(Ty)) {
370154e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = getPointerType(QualType(Ty, 0));
370254e14c4db764c0636160d26c5bbf491637c83a76John McCall  } else {
370354e14c4db764c0636160d26c5bbf491637c83a76John McCall    Result = QualType(Ty, 0);
370454e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
370554e14c4db764c0636160d26c5bbf491637c83a76John McCall
370654e14c4db764c0636160d26c5bbf491637c83a76John McCall  return CanQualType::CreateUnsafe(Result);
370754e14c4db764c0636160d26c5bbf491637c83a76John McCall}
370854e14c4db764c0636160d26c5bbf491637c83a76John McCall
370962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCallQualType ASTContext::getUnqualifiedArrayType(QualType type,
371062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall                                             Qualifiers &quals) {
371162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  SplitQualType splitType = type.getSplitUnqualifiedType();
371262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
371362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // FIXME: getSplitUnqualifiedType() actually walks all the way to
371462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // the unqualified desugared type and then drops it on the floor.
371562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // We then have to strip that sugar back off with
371662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // getUnqualifiedDesugaredType(), which is silly.
371762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  const ArrayType *AT =
3718200fa53fd420aa8369586f569dbece04930ad6a3John McCall    dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType());
371962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
372062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // If we don't have an array, just use the results in splitType.
37219dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (!AT) {
3722200fa53fd420aa8369586f569dbece04930ad6a3John McCall    quals = splitType.Quals;
3723200fa53fd420aa8369586f569dbece04930ad6a3John McCall    return QualType(splitType.Ty, 0);
372428e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
372528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
372662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // Otherwise, recurse on the array's element type.
372762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  QualType elementType = AT->getElementType();
372862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  QualType unqualElementType = getUnqualifiedArrayType(elementType, quals);
372962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
373062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // If that didn't change the element type, AT has no qualifiers, so we
373162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // can just use the results in splitType.
373262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  if (elementType == unqualElementType) {
373362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    assert(quals.empty()); // from the recursive call
3734200fa53fd420aa8369586f569dbece04930ad6a3John McCall    quals = splitType.Quals;
3735200fa53fd420aa8369586f569dbece04930ad6a3John McCall    return QualType(splitType.Ty, 0);
373662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  }
373762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall
373862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // Otherwise, add in the qualifiers from the outermost type, then
373962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  // build the type back up.
3740200fa53fd420aa8369586f569dbece04930ad6a3John McCall  quals.addConsistentQualifiers(splitType.Quals);
374128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
37429dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
374362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getConstantArrayType(unqualElementType, CAT->getSize(),
374428e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                CAT->getSizeModifier(), 0);
374528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
374628e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
37479dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
374862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0);
374928e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth  }
375028e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
37519dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(AT)) {
375262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall    return getVariableArrayType(unqualElementType,
37533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                VAT->getSizeExpr(),
37549dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getSizeModifier(),
37559dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getIndexTypeCVRQualifiers(),
37569dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor                                VAT->getBracketsRange());
37579dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  }
37589dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor
37599dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor  const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(AT);
376062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall  return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(),
376128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                    DSAT->getSizeModifier(), 0,
376228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth                                    SourceRange());
376328e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth}
376428e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth
37655a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types  that
37665a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// may be similar (C++ 4.4), replaces T1 and T2 with the type that
37675a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// they point to and return true. If T1 and T2 aren't pointer types
37685a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// or pointer-to-member types, or if they are not similar at this
37695a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// level, returns false and leaves T1 and T2 unchanged. Top-level
37705a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// qualifiers on T1 and T2 are ignored. This function will typically
37715a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// be called in a loop that successively "unwraps" pointer and
37725a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// pointer-to-member types to compare them at each level.
37735a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregorbool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) {
37745a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  const PointerType *T1PtrType = T1->getAs<PointerType>(),
37755a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                    *T2PtrType = T2->getAs<PointerType>();
37765a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  if (T1PtrType && T2PtrType) {
37775a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T1 = T1PtrType->getPointeeType();
37785a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T2 = T2PtrType->getPointeeType();
37795a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    return true;
37805a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
37815a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
37825a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(),
37835a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                          *T2MPType = T2->getAs<MemberPointerType>();
37845a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  if (T1MPType && T2MPType &&
37855a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0),
37865a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                             QualType(T2MPType->getClass(), 0))) {
37875a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T1 = T1MPType->getPointeeType();
37885a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    T2 = T2MPType->getPointeeType();
37895a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    return true;
37905a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
37915a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
37924e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().ObjC1) {
37935a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    const ObjCObjectPointerType *T1OPType = T1->getAs<ObjCObjectPointerType>(),
37945a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor                                *T2OPType = T2->getAs<ObjCObjectPointerType>();
37955a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    if (T1OPType && T2OPType) {
37965a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      T1 = T1OPType->getPointeeType();
37975a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      T2 = T2OPType->getPointeeType();
37985a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor      return true;
37995a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor    }
38005a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  }
38015a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
38025a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  // FIXME: Block pointers, too?
38035a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
38045a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor  return false;
38055a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor}
38065a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor
38074ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameInfo
38084ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getNameForTemplate(TemplateName Name,
38094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                               SourceLocation NameLoc) const {
3810146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  switch (Name.getKind()) {
3811146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::QualifiedTemplate:
3812146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::Template:
38132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    // DNInfo work in progress: CHECKME: what about DNLoc?
3814146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(),
3815146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
38162577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
3817146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::OverloadedTemplate: {
3818146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate();
3819146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    // DNInfo work in progress: CHECKME: what about DNLoc?
3820146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc);
3821146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3822146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3823146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::DependentTemplate: {
3824146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    DependentTemplateName *DTN = Name.getAsDependentTemplateName();
38252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName DName;
382680ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    if (DTN->isIdentifier()) {
38272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DName = DeclarationNames.getIdentifier(DTN->getIdentifier());
38282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return DeclarationNameInfo(DName, NameLoc);
382980ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    } else {
38302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DName = DeclarationNames.getCXXOperatorName(DTN->getOperator());
38312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      // DNInfo work in progress: FIXME: source locations?
38322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DeclarationNameLoc DNLoc;
38332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DNLoc.CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding();
38342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DNLoc.CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding();
38352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return DeclarationNameInfo(DName, NameLoc, DNLoc);
383680ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall    }
383780ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall  }
383880ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall
3839146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParm: {
3840146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmStorage *subst
3841146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParm();
3842146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(subst->getParameter()->getDeclName(),
3843146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
3844146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3845146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3846146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParmPack: {
3847146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmPackStorage *subst
3848146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParmPack();
3849146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DeclarationNameInfo(subst->getParameterPack()->getDeclName(),
3850146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                               NameLoc);
3851146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3852146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3853146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3854146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm_unreachable("bad template name kind!");
385580ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall}
385680ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall
38574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const {
3858146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  switch (Name.getKind()) {
3859146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::QualifiedTemplate:
3860146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::Template: {
3861146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateDecl *Template = Name.getAsTemplateDecl();
38623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    if (TemplateTemplateParmDecl *TTP
3863146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall          = dyn_cast<TemplateTemplateParmDecl>(Template))
38643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor      Template = getCanonicalTemplateTemplateParmDecl(TTP);
38653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
38663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    // The canonical template name is the canonical template declaration.
386797fbaa2a38804268a024f1a104b43fcf8b4411b0Argyrios Kyrtzidis    return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl()));
38683e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor  }
386925a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor
3870146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::OverloadedTemplate:
3871146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    llvm_unreachable("cannot canonicalize overloaded template");
3872146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3873146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::DependentTemplate: {
3874146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    DependentTemplateName *DTN = Name.getAsDependentTemplateName();
3875146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    assert(DTN && "Non-dependent template names must refer to template decls.");
3876146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return DTN->CanonicalTemplateName;
3877146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3878146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3879146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParm: {
3880146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmStorage *subst
3881146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = Name.getAsSubstTemplateTemplateParm();
3882146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return getCanonicalTemplateName(subst->getReplacement());
38831aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
38841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3885146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParmPack: {
3886146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmPackStorage *subst
3887146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                  = Name.getAsSubstTemplateTemplateParmPack();
3888146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateTemplateParmDecl *canonParameter
3889146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack());
3890146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateArgument canonArgPack
3891146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      = getCanonicalTemplateArgument(subst->getArgumentPack());
3892146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack);
3893146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3894146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
3895146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3896146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm_unreachable("bad template name!");
389725a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor}
389825a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor
3899db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregorbool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) {
3900db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  X = getCanonicalTemplateName(X);
3901db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  Y = getCanonicalTemplateName(Y);
3902db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor  return X.getAsVoidPointer() == Y.getAsVoidPointer();
3903db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor}
3904db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor
39051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument
39064ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const {
39071275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  switch (Arg.getKind()) {
39081275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Null:
39091275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      return Arg;
39101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39111275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Expression:
39121275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      return Arg;
39131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3914d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    case TemplateArgument::Declaration: {
3915d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      ValueDecl *D = cast<ValueDecl>(Arg.getAsDecl()->getCanonicalDecl());
3916d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return TemplateArgument(D, Arg.isDeclForReferenceParam());
3917d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    }
39181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3919d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    case TemplateArgument::NullPtr:
3920d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return TemplateArgument(getCanonicalType(Arg.getNullPtrType()),
3921d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman                              /*isNullPtr*/true);
3922d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
3923788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    case TemplateArgument::Template:
3924788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate()));
3925a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
3926a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    case TemplateArgument::TemplateExpansion:
3927a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      return TemplateArgument(getCanonicalTemplateName(
3928a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                         Arg.getAsTemplateOrTemplatePattern()),
39292be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                              Arg.getNumTemplateExpansions());
3930a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
39311275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Integral:
3932855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer      return TemplateArgument(Arg, getCanonicalType(Arg.getIntegralType()));
39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39341275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Type:
3935833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      return TemplateArgument(getCanonicalType(Arg.getAsType()));
39361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39371275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    case TemplateArgument::Pack: {
393887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor      if (Arg.pack_size() == 0)
393987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor        return Arg;
394087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
3941910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      TemplateArgument *CanonArgs
3942910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor        = new (*this) TemplateArgument[Arg.pack_size()];
39431275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor      unsigned Idx = 0;
39441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
39451275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                        AEnd = Arg.pack_end();
39461275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor           A != AEnd; (void)++A, ++Idx)
39471275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor        CanonArgs[Idx] = getCanonicalTemplateArgument(*A);
39481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3949910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      return TemplateArgument(CanonArgs, Arg.pack_size());
39501275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    }
39511275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  }
39521275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor
39531275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // Silence GCC warning
3954b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unhandled template argument kind");
39551275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor}
39561275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor
3957d57959af02b4af695276f4204443afe6e5d86bd8Douglas GregorNestedNameSpecifier *
39584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const {
39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!NNS)
3960d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return 0;
3961d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3962d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  switch (NNS->getKind()) {
3963d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Identifier:
3964d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // Canonicalize the prefix but keep the identifier the same.
39651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return NestedNameSpecifier::Create(*this,
3966d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor                         getCanonicalNestedNameSpecifier(NNS->getPrefix()),
3967d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor                                       NNS->getAsIdentifier());
3968d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3969d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Namespace:
3970d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // A namespace is canonical; build a nested-name-specifier with
3971d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // this namespace and no prefix.
397214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return NestedNameSpecifier::Create(*this, 0,
397314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                 NNS->getAsNamespace()->getOriginalNamespace());
397414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
397514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NestedNameSpecifier::NamespaceAlias:
397614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    // A namespace is canonical; build a nested-name-specifier with
397714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    // this namespace and no prefix.
397814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return NestedNameSpecifier::Create(*this, 0,
397914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                    NNS->getAsNamespaceAlias()->getNamespace()
398014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                      ->getOriginalNamespace());
3981d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
3982d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::TypeSpec:
3983d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate: {
3984d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    QualType T = getCanonicalType(QualType(NNS->getAsType(), 0));
3985264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor
3986264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // If we have some kind of dependent-named type (e.g., "typename T::type"),
3987264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // break it apart into its prefix and identifier, then reconsititute those
3988264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // as the canonical nested-name-specifier. This is required to canonicalize
3989264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // a dependent nested-name-specifier involving typedefs of dependent-name
3990264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    // types, e.g.,
3991264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    //   typedef typename T::type T1;
3992264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor    //   typedef typename T1::type T2;
399316412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    if (const DependentNameType *DNT = T->getAs<DependentNameType>())
399416412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman      return NestedNameSpecifier::Create(*this, DNT->getQualifier(),
3995264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor                           const_cast<IdentifierInfo *>(DNT->getIdentifier()));
3996264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor
399716412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // Otherwise, just canonicalize the type, and force it to be a TypeSpec.
399816412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // FIXME: Why are TypeSpec and TypeSpecWithTemplate distinct in the
399916412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman    // first place?
40003b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    return NestedNameSpecifier::Create(*this, 0, false,
40013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                       const_cast<Type*>(T.getTypePtr()));
4002d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
4003d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
4004d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  case NestedNameSpecifier::Global:
4005d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    // The global specifier is canonical and unique.
4006d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    return NNS;
4007d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
4008d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
40097530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid NestedNameSpecifier::Kind!");
4010d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
4011d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
4012c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner
40134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadconst ArrayType *ASTContext::getAsArrayType(QualType T) const {
4014c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Handle the non-qualified case efficiently.
4015a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  if (!T.hasLocalQualifiers()) {
4016c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    // Handle the common positive case fast.
4017c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    if (const ArrayType *AT = dyn_cast<ArrayType>(T))
4018c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner      return AT;
4019c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  }
40201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Handle the common negative case fast.
40223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!isa<ArrayType>(T.getCanonicalType()))
4023c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return 0;
40241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40250953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Apply any qualifiers from the array type to the element type.  This
4026c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // implements C99 6.7.3p8: "If the specification of an array type includes
4027c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // any type qualifiers, the element type is so qualified, not the array type."
40281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4029c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If we get here, we either have type qualifiers on the type, or we have
4030c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // sugar such as a typedef in the way.  If we have type qualifiers on the type
403150d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor  // we must propagate them down into the element type.
40320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
40333b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  SplitQualType split = T.getSplitDesugaredType();
4034200fa53fd420aa8369586f569dbece04930ad6a3John McCall  Qualifiers qs = split.Quals;
40351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4036c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If we have a simple case, just return now.
4037200fa53fd420aa8369586f569dbece04930ad6a3John McCall  const ArrayType *ATy = dyn_cast<ArrayType>(split.Ty);
40383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (ATy == 0 || qs.empty())
4039c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return ATy;
40401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4041c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Otherwise, we have an array and we have qualifiers on it.  Push the
4042c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // qualifiers into the array element type and return a new array type.
40433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs);
40441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4045c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy))
4046c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(),
4047c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                                CAT->getSizeModifier(),
40480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                           CAT->getIndexTypeCVRQualifiers()));
4049c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy))
4050c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return cast<ArrayType>(getIncompleteArrayType(NewEltTy,
4051c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                                  IAT->getSizeModifier(),
40520953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                           IAT->getIndexTypeCVRQualifiers()));
4053898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
40541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (const DependentSizedArrayType *DSAT
4055898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor        = dyn_cast<DependentSizedArrayType>(ATy))
4056898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    return cast<ArrayType>(
40571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                     getDependentSizedArrayType(NewEltTy,
40583fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                                DSAT->getSizeExpr(),
4059898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor                                                DSAT->getSizeModifier(),
40600953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                              DSAT->getIndexTypeCVRQualifiers(),
40617e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                                DSAT->getBracketsRange()));
40621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4063c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  const VariableArrayType *VAT = cast<VariableArrayType>(ATy);
40647e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  return cast<ArrayType>(getVariableArrayType(NewEltTy,
40653fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall                                              VAT->getSizeExpr(),
4066c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner                                              VAT->getSizeModifier(),
40670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                              VAT->getIndexTypeCVRQualifiers(),
40687e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                              VAT->getBracketsRange()));
406977c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner}
407077c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner
4071ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getAdjustedParameterType(QualType T) const {
407279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  // C99 6.7.5.3p7:
407379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   A declaration of a parameter as "array of type" shall be
407479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   adjusted to "qualified pointer to type", where the type
407579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   qualifiers (if any) are those specified within the [ and ] of
407679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   the array type derivation.
407779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  if (T->isArrayType())
407879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor    return getArrayDecayedType(T);
407979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
408079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  // C99 6.7.5.3p8:
408179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   A declaration of a parameter as "function returning type"
408279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   shall be adjusted to "pointer to function returning type", as
408379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  //   in 6.3.2.1.
408479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  if (T->isFunctionType())
408579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor    return getPointerType(T);
408679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
408779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  return T;
408879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor}
408979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
4090ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getSignatureParameterType(QualType T) const {
409179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  T = getVariableArrayDecayedType(T);
409279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  T = getAdjustedParameterType(T);
409379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor  return T.getUnqualifiedType();
409479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor}
409579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor
4096e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// getArrayDecayedType - Return the properly qualified result of decaying the
4097e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// specified array type to a pointer.  This operation is non-trivial when
4098e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// handling typedefs etc.  The canonical type of "T" must be an array type,
4099e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// this returns a pointer to a properly qualified element of the array.
4100e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner///
4101e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
41024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getArrayDecayedType(QualType Ty) const {
4103c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // Get the element type with 'getAsArrayType' so that we don't lose any
4104c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // typedefs in the element type of the array.  This also handles propagation
4105c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // of type qualifiers from the array type into the element type if present
4106c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // (C99 6.7.3p8).
4107c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  const ArrayType *PrettyArrayType = getAsArrayType(Ty);
4108c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  assert(PrettyArrayType && "Not an array type!");
41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4110c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  QualType PtrTy = getPointerType(PrettyArrayType->getElementType());
4111e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
4112e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner  // int x[restrict 4] ->  int *restrict
41130953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers());
4114e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner}
4115e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner
41163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(const ArrayType *array) const {
41173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return getBaseElementType(array->getElementType());
41185e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor}
41195e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor
41203b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(QualType type) const {
41213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Qualifiers qs;
41223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  while (true) {
41233b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    SplitQualType split = type.getSplitDesugaredType();
4124200fa53fd420aa8369586f569dbece04930ad6a3John McCall    const ArrayType *array = split.Ty->getAsArrayTypeUnsafe();
41253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    if (!array) break;
41261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    type = array->getElementType();
4128200fa53fd420aa8369586f569dbece04930ad6a3John McCall    qs.addConsistentQualifiers(split.Quals);
41293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  }
41301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41313b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  return getQualifiedType(type, qs);
41326183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson}
41336183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson
41340de78998e7bda473b408437053e48661b510d453Fariborz Jahanian/// getConstantArrayElementCount - Returns number of constant array elements.
41351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpuint64_t
41360de78998e7bda473b408437053e48661b510d453Fariborz JahanianASTContext::getConstantArrayElementCount(const ConstantArrayType *CA)  const {
41370de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  uint64_t ElementCount = 1;
41380de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  do {
41390de78998e7bda473b408437053e48661b510d453Fariborz Jahanian    ElementCount *= CA->getSize().getZExtValue();
4140d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith    CA = dyn_cast_or_null<ConstantArrayType>(
4141d5e839429771ad4d1a8b3db598cbbc6d93621f75Richard Smith      CA->getElementType()->getAsArrayTypeUnsafe());
41420de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  } while (CA);
41430de78998e7bda473b408437053e48661b510d453Fariborz Jahanian  return ElementCount;
41440de78998e7bda473b408437053e48661b510d453Fariborz Jahanian}
41450de78998e7bda473b408437053e48661b510d453Fariborz Jahanian
41465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFloatingRank - Return a relative rank for floating point types.
41475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// This routine will assert if passed a built-in type that isn't a float.
4148a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattnerstatic FloatingRank getFloatingRank(QualType T) {
4149183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  if (const ComplexType *CT = T->getAs<ComplexType>())
41505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return getFloatingRank(CT->getElementType());
4151a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner
4152183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type");
4153183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  switch (T->getAs<BuiltinType>()->getKind()) {
4154b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("getFloatingRank(): not a floating type");
4155aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case BuiltinType::Half:       return HalfRank;
41565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Float:      return FloatRank;
41575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Double:     return DoubleRank;
41585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::LongDouble: return LongDoubleRank;
41595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
41605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
41615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
41621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getFloatingTypeOfSizeWithinDomain - Returns a real floating
41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// point or a complex type (based on typeDomain/typeSize).
4164716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeDomain' is a real floating point or complex type.
4165716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeSize' is a real floating point or complex type.
41661361b11066239ea15764a2a844405352d87296b3Chris LattnerQualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size,
41671361b11066239ea15764a2a844405352d87296b3Chris Lattner                                                       QualType Domain) const {
41681361b11066239ea15764a2a844405352d87296b3Chris Lattner  FloatingRank EltRank = getFloatingRank(Size);
41691361b11066239ea15764a2a844405352d87296b3Chris Lattner  if (Domain->isComplexType()) {
41701361b11066239ea15764a2a844405352d87296b3Chris Lattner    switch (EltRank) {
4171561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie    case HalfRank: llvm_unreachable("Complex half is not supported");
4172f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case FloatRank:      return FloatComplexTy;
4173f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case DoubleRank:     return DoubleComplexTy;
4174f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    case LongDoubleRank: return LongDoubleComplexTy;
4175f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff    }
4176f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff  }
41771361b11066239ea15764a2a844405352d87296b3Chris Lattner
41781361b11066239ea15764a2a844405352d87296b3Chris Lattner  assert(Domain->isRealFloatingType() && "Unknown domain!");
41791361b11066239ea15764a2a844405352d87296b3Chris Lattner  switch (EltRank) {
418019dbb20ac4371fae3190379a7e7bd467af3c00aaJoey Gouly  case HalfRank:       return HalfTy;
41811361b11066239ea15764a2a844405352d87296b3Chris Lattner  case FloatRank:      return FloatTy;
41821361b11066239ea15764a2a844405352d87296b3Chris Lattner  case DoubleRank:     return DoubleTy;
41831361b11066239ea15764a2a844405352d87296b3Chris Lattner  case LongDoubleRank: return LongDoubleTy;
41845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4185561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie  llvm_unreachable("getFloatingRank(): illegal value for rank");
41865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
41875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
41887cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// getFloatingTypeOrder - Compare the rank of the two specified floating
41897cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// point types, ignoring the domain of the type (i.e. 'double' ==
41907cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// '_Complex double').  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
41911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1.
41924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const {
4193a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  FloatingRank LHSR = getFloatingRank(LHS);
4194a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  FloatingRank RHSR = getFloatingRank(RHS);
41951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4196a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  if (LHSR == RHSR)
4197fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff    return 0;
4198a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner  if (LHSR > RHSR)
4199fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff    return 1;
4200fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff  return -1;
42015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
42025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4203f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This
4204f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// routine will assert if passed a built-in type that isn't an integer or enum,
4205f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// or if it is not canonicalized.
4206f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallunsigned ASTContext::getIntegerRank(const Type *T) const {
4207467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(T->isCanonicalUnqualified() && "T should be canonicalized");
4208f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith
4209f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  switch (cast<BuiltinType>(T)->getKind()) {
4210b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("getIntegerRank(): not a built-in integer");
42117cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Bool:
4212f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 1 + (getIntWidth(BoolTy) << 3);
42137cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Char_S:
42147cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Char_U:
42157cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::SChar:
42167cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UChar:
4217f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 2 + (getIntWidth(CharTy) << 3);
42187cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Short:
42197cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UShort:
4220f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 3 + (getIntWidth(ShortTy) << 3);
42217cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Int:
42227cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::UInt:
4223f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 4 + (getIntWidth(IntTy) << 3);
42247cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::Long:
42257cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::ULong:
4226f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 5 + (getIntWidth(LongTy) << 3);
42277cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::LongLong:
42287cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  case BuiltinType::ULongLong:
4229f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return 6 + (getIntWidth(LongLongTy) << 3);
42302df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::Int128:
42312df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::UInt128:
42322df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner    return 7 + (getIntWidth(Int128Ty) << 3);
4233f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  }
4234f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner}
4235f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner
423604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \brief Whether this is a promotable bitfield reference according
423704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
423804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman///
423904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \returns the type this bit-field will promote to, or NULL if no
424004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// promotion occurs.
42414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::isPromotableBitField(Expr *E) const {
4242ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor  if (E->isTypeDependent() || E->isValueDependent())
4243ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor    return QualType();
4244ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor
424504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  FieldDecl *Field = E->getBitField();
424604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (!Field)
424704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return QualType();
424804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
424904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  QualType FT = Field->getType();
425004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
4251a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  uint64_t BitWidth = Field->getBitWidthValue(*this);
425204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  uint64_t IntSize = getTypeSize(IntTy);
425304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // GCC extension compatibility: if the bit-field size is less than or equal
425404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // to the size of int, it gets promoted no matter what its type is.
425504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // For instance, unsigned long bf : 4 gets promoted to signed int.
425604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (BitWidth < IntSize)
425704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return IntTy;
425804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
425904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  if (BitWidth == IntSize)
426004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman    return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy;
426104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
426204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // Types bigger than int are not subject to promotions, and therefore act
426304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // like the base type.
426404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // FIXME: This doesn't quite match what gcc does, but what gcc does here
426504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  // is ridiculous.
426604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman  return QualType();
426704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman}
426804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman
4269a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// getPromotedIntegerType - Returns the type that Promotable will
4270a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable
4271a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// integer type.
42724ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPromotedIntegerType(QualType Promotable) const {
4273a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(!Promotable.isNull());
4274a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(Promotable->isPromotableIntegerType());
4275842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  if (const EnumType *ET = Promotable->getAs<EnumType>())
4276842aef8d942a880eeb9535d40de31a86838264cbJohn McCall    return ET->getDecl()->getPromotionType();
427768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman
427868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  if (const BuiltinType *BT = Promotable->getAs<BuiltinType>()) {
427968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t
428068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // (3.9.1) can be converted to a prvalue of the first of the following
428168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // types that can represent all the values of its underlying type:
428268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // int, unsigned int, long int, unsigned long int, long long int, or
428368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // unsigned long long int [...]
428468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    // FIXME: Is there some better way to compute this?
428568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    if (BT->getKind() == BuiltinType::WChar_S ||
428668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::WChar_U ||
428768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::Char16 ||
428868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        BT->getKind() == BuiltinType::Char32) {
428968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
429068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      uint64_t FromSize = getTypeSize(BT);
429168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy,
429268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman                                  LongLongTy, UnsignedLongLongTy };
429368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      for (size_t Idx = 0; Idx < llvm::array_lengthof(PromoteTypes); ++Idx) {
429468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        uint64_t ToSize = getTypeSize(PromoteTypes[Idx]);
429568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman        if (FromSize < ToSize ||
429668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman            (FromSize == ToSize &&
429768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman             FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType()))
429868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman          return PromoteTypes[Idx];
429968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      }
430068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman      llvm_unreachable("char type should fit into long long");
430168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman    }
430268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  }
430368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman
430468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman  // At this point, we should have a signed or unsigned integer type.
4305a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  if (Promotable->isSignedIntegerType())
4306a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman    return IntTy;
43075b64e77c2d51ca3e9313ed4107d3c4d927895cd6Eli Friedman  uint64_t PromotableSize = getIntWidth(Promotable);
43085b64e77c2d51ca3e9313ed4107d3c4d927895cd6Eli Friedman  uint64_t IntSize = getIntWidth(IntTy);
4309a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize);
4310a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman  return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy;
4311a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman}
4312a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman
431331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// \brief Recurses in pointer/array types until it finds an objc retainable
431431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// type and returns its ownership.
431531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios KyrtzidisQualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const {
431631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  while (!T.isNull()) {
431731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    if (T.getObjCLifetime() != Qualifiers::OCL_None)
431831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      return T.getObjCLifetime();
431931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    if (T->isArrayType())
432031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      T = getBaseElementType(T);
432131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else if (const PointerType *PT = T->getAs<PointerType>())
432231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      T = PT->getPointeeType();
432331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else if (const ReferenceType *RT = T->getAs<ReferenceType>())
432428445f0b62f6aed851ff87ce64d9b19200d3211fArgyrios Kyrtzidis      T = RT->getPointeeType();
432531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis    else
432631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis      break;
432731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  }
432831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis
432931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis  return Qualifiers::OCL_None;
433031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis}
433131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis
43321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getIntegerTypeOrder - Returns the highest ranked integer type:
43337cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// C99 6.3.1.8p1.  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
43341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1.
43354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const {
4336f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const Type *LHSC = getCanonicalType(LHS).getTypePtr();
4337f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const Type *RHSC = getCanonicalType(RHS).getTypePtr();
43387cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSC == RHSC) return 0;
43391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4340f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  bool LHSUnsigned = LHSC->isUnsignedIntegerType();
4341f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner  bool RHSUnsigned = RHSC->isUnsignedIntegerType();
43421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43437cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  unsigned LHSRank = getIntegerRank(LHSC);
43447cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  unsigned RHSRank = getIntegerRank(RHSC);
43451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43467cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSUnsigned == RHSUnsigned) {  // Both signed or both unsigned.
43477cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    if (LHSRank == RHSRank) return 0;
43487cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return LHSRank > RHSRank ? 1 : -1;
43497cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  }
43501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43517cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // Otherwise, the LHS is signed and the RHS is unsigned or visa versa.
43527cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (LHSUnsigned) {
43537cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // If the unsigned [LHS] type is larger, return it.
43547cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    if (LHSRank >= RHSRank)
43557cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner      return 1;
43561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43577cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // If the signed type can represent all values of the unsigned type, it
43587cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    // wins.  Because we are dealing with 2's complement and types that are
43591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // powers of two larger than each other, this is always safe.
43607cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return -1;
43617cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  }
43627cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner
43637cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // If the unsigned [RHS] type is larger, return it.
43647cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  if (RHSRank >= LHSRank)
43657cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner    return -1;
43661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43677cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // If the signed type can represent all values of the unsigned type, it
43687cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  // wins.  Because we are dealing with 2's complement and types that are
43691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // powers of two larger than each other, this is always safe.
43707cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner  return 1;
43715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
437271993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson
437379cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlssonstatic RecordDecl *
4374ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK,
4375ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                 DeclContext *DC, IdentifierInfo *Id) {
4376ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  SourceLocation Loc;
43774e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (Ctx.getLangOpts().CPlusPlus)
4378ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id);
437979cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson  else
4380ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id);
438179cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson}
4382ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara
43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// getCFConstantStringType - Return the type used for constant CFStrings.
43844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getCFConstantStringType() const {
438571993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  if (!CFConstantStringTypeDecl) {
43861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CFConstantStringTypeDecl =
4387ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara      CreateRecordDecl(*this, TTK_Struct, TUDecl,
438879cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("NSConstantString"));
43895cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall    CFConstantStringTypeDecl->startDefinition();
439079cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson
4391f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    QualType FieldTypes[4];
43921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
439371993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // const int *isa;
43940953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    FieldTypes[0] = getPointerType(IntTy.withConst());
4395f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    // int flags;
4396f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson    FieldTypes[1] = IntTy;
439771993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // const char *str;
43980953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    FieldTypes[2] = getPointerType(CharTy.withConst());
439971993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    // long length;
44001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    FieldTypes[3] = LongTy;
44011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
440244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    // Create fields
440344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    for (unsigned i = 0; i < 4; ++i) {
44041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl,
4405ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           SourceLocation(),
440644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                                           SourceLocation(), 0,
4407a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                           FieldTypes[i], /*TInfo=*/0,
44081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                           /*BitWidth=*/0,
44097a614d8380297fcd2bc23986241905d97222948cRichard Smith                                           /*Mutable=*/false,
4410ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                           ICIS_NoInit);
44112888b65aae768f54062505330df7be230a0510c7John McCall      Field->setAccess(AS_public);
441217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      CFConstantStringTypeDecl->addDecl(Field);
441344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    }
441444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
4415838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor    CFConstantStringTypeDecl->completeDefinition();
441671993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  }
44171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
441871993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  return getTagDeclType(CFConstantStringTypeDecl);
44198467583c2704e7a9691ea56939a029015f0ade0aGabor Greif}
4420b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson
4421f7992132207d7ddc8810a135cec97ebe5805e500Fariborz JahanianQualType ASTContext::getObjCSuperType() const {
4422f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  if (ObjCSuperType.isNull()) {
4423f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    RecordDecl *ObjCSuperTypeDecl  =
4424f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian      CreateRecordDecl(*this, TTK_Struct, TUDecl, &Idents.get("objc_super"));
4425f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    TUDecl->addDecl(ObjCSuperTypeDecl);
4426f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    ObjCSuperType = getTagDeclType(ObjCSuperTypeDecl);
4427f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  }
4428f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  return ObjCSuperType;
4429f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian}
4430f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian
4431319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregorvoid ASTContext::setCFConstantStringType(QualType T) {
44326217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  const RecordType *Rec = T->getAs<RecordType>();
4433319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor  assert(Rec && "Invalid CFConstantStringType");
4434319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor  CFConstantStringTypeDecl = Rec->getDecl();
4435319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor}
4436319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor
44374ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorType() const {
4438adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  if (BlockDescriptorType)
4439adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    return getTagDeclType(BlockDescriptorType);
4440adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4441adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  RecordDecl *T;
4442adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  // FIXME: Needs the FlagAppleBlock bit.
4443ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  T = CreateRecordDecl(*this, TTK_Struct, TUDecl,
444479cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("__block_descriptor"));
44455cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall  T->startDefinition();
4446adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4447adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  QualType FieldTypes[] = {
4448adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    UnsignedLongTy,
4449adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    UnsignedLongTy,
4450adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  };
4451adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4452adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  const char *FieldNames[] = {
4453adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    "reserved",
4454083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "Size"
4455adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  };
4456adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4457adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  for (size_t i = 0; i < 2; ++i) {
4458ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
4459adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         SourceLocation(),
4460adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         &Idents.get(FieldNames[i]),
4461a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                         FieldTypes[i], /*TInfo=*/0,
4462adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump                                         /*BitWidth=*/0,
44637a614d8380297fcd2bc23986241905d97222948cRichard Smith                                         /*Mutable=*/false,
4464ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                         ICIS_NoInit);
44652888b65aae768f54062505330df7be230a0510c7John McCall    Field->setAccess(AS_public);
4466adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump    T->addDecl(Field);
4467adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  }
4468adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4469838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  T->completeDefinition();
4470adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4471adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  BlockDescriptorType = T;
4472adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
4473adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump  return getTagDeclType(BlockDescriptorType);
4474adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump}
4475adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
44764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorExtendedType() const {
4477083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  if (BlockDescriptorExtendedType)
4478083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    return getTagDeclType(BlockDescriptorExtendedType);
4479083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4480083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  RecordDecl *T;
4481083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  // FIXME: Needs the FlagAppleBlock bit.
4482ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  T = CreateRecordDecl(*this, TTK_Struct, TUDecl,
448379cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson                       &Idents.get("__block_descriptor_withcopydispose"));
44845cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall  T->startDefinition();
4485083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4486083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  QualType FieldTypes[] = {
4487083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    UnsignedLongTy,
4488083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    UnsignedLongTy,
4489083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    getPointerType(VoidPtrTy),
4490083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    getPointerType(VoidPtrTy)
4491083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  };
4492083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4493083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  const char *FieldNames[] = {
4494083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "reserved",
4495083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "Size",
4496083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "CopyFuncPtr",
4497083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    "DestroyFuncPtr"
4498083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  };
4499083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4500083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  for (size_t i = 0; i < 4; ++i) {
4501ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(),
4502083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         SourceLocation(),
4503083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         &Idents.get(FieldNames[i]),
4504a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                         FieldTypes[i], /*TInfo=*/0,
4505083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump                                         /*BitWidth=*/0,
45067a614d8380297fcd2bc23986241905d97222948cRichard Smith                                         /*Mutable=*/false,
4507ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith                                         ICIS_NoInit);
45082888b65aae768f54062505330df7be230a0510c7John McCall    Field->setAccess(AS_public);
4509083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    T->addDecl(Field);
4510083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  }
4511083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4512838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  T->completeDefinition();
4513083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4514083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  BlockDescriptorExtendedType = T;
4515083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4516083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump  return getTagDeclType(BlockDescriptorExtendedType);
4517083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump}
4518083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump
4519b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// BlockRequiresCopying - Returns true if byref variable "D" of type "Ty"
4520b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// requires copy/dispose. Note that this must match the logic
4521b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian/// in buildByrefHelpers.
4522b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanianbool ASTContext::BlockRequiresCopying(QualType Ty,
4523b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian                                      const VarDecl *D) {
4524b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (const CXXRecordDecl *record = Ty->getAsCXXRecordDecl()) {
4525b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    const Expr *copyExpr = getBlockVarCopyInits(D);
4526b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    if (!copyExpr && record->hasTrivialDestructor()) return false;
4527b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4528af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump    return true;
4529b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  }
4530b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4531b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (!Ty->isObjCRetainableType()) return false;
4532b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4533b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  Qualifiers qs = Ty.getQualifiers();
4534b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4535b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  // If we have lifetime, that dominates.
4536b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  if (Qualifiers::ObjCLifetime lifetime = qs.getObjCLifetime()) {
4537b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    assert(getLangOpts().ObjCAutoRefCount);
4538b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4539b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    switch (lifetime) {
4540b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_None: llvm_unreachable("impossible");
4541b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4542b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // These are just bits as far as the runtime is concerned.
4543b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_ExplicitNone:
4544b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Autoreleasing:
4545b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian        return false;
4546b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian
4547b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // Tell the runtime that this is ARC __weak, called by the
4548b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // byref routines.
4549b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Weak:
4550b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      // ARC __strong __block variables need to be retained.
4551b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian      case Qualifiers::OCL_Strong:
4552b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian        return true;
4553e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian    }
4554b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian    llvm_unreachable("fell out of lifetime switch!");
4555e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian  }
4556b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian  return (Ty->isBlockPointerType() || isObjCNSObjectType(Ty) ||
4557b15c8984ea300624fbbde385d3907667ce1043faFariborz Jahanian          Ty->isObjCObjectPointerType());
4558af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump}
4559af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump
45603ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanianbool ASTContext::getByrefLifetime(QualType Ty,
45613ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian                              Qualifiers::ObjCLifetime &LifeTime,
45623ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian                              bool &HasByrefExtendedLayout) const {
45633ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
45643ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  if (!getLangOpts().ObjC1 ||
45653ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian      getLangOpts().getGC() != LangOptions::NonGC)
45663ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    return false;
45673ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
45683ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  HasByrefExtendedLayout = false;
456934db84fdb092f89ea3678a0792074a5b9253829aFariborz Jahanian  if (Ty->isRecordType()) {
45703ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    HasByrefExtendedLayout = true;
45713ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_None;
45723ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  }
45733ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else if (getLangOpts().ObjCAutoRefCount)
45743ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Ty.getObjCLifetime();
45753ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  // MRR.
45763ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
45773ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_ExplicitNone;
45783ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  else
45793ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian    LifeTime = Qualifiers::OCL_None;
45803ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian  return true;
45813ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian}
45823ca23d7dc6cb61e6f363a58d9256d548199d120cFariborz Jahanian
4583e97179c675b341927807c718be215c8d1aab8acbDouglas GregorTypedefDecl *ASTContext::getObjCInstanceTypeDecl() {
4584e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor  if (!ObjCInstanceTypeDecl)
4585e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor    ObjCInstanceTypeDecl = TypedefDecl::Create(*this,
4586e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               getTranslationUnitDecl(),
4587e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               SourceLocation(),
4588e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               SourceLocation(),
4589e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                               &Idents.get("instancetype"),
4590e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor                                     getTrivialTypeSourceInfo(getObjCIdType()));
4591e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor  return ObjCInstanceTypeDecl;
4592e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor}
4593e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor
4594e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// This returns true if a type has been typedefed to BOOL:
4595e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// typedef <type> BOOL;
45962d99833e8c956775f2183601cd120b65b569c867Chris Lattnerstatic bool isTypeTypedefedAsBOOL(QualType T) {
4597e8c49533521c40643653f943d47229e62d277f88Anders Carlsson  if (const TypedefType *TT = dyn_cast<TypedefType>(T))
4598bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner    if (IdentifierInfo *II = TT->getDecl()->getIdentifier())
4599bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner      return II->isStr("BOOL");
46001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
460185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson  return false;
460285f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson}
460385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson
4604a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingTypeSize returns size of type for objective-c encoding
460533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// purpose.
46064ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const {
4607f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  if (!type->isIncompleteArrayType() && type->isIncompleteType())
4608f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    return CharUnits::Zero();
4609f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4610199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits sz = getTypeSizeInChars(type);
46111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
461233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Make all integer and enum types at least as large as an int
46132ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor  if (sz.isPositive() && type->isIntegralOrEnumerationType())
4614199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    sz = std::max(sz, getTypeSizeInChars(IntTy));
461533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Treat arrays as pointers, since that's how they're passed in.
461633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  else if (type->isArrayType())
4617199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    sz = getTypeSizeInChars(VoidPtrTy);
4618aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck  return sz;
4619199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck}
4620199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck
4621199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstatic inline
4622199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstd::string charUnitsToString(const CharUnits &CU) {
4623199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  return llvm::itostr(CU.getQuantity());
462433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
462533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
46266b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// getObjCEncodingForBlock - Return the encoded type for this block
46275e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall/// declaration.
46286b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallstd::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const {
46296b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  std::string S;
46306b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
46315e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  const BlockDecl *Decl = Expr->getBlockDecl();
46325e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  QualType BlockTy =
46335e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      Expr->getType()->getAs<BlockPointerType>()->getPointeeType();
46345e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Encode result type.
46353d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian  if (getLangOpts().EncodeExtendedBlockSig)
463606cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None,
463706cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                            BlockTy->getAs<FunctionType>()->getResultType(),
463806cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                            S, true /*Extended*/);
463906cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian  else
464006cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    getObjCEncodingForType(BlockTy->getAs<FunctionType>()->getResultType(),
464106cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                           S);
46425e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Compute size of all parameters.
46435e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Start with computing size of a pointer in number of bytes.
46445e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // FIXME: There might(should) be a better way of doing this computation!
46455e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  SourceLocation Loc;
4646199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
4647199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits ParmOffset = PtrSize;
46486f46c2653c1545cc3fef0c0df996d18160160ce8Fariborz Jahanian  for (BlockDecl::param_const_iterator PI = Decl->param_begin(),
46495e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall       E = Decl->param_end(); PI != E; ++PI) {
46505e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    QualType PType = (*PI)->getType();
4651aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    CharUnits sz = getObjCEncodingTypeSize(PType);
4652075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian    if (sz.isZero())
4653075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian      continue;
4654199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    assert (sz.isPositive() && "BlockExpr - Incomplete param type");
46555e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    ParmOffset += sz;
46565e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
46575e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Size of the argument frame
4658199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(ParmOffset);
46595e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Block pointer and offset.
46605e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  S += "@?0";
46615e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall
46625e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  // Argument types.
46635e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  ParmOffset = PtrSize;
46645e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E =
46655e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall       Decl->param_end(); PI != E; ++PI) {
46665e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    ParmVarDecl *PVDecl = *PI;
46675e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    QualType PType = PVDecl->getOriginalType();
46685e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    if (const ArrayType *AT =
46695e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
46705e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      // Use array's original type only if it has known number of
46715389f48b24937ad7b4093307128b3cbf25235654David Chisnall      // elements.
46725389f48b24937ad7b4093307128b3cbf25235654David Chisnall      if (!isa<ConstantArrayType>(AT))
46735389f48b24937ad7b4093307128b3cbf25235654David Chisnall        PType = PVDecl->getType();
46745389f48b24937ad7b4093307128b3cbf25235654David Chisnall    } else if (PType->isFunctionType())
46755389f48b24937ad7b4093307128b3cbf25235654David Chisnall      PType = PVDecl->getType();
46763d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian    if (getLangOpts().EncodeExtendedBlockSig)
467706cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian      getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, PType,
467806cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian                                      S, true /*Extended*/);
467906cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian    else
468006cffc0511ba76d979fad9ef6944e685936b62f0Fariborz Jahanian      getObjCEncodingForType(PType, S);
46815389f48b24937ad7b4093307128b3cbf25235654David Chisnall    S += charUnitsToString(ParmOffset);
46825389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmOffset += getObjCEncodingTypeSize(PType);
46835389f48b24937ad7b4093307128b3cbf25235654David Chisnall  }
46846b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
46856b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  return S;
46865389f48b24937ad7b4093307128b3cbf25235654David Chisnall}
46875389f48b24937ad7b4093307128b3cbf25235654David Chisnall
4688f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl,
46895389f48b24937ad7b4093307128b3cbf25235654David Chisnall                                                std::string& S) {
46905389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Encode result type.
46915389f48b24937ad7b4093307128b3cbf25235654David Chisnall  getObjCEncodingForType(Decl->getResultType(), S);
46925389f48b24937ad7b4093307128b3cbf25235654David Chisnall  CharUnits ParmOffset;
46935389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Compute size of all parameters.
46945389f48b24937ad7b4093307128b3cbf25235654David Chisnall  for (FunctionDecl::param_const_iterator PI = Decl->param_begin(),
46955389f48b24937ad7b4093307128b3cbf25235654David Chisnall       E = Decl->param_end(); PI != E; ++PI) {
46965389f48b24937ad7b4093307128b3cbf25235654David Chisnall    QualType PType = (*PI)->getType();
46975389f48b24937ad7b4093307128b3cbf25235654David Chisnall    CharUnits sz = getObjCEncodingTypeSize(PType);
4698f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    if (sz.isZero())
46997e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian      continue;
47007e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian
47015389f48b24937ad7b4093307128b3cbf25235654David Chisnall    assert (sz.isPositive() &&
4702f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor        "getObjCEncodingForFunctionDecl - Incomplete param type");
47035389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmOffset += sz;
47045389f48b24937ad7b4093307128b3cbf25235654David Chisnall  }
47055389f48b24937ad7b4093307128b3cbf25235654David Chisnall  S += charUnitsToString(ParmOffset);
47065389f48b24937ad7b4093307128b3cbf25235654David Chisnall  ParmOffset = CharUnits::Zero();
47075389f48b24937ad7b4093307128b3cbf25235654David Chisnall
47085389f48b24937ad7b4093307128b3cbf25235654David Chisnall  // Argument types.
47095389f48b24937ad7b4093307128b3cbf25235654David Chisnall  for (FunctionDecl::param_const_iterator PI = Decl->param_begin(),
47105389f48b24937ad7b4093307128b3cbf25235654David Chisnall       E = Decl->param_end(); PI != E; ++PI) {
47115389f48b24937ad7b4093307128b3cbf25235654David Chisnall    ParmVarDecl *PVDecl = *PI;
47125389f48b24937ad7b4093307128b3cbf25235654David Chisnall    QualType PType = PVDecl->getOriginalType();
47135389f48b24937ad7b4093307128b3cbf25235654David Chisnall    if (const ArrayType *AT =
47145389f48b24937ad7b4093307128b3cbf25235654David Chisnall          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
47155389f48b24937ad7b4093307128b3cbf25235654David Chisnall      // Use array's original type only if it has known number of
47165e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      // elements.
47175e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      if (!isa<ConstantArrayType>(AT))
47185e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall        PType = PVDecl->getType();
47195e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    } else if (PType->isFunctionType())
47205e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall      PType = PVDecl->getType();
47215e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    getObjCEncodingForType(PType, S);
4722199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    S += charUnitsToString(ParmOffset);
4723aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    ParmOffset += getObjCEncodingTypeSize(PType);
47245e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
4725f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4726f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  return false;
47275e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall}
47285e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall
4729dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// getObjCEncodingForMethodParameter - Return the encoded type for a single
4730dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// method parameter or return type. If Extended, include class names and
4731dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// block object types.
4732dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilsonvoid ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT,
4733dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                                   QualType T, std::string& S,
4734dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                                   bool Extended) const {
4735dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode type qualifer, 'in', 'inout', etc. for the parameter.
4736dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForTypeQualifier(QT, S);
4737dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode parameter type.
4738dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForTypeImpl(T, S, true, true, 0,
4739dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             true     /*OutermostType*/,
4740dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             false    /*EncodingProperty*/,
4741dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             false    /*StructField*/,
4742dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             Extended /*EncodeBlockParameters*/,
4743dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                             Extended /*EncodeClassNames*/);
4744dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson}
4745dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson
4746a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingForMethodDecl - Return the encoded type for this method
474733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// declaration.
4748f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
4749dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                              std::string& S,
4750dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                              bool Extended) const {
4751c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: This is not very efficient.
4752dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  // Encode return type.
4753dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson  getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(),
4754dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                    Decl->getResultType(), S, Extended);
475533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Compute size of all parameters.
475633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Start with computing size of a pointer in number of bytes.
475733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // FIXME: There might(should) be a better way of doing this computation!
475833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  SourceLocation Loc;
4759199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
476033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // The first two arguments (self and _cmd) are pointers; account for
476133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // their size.
4762199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CharUnits ParmOffset = 2 * PtrSize;
4763491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis  for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
47647732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian       E = Decl->sel_param_end(); PI != E; ++PI) {
476589951a86b594513c2a013532ed45d197413b1087Chris Lattner    QualType PType = (*PI)->getType();
4766aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    CharUnits sz = getObjCEncodingTypeSize(PType);
4767f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor    if (sz.isZero())
47687e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian      continue;
47697e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian
4770199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    assert (sz.isPositive() &&
4771199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck        "getObjCEncodingForMethodDecl - Incomplete param type");
477233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    ParmOffset += sz;
477333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  }
4774199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(ParmOffset);
477533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  S += "@0:";
4776199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  S += charUnitsToString(PtrSize);
47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
477833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  // Argument types.
477933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  ParmOffset = 2 * PtrSize;
4780491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis  for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
47817732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian       E = Decl->sel_param_end(); PI != E; ++PI) {
4782491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis    const ParmVarDecl *PVDecl = *PI;
47831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType PType = PVDecl->getOriginalType();
47844306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian    if (const ArrayType *AT =
4785ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff          dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
4786ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      // Use array's original type only if it has known number of
4787ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      // elements.
4788bb3fde337fb712c0e6da8790d431621be4793048Steve Naroff      if (!isa<ConstantArrayType>(AT))
4789ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff        PType = PVDecl->getType();
4790ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff    } else if (PType->isFunctionType())
4791ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff      PType = PVDecl->getType();
4792dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(),
4793dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                      PType, S, Extended);
4794199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    S += charUnitsToString(ParmOffset);
4795aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck    ParmOffset += getObjCEncodingTypeSize(PType);
479633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  }
4797f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor
4798f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor  return false;
479933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
480033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
4801c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// getObjCEncodingForPropertyDecl - Return the encoded type for this
480283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// property declaration. If non-NULL, Container must be either an
4803c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be
4804c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// NULL when getting encodings for protocol properties.
48051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Property attributes are stored as a comma-delimited C string. The simple
48061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// attributes readonly and bycopy are encoded as single characters. The
48071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parametrized attributes, getter=name, setter=name, and ivar=name, are
48081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// encoded as single characters, followed by an identifier. Property types
48091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// are also encoded as a parametrized attribute. The characters used to encode
481083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// these attributes are defined by the following enumeration:
481183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @code
481283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// enum PropertyAttributes {
481383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyReadOnly = 'R',   // property is read-only.
481483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyBycopy = 'C',     // property is a copy of the value last assigned
481583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyByref = '&',  // property is a reference to the value last assigned
481683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyDynamic = 'D',    // property is dynamic
481783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyGetter = 'G',     // followed by getter selector name
481883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertySetter = 'S',     // followed by setter selector name
481983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyInstanceVariable = 'V'  // followed by instance variable  name
48200d4cb85130d91da61c45aecb9fd31c7097a7cfccBob Wilson/// kPropertyType = 'T'              // followed by old-style type encoding.
482183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyWeak = 'W'              // 'weak' property
482283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyStrong = 'P'            // property GC'able
482383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyNonAtomic = 'N'         // property non-atomic
482483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// };
482583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @endcode
48261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
4827c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar                                                const Decl *Container,
48284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                                std::string& S) const {
4829c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // Collect information from the property implementation decl(s).
4830c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  bool Dynamic = false;
4831c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  ObjCPropertyImplDecl *SynthesizePID = 0;
4832c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4833c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: Duplicated code due to poor abstraction.
4834c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (Container) {
48351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const ObjCCategoryImplDecl *CID =
4836c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        dyn_cast<ObjCCategoryImplDecl>(Container)) {
4837c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      for (ObjCCategoryImplDecl::propimpl_iterator
483817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis             i = CID->propimpl_begin(), e = CID->propimpl_end();
4839653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor           i != e; ++i) {
4840581deb3da481053c4993c7600f97acf7768caac5David Blaikie        ObjCPropertyImplDecl *PID = *i;
4841c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        if (PID->getPropertyDecl() == PD) {
4842c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
4843c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            Dynamic = true;
4844c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          } else {
4845c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            SynthesizePID = PID;
4846c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          }
4847c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        }
4848c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      }
4849c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    } else {
485061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container);
4851c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar      for (ObjCCategoryImplDecl::propimpl_iterator
485217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis             i = OID->propimpl_begin(), e = OID->propimpl_end();
4853653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor           i != e; ++i) {
4854581deb3da481053c4993c7600f97acf7768caac5David Blaikie        ObjCPropertyImplDecl *PID = *i;
4855c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        if (PID->getPropertyDecl() == PD) {
4856c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) {
4857c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            Dynamic = true;
4858c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          } else {
4859c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar            SynthesizePID = PID;
4860c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar          }
4861c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar        }
48621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
4863c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    }
4864c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4865c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4866c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: This is not very efficient.
4867c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  S = "T";
4868c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4869c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // Encode result type.
4870090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  // GCC has some special rules regarding encoding of properties which
4871090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  // closely resembles encoding of ivars.
48721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0,
4873090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                             true /* outermost type */,
4874090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                             true /* encoding for property */);
4875c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4876c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->isReadOnly()) {
4877c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",R";
4878c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  } else {
4879c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    switch (PD->getSetterKind()) {
4880c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    case ObjCPropertyDecl::Assign: break;
4881c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    case ObjCPropertyDecl::Copy:   S += ",C"; break;
48821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case ObjCPropertyDecl::Retain: S += ",&"; break;
48833a02b44e3948f7762dbfba94b7961281ca29d022Fariborz Jahanian    case ObjCPropertyDecl::Weak:   S += ",W"; break;
4884c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    }
4885c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4886c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4887c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // It really isn't clear at all what this means, since properties
4888c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // are "dynamic by default".
4889c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (Dynamic)
4890c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",D";
4891c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4892090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic)
4893090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian    S += ",N";
48941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4895c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
4896c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",G";
4897077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    S += PD->getGetterName().getAsString();
4898c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4899c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4900c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
4901c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",S";
4902077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    S += PD->getSetterName().getAsString();
4903c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4904c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4905c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  if (SynthesizePID) {
4906c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl();
4907c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar    S += ",V";
490839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner    S += OID->getNameAsString();
4909c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  }
4910c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4911c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar  // FIXME: OBJCGC: weak & strong
4912c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar}
4913c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar
4914a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// getLegacyIntegralTypeEncoding -
49151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Another legacy compatibility encoding: 32-bit longs are encoded as
49161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 'l' or 'L' , but not always.  For typedefs, we need to use
4917a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 'i' or 'I' instead if encoding a struct field, or a pointer!
4918a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian///
4919a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanianvoid ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const {
49208e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump  if (isa<TypedefType>(PointeeTy.getTypePtr())) {
4921183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) {
49224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad      if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32)
4923a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        PointeeTy = UnsignedIntTy;
49241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      else
49254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32)
4926a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian          PointeeTy = IntTy;
4927a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
4928a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian  }
4929a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian}
4930a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian
49317d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanianvoid ASTContext::getObjCEncodingForType(QualType T, std::string& S,
49324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                        const FieldDecl *Field) const {
493382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // We follow the behavior of gcc, expanding structures which are
493482a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // directly pointed to, and expanding embedded structures. Note that
493582a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // these rules are sufficient to prevent recursive encoding of the
493682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar  // same type.
49371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getObjCEncodingForTypeImpl(T, S, true, true, Field,
49385b8c7d9fb620ba3a71e996d61e7b9bdf763b5c09Fariborz Jahanian                             true /* outermost type */);
493982a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar}
494082a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar
49413624e9e55d98507863d0731a0942cd874f2a1574John McCallstatic char getObjCEncodingForPrimitiveKind(const ASTContext *C,
49423624e9e55d98507863d0731a0942cd874f2a1574John McCall                                            BuiltinType::Kind kind) {
49433624e9e55d98507863d0731a0942cd874f2a1574John McCall    switch (kind) {
494464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Void:       return 'v';
494564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Bool:       return 'B';
494664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Char_U:
494764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UChar:      return 'C';
49483624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Char16:
494964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UShort:     return 'S';
49503624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Char32:
495164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UInt:       return 'I';
495264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::ULong:
49533624e9e55d98507863d0731a0942cd874f2a1574John McCall        return C->getTargetInfo().getLongWidth() == 32 ? 'L' : 'Q';
495464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::UInt128:    return 'T';
495564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::ULongLong:  return 'Q';
495664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Char_S:
495764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::SChar:      return 'c';
495864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Short:      return 's';
49593f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_S:
49603f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_U:
496164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Int:        return 'i';
496264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Long:
49633624e9e55d98507863d0731a0942cd874f2a1574John McCall      return C->getTargetInfo().getLongWidth() == 32 ? 'l' : 'q';
496464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::LongLong:   return 'q';
496564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Int128:     return 't';
496664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Float:      return 'f';
496764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    case BuiltinType::Double:     return 'd';
49683a0be84b2aed8563150cdbd976a98838afa261ebDaniel Dunbar    case BuiltinType::LongDouble: return 'D';
49693624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::NullPtr:    return '*'; // like char*
49703624e9e55d98507863d0731a0942cd874f2a1574John McCall
49713624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Half:
49723624e9e55d98507863d0731a0942cd874f2a1574John McCall      // FIXME: potentially need @encodes for these!
49733624e9e55d98507863d0731a0942cd874f2a1574John McCall      return ' ';
49743624e9e55d98507863d0731a0942cd874f2a1574John McCall
49753624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCId:
49763624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCClass:
49773624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::ObjCSel:
49783624e9e55d98507863d0731a0942cd874f2a1574John McCall      llvm_unreachable("@encoding ObjC primitive type");
49793624e9e55d98507863d0731a0942cd874f2a1574John McCall
49803624e9e55d98507863d0731a0942cd874f2a1574John McCall    // OpenCL and placeholder types don't need @encodings.
49813624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1d:
49823624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1dArray:
49833624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage1dBuffer:
49843624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage2d:
49853624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage2dArray:
49863624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::OCLImage3d:
4987e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei    case BuiltinType::OCLEvent:
498821f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei    case BuiltinType::OCLSampler:
49893624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::Dependent:
49903624e9e55d98507863d0731a0942cd874f2a1574John McCall#define BUILTIN_TYPE(KIND, ID)
49913624e9e55d98507863d0731a0942cd874f2a1574John McCall#define PLACEHOLDER_TYPE(KIND, ID) \
49923624e9e55d98507863d0731a0942cd874f2a1574John McCall    case BuiltinType::KIND:
49933624e9e55d98507863d0731a0942cd874f2a1574John McCall#include "clang/AST/BuiltinTypes.def"
49943624e9e55d98507863d0731a0942cd874f2a1574John McCall      llvm_unreachable("invalid builtin type for @encode");
499564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    }
4996719e53f64637c5ac41aac0c711e1977487ffc0d7David Blaikie    llvm_unreachable("invalid BuiltinType::Kind value");
499764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall}
499864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall
49995471bc85b69912e3b448de004498a80c0de32296Douglas Gregorstatic char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) {
50005471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  EnumDecl *Enum = ET->getDecl();
50015471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
50025471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  // The encoding of an non-fixed enum type is always 'i', regardless of size.
50035471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  if (!Enum->isFixed())
50045471bc85b69912e3b448de004498a80c0de32296Douglas Gregor    return 'i';
50055471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
50065471bc85b69912e3b448de004498a80c0de32296Douglas Gregor  // The encoding of a fixed enum type matches its fixed underlying type.
50073624e9e55d98507863d0731a0942cd874f2a1574John McCall  const BuiltinType *BT = Enum->getIntegerType()->castAs<BuiltinType>();
50083624e9e55d98507863d0731a0942cd874f2a1574John McCall  return getObjCEncodingForPrimitiveKind(C, BT->getKind());
50095471bc85b69912e3b448de004498a80c0de32296Douglas Gregor}
50105471bc85b69912e3b448de004498a80c0de32296Douglas Gregor
50114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic void EncodeBitField(const ASTContext *Ctx, std::string& S,
501264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall                           QualType T, const FieldDecl *FD) {
5013a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl");
50148b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian  S += 'b';
501564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // The NeXT runtime encodes bit fields as b followed by the number of bits.
501664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // The GNU runtime requires more information; bitfields are encoded as b,
501764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // then the offset (in bits) of the first element, then the type of the
501864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // bitfield, then the size in bits.  For example, in this structure:
501964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //
502064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // struct
502164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // {
502264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //    int integer;
502364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  //    int flags:2;
502464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // };
502564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // On a 32-bit system, the encoding for flags would be b2 for the NeXT
502664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // runtime, but b32i2 for the GNU runtime.  The reason for this extra
502764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // information is not especially sensible, but we're stuck with it for
502864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // compatibility with GCC, although providing it breaks anything that
502964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  // actually uses runtime introspection and wants to work on both runtimes...
5030260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (Ctx->getLangOpts().ObjCRuntime.isGNUFamily()) {
503164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    const RecordDecl *RD = FD->getParent();
503264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall    const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD);
503382905749d5c8d8b4edec11de754a73349cb96603Eli Friedman    S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex()));
50345471bc85b69912e3b448de004498a80c0de32296Douglas Gregor    if (const EnumType *ET = T->getAs<EnumType>())
50355471bc85b69912e3b448de004498a80c0de32296Douglas Gregor      S += ObjCEncodingForEnumType(Ctx, ET);
50363624e9e55d98507863d0731a0942cd874f2a1574John McCall    else {
50373624e9e55d98507863d0731a0942cd874f2a1574John McCall      const BuiltinType *BT = T->castAs<BuiltinType>();
50383624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += getObjCEncodingForPrimitiveKind(Ctx, BT->getKind());
50393624e9e55d98507863d0731a0942cd874f2a1574John McCall    }
504064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall  }
5041a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith  S += llvm::utostr(FD->getBitWidthValue(*Ctx));
50428b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian}
50438b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian
504401eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar// FIXME: Use SmallString for accumulating string.
504582a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbarvoid ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
504682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar                                            bool ExpandPointedToStructures,
504782a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar                                            bool ExpandStructures,
5048153bfe5795e2c1a5a738e73d3784964e082237fcDaniel Dunbar                                            const FieldDecl *FD,
5049090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian                                            bool OutermostType,
50502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                            bool EncodingProperty,
5051dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                            bool StructField,
5052dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                            bool EncodeBlockParameters,
505317c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian                                            bool EncodeClassNames,
505417c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian                                            bool EncodePointerToObjCTypedef) const {
50553624e9e55d98507863d0731a0942cd874f2a1574John McCall  CanQualType CT = getCanonicalType(T);
50563624e9e55d98507863d0731a0942cd874f2a1574John McCall  switch (CT->getTypeClass()) {
50573624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Builtin:
50583624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Enum:
5059ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (FD && FD->isBitField())
506064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall      return EncodeBitField(this, S, T, FD);
50613624e9e55d98507863d0731a0942cd874f2a1574John McCall    if (const BuiltinType *BT = dyn_cast<BuiltinType>(CT))
50623624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += getObjCEncodingForPrimitiveKind(this, BT->getKind());
50633624e9e55d98507863d0731a0942cd874f2a1574John McCall    else
50643624e9e55d98507863d0731a0942cd874f2a1574John McCall      S += ObjCEncodingForEnumType(this, cast<EnumType>(CT));
5065ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
50661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50673624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Complex: {
50683624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ComplexType *CT = T->castAs<ComplexType>();
5069c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson    S += 'j';
50701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false,
5071c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson                               false);
5072ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5073ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
50743624e9e55d98507863d0731a0942cd874f2a1574John McCall
50753624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Atomic: {
50763624e9e55d98507863d0731a0942cd874f2a1574John McCall    const AtomicType *AT = T->castAs<AtomicType>();
50773624e9e55d98507863d0731a0942cd874f2a1574John McCall    S += 'A';
50783624e9e55d98507863d0731a0942cd874f2a1574John McCall    getObjCEncodingForTypeImpl(AT->getValueType(), S, false, false, 0,
50793624e9e55d98507863d0731a0942cd874f2a1574John McCall                               false, false);
50803624e9e55d98507863d0731a0942cd874f2a1574John McCall    return;
5081aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian  }
50823624e9e55d98507863d0731a0942cd874f2a1574John McCall
50833624e9e55d98507863d0731a0942cd874f2a1574John McCall  // encoding for pointer or reference types.
50843624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Pointer:
50853624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::LValueReference:
50863624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::RValueReference: {
50873624e9e55d98507863d0731a0942cd874f2a1574John McCall    QualType PointeeTy;
50883624e9e55d98507863d0731a0942cd874f2a1574John McCall    if (isa<PointerType>(CT)) {
50893624e9e55d98507863d0731a0942cd874f2a1574John McCall      const PointerType *PT = T->castAs<PointerType>();
50903624e9e55d98507863d0731a0942cd874f2a1574John McCall      if (PT->isObjCSelType()) {
50913624e9e55d98507863d0731a0942cd874f2a1574John McCall        S += ':';
50923624e9e55d98507863d0731a0942cd874f2a1574John McCall        return;
50933624e9e55d98507863d0731a0942cd874f2a1574John McCall      }
50943624e9e55d98507863d0731a0942cd874f2a1574John McCall      PointeeTy = PT->getPointeeType();
50953624e9e55d98507863d0731a0942cd874f2a1574John McCall    } else {
50963624e9e55d98507863d0731a0942cd874f2a1574John McCall      PointeeTy = T->castAs<ReferenceType>()->getPointeeType();
50973624e9e55d98507863d0731a0942cd874f2a1574John McCall    }
50983624e9e55d98507863d0731a0942cd874f2a1574John McCall
5099a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    bool isReadOnly = false;
5100a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // For historical/compatibility reasons, the read-only qualifier of the
5101a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // pointee gets emitted _before_ the '^'.  The read-only qualifier of
5102a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    // the pointer itself gets ignored, _unless_ we are looking at a typedef!
51031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Also, do not emit the 'r' for anything but the outermost type!
51048e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump    if (isa<TypedefType>(T.getTypePtr())) {
5105a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      if (OutermostType && T.isConstQualified()) {
5106a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        isReadOnly = true;
5107a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        S += 'r';
5108a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      }
51099fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump    } else if (OutermostType) {
5110a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      QualType P = PointeeTy;
51116217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      while (P->getAs<PointerType>())
51126217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek        P = P->getAs<PointerType>()->getPointeeType();
5113a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      if (P.isConstQualified()) {
5114a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        isReadOnly = true;
5115a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian        S += 'r';
5116a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      }
5117a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
5118a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    if (isReadOnly) {
5119a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // Another legacy compatibility encoding. Some ObjC qualifier and type
5120a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // combinations need to be rearranged.
5121a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian      // Rewrite "in const" from "nr" to "rn"
51225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (StringRef(S).endswith("nr"))
51230237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer        S.replace(S.end()-2, S.end(), "rn");
5124a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    }
51251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
512685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    if (PointeeTy->isCharType()) {
512785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      // char pointer types should be encoded as '*' unless it is a
512885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      // type that has been typedef'd to 'BOOL'.
5129e8c49533521c40643653f943d47229e62d277f88Anders Carlsson      if (!isTypeTypedefedAsBOOL(PointeeTy)) {
513085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson        S += '*';
513185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson        return;
513285f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson      }
51336217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) {
51349533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // GCC binary compat: Need to convert "struct objc_class *" to "#".
51359533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) {
51369533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        S += '#';
51379533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        return;
51389533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      }
51399533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // GCC binary compat: Need to convert "struct objc_object *" to "@".
51409533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) {
51419533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        S += '@';
51429533a7fdb8397421f3be52e879442460a87389f6Steve Naroff        return;
51439533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      }
51449533a7fdb8397421f3be52e879442460a87389f6Steve Naroff      // fall through...
514585f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    }
514685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    S += '^';
5147a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian    getLegacyIntegralTypeEncoding(PointeeTy);
5148a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian
51491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures,
515043822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian                               NULL);
5151ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5152ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
51533624e9e55d98507863d0731a0942cd874f2a1574John McCall
51543624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ConstantArray:
51553624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::IncompleteArray:
51563624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::VariableArray: {
51573624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ArrayType *AT = cast<ArrayType>(CT);
51583624e9e55d98507863d0731a0942cd874f2a1574John McCall
51592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (isa<IncompleteArrayType>(AT) && !StructField) {
5160559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      // Incomplete arrays are encoded as a pointer to the array element.
5161559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += '^';
5162559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson
51631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(AT->getElementType(), S,
5164559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson                                 false, ExpandStructures, FD);
5165559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson    } else {
5166559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += '[';
51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
51692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        if (getTypeSize(CAT->getElementType()) == 0)
51702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          S += '0';
51712636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        else
51722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          S += llvm::utostr(CAT->getSize().getZExtValue());
51732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
5174559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson        //Variable length arrays are encoded as a regular array with 0 elements.
51752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) &&
51762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis               "Unknown array type!");
5177559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson        S += '0';
5178559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      }
51791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(AT->getElementType(), S,
5181559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson                                 false, ExpandStructures, FD);
5182559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson      S += ']';
5183559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson    }
5184ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5185ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
51861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51873624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::FunctionNoProto:
51883624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::FunctionProto:
5189c0a87b7db06643178ad2cbce0767548c139ea387Anders Carlsson    S += '?';
5190ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
51911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51923624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Record: {
51933624e9e55d98507863d0731a0942cd874f2a1574John McCall    RecordDecl *RDecl = cast<RecordType>(CT)->getDecl();
5194d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar    S += RDecl->isUnion() ? '(' : '{';
5195502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    // Anonymous structures print as '?'
5196502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    if (const IdentifierInfo *II = RDecl->getIdentifier()) {
5197502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar      S += II->getName();
51986fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian      if (ClassTemplateSpecializationDecl *Spec
51996fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian          = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
52006fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian        const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
52015eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer        llvm::raw_string_ostream OS(S);
52025eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer        TemplateSpecializationType::PrintTemplateArgumentList(OS,
5203910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                            TemplateArgs.data(),
5204910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                            TemplateArgs.size(),
520530c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor                                            (*this).getPrintingPolicy());
52066fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian      }
5207502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    } else {
5208502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar      S += '?';
5209502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar    }
52100d504c1da852e58ff802545c823ecff3b6c654b8Daniel Dunbar    if (ExpandStructures) {
52117d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian      S += '=';
52122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (!RDecl->isUnion()) {
52132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getObjCEncodingForStructureImpl(RDecl, S, FD);
52142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
52152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        for (RecordDecl::field_iterator Field = RDecl->field_begin(),
52162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                     FieldEnd = RDecl->field_end();
52172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis             Field != FieldEnd; ++Field) {
52182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          if (FD) {
52192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += '"';
52202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += Field->getNameAsString();
52212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            S += '"';
52222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          }
52231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          // Special case bit-fields.
52252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          if (Field->isBitField()) {
52262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getObjCEncodingForTypeImpl(Field->getType(), S, false, true,
5227581deb3da481053c4993c7600f97acf7768caac5David Blaikie                                       *Field);
52282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          } else {
52292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            QualType qt = Field->getType();
52302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getLegacyIntegralTypeEncoding(qt);
52312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            getObjCEncodingForTypeImpl(qt, S, false, true,
52322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       FD, /*OutermostType*/false,
52332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       /*EncodingProperty*/false,
52342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                       /*StructField*/true);
52352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis          }
5236d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar        }
52377d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian      }
52386de88a873a4cbe06d72602eef57d68006730a80bFariborz Jahanian    }
5239d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar    S += RDecl->isUnion() ? ')' : '}';
5240ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5241ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
52421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52433624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::BlockPointer: {
52443624e9e55d98507863d0731a0942cd874f2a1574John McCall    const BlockPointerType *BT = T->castAs<BlockPointerType>();
524521a98b188857d690aa4510c52ac4317ffa0908a8Steve Naroff    S += "@?"; // Unlike a pointer-to-function, which is "^?".
5246dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    if (EncodeBlockParameters) {
52473624e9e55d98507863d0731a0942cd874f2a1574John McCall      const FunctionType *FT = BT->getPointeeType()->castAs<FunctionType>();
5248dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson
5249dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += '<';
5250dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block return type
5251dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      getObjCEncodingForTypeImpl(FT->getResultType(), S,
5252dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 ExpandPointedToStructures, ExpandStructures,
5253dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 FD,
5254dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 false /* OutermostType */,
5255dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodingProperty,
5256dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 false /* StructField */,
5257dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodeBlockParameters,
5258dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                 EncodeClassNames);
5259dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block self
5260dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += "@?";
5261dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      // Block parameters
5262dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) {
5263dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        for (FunctionProtoType::arg_type_iterator I = FPT->arg_type_begin(),
5264dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson               E = FPT->arg_type_end(); I && (I != E); ++I) {
5265dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson          getObjCEncodingForTypeImpl(*I, S,
5266dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     ExpandPointedToStructures,
5267dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     ExpandStructures,
5268dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     FD,
5269dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     false /* OutermostType */,
5270dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodingProperty,
5271dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     false /* StructField */,
5272dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodeBlockParameters,
5273dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson                                     EncodeClassNames);
5274dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        }
5275dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      }
5276dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      S += '>';
5277dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    }
5278ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5279ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
52801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52813624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCObject:
52823624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCInterface: {
52833624e9e55d98507863d0731a0942cd874f2a1574John McCall    // Ignore protocol qualifiers when mangling at this level.
52843624e9e55d98507863d0731a0942cd874f2a1574John McCall    T = T->castAs<ObjCObjectType>()->getBaseType();
5285c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
52863624e9e55d98507863d0731a0942cd874f2a1574John McCall    // The assumption seems to be that this assert will succeed
52873624e9e55d98507863d0731a0942cd874f2a1574John McCall    // because nested levels will have filtered out 'id' and 'Class'.
52883624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ObjCInterfaceType *OIT = T->castAs<ObjCInterfaceType>();
528943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    // @encode(class_name)
52900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    ObjCInterfaceDecl *OI = OIT->getDecl();
529143822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '{';
529243822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    const IdentifierInfo *II = OI->getIdentifier();
529343822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += II->getName();
529443822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '=';
5295db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose    SmallVector<const ObjCIvarDecl*, 32> Ivars;
52962c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    DeepCollectObjCIvars(OI, true, Ivars);
52972c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian    for (unsigned i = 0, e = Ivars.size(); i != e; ++i) {
5298db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose      const FieldDecl *Field = cast<FieldDecl>(Ivars[i]);
52992c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian      if (Field->isBitField())
53002c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian        getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field);
530143822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian      else
530217c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian        getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD,
530317c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian                                   false, false, false, false, false,
530417c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian                                   EncodePointerToObjCTypedef);
530543822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    }
530643822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian    S += '}';
5307ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
530843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian  }
53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53103624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ObjCObjectPointer: {
53113624e9e55d98507863d0731a0942cd874f2a1574John McCall    const ObjCObjectPointerType *OPT = T->castAs<ObjCObjectPointerType>();
531214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    if (OPT->isObjCIdType()) {
531314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      S += '@';
531414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5315ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
53161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
531727d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff    if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
531827d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // FIXME: Consider if we need to output qualifiers for 'Class<p>'.
531927d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // Since this is a binary compatibility issue, need to consult with runtime
532027d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      // folks. Fortunately, this is a *very* obsure construct.
532114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      S += '#';
532214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5323ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
53241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5325ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (OPT->isObjCQualifiedIdType()) {
53261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(getObjCIdType(), S,
532714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff                                 ExpandPointedToStructures,
532814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff                                 ExpandStructures, FD);
5329dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson      if (FD || EncodingProperty || EncodeClassNames) {
533014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        // Note that we do extended encoding of protocol qualifer list
533114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        // Only when doing ivar or property encoding.
533214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        S += '"';
533367ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
533467ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff             E = OPT->qual_end(); I != E; ++I) {
533514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += '<';
533614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += (*I)->getNameAsString();
533714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff          S += '>';
533814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        }
533914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff        S += '"';
534014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      }
534114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
5342ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
53431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5344ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    QualType PointeeTy = OPT->getPointeeType();
5345ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    if (!EncodingProperty &&
534617c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian        isa<TypedefType>(PointeeTy.getTypePtr()) &&
534717c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian        !EncodePointerToObjCTypedef) {
5348ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      // Another historical/compatibility reason.
53491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // We encode the underlying type which comes out as
5350ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      // {...};
5351ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '^';
53521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      getObjCEncodingForTypeImpl(PointeeTy, S,
53531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 false, ExpandPointedToStructures,
535417c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian                                 NULL,
535517c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian                                 false, false, false, false, false,
535617c1a2e748d49d293c9926eeeb85aa4890182106Fariborz Jahanian                                 /*EncodePointerToObjCTypedef*/true);
535714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return;
535814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    }
5359ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner
5360ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    S += '@';
5361dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson    if (OPT->getInterfaceDecl() &&
5362dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson        (FD || EncodingProperty || EncodeClassNames)) {
5363ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '"';
536427d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff      S += OPT->getInterfaceDecl()->getIdentifier()->getName();
536567ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff      for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
536667ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff           E = OPT->qual_end(); I != E; ++I) {
5367ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += '<';
5368ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += (*I)->getNameAsString();
5369ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner        S += '>';
53701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
5371ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner      S += '"';
5372ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    }
5373ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner    return;
5374ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner  }
53751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5376532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall  // gcc just blithely ignores member pointers.
53773624e9e55d98507863d0731a0942cd874f2a1574John McCall  // FIXME: we shoul do better than that.  'M' is available.
53783624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::MemberPointer:
5379532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall    return;
5380e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian
53813624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::Vector:
53823624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::ExtVector:
5383e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // This matches gcc's encoding, even though technically it is
5384e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // insufficient.
5385e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    // FIXME. We should do a better job than gcc.
5386e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian    return;
53873624e9e55d98507863d0731a0942cd874f2a1574John McCall
53883624e9e55d98507863d0731a0942cd874f2a1574John McCall#define ABSTRACT_TYPE(KIND, BASE)
53893624e9e55d98507863d0731a0942cd874f2a1574John McCall#define TYPE(KIND, BASE)
53903624e9e55d98507863d0731a0942cd874f2a1574John McCall#define DEPENDENT_TYPE(KIND, BASE) \
53913624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
53923624e9e55d98507863d0731a0942cd874f2a1574John McCall#define NON_CANONICAL_TYPE(KIND, BASE) \
53933624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
53943624e9e55d98507863d0731a0942cd874f2a1574John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
53953624e9e55d98507863d0731a0942cd874f2a1574John McCall  case Type::KIND:
53963624e9e55d98507863d0731a0942cd874f2a1574John McCall#include "clang/AST/TypeNodes.def"
53973624e9e55d98507863d0731a0942cd874f2a1574John McCall    llvm_unreachable("@encode for dependent type!");
5398e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian  }
53993624e9e55d98507863d0731a0942cd874f2a1574John McCall  llvm_unreachable("bad type kind!");
540085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson}
540185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson
54022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidisvoid ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
54032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 std::string &S,
54042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 const FieldDecl *FD,
54052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                                 bool includeVBases) const {
54062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  assert(RDecl && "Expected non-null RecordDecl");
54072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  assert(!RDecl->isUnion() && "Should not be called for unions");
54082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (!RDecl->getDefinition())
54092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    return;
54102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
54122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
54132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  const ASTRecordLayout &layout = getASTRecordLayout(RDecl);
54142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec) {
54162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    for (CXXRecordDecl::base_class_iterator
54172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BI = CXXRec->bases_begin(),
54182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BE = CXXRec->bases_end(); BI != BE; ++BI) {
54192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (!BI->isVirtual()) {
54202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
5421829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis        if (base->isEmpty())
5422829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis          continue;
5423d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer        uint64_t offs = toBits(layout.getBaseClassOffset(base));
54242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
54252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                  std::make_pair(offs, base));
54262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
54272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
54282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
54292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  unsigned i = 0;
54312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  for (RecordDecl::field_iterator Field = RDecl->field_begin(),
54322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                               FieldEnd = RDecl->field_end();
54332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis       Field != FieldEnd; ++Field, ++i) {
54342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    uint64_t offs = layout.getFieldOffset(i);
54352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
5436581deb3da481053c4993c7600f97acf7768caac5David Blaikie                              std::make_pair(offs, *Field));
54372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
54382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec && includeVBases) {
54402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    for (CXXRecordDecl::base_class_iterator
54412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BI = CXXRec->vbases_begin(),
54422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis           BE = CXXRec->vbases_end(); BI != BE; ++BI) {
54432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
5444829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      if (base->isEmpty())
5445829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis        continue;
5446d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer      uint64_t offs = toBits(layout.getVBaseClassOffset(base));
544719aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis      if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
544819aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis        FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
544919aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis                                  std::make_pair(offs, base));
54502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
54512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
54522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  CharUnits size;
54542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (CXXRec) {
54552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    size = includeVBases ? layout.getSize() : layout.getNonVirtualSize();
54562636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  } else {
54572636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    size = layout.getSize();
54582636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
54592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54602636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  uint64_t CurOffs = 0;
54612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  std::multimap<uint64_t, NamedDecl *>::iterator
54622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    CurLayObj = FieldOrBaseOffsets.begin();
54632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
546458db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor  if (CXXRec && CXXRec->isDynamicClass() &&
546558db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor      (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
54662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (FD) {
54672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += "\"_vptr$";
54682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      std::string recname = CXXRec->getNameAsString();
54692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (recname.empty()) recname = "?";
54702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += recname;
54712636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      S += '"';
54722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
54732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    S += "^^?";
54742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    CurOffs += getTypeSize(VoidPtrTy);
54752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
54762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  if (!RDecl->hasFlexibleArrayMember()) {
54782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    // Mark the end of the structure.
54792636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    uint64_t offs = toBits(size);
54802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
54812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                              std::make_pair(offs, (NamedDecl*)0));
54822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
54832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54842636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
54852636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    assert(CurOffs <= CurLayObj->first);
54862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (CurOffs < CurLayObj->first) {
54882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      uint64_t padding = CurLayObj->first - CurOffs;
54892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // FIXME: There doesn't seem to be a way to indicate in the encoding that
54902636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // packing/alignment of members is different that normal, in which case
54912636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // the encoding will be out-of-sync with the real layout.
54922636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // If the runtime switches to just consider the size of types without
54932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // taking into account alignment, we could make padding explicit in the
54942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // encoding (e.g. using arrays of chars). The encoding strings would be
54952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // longer then though.
54962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      CurOffs += padding;
54972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
54982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
54992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    NamedDecl *dcl = CurLayObj->second;
55002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (dcl == 0)
55012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      break; // reached end of structure.
55022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
55032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) {
55042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // We expand the bases without their virtual bases since those are going
55052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // in the initial structure. Note that this differs from gcc which
55062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // expands virtual bases each time one is encountered in the hierarchy,
55072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      // making the encoding type bigger than it really is.
55082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false);
5509829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      assert(!base->isEmpty());
5510829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis      CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
55112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    } else {
55122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      FieldDecl *field = cast<FieldDecl>(dcl);
55132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (FD) {
55142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += '"';
55152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += field->getNameAsString();
55162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        S += '"';
55172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
55182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
55192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      if (field->isBitField()) {
55202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        EncodeBitField(this, S, field->getType(), field);
5521a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith        CurOffs += field->getBitWidthValue(*this);
55222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      } else {
55232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        QualType qt = field->getType();
55242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getLegacyIntegralTypeEncoding(qt);
55252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        getObjCEncodingForTypeImpl(qt, S, false, true, FD,
55262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*OutermostType*/false,
55272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*EncodingProperty*/false,
55282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis                                   /*StructField*/true);
55292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis        CurOffs += getTypeSize(field->getType());
55302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis      }
55312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis    }
55322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis  }
55332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis}
55342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
55351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,
5536ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian                                                 std::string& S) const {
5537ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_In)
5538ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'n';
5539ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Inout)
5540ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'N';
5541ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Out)
5542ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'o';
5543ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Bycopy)
5544ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'O';
5545ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Byref)
5546ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'R';
5547ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian  if (QT & Decl::OBJC_TQ_Oneway)
5548ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian    S += 'V';
5549ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian}
5550ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian
55514dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas GregorTypedefDecl *ASTContext::getObjCIdDecl() const {
55524dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  if (!ObjCIdDecl) {
55534dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0);
55544dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    T = getObjCObjectPointerType(T);
55554dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T);
55564dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
55574dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     getTranslationUnitDecl(),
55584dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     SourceLocation(), SourceLocation(),
55594dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor                                     &Idents.get("id"), IdInfo);
55604dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  }
55614dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor
55624dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  return ObjCIdDecl;
55637e219e47de26346885d667131977bd9ca2d7662aSteve Naroff}
55647e219e47de26346885d667131977bd9ca2d7662aSteve Naroff
55657a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas GregorTypedefDecl *ASTContext::getObjCSelDecl() const {
55667a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  if (!ObjCSelDecl) {
55677a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    QualType SelT = getPointerType(ObjCBuiltinSelTy);
55687a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    TypeSourceInfo *SelInfo = getTrivialTypeSourceInfo(SelT);
55697a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    ObjCSelDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
55707a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      getTranslationUnitDecl(),
55717a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      SourceLocation(), SourceLocation(),
55727a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor                                      &Idents.get("SEL"), SelInfo);
55737a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  }
55747a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor  return ObjCSelDecl;
5575b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
5576b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
557779d6726921897811232554ed94c5d77b5b7b3fc0Douglas GregorTypedefDecl *ASTContext::getObjCClassDecl() const {
557879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  if (!ObjCClassDecl) {
557979d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    QualType T = getObjCObjectType(ObjCBuiltinClassTy, 0, 0);
558079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    T = getObjCObjectPointerType(T);
558179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    TypeSourceInfo *ClassInfo = getTrivialTypeSourceInfo(T);
558279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    ObjCClassDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
558379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        getTranslationUnitDecl(),
558479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        SourceLocation(), SourceLocation(),
558579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor                                        &Idents.get("Class"), ClassInfo);
558679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  }
558779d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor
558879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor  return ObjCClassDecl;
5589a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor}
5590a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor
5591a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas GregorObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const {
5592a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  if (!ObjCProtocolClassDecl) {
5593a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    ObjCProtocolClassDecl
5594a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor      = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(),
5595a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  SourceLocation(),
5596a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  &Idents.get("Protocol"),
5597a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  /*PrevDecl=*/0,
5598a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor                                  SourceLocation(), true);
5599a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  }
5600a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor
5601a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  return ObjCProtocolClassDecl;
56028baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson}
56038baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson
5604c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===//
5605c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge// __builtin_va_list Construction Functions
5606c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===//
5607c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5608c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateCharPtrBuiltinVaListDecl(const ASTContext *Context) {
5609c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef char* __builtin_va_list;
5610c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType CharPtrType = Context->getPointerType(Context->CharTy);
5611c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5612c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(CharPtrType);
5613c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5614c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypeDecl
5615c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5616c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5617c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5618c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5619c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5620c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypeDecl;
5621c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5622c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5623c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) {
5624c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef void* __builtin_va_list;
5625c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VoidPtrType = Context->getPointerType(Context->VoidTy);
5626c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5627c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VoidPtrType);
5628c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5629c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypeDecl
5630c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5631c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5632c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5633c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5634c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5635c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypeDecl;
5636c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5637c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5638c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northoverstatic TypedefDecl *
5639c264e16a42b3f6c36521857a29ea0949d9781c22Tim NorthoverCreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context) {
5640c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  RecordDecl *VaListTagDecl;
5641c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  if (Context->getLangOpts().CPlusPlus) {
5642c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    // namespace std { struct __va_list {
5643c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    NamespaceDecl *NS;
5644c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    NS = NamespaceDecl::Create(const_cast<ASTContext &>(*Context),
5645c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                               Context->getTranslationUnitDecl(),
5646c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                               /*Inline*/false, SourceLocation(),
5647c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                               SourceLocation(), &Context->Idents.get("std"),
5648c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                               /*PrevDecl*/0);
5649c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5650c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    VaListTagDecl = CXXRecordDecl::Create(*Context, TTK_Struct,
5651c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                          Context->getTranslationUnitDecl(),
5652c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                          SourceLocation(), SourceLocation(),
5653c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                          &Context->Idents.get("__va_list"));
5654c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    VaListTagDecl->setDeclContext(NS);
5655c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  } else {
5656c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    // struct __va_list
5657c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct,
5658c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                   Context->getTranslationUnitDecl(),
5659c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                   &Context->Idents.get("__va_list"));
5660c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  }
5661c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5662c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  VaListTagDecl->startDefinition();
5663c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5664c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  const size_t NumFields = 5;
5665c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  QualType FieldTypes[NumFields];
5666c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  const char *FieldNames[NumFields];
5667c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5668c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  // void *__stack;
5669c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldTypes[0] = Context->getPointerType(Context->VoidTy);
5670c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldNames[0] = "__stack";
5671c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5672c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  // void *__gr_top;
5673c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldTypes[1] = Context->getPointerType(Context->VoidTy);
5674c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldNames[1] = "__gr_top";
5675c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5676c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  // void *__vr_top;
5677c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldTypes[2] = Context->getPointerType(Context->VoidTy);
5678c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldNames[2] = "__vr_top";
5679c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5680c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  // int __gr_offs;
5681c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldTypes[3] = Context->IntTy;
5682c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldNames[3] = "__gr_offs";
5683c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5684c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  // int __vr_offs;
5685c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldTypes[4] = Context->IntTy;
5686c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  FieldNames[4] = "__vr_offs";
5687c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5688c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  // Create fields
5689c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  for (unsigned i = 0; i < NumFields; ++i) {
5690c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
5691c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                         VaListTagDecl,
5692c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                         SourceLocation(),
5693c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                         SourceLocation(),
5694c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                         &Context->Idents.get(FieldNames[i]),
5695c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                         FieldTypes[i], /*TInfo=*/0,
5696c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                         /*BitWidth=*/0,
5697c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                         /*Mutable=*/false,
5698c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                         ICIS_NoInit);
5699c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    Field->setAccess(AS_public);
5700c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    VaListTagDecl->addDecl(Field);
5701c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  }
5702c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  VaListTagDecl->completeDefinition();
5703c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  QualType VaListTagType = Context->getRecordType(VaListTagDecl);
5704c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  Context->VaListTagTy = VaListTagType;
5705c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5706c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  // } __builtin_va_list;
5707c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  TypedefDecl *VaListTypedefDecl
5708c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5709c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                          Context->getTranslationUnitDecl(),
5710c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                          SourceLocation(), SourceLocation(),
5711c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                          &Context->Idents.get("__builtin_va_list"),
5712c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                          Context->getTrivialTypeSourceInfo(VaListTagType));
5713c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5714c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  return VaListTypedefDecl;
5715c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover}
5716c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
5717c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePowerABIBuiltinVaListDecl(const ASTContext *Context) {
5718c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef struct __va_list_tag {
5719c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  RecordDecl *VaListTagDecl;
5720c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5721c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct,
5722c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   Context->getTranslationUnitDecl(),
5723c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   &Context->Idents.get("__va_list_tag"));
5724c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->startDefinition();
5725c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5726c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const size_t NumFields = 5;
5727c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType FieldTypes[NumFields];
5728c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const char *FieldNames[NumFields];
5729c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5730c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned char gpr;
5731c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[0] = Context->UnsignedCharTy;
5732c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[0] = "gpr";
5733c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5734c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned char fpr;
5735c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[1] = Context->UnsignedCharTy;
5736c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[1] = "fpr";
5737c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5738c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned short reserved;
5739c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[2] = Context->UnsignedShortTy;
5740c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[2] = "reserved";
5741c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5742c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* overflow_arg_area;
5743c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[3] = Context->getPointerType(Context->VoidTy);
5744c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[3] = "overflow_arg_area";
5745c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5746c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* reg_save_area;
5747c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[4] = Context->getPointerType(Context->VoidTy);
5748c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[4] = "reg_save_area";
5749c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5750c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // Create fields
5751c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  for (unsigned i = 0; i < NumFields; ++i) {
5752c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    FieldDecl *Field = FieldDecl::Create(*Context, VaListTagDecl,
5753c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5754c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5755c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         &Context->Idents.get(FieldNames[i]),
5756c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         FieldTypes[i], /*TInfo=*/0,
5757c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*BitWidth=*/0,
5758c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*Mutable=*/false,
5759c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         ICIS_NoInit);
5760c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Field->setAccess(AS_public);
5761c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    VaListTagDecl->addDecl(Field);
5762c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5763c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->completeDefinition();
5764c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagType = Context->getRecordType(VaListTagDecl);
5765fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  Context->VaListTagTy = VaListTagType;
5766c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5767c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // } __va_list_tag;
5768c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTagTypedefDecl
5769c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5770c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5771c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5772c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__va_list_tag"),
5773c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(VaListTagType));
5774c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagTypedefType =
5775c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Context->getTypedefType(VaListTagTypedefDecl);
5776c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5777c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef __va_list_tag __builtin_va_list[1];
5778c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
5779c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagArrayType
5780c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(VaListTagTypedefType,
5781c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                    Size, ArrayType::Normal, 0);
5782c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5783c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VaListTagArrayType);
5784c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5785c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5786c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5787c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5788c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5789c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5790c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5791c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5792c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5793c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5794c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *
5795c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeCreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context) {
5796c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef struct __va_list_tag {
5797c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  RecordDecl *VaListTagDecl;
5798c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct,
5799c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   Context->getTranslationUnitDecl(),
5800c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                   &Context->Idents.get("__va_list_tag"));
5801c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->startDefinition();
5802c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5803c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const size_t NumFields = 4;
5804c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType FieldTypes[NumFields];
5805c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  const char *FieldNames[NumFields];
5806c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5807c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned gp_offset;
5808c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[0] = Context->UnsignedIntTy;
5809c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[0] = "gp_offset";
5810c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5811c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   unsigned fp_offset;
5812c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[1] = Context->UnsignedIntTy;
5813c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[1] = "fp_offset";
5814c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5815c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* overflow_arg_area;
5816c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[2] = Context->getPointerType(Context->VoidTy);
5817c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[2] = "overflow_arg_area";
5818c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5819c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  //   void* reg_save_area;
5820c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldTypes[3] = Context->getPointerType(Context->VoidTy);
5821c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  FieldNames[3] = "reg_save_area";
5822c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5823c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // Create fields
5824c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  for (unsigned i = 0; i < NumFields; ++i) {
5825c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
5826c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         VaListTagDecl,
5827c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5828c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         SourceLocation(),
5829c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         &Context->Idents.get(FieldNames[i]),
5830c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         FieldTypes[i], /*TInfo=*/0,
5831c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*BitWidth=*/0,
5832c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         /*Mutable=*/false,
5833c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                         ICIS_NoInit);
5834c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Field->setAccess(AS_public);
5835c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    VaListTagDecl->addDecl(Field);
5836c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5837c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  VaListTagDecl->completeDefinition();
5838c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagType = Context->getRecordType(VaListTagDecl);
5839fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  Context->VaListTagTy = VaListTagType;
5840c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5841c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // } __va_list_tag;
5842c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTagTypedefDecl
5843c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5844c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5845c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5846c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__va_list_tag"),
5847c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(VaListTagType));
5848c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagTypedefType =
5849c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    Context->getTypedefType(VaListTagTypedefDecl);
5850c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5851c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef __va_list_tag __builtin_va_list[1];
5852c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
5853c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType VaListTagArrayType
5854c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(VaListTagTypedefType,
5855c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                      Size, ArrayType::Normal,0);
5856c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypeSourceInfo *TInfo
5857c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getTrivialTypeSourceInfo(VaListTagArrayType);
5858c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5859c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5860c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5861c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5862c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5863c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          TInfo);
5864c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5865c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5866c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5867c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5868c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context) {
5869c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  // typedef int __builtin_va_list[4];
5870c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 4);
5871c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  QualType IntArrayType
5872c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = Context->getConstantArrayType(Context->IntTy,
5873c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge				    Size, ArrayType::Normal, 0);
5874c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  TypedefDecl *VaListTypedefDecl
5875c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5876c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTranslationUnitDecl(),
5877c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          SourceLocation(), SourceLocation(),
5878c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          &Context->Idents.get("__builtin_va_list"),
5879c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                          Context->getTrivialTypeSourceInfo(IntArrayType));
5880c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5881c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return VaListTypedefDecl;
5882c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5883c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5884eae5a820bced67465c8517793a1602dfaeed8a06Logan Chienstatic TypedefDecl *
5885eae5a820bced67465c8517793a1602dfaeed8a06Logan ChienCreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context) {
5886eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  RecordDecl *VaListDecl;
5887eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  if (Context->getLangOpts().CPlusPlus) {
5888eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    // namespace std { struct __va_list {
5889eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    NamespaceDecl *NS;
5890eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    NS = NamespaceDecl::Create(const_cast<ASTContext &>(*Context),
5891eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               Context->getTranslationUnitDecl(),
5892eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               /*Inline*/false, SourceLocation(),
5893eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               SourceLocation(), &Context->Idents.get("std"),
5894eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                               /*PrevDecl*/0);
5895eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5896eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl = CXXRecordDecl::Create(*Context, TTK_Struct,
5897eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       Context->getTranslationUnitDecl(),
5898eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(), SourceLocation(),
5899eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       &Context->Idents.get("__va_list"));
5900eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5901eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl->setDeclContext(NS);
5902eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5903eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  } else {
5904eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    // struct __va_list {
5905eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    VaListDecl = CreateRecordDecl(*Context, TTK_Struct,
5906eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                  Context->getTranslationUnitDecl(),
5907eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                  &Context->Idents.get("__va_list"));
5908eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  }
5909eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5910eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->startDefinition();
5911eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5912eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // void * __ap;
5913eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
5914eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       VaListDecl,
5915eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(),
5916eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       SourceLocation(),
5917eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       &Context->Idents.get("__ap"),
5918eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       Context->getPointerType(Context->VoidTy),
5919eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*TInfo=*/0,
5920eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*BitWidth=*/0,
5921eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       /*Mutable=*/false,
5922eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                                       ICIS_NoInit);
5923eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  Field->setAccess(AS_public);
5924eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->addDecl(Field);
5925eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5926eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // };
5927eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  VaListDecl->completeDefinition();
5928eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5929eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  // typedef struct __va_list __builtin_va_list;
5930eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  TypeSourceInfo *TInfo
5931eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    = Context->getTrivialTypeSourceInfo(Context->getRecordType(VaListDecl));
5932eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5933eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  TypedefDecl *VaListTypeDecl
5934eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    = TypedefDecl::Create(const_cast<ASTContext &>(*Context),
5935eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          Context->getTranslationUnitDecl(),
5936eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          SourceLocation(), SourceLocation(),
5937eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          &Context->Idents.get("__builtin_va_list"),
5938eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien                          TInfo);
5939eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5940eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  return VaListTypeDecl;
5941eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien}
5942eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien
5943c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVaListDecl(const ASTContext *Context,
5944c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                     TargetInfo::BuiltinVaListKind Kind) {
5945c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  switch (Kind) {
5946c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::CharPtrBuiltinVaList:
5947c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateCharPtrBuiltinVaListDecl(Context);
5948c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::VoidPtrBuiltinVaList:
5949c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateVoidPtrBuiltinVaListDecl(Context);
5950c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  case TargetInfo::AArch64ABIBuiltinVaList:
5951c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    return CreateAArch64ABIBuiltinVaListDecl(Context);
5952c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::PowerABIBuiltinVaList:
5953c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreatePowerABIBuiltinVaListDecl(Context);
5954c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::X86_64ABIBuiltinVaList:
5955c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreateX86_64ABIBuiltinVaListDecl(Context);
5956c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  case TargetInfo::PNaClABIBuiltinVaList:
5957c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    return CreatePNaClABIBuiltinVaListDecl(Context);
5958eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien  case TargetInfo::AAPCSABIBuiltinVaList:
5959eae5a820bced67465c8517793a1602dfaeed8a06Logan Chien    return CreateAAPCSABIBuiltinVaListDecl(Context);
5960c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  }
5961c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5962c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  llvm_unreachable("Unhandled __builtin_va_list type kind");
5963c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5964c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5965c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeTypedefDecl *ASTContext::getBuiltinVaListDecl() const {
5966c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  if (!BuiltinVaListDecl)
5967c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    BuiltinVaListDecl = CreateVaListDecl(this, Target->getBuiltinVaListKind());
5968c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5969c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  return BuiltinVaListDecl;
5970c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge}
5971c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
5972fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador IngeQualType ASTContext::getVaListTagType() const {
5973fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // Force the creation of VaListTagTy by building the __builtin_va_list
5974fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  // declaration.
5975fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  if (VaListTagTy.isNull())
5976fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge    (void) getBuiltinVaListDecl();
5977fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
5978fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge  return VaListTagTy;
5979fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge}
5980fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge
5981a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) {
59821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(ObjCConstantStringType.isNull() &&
59832198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff         "'NSConstantString' type already set!");
59841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5985a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCConstantStringType = getObjCInterfaceType(Decl);
59862198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff}
59872198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff
59880bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// \brief Retrieve the template name that corresponds to a non-empty
59890bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// lookup.
59904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
59914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
59924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                      UnresolvedSetIterator End) const {
59930bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  unsigned size = End - Begin;
59940bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  assert(size > 1 && "set is not overloaded!");
59957532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
59960bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  void *memory = Allocate(sizeof(OverloadedTemplateStorage) +
59970bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall                          size * sizeof(FunctionTemplateDecl*));
59980bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size);
59990bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
60000bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  NamedDecl **Storage = OT->getStorage();
6001eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall  for (UnresolvedSetIterator I = Begin; I != End; ++I) {
60020bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    NamedDecl *D = *I;
60030bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    assert(isa<FunctionTemplateDecl>(D) ||
60040bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall           (isa<UsingShadowDecl>(D) &&
60050bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall            isa<FunctionTemplateDecl>(D->getUnderlyingDecl())));
60060bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    *Storage++ = D;
60077532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
60087532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
60090bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  return TemplateName(OT);
60107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
60117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
6012d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// \brief Retrieve the template name that represents a qualified
6013d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// template name such as \c std::vector.
60144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
60154ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
60164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     bool TemplateKeyword,
60174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     TemplateDecl *Template) const {
60180f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor  assert(NNS && "Missing nested-name-specifier in qualified template name");
60190f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor
6020789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  // FIXME: Canonicalization?
6021d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  llvm::FoldingSetNodeID ID;
6022d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template);
60231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6024d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  void *InsertPos = 0;
6025d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  QualifiedTemplateName *QTN =
60260bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
6027d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  if (!QTN) {
60282f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<QualifiedTemplateName>())
60292f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        QualifiedTemplateName(NNS, TemplateKeyword, Template);
6030d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor    QualifiedTemplateNames.InsertNode(QTN, InsertPos);
6031d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  }
60321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6033d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  return TemplateName(QTN);
6034d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor}
6035d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor
60367532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Retrieve the template name that represents a dependent
60377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name such as \c MetaFun::template apply.
60384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName
60394ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
60404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     const IdentifierInfo *Name) const {
60411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert((!NNS || NNS->isDependent()) &&
60423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor         "Nested name specifier must be dependent");
60437532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
60447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  llvm::FoldingSetNodeID ID;
60457532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateName::Profile(ID, NNS, Name);
60467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
60477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void *InsertPos = 0;
60487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateName *QTN =
60497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
60507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
60517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (QTN)
60527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return TemplateName(QTN);
60537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
60547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
60557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (CanonNNS == NNS) {
60562f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
60572f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Name);
60587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  } else {
60597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    TemplateName Canon = getDependentTemplateName(CanonNNS, Name);
60602f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
60612f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Name, Canon);
6062789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    DependentTemplateName *CheckQTN =
6063789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
6064789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!CheckQTN && "Dependent type name canonicalization broken");
6065789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckQTN;
60667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
60677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
60687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateNames.InsertNode(QTN, InsertPos);
60697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  return TemplateName(QTN);
60707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
60717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
6072ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// \brief Retrieve the template name that represents a dependent
6073ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// template name such as \c MetaFun::template operator+.
6074ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
6075ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
60764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                     OverloadedOperatorKind Operator) const {
6077ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  assert((!NNS || NNS->isDependent()) &&
6078ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor         "Nested name specifier must be dependent");
6079ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
6080ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  llvm::FoldingSetNodeID ID;
6081ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateName::Profile(ID, NNS, Operator);
6082ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
6083ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  void *InsertPos = 0;
6084789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor  DependentTemplateName *QTN
6085789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
6086ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
6087ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  if (QTN)
6088ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return TemplateName(QTN);
6089ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
6090ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
6091ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  if (CanonNNS == NNS) {
60922f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
60932f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Operator);
6094ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  } else {
6095ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    TemplateName Canon = getDependentTemplateName(CanonNNS, Operator);
60962f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith    QTN = new (*this, llvm::alignOf<DependentTemplateName>())
60972f47cab092cd2dcbfe7e003fa865499caf198dc2Richard Smith        DependentTemplateName(NNS, Operator, Canon);
6098789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor
6099789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    DependentTemplateName *CheckQTN
6100789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor      = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
6101789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    assert(!CheckQTN && "Dependent template name canonicalization broken");
6102789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor    (void)CheckQTN;
6103ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
6104ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
6105ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateNames.InsertNode(QTN, InsertPos);
6106ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return TemplateName(QTN);
6107ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
6108ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
61091aee05d08b2184acadeb36de300e216390780d6cDouglas GregorTemplateName
6110146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param,
6111146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                         TemplateName replacement) const {
6112146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  llvm::FoldingSetNodeID ID;
6113146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage::Profile(ID, param, replacement);
6114146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
6115146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  void *insertPos = 0;
6116146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage *subst
6117146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
6118146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
6119146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  if (!subst) {
6120146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement);
6121146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParms.InsertNode(subst, insertPos);
6122146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
6123146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
6124146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  return TemplateName(subst);
6125146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall}
6126146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
6127146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallTemplateName
61281aee05d08b2184acadeb36de300e216390780d6cDouglas GregorASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param,
61291aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                       const TemplateArgument &ArgPack) const {
61301aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ASTContext &Self = const_cast<ASTContext &>(*this);
61311aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  llvm::FoldingSetNodeID ID;
61321aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack);
61331aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
61341aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  void *InsertPos = 0;
61351aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage *Subst
61361aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
61371aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
61381aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  if (!Subst) {
6139146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param,
61401aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                                           ArgPack.pack_size(),
61411aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                                         ArgPack.pack_begin());
61421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
61431aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
61441aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
61451aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  return TemplateName(Subst);
61461aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor}
61471aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
6148b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor/// getFromTargetType - Given one of the integer types provided by
6149d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// TargetInfo, produce the corresponding type. The unsigned @p Type
6150d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// is actually a value of type @c TargetInfo::IntType.
6151e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallCanQualType ASTContext::getFromTargetType(unsigned Type) const {
6152b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  switch (Type) {
6153e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall  case TargetInfo::NoInt: return CanQualType();
6154b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedShort: return ShortTy;
6155b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedShort: return UnsignedShortTy;
6156b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedInt: return IntTy;
6157b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedInt: return UnsignedIntTy;
6158b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedLong: return LongTy;
6159b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedLong: return UnsignedLongTy;
6160b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::SignedLongLong: return LongLongTy;
6161b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy;
6162b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor  }
6163b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor
6164b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unhandled TargetInfo::IntType value");
6165b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor}
6166b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek
6167b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===//
6168b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//                        Type Predicates.
6169b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===//
6170b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek
61714fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
61724fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// garbage collection attribute.
61734fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian///
6174ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCallQualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const {
61754e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().getGC() == LangOptions::NonGC)
6176ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    return Qualifiers::GCNone;
6177ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall
61784e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  assert(getLangOpts().ObjC1);
6179ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  Qualifiers::GC GCAttrs = Ty.getObjCGCAttr();
6180ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall
6181ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // Default behaviour under objective-C's gc is for ObjC pointers
6182ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // (or pointers to them) be treated as though they were declared
6183ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  // as __strong.
6184ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  if (GCAttrs == Qualifiers::GCNone) {
6185ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
6186ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      return Qualifiers::Strong;
6187ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    else if (Ty->isPointerType())
6188ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType());
6189ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall  } else {
6190ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    // It's not valid to set GC attributes on anything that isn't a
6191ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    // pointer.
6192ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#ifndef NDEBUG
6193ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    QualType CT = Ty->getCanonicalTypeInternal();
6194ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    while (const ArrayType *AT = dyn_cast<ArrayType>(CT))
6195ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall      CT = AT->getElementType();
6196ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall    assert(CT->isAnyPointerType() || CT->isBlockPointerType());
6197ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#endif
61984fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian  }
6199b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner  return GCAttrs;
62004fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian}
62014fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian
62026ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===//
62036ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//                        Type Compatibility Testing
62046ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===//
6205770951b5bb6028a8d326ddb4a13cef7d4a128162Chris Lattner
62061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// areCompatVectorTypes - Return true if the two specified vector types are
62076ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner/// compatible.
62086ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattnerstatic bool areCompatVectorTypes(const VectorType *LHS,
62096ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner                                 const VectorType *RHS) {
6210467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall  assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified());
62116ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  return LHS->getElementType() == RHS->getElementType() &&
621261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner         LHS->getNumElements() == RHS->getNumElements();
62136ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner}
62146ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner
6215255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregorbool ASTContext::areCompatibleVectorTypes(QualType FirstVec,
6216255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor                                          QualType SecondVec) {
6217255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  assert(FirstVec->isVectorType() && "FirstVec should be a vector type");
6218255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  assert(SecondVec->isVectorType() && "SecondVec should be a vector type");
6219255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6220255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  if (hasSameUnqualifiedType(FirstVec, SecondVec))
6221255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor    return true;
6222255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6223f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  // Treat Neon vector types and most AltiVec vector types as if they are the
6224f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  // equivalent GCC vector types.
6225255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  const VectorType *First = FirstVec->getAs<VectorType>();
6226255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  const VectorType *Second = SecondVec->getAs<VectorType>();
6227f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson  if (First->getNumElements() == Second->getNumElements() &&
6228255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor      hasSameType(First->getElementType(), Second->getElementType()) &&
6229f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      First->getVectorKind() != VectorType::AltiVecPixel &&
6230f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      First->getVectorKind() != VectorType::AltiVecBool &&
6231f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      Second->getVectorKind() != VectorType::AltiVecPixel &&
6232f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson      Second->getVectorKind() != VectorType::AltiVecBool)
6233255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor    return true;
6234255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
6235255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor  return false;
6236255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor}
6237255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor
62384084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===//
62394084c306635b70f37029dca938444e6013f08684Steve Naroff// ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's.
62404084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===//
62414084c306635b70f37029dca938444e6013f08684Steve Naroff
62424084c306635b70f37029dca938444e6013f08684Steve Naroff/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the
62434084c306635b70f37029dca938444e6013f08684Steve Naroff/// inheritance hierarchy of 'rProto'.
62444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool
62454ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
62464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                           ObjCProtocolDecl *rProto) const {
62473fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor  if (declaresSameEntity(lProto, rProto))
624814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    return true;
62494084c306635b70f37029dca938444e6013f08684Steve Naroff  for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(),
62504084c306635b70f37029dca938444e6013f08684Steve Naroff       E = rProto->protocol_end(); PI != E; ++PI)
62514084c306635b70f37029dca938444e6013f08684Steve Naroff    if (ProtocolCompatibleWithProtocol(lProto, *PI))
62524084c306635b70f37029dca938444e6013f08684Steve Naroff      return true;
62534084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
62544084c306635b70f37029dca938444e6013f08684Steve Naroff}
625514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
62564c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// QualifiedIdConformsQualifiedId - compare id<pr,...> with id<pr1,...>
62574084c306635b70f37029dca938444e6013f08684Steve Naroff/// return true if lhs's protocols conform to rhs's protocol; false
62584084c306635b70f37029dca938444e6013f08684Steve Naroff/// otherwise.
62594084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) {
62604084c306635b70f37029dca938444e6013f08684Steve Naroff  if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType())
62614084c306635b70f37029dca938444e6013f08684Steve Naroff    return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false);
62624084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
62634084c306635b70f37029dca938444e6013f08684Steve Naroff}
62644084c306635b70f37029dca938444e6013f08684Steve Naroff
62654c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// ObjCQualifiedClassTypesAreCompatible - compare  Class<pr,...> and
62664c3b8a3ed28c52dc56d3a1b9670d71e5f7070c62Dmitri Gribenko/// Class<pr1, ...>.
6267a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanianbool ASTContext::ObjCQualifiedClassTypesAreCompatible(QualType lhs,
6268a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian                                                      QualType rhs) {
6269a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  const ObjCObjectPointerType *lhsQID = lhs->getAs<ObjCObjectPointerType>();
6270a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
6271a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  assert ((lhsQID && rhsOPT) && "ObjCQualifiedClassTypesAreCompatible");
6272a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6273a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
6274a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian       E = lhsQID->qual_end(); I != E; ++I) {
6275a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    bool match = false;
6276a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    ObjCProtocolDecl *lhsProto = *I;
6277a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(),
6278a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian         E = rhsOPT->qual_end(); J != E; ++J) {
6279a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      ObjCProtocolDecl *rhsProto = *J;
6280a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) {
6281a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian        match = true;
6282a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian        break;
6283a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      }
6284a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    }
6285a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    if (!match)
6286a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian      return false;
6287a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  }
6288a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  return true;
6289a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian}
6290a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
62914084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an
62924084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIDType.
62934084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs,
62944084c306635b70f37029dca938444e6013f08684Steve Naroff                                                   bool compare) {
62954084c306635b70f37029dca938444e6013f08684Steve Naroff  // Allow id<P..> and an 'id' or void* type in all cases.
62961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (lhs->isVoidPointerType() ||
62974084c306635b70f37029dca938444e6013f08684Steve Naroff      lhs->isObjCIdType() || lhs->isObjCClassType())
62984084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
62991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  else if (rhs->isVoidPointerType() ||
63004084c306635b70f37029dca938444e6013f08684Steve Naroff           rhs->isObjCIdType() || rhs->isObjCClassType())
63014084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
63024084c306635b70f37029dca938444e6013f08684Steve Naroff
63034084c306635b70f37029dca938444e6013f08684Steve Naroff  if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) {
6304183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
63051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63064084c306635b70f37029dca938444e6013f08684Steve Naroff    if (!rhsOPT) return false;
63071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63084084c306635b70f37029dca938444e6013f08684Steve Naroff    if (rhsOPT->qual_empty()) {
63091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // If the RHS is a unqualified interface pointer "NSString*",
63104084c306635b70f37029dca938444e6013f08684Steve Naroff      // make sure we check the class hierarchy.
63114084c306635b70f37029dca938444e6013f08684Steve Naroff      if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) {
63124084c306635b70f37029dca938444e6013f08684Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
63134084c306635b70f37029dca938444e6013f08684Steve Naroff             E = lhsQID->qual_end(); I != E; ++I) {
63144084c306635b70f37029dca938444e6013f08684Steve Naroff          // when comparing an id<P> on lhs with a static type on rhs,
63154084c306635b70f37029dca938444e6013f08684Steve Naroff          // see if static class implements all of id's protocols, directly or
63164084c306635b70f37029dca938444e6013f08684Steve Naroff          // through its super class and categories.
63170fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian          if (!rhsID->ClassImplementsProtocol(*I, true))
63184084c306635b70f37029dca938444e6013f08684Steve Naroff            return false;
63194084c306635b70f37029dca938444e6013f08684Steve Naroff        }
63204084c306635b70f37029dca938444e6013f08684Steve Naroff      }
63214084c306635b70f37029dca938444e6013f08684Steve Naroff      // If there are no qualifiers and no interface, we have an 'id'.
63224084c306635b70f37029dca938444e6013f08684Steve Naroff      return true;
63234084c306635b70f37029dca938444e6013f08684Steve Naroff    }
63241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Both the right and left sides have qualifiers.
63254084c306635b70f37029dca938444e6013f08684Steve Naroff    for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
63264084c306635b70f37029dca938444e6013f08684Steve Naroff         E = lhsQID->qual_end(); I != E; ++I) {
63274084c306635b70f37029dca938444e6013f08684Steve Naroff      ObjCProtocolDecl *lhsProto = *I;
63284084c306635b70f37029dca938444e6013f08684Steve Naroff      bool match = false;
6329de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff
6330de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // when comparing an id<P> on lhs with a static type on rhs,
6331de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // see if static class implements all of id's protocols, directly or
6332de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      // through its super class and categories.
63334084c306635b70f37029dca938444e6013f08684Steve Naroff      for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(),
63344084c306635b70f37029dca938444e6013f08684Steve Naroff           E = rhsOPT->qual_end(); J != E; ++J) {
63354084c306635b70f37029dca938444e6013f08684Steve Naroff        ObjCProtocolDecl *rhsProto = *J;
63364084c306635b70f37029dca938444e6013f08684Steve Naroff        if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
63374084c306635b70f37029dca938444e6013f08684Steve Naroff            (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
63384084c306635b70f37029dca938444e6013f08684Steve Naroff          match = true;
63398f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff          break;
63408f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff        }
6341de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff      }
63421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // If the RHS is a qualified interface pointer "NSString<P>*",
63434084c306635b70f37029dca938444e6013f08684Steve Naroff      // make sure we check the class hierarchy.
63444084c306635b70f37029dca938444e6013f08684Steve Naroff      if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) {
63454084c306635b70f37029dca938444e6013f08684Steve Naroff        for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(),
63464084c306635b70f37029dca938444e6013f08684Steve Naroff             E = lhsQID->qual_end(); I != E; ++I) {
63474084c306635b70f37029dca938444e6013f08684Steve Naroff          // when comparing an id<P> on lhs with a static type on rhs,
63484084c306635b70f37029dca938444e6013f08684Steve Naroff          // see if static class implements all of id's protocols, directly or
63494084c306635b70f37029dca938444e6013f08684Steve Naroff          // through its super class and categories.
63500fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian          if (rhsID->ClassImplementsProtocol(*I, true)) {
63514084c306635b70f37029dca938444e6013f08684Steve Naroff            match = true;
63524084c306635b70f37029dca938444e6013f08684Steve Naroff            break;
63534084c306635b70f37029dca938444e6013f08684Steve Naroff          }
63544084c306635b70f37029dca938444e6013f08684Steve Naroff        }
63554084c306635b70f37029dca938444e6013f08684Steve Naroff      }
63564084c306635b70f37029dca938444e6013f08684Steve Naroff      if (!match)
6357de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff        return false;
6358de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    }
63591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6360de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    return true;
6361de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  }
63621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63634084c306635b70f37029dca938444e6013f08684Steve Naroff  const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType();
63644084c306635b70f37029dca938444e6013f08684Steve Naroff  assert(rhsQID && "One of the LHS/RHS should be id<x>");
63654084c306635b70f37029dca938444e6013f08684Steve Naroff
63661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (const ObjCObjectPointerType *lhsOPT =
63674084c306635b70f37029dca938444e6013f08684Steve Naroff        lhs->getAsObjCInterfacePointerType()) {
6368de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // If both the right and left sides have qualifiers.
63694084c306635b70f37029dca938444e6013f08684Steve Naroff    for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(),
63704084c306635b70f37029dca938444e6013f08684Steve Naroff         E = lhsOPT->qual_end(); I != E; ++I) {
63714084c306635b70f37029dca938444e6013f08684Steve Naroff      ObjCProtocolDecl *lhsProto = *I;
63724084c306635b70f37029dca938444e6013f08684Steve Naroff      bool match = false;
63734084c306635b70f37029dca938444e6013f08684Steve Naroff
6374de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // when comparing an id<P> on rhs with a static type on lhs,
63754084c306635b70f37029dca938444e6013f08684Steve Naroff      // see if static class implements all of id's protocols, directly or
63764084c306635b70f37029dca938444e6013f08684Steve Naroff      // through its super class and categories.
6377de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // First, lhs protocols in the qualifier list must be found, direct
6378de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // or indirect in rhs's qualifier list or it is a mismatch.
63794084c306635b70f37029dca938444e6013f08684Steve Naroff      for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
63804084c306635b70f37029dca938444e6013f08684Steve Naroff           E = rhsQID->qual_end(); J != E; ++J) {
63814084c306635b70f37029dca938444e6013f08684Steve Naroff        ObjCProtocolDecl *rhsProto = *J;
63824084c306635b70f37029dca938444e6013f08684Steve Naroff        if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
63834084c306635b70f37029dca938444e6013f08684Steve Naroff            (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
63844084c306635b70f37029dca938444e6013f08684Steve Naroff          match = true;
63854084c306635b70f37029dca938444e6013f08684Steve Naroff          break;
63864084c306635b70f37029dca938444e6013f08684Steve Naroff        }
63874084c306635b70f37029dca938444e6013f08684Steve Naroff      }
63884084c306635b70f37029dca938444e6013f08684Steve Naroff      if (!match)
63894084c306635b70f37029dca938444e6013f08684Steve Naroff        return false;
63904084c306635b70f37029dca938444e6013f08684Steve Naroff    }
6391de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian
6392de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // Static class's protocols, or its super class or category protocols
6393de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    // must be found, direct or indirect in rhs's qualifier list or it is a mismatch.
6394de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) {
6395de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
6396de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      CollectInheritedProtocols(lhsID, LHSInheritedProtocols);
6397de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // This is rather dubious but matches gcc's behavior. If lhs has
6398de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // no type qualifier and its class has no static protocol(s)
6399de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      // assume that it is mismatch.
6400de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty())
6401de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        return false;
6402de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6403de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian           LHSInheritedProtocols.begin(),
6404de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian           E = LHSInheritedProtocols.end(); I != E; ++I) {
6405de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        bool match = false;
6406de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        ObjCProtocolDecl *lhsProto = (*I);
6407de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
6408de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian             E = rhsQID->qual_end(); J != E; ++J) {
6409de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          ObjCProtocolDecl *rhsProto = *J;
6410de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
6411de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian              (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
6412de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian            match = true;
6413de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian            break;
6414de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          }
6415de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        }
6416de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian        if (!match)
6417de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian          return false;
6418de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian      }
6419de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian    }
64204084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
64214084c306635b70f37029dca938444e6013f08684Steve Naroff  }
64224084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
64234084c306635b70f37029dca938444e6013f08684Steve Naroff}
64244084c306635b70f37029dca938444e6013f08684Steve Naroff
64254084c306635b70f37029dca938444e6013f08684Steve Naroff/// canAssignObjCInterfaces - Return true if the two interface types are
64264084c306635b70f37029dca938444e6013f08684Steve Naroff/// compatible for assignment from RHS to LHS.  This handles validation of any
64274084c306635b70f37029dca938444e6013f08684Steve Naroff/// protocol qualifiers on the LHS or RHS.
64284084c306635b70f37029dca938444e6013f08684Steve Naroff///
64294084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT,
64304084c306635b70f37029dca938444e6013f08684Steve Naroff                                         const ObjCObjectPointerType *RHSOPT) {
6431c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* LHS = LHSOPT->getObjectType();
6432c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* RHS = RHSOPT->getObjectType();
6433c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
64344084c306635b70f37029dca938444e6013f08684Steve Naroff  // If either type represents the built-in 'id' or 'Class' types, return true.
6435c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->isObjCUnqualifiedIdOrClass() ||
6436c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      RHS->isObjCUnqualifiedIdOrClass())
64374084c306635b70f37029dca938444e6013f08684Steve Naroff    return true;
64384084c306635b70f37029dca938444e6013f08684Steve Naroff
6439c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId())
64401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
64411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             QualType(RHSOPT,0),
64424084c306635b70f37029dca938444e6013f08684Steve Naroff                                             false);
6443a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6444a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian  if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass())
6445a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian    return ObjCQualifiedClassTypesAreCompatible(QualType(LHSOPT,0),
6446a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian                                                QualType(RHSOPT,0));
6447a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian
6448c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // If we have 2 user-defined types, fall into that path.
6449c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHS->getInterface() && RHS->getInterface())
64504084c306635b70f37029dca938444e6013f08684Steve Naroff    return canAssignObjCInterfaces(LHS, RHS);
64511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64524084c306635b70f37029dca938444e6013f08684Steve Naroff  return false;
645314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff}
645414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
6455132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// canAssignObjCInterfacesInBlockPointer - This routine is specifically written
6456fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// for providing type-safety for objective-c pointers used to pass/return
6457132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// arguments in block literals. When passed as arguments, passing 'A*' where
6458132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is
6459132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// not OK. For the return type, the opposite is not OK.
6460132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::canAssignObjCInterfacesInBlockPointer(
6461132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                         const ObjCObjectPointerType *LHSOPT,
6462a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                         const ObjCObjectPointerType *RHSOPT,
6463a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                         bool BlockReturnType) {
6464a98344869c278295f38e106583906377520079b8Fariborz Jahanian  if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType())
6465132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return true;
6466132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6467132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  if (LHSOPT->isObjCBuiltinType()) {
6468132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType();
6469132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  }
6470132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6471a98344869c278295f38e106583906377520079b8Fariborz Jahanian  if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType())
6472132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0),
6473132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                             QualType(RHSOPT,0),
6474132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                             false);
6475132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6476132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
6477132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
6478132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  if (LHS && RHS)  { // We have 2 user-defined types.
6479132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    if (LHS != RHS) {
6480132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (LHS->getDecl()->isSuperClassOf(RHS->getDecl()))
6481a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian        return BlockReturnType;
6482132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (RHS->getDecl()->isSuperClassOf(LHS->getDecl()))
6483a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian        return !BlockReturnType;
6484132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    }
6485132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    else
6486132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      return true;
6487132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  }
6488132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  return false;
6489132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian}
6490132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
6491e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// getIntersectionOfProtocols - This routine finds the intersection of set
6492e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// of protocols inherited from two distinct objective-c pointer objects.
6493e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// It is used to build composite qualifier list of the composite type of
6494e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// the conditional expression involving two objective-c pointer objects.
6495e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianstatic
6496e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid getIntersectionOfProtocols(ASTContext &Context,
6497e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                const ObjCObjectPointerType *LHSOPT,
6498e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                const ObjCObjectPointerType *RHSOPT,
64995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) {
6500e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6501c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* LHS = LHSOPT->getObjectType();
6502c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType* RHS = RHSOPT->getObjectType();
6503c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(LHS->getInterface() && "LHS must have an interface base");
6504c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(RHS->getInterface() && "RHS must have an interface base");
6505e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6506e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet;
6507e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  unsigned LHSNumProtocols = LHS->getNumProtocols();
6508e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (LHSNumProtocols > 0)
6509e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end());
6510e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  else {
6511432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
6512c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Context.CollectInheritedProtocols(LHS->getInterface(),
6513c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                      LHSInheritedProtocols);
6514e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    InheritedProtocolSet.insert(LHSInheritedProtocols.begin(),
6515e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian                                LHSInheritedProtocols.end());
6516e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
6517e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6518e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  unsigned RHSNumProtocols = RHS->getNumProtocols();
6519e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  if (RHSNumProtocols > 0) {
6520cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman    ObjCProtocolDecl **RHSProtocols =
6521cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman      const_cast<ObjCProtocolDecl **>(RHS->qual_begin());
6522e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    for (unsigned i = 0; i < RHSNumProtocols; ++i)
6523e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian      if (InheritedProtocolSet.count(RHSProtocols[i]))
6524e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian        IntersectionOfProtocols.push_back(RHSProtocols[i]);
65253060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  } else {
6526432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols;
6527c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Context.CollectInheritedProtocols(RHS->getInterface(),
6528c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                      RHSInheritedProtocols);
6529432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6530432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian         RHSInheritedProtocols.begin(),
6531432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian         E = RHSInheritedProtocols.end(); I != E; ++I)
6532432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian      if (InheritedProtocolSet.count((*I)))
6533432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian        IntersectionOfProtocols.push_back((*I));
6534e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian  }
6535e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian}
6536e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian
6537db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// areCommonBaseCompatible - Returns common base class of the two classes if
6538db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// one found. Note that this is O'2 algorithm. But it will be called as the
6539db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// last type comparison in a ?-exp of ObjC pointer types before a
6540db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// warning is issued. So, its invokation is extremely rare.
6541db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz JahanianQualType ASTContext::areCommonBaseCompatible(
6542c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                          const ObjCObjectPointerType *Lptr,
6543c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                          const ObjCObjectPointerType *Rptr) {
6544c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType *LHS = Lptr->getObjectType();
6545c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType *RHS = Rptr->getObjectType();
6546c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCInterfaceDecl* LDecl = LHS->getInterface();
6547c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCInterfaceDecl* RDecl = RHS->getInterface();
654860ef308e51c71b760d7f598c1b763ceb7b768148Douglas Gregor  if (!LDecl || !RDecl || (declaresSameEntity(LDecl, RDecl)))
6549db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian    return QualType();
6550db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
65517c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian  do {
6552c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    LHS = cast<ObjCInterfaceType>(getObjCInterfaceType(LDecl));
6553e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    if (canAssignObjCInterfaces(LHS, RHS)) {
65545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVector<ObjCProtocolDecl *, 8> Protocols;
6555c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      getIntersectionOfProtocols(*this, Lptr, Rptr, Protocols);
6556c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
6557c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      QualType Result = QualType(LHS, 0);
6558c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      if (!Protocols.empty())
6559c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        Result = getObjCObjectType(Result, Protocols.data(), Protocols.size());
6560c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      Result = getObjCObjectPointerType(Result);
6561c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      return Result;
6562e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian    }
65637c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian  } while ((LDecl = LDecl->getSuperClass()));
6564db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
6565db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian  return QualType();
6566db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian}
6567db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian
6568c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallbool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS,
6569c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                         const ObjCObjectType *RHS) {
6570c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(LHS->getInterface() && "LHS is not an interface type");
6571c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  assert(RHS->getInterface() && "RHS is not an interface type");
6572c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
65736ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // Verify that the base decls are compatible: the RHS must be a subclass of
65746ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // the LHS.
6575c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!LHS->getInterface()->isSuperClassOf(RHS->getInterface()))
65766ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner    return false;
65771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65786ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // RHS must have a superset of the protocols in the LHS.  If the LHS is not
65796ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner  // protocol qualified at all, then we are good.
6580c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  if (LHS->getNumProtocols() == 0)
65816ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner    return true;
65821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6583b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  // Okay, we know the LHS has protocol qualifiers.  If the RHS doesn't,
6584b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  // more detailed analysis is required.
6585b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  if (RHS->getNumProtocols() == 0) {
6586b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // OK, if LHS is a superclass of RHS *and*
6587b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // this superclass is assignment compatible with LHS.
6588b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    // false otherwise.
6589627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian    bool IsSuperClass =
6590627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian      LHS->getInterface()->isSuperClassOf(RHS->getInterface());
6591627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian    if (IsSuperClass) {
6592b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // OK if conversion of LHS to SuperClass results in narrowing of types
6593b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // ; i.e., SuperClass may implement at least one of the protocols
6594b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok.
6595b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // But not SuperObj<P1,P2,P3> = lhs<P1,P2>.
6596b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols;
6597627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian      CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols);
6598b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      // If super class has no protocols, it is not a match.
6599b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      if (SuperClassInheritedProtocols.empty())
6600b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        return false;
6601b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian
6602b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(),
6603b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian           LHSPE = LHS->qual_end();
6604b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian           LHSPI != LHSPE; LHSPI++) {
6605b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        bool SuperImplementsProtocol = false;
6606b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        ObjCProtocolDecl *LHSProto = (*LHSPI);
6607b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian
6608b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
6609b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian             SuperClassInheritedProtocols.begin(),
6610b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian             E = SuperClassInheritedProtocols.end(); I != E; ++I) {
6611b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          ObjCProtocolDecl *SuperClassProto = (*I);
6612b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
6613b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian            SuperImplementsProtocol = true;
6614b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian            break;
6615b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          }
6616b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        }
6617b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian        if (!SuperImplementsProtocol)
6618b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian          return false;
6619b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      }
6620b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian      return true;
6621b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    }
6622b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian    return false;
6623b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian  }
66241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6625c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(),
6626c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                     LHSPE = LHS->qual_end();
662791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff       LHSPI != LHSPE; LHSPI++) {
662891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    bool RHSImplementsProtocol = false;
662991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff
663091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // If the RHS doesn't implement the protocol on the left, the types
663191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // are incompatible.
6632c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    for (ObjCObjectType::qual_iterator RHSPI = RHS->qual_begin(),
6633c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                       RHSPE = RHS->qual_end();
66348f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff         RHSPI != RHSPE; RHSPI++) {
66358f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff      if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) {
663691b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff        RHSImplementsProtocol = true;
66378f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff        break;
66388f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff      }
663991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    }
664091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    // FIXME: For better diagnostics, consider passing back the protocol name.
664191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff    if (!RHSImplementsProtocol)
664291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff      return false;
664391b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  }
664491b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  // The RHS implements all protocols listed on the LHS.
664591b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff  return true;
66466ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner}
66476ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner
6648389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroffbool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) {
6649389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff  // get the "pointed to" types
6650183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>();
6651183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>();
66521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
665314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (!LHSOPT || !RHSOPT)
6654389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff    return false;
665514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
665614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  return canAssignObjCInterfaces(LHSOPT, RHSOPT) ||
665714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff         canAssignObjCInterfaces(RHSOPT, LHSOPT);
6658389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff}
6659389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff
6660569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorbool ASTContext::canBindObjCObjectType(QualType To, QualType From) {
6661569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor  return canAssignObjCInterfaces(
6662569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor                getObjCObjectPointerType(To)->getAs<ObjCObjectPointerType>(),
6663569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor                getObjCObjectPointerType(From)->getAs<ObjCObjectPointerType>());
6664569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor}
6665569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor
66661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible,
6667ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// both shall have the identically qualified version of a compatible type.
66681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// C99 6.2.7p1: Two types have compatible types if their types are the
6669ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// same. See 6.7.[2,3,5] for additional rules.
6670447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregorbool ASTContext::typesAreCompatible(QualType LHS, QualType RHS,
6671447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                    bool CompareUnqualified) {
66724e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
66730e709abafbd939326850501f795cc7a92c88a354Douglas Gregor    return hasSameType(LHS, RHS);
66740e709abafbd939326850501f795cc7a92c88a354Douglas Gregor
6675447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull();
66763d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman}
66773d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6678c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanianbool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) {
667982378391dfc3b2fc22f63dbf1552bd9aed39dc42Fariborz Jahanian  return typesAreCompatible(LHS, RHS);
6680c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian}
6681c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian
6682132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) {
6683132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  return !mergeTypes(LHS, RHS, true).isNull();
6684132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian}
6685132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian
66864846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeTransparentUnionType - if T is a transparent union type and a member
66874846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// of T is compatible with SubType, return the merged type, else return
66884846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// QualType()
66894846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType,
66904846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                               bool OfBlockPointer,
66914846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                               bool Unqualified) {
66924846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (const RecordType *UT = T->getAsUnionType()) {
66934846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    RecordDecl *UD = UT->getDecl();
66944846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    if (UD->hasAttr<TransparentUnionAttr>()) {
66954846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      for (RecordDecl::field_iterator it = UD->field_begin(),
66964846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne           itend = UD->field_end(); it != itend; ++it) {
6697f91d7572ee7fa6f2926c8e7e816039a1154a59f8Peter Collingbourne        QualType ET = it->getType().getUnqualifiedType();
66984846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne        QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified);
66994846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne        if (!MT.isNull())
67004846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne          return MT;
67014846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      }
67024846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    }
67034846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  }
67044846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
67054846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  return QualType();
67064846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne}
67074846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
67084846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeFunctionArgumentTypes - merge two types which appear as function
67094846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// argument types
67104846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeFunctionArgumentTypes(QualType lhs, QualType rhs,
67114846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                bool OfBlockPointer,
67124846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                bool Unqualified) {
67134846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // GNU extension: two types are compatible if they appear as a function
67144846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // argument, one of the types is a transparent union type and the other
67154846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  // type is compatible with a union member
67164846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer,
67174846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                              Unqualified);
67184846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (!lmerge.isNull())
67194846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    return lmerge;
67204846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
67214846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer,
67224846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                              Unqualified);
67234846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  if (!rmerge.isNull())
67244846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne    return rmerge;
67254846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
67264846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne  return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified);
67274846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne}
67284846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne
6729132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
6730447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                        bool OfBlockPointer,
6731447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                        bool Unqualified) {
6732183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const FunctionType *lbase = lhs->getAs<FunctionType>();
6733183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const FunctionType *rbase = rhs->getAs<FunctionType>();
673472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase);
673572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase);
67363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  bool allLTypes = true;
67373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  bool allRTypes = true;
67383d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
67393d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  // Check return type
6740132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  QualType retType;
6741d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian  if (OfBlockPointer) {
6742d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    QualType RHS = rbase->getResultType();
6743d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    QualType LHS = lbase->getResultType();
6744d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    bool UnqualifiedResult = Unqualified;
6745d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian    if (!UnqualifiedResult)
6746d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian      UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers());
6747a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian    retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true);
6748d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian  }
6749132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian  else
67508cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    retType = mergeTypes(lbase->getResultType(), rbase->getResultType(), false,
67518cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall                         Unqualified);
67523d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (retType.isNull()) return QualType();
6753447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6754447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified)
6755447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    retType = retType.getUnqualifiedType();
6756447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6757447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  CanQualType LRetType = getCanonicalType(lbase->getResultType());
6758447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  CanQualType RRetType = getCanonicalType(rbase->getResultType());
6759447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified) {
6760447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    LRetType = LRetType.getUnqualifiedType();
6761447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    RRetType = RRetType.getUnqualifiedType();
6762447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  }
6763447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6764447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (getCanonicalType(retType) != LRetType)
676561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    allLTypes = false;
6766447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (getCanonicalType(retType) != RRetType)
676761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    allRTypes = false;
67688cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
67696a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  // FIXME: double check this
67706a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  // FIXME: should we error if lbase->getRegParmAttr() != 0 &&
67716a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  //                           rbase->getRegParmAttr() != 0 &&
67726a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar  //                           lbase->getRegParmAttr() != rbase->getRegParmAttr()?
6773264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo();
6774264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo();
67758cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
67768cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  // Compatible functions must have compatible calling conventions
67778cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  if (!isSameCallConv(lbaseInfo.getCC(), rbaseInfo.getCC()))
67788cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    return QualType();
67798cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
67808cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  // Regparm is part of the calling convention.
6781a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman  if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm())
6782a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman    return QualType();
67838cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm())
67848cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall    return QualType();
67858cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall
6786f85e193739c953358c865005855253af4f68a497John McCall  if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult())
6787f85e193739c953358c865005855253af4f68a497John McCall    return QualType();
6788f85e193739c953358c865005855253af4f68a497John McCall
678953c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian  // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'.
679053c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian  bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn();
67911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67928b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola  if (lbaseInfo.getNoReturn() != NoReturn)
67938b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola    allLTypes = false;
67948b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola  if (rbaseInfo.getNoReturn() != NoReturn)
67958b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola    allRTypes = false;
67968b8a09e496fbed361d4c8e9e8cc259454a094258Rafael Espindola
6797f85e193739c953358c865005855253af4f68a497John McCall  FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn);
6798e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
67993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (lproto && rproto) { // two C99 style function prototypes
6800465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl    assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() &&
6801465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl           "C++ shouldn't be here");
68023d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned lproto_nargs = lproto->getNumArgs();
68033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned rproto_nargs = rproto->getNumArgs();
68043d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68053d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Compatible functions must have the same number of arguments
68063d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (lproto_nargs != rproto_nargs)
68073d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
68083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68093d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Variadic and non-variadic functions aren't compatible
68103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (lproto->isVariadic() != rproto->isVariadic())
68113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
68123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68137fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis    if (lproto->getTypeQuals() != rproto->getTypeQuals())
68147fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis      return QualType();
68157fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis
681678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    if (LangOpts.ObjCAutoRefCount &&
681778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian        !FunctionTypesMatchOnNSConsumedAttrs(rproto, lproto))
681878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      return QualType();
681978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
68203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Check argument compatibility
68215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<QualType, 10> types;
68223d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    for (unsigned i = 0; i < lproto_nargs; i++) {
68233d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType largtype = lproto->getArgType(i).getUnqualifiedType();
68243d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType rargtype = rproto->getArgType(i).getUnqualifiedType();
68254846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne      QualType argtype = mergeFunctionArgumentTypes(largtype, rargtype,
68264846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                    OfBlockPointer,
68274846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne                                                    Unqualified);
68283d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      if (argtype.isNull()) return QualType();
6829447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6830447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      if (Unqualified)
6831447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        argtype = argtype.getUnqualifiedType();
6832447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
68333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      types.push_back(argtype);
6834447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      if (Unqualified) {
6835447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        largtype = largtype.getUnqualifiedType();
6836447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor        rargtype = rargtype.getUnqualifiedType();
6837447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      }
6838447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
683961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      if (getCanonicalType(argtype) != getCanonicalType(largtype))
684061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner        allLTypes = false;
684161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      if (getCanonicalType(argtype) != getCanonicalType(rargtype))
684261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner        allRTypes = false;
68433d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
684478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
68453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allLTypes) return lhs;
68463d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allRTypes) return rhs;
6847e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
6848e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo();
6849e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.ExtInfo = einfo;
6850bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose    return getFunctionType(retType, types, EPI);
68513d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
68523d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68533d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (lproto) allRTypes = false;
68543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (rproto) allLTypes = false;
68553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
685672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  const FunctionProtoType *proto = lproto ? lproto : rproto;
68573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (proto) {
6858465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl    assert(!proto->hasExceptionSpec() && "C++ shouldn't be here");
68593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (proto->isVariadic()) return QualType();
68603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Check that the types are compatible with the types that
68613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // would result from default argument promotions (C99 6.7.5.3p15).
68623d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // The only types actually affected are promotable integer
68633d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // types and floats, which would be passed as a different
68643d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // type depending on whether the prototype is visible.
68653d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    unsigned proto_nargs = proto->getNumArgs();
68663d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    for (unsigned i = 0; i < proto_nargs; ++i) {
68673d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      QualType argTy = proto->getArgType(i);
6868b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor
6869c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      // Look at the converted type of enum types, since that is the type used
6870b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor      // to pass enum values.
6871c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      if (const EnumType *Enum = argTy->getAs<EnumType>()) {
6872c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman        argTy = Enum->getDecl()->getIntegerType();
6873c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman        if (argTy.isNull())
6874c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman          return QualType();
6875c586d5dd7a997321ea96d1d28213315f86778fc8Eli Friedman      }
6876b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor
68773d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      if (argTy->isPromotableIntegerType() ||
68783d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman          getCanonicalType(argTy).getUnqualifiedType() == FloatTy)
68793d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman        return QualType();
68803d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
68813d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68823d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allLTypes) return lhs;
68833d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (allRTypes) return rhs;
6884e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
6885e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo();
6886e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.ExtInfo = einfo;
6887bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose    return getFunctionType(retType,
6888bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                           ArrayRef<QualType>(proto->arg_type_begin(),
6889bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                                              proto->getNumArgs()),
6890bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                           EPI);
68913d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
68923d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
68933d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (allLTypes) return lhs;
68943d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (allRTypes) return rhs;
68958cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall  return getFunctionNoProtoType(retType, einfo);
68963d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman}
68973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6898b9da713efb4277753211590953f433723908aadeJohn McCall/// Given that we have an enum type and a non-enum type, try to merge them.
6899b9da713efb4277753211590953f433723908aadeJohn McCallstatic QualType mergeEnumWithInteger(ASTContext &Context, const EnumType *ET,
6900b9da713efb4277753211590953f433723908aadeJohn McCall                                     QualType other, bool isBlockReturnType) {
6901b9da713efb4277753211590953f433723908aadeJohn McCall  // C99 6.7.2.2p4: Each enumerated type shall be compatible with char,
6902b9da713efb4277753211590953f433723908aadeJohn McCall  // a signed integer type, or an unsigned integer type.
6903b9da713efb4277753211590953f433723908aadeJohn McCall  // Compatibility is based on the underlying type, not the promotion
6904b9da713efb4277753211590953f433723908aadeJohn McCall  // type.
6905b9da713efb4277753211590953f433723908aadeJohn McCall  QualType underlyingType = ET->getDecl()->getIntegerType();
6906b9da713efb4277753211590953f433723908aadeJohn McCall  if (underlyingType.isNull()) return QualType();
6907b9da713efb4277753211590953f433723908aadeJohn McCall  if (Context.hasSameType(underlyingType, other))
6908b9da713efb4277753211590953f433723908aadeJohn McCall    return other;
6909b9da713efb4277753211590953f433723908aadeJohn McCall
6910b9da713efb4277753211590953f433723908aadeJohn McCall  // In block return types, we're more permissive and accept any
6911b9da713efb4277753211590953f433723908aadeJohn McCall  // integral type of the same size.
6912b9da713efb4277753211590953f433723908aadeJohn McCall  if (isBlockReturnType && other->isIntegerType() &&
6913b9da713efb4277753211590953f433723908aadeJohn McCall      Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
6914b9da713efb4277753211590953f433723908aadeJohn McCall    return other;
6915b9da713efb4277753211590953f433723908aadeJohn McCall
6916b9da713efb4277753211590953f433723908aadeJohn McCall  return QualType();
6917b9da713efb4277753211590953f433723908aadeJohn McCall}
6918b9da713efb4277753211590953f433723908aadeJohn McCall
6919132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeTypes(QualType LHS, QualType RHS,
6920447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                bool OfBlockPointer,
6921a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                bool Unqualified, bool BlockReturnType) {
692243d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // C++ [expr]: If an expression initially has the type "reference to T", the
692343d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // type is adjusted to "T" prior to any further analysis, the expression
692443d69750e7f7b26076e7474dec8839bb777b260fBill Wendling  // designates the object or function denoted by the reference, and the
69257c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // expression is an lvalue unless the reference is an rvalue reference and
69267c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // the expression is a function call (possibly inside parentheses).
69270e709abafbd939326850501f795cc7a92c88a354Douglas Gregor  assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?");
69280e709abafbd939326850501f795cc7a92c88a354Douglas Gregor  assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?");
6929447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
6930447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  if (Unqualified) {
6931447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    LHS = LHS.getUnqualifiedType();
6932447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    RHS = RHS.getUnqualifiedType();
6933447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor  }
69340e709abafbd939326850501f795cc7a92c88a354Douglas Gregor
69353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  QualType LHSCan = getCanonicalType(LHS),
69363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman           RHSCan = getCanonicalType(RHS);
69373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6938f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner  // If two types are identical, they are compatible.
69393d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  if (LHSCan == RHSCan)
69403d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return LHS;
69413d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
69420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // If the qualifiers are different, the types aren't compatible... mostly.
6943a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers LQuals = LHSCan.getLocalQualifiers();
6944a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers RQuals = RHSCan.getLocalQualifiers();
69450953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  if (LQuals != RQuals) {
69460953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // If any of these qualifiers are different, we have a type
69470953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // mismatch.
69480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
6949f85e193739c953358c865005855253af4f68a497John McCall        LQuals.getAddressSpace() != RQuals.getAddressSpace() ||
6950f85e193739c953358c865005855253af4f68a497John McCall        LQuals.getObjCLifetime() != RQuals.getObjCLifetime())
69510953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return QualType();
69520953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
69530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // Exactly one GC qualifier difference is allowed: __strong is
69540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // okay if the other type has no GC qualifier but is an Objective
69550953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // C object pointer (i.e. implicitly strong by default).  We fix
69560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // this by pretending that the unqualified type was actually
69570953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    // qualified __strong.
69580953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
69590953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
69600953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
69610953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
69620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
69630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return QualType();
69640953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
69650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) {
69660953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong));
69670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    }
69680953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) {
69690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS);
69700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    }
69713d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
69720953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  }
69730953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
69740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  // Okay, qualifiers are equal.
69753d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
6976852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman  Type::TypeClass LHSClass = LHSCan->getTypeClass();
6977852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman  Type::TypeClass RHSClass = RHSCan->getTypeClass();
6978f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner
69791adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  // We want to consider the two function types to be the same for these
69801adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  // comparisons, just force one to the other.
69811adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
69821adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
69834c721d381fb279899337d120edd4a24d405e56b2Eli Friedman
69844c721d381fb279899337d120edd4a24d405e56b2Eli Friedman  // Same as above for arrays
6985a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner  if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
6986a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner    LHSClass = Type::ConstantArray;
6987a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner  if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
6988a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner    RHSClass = Type::ConstantArray;
69891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6990c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCInterfaces are just specialized ObjCObjects.
6991c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
6992c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
6993c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
6994213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // Canonicalize ExtVector -> Vector.
6995213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
6996213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
69971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69984e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff  // If the canonical type classes don't match.
69994e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff  if (LHSClass != RHSClass) {
7000b9da713efb4277753211590953f433723908aadeJohn McCall    // Note that we only have special rules for turning block enum
7001b9da713efb4277753211590953f433723908aadeJohn McCall    // returns into block int returns, not vice-versa.
7002183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const EnumType* ETy = LHS->getAs<EnumType>()) {
7003b9da713efb4277753211590953f433723908aadeJohn McCall      return mergeEnumWithInteger(*this, ETy, RHS, false);
7004bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman    }
7005183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (const EnumType* ETy = RHS->getAs<EnumType>()) {
7006b9da713efb4277753211590953f433723908aadeJohn McCall      return mergeEnumWithInteger(*this, ETy, LHS, BlockReturnType);
7007bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman    }
7008e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian    // allow block pointer type to match an 'id' type.
7009419636316c04d570c183b4797fc811932c588358Fariborz Jahanian    if (OfBlockPointer && !BlockReturnType) {
7010419636316c04d570c183b4797fc811932c588358Fariborz Jahanian       if (LHS->isObjCIdType() && RHS->isBlockPointerType())
7011419636316c04d570c183b4797fc811932c588358Fariborz Jahanian         return LHS;
7012419636316c04d570c183b4797fc811932c588358Fariborz Jahanian      if (RHS->isObjCIdType() && LHS->isBlockPointerType())
7013419636316c04d570c183b4797fc811932c588358Fariborz Jahanian        return RHS;
7014419636316c04d570c183b4797fc811932c588358Fariborz Jahanian    }
7015e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian
70163d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
7017ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff  }
70183d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
70194a74678ed6c3dedac05d02b1ee341f1db869f049Steve Naroff  // The canonical type classes match.
70201adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  switch (LHSClass) {
702172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base)
702272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base)
7023ad5e73887052193afda72db8efcb812bd083a4a8John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
702472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
702572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class:
702672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def"
7027b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Non-canonical and dependent types shouldn't get here");
702872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
70297c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  case Type::LValueReference:
70307c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  case Type::RValueReference:
703172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::MemberPointer:
7032b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("C++ should never be in mergeTypes");
703372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
7034c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCInterface:
703572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::IncompleteArray:
703672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::VariableArray:
703772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::FunctionProto:
703872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::ExtVector:
7039b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Types are eliminated above");
704072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
70411adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::Pointer:
70423d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  {
70433d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    // Merge two pointer types, while trying to preserve typedef info
70446217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType();
70456217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType();
7046447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
7047447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSPointee = LHSPointee.getUnqualifiedType();
7048447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSPointee = RHSPointee.getUnqualifiedType();
7049447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
7050447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false,
7051447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                     Unqualified);
70523d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (ResultType.isNull()) return QualType();
705307d258756dc856c6987c394a0972884e6ed46765Eli Friedman    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
705461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
705507d258756dc856c6987c394a0972884e6ed46765Eli Friedman    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
705661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
70573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return getPointerType(ResultType);
70583d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
7059c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  case Type::BlockPointer:
7060c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  {
7061c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    // Merge two block pointer types, while trying to preserve typedef info
70626217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType();
70636217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType();
7064447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
7065447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSPointee = LHSPointee.getUnqualifiedType();
7066447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSPointee = RHSPointee.getUnqualifiedType();
7067447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
7068447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer,
7069447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor                                     Unqualified);
7070c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (ResultType.isNull()) return QualType();
7071c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
7072c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff      return LHS;
7073c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
7074c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff      return RHS;
7075c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff    return getBlockPointerType(ResultType);
7076c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff  }
7077b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case Type::Atomic:
7078b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  {
7079b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    // Merge two pointer types, while trying to preserve typedef info
7080b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType LHSValue = LHS->getAs<AtomicType>()->getValueType();
7081b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType RHSValue = RHS->getAs<AtomicType>()->getValueType();
7082b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (Unqualified) {
7083b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      LHSValue = LHSValue.getUnqualifiedType();
7084b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      RHSValue = RHSValue.getUnqualifiedType();
7085b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    }
7086b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType ResultType = mergeTypes(LHSValue, RHSValue, false,
7087b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman                                     Unqualified);
7088b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (ResultType.isNull()) return QualType();
7089b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (getCanonicalType(LHSValue) == getCanonicalType(ResultType))
7090b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      return LHS;
7091b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (getCanonicalType(RHSValue) == getCanonicalType(ResultType))
7092b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      return RHS;
7093b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    return getAtomicType(ResultType);
7094b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
70951adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::ConstantArray:
70963d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  {
70973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const ConstantArrayType* LCAT = getAsConstantArrayType(LHS);
70983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const ConstantArrayType* RCAT = getAsConstantArrayType(RHS);
70993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize())
71003d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return QualType();
71013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman
71023d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    QualType LHSElem = getAsArrayType(LHS)->getElementType();
71033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    QualType RHSElem = getAsArrayType(RHS)->getElementType();
7104447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    if (Unqualified) {
7105447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      LHSElem = LHSElem.getUnqualifiedType();
7106447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor      RHSElem = RHSElem.getUnqualifiedType();
7107447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    }
7108447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor
7109447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified);
71103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (ResultType.isNull()) return QualType();
711161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
711261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
711361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
711461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
71153bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(),
71163bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman                                          ArrayType::ArraySizeModifier(), 0);
71173bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(),
71183bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman                                          ArrayType::ArraySizeModifier(), 0);
71193d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const VariableArrayType* LVAT = getAsVariableArrayType(LHS);
71203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    const VariableArrayType* RVAT = getAsVariableArrayType(RHS);
712161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
712261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return LHS;
712361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
712461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner      return RHS;
71253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (LVAT) {
71263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // FIXME: This isn't correct! But tricky to implement because
71273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // the array's size has to be the size of LHS, but the type
71283d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // has to be different.
71293d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return LHS;
71303d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
71313d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    if (RVAT) {
71323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // FIXME: This isn't correct! But tricky to implement because
71333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // the array's size has to be the size of RHS, but the type
71343d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      // has to be different.
71353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return RHS;
71363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    }
71373bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
71383bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman    if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
71397e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    return getIncompleteArrayType(ResultType,
71407e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                  ArrayType::ArraySizeModifier(), 0);
71413d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman  }
71421adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::FunctionNoProto:
7143447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor    return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified);
714472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Record:
714572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Type::Enum:
71463d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
71471adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner  case Type::Builtin:
71483cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner    // Only exactly equal builtin types are compatible, which is tested above.
71493d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
715064cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar  case Type::Complex:
715164cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar    // Distinct complex types are incompatible.
715264cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar    return QualType();
71533cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner  case Type::Vector:
71545a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // FIXME: The merged type should be an ExtVector!
71551c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall    if (areCompatVectorTypes(LHSCan->getAs<VectorType>(),
71561c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall                             RHSCan->getAs<VectorType>()))
71573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman      return LHS;
715861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner    return QualType();
7159c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCObject: {
7160c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    // Check if the types are assignment compatible.
71615a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // FIXME: This should be type compatibility, e.g. whether
71625a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman    // "LHS x; RHS x;" at global scope is legal.
7163c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    const ObjCObjectType* LHSIface = LHS->getAs<ObjCObjectType>();
7164c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    const ObjCObjectType* RHSIface = RHS->getAs<ObjCObjectType>();
7165c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (canAssignObjCInterfaces(LHSIface, RHSIface))
71665fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff      return LHS;
71675fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff
71683d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman    return QualType();
716961490e9a965cfee8a78c12c6802138844f04250dCedric Venet  }
717014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  case Type::ObjCObjectPointer: {
7171132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    if (OfBlockPointer) {
7172132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      if (canAssignObjCInterfacesInBlockPointer(
7173132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian                                          LHS->getAs<ObjCObjectPointerType>(),
7174a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                          RHS->getAs<ObjCObjectPointerType>(),
7175a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian                                          BlockReturnType))
71767530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie        return LHS;
7177132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian      return QualType();
7178132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian    }
7179183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(),
7180183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall                                RHS->getAs<ObjCObjectPointerType>()))
718114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return LHS;
718214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
7183bc76dd06eb881c70c9775b74bab8b88cd747f173Steve Naroff    return QualType();
71847530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  }
7185ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff  }
718672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
71877530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid Type::Class!");
7188ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff}
71897192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek
719078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanianbool ASTContext::FunctionTypesMatchOnNSConsumedAttrs(
719178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian                   const FunctionProtoType *FromFunctionType,
719278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian                   const FunctionProtoType *ToFunctionType) {
719378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  if (FromFunctionType->hasAnyConsumedArgs() !=
719478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      ToFunctionType->hasAnyConsumedArgs())
719578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    return false;
719678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  FunctionProtoType::ExtProtoInfo FromEPI =
719778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    FromFunctionType->getExtProtoInfo();
719878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  FunctionProtoType::ExtProtoInfo ToEPI =
719978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    ToFunctionType->getExtProtoInfo();
720078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  if (FromEPI.ConsumedArguments && ToEPI.ConsumedArguments)
720178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs();
720278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian         ArgIdx != NumArgs; ++ArgIdx)  {
720378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian      if (FromEPI.ConsumedArguments[ArgIdx] !=
720478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian          ToEPI.ConsumedArguments[ArgIdx])
720578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian        return false;
720678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian    }
720778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian  return true;
720878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian}
720978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian
72102390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and
72112390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// 'RHS' attributes and returns the merged version; including for function
72122390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// return types.
72132390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz JahanianQualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) {
72142390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  QualType LHSCan = getCanonicalType(LHS),
72152390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  RHSCan = getCanonicalType(RHS);
72162390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  // If two types are identical, they are compatible.
72172390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LHSCan == RHSCan)
72182390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return LHS;
72192390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (RHSCan->isFunctionType()) {
72202390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (!LHSCan->isFunctionType())
72212390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
72222390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType OldReturnType =
72232390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      cast<FunctionType>(RHSCan.getTypePtr())->getResultType();
72242390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType NewReturnType =
72252390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      cast<FunctionType>(LHSCan.getTypePtr())->getResultType();
72262390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType ResReturnType =
72272390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      mergeObjCGCQualifiers(NewReturnType, OldReturnType);
72282390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResReturnType.isNull())
72292390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
72302390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
72312390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo();
72322390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      // In either case, use OldReturnType to build the new function type.
72332390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      const FunctionType *F = LHS->getAs<FunctionType>();
72342390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      if (const FunctionProtoType *FPT = cast<FunctionProtoType>(F)) {
7235e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall        FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
7236e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall        EPI.ExtInfo = getFunctionExtInfo(LHS);
72372390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        QualType ResultType
7238bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose          = getFunctionType(OldReturnType,
7239bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                            ArrayRef<QualType>(FPT->arg_type_begin(),
7240bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                                               FPT->getNumArgs()),
7241bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose                            EPI);
72422390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        return ResultType;
72432390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      }
72442390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    }
72452390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return QualType();
72462390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
72472390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
72482390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  // If the qualifiers are different, the types can still be merged.
72492390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  Qualifiers LQuals = LHSCan.getLocalQualifiers();
72502390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  Qualifiers RQuals = RHSCan.getLocalQualifiers();
72512390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LQuals != RQuals) {
72522390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // If any of these qualifiers are different, we have a type mismatch.
72532390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
72542390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian        LQuals.getAddressSpace() != RQuals.getAddressSpace())
72552390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
72562390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
72572390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // Exactly one GC qualifier difference is allowed: __strong is
72582390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // okay if the other type has no GC qualifier but is an Objective
72592390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // C object pointer (i.e. implicitly strong by default).  We fix
72602390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // this by pretending that the unqualified type was actually
72612390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    // qualified __strong.
72622390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
72632390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
72642390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
72652390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
72662390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
72672390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return QualType();
72682390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
72692390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_L == Qualifiers::Strong)
72702390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return LHS;
72712390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (GC_R == Qualifiers::Strong)
72722390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return RHS;
72732390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    return QualType();
72742390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
72752390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
72762390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) {
72772390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType LHSBaseQT = LHS->getAs<ObjCObjectPointerType>()->getPointeeType();
72782390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType RHSBaseQT = RHS->getAs<ObjCObjectPointerType>()->getPointeeType();
72792390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT);
72802390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResQT == LHSBaseQT)
72812390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return LHS;
72822390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian    if (ResQT == RHSBaseQT)
72832390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian      return RHS;
72842390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  }
72852390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian  return QualType();
72862390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian}
72872390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian
72885426bf6456a5aeac416a9150de157904d101c819Chris Lattner//===----------------------------------------------------------------------===//
7289ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//                         Integer Predicates
7290ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//===----------------------------------------------------------------------===//
729188054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner
72924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getIntWidth(QualType T) const {
7293f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  if (const EnumType *ET = dyn_cast<EnumType>(T))
729429a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman    T = ET->getDecl()->getIntegerType();
72951274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  if (T->isBooleanType())
72961274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor    return 1;
7297f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  // For builtin types, just use the standard type sizing method
7298ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  return (unsigned)getTypeSize(T);
7299ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman}
7300ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman
7301762f159c3295552f1f3e5e1af8b66385bfaed786Abramo BagnaraQualType ASTContext::getCorrespondingUnsignedType(QualType T) const {
7302f60946222721d9ba3c059563935c17b84703187aDouglas Gregor  assert(T->hasSignedIntegerRepresentation() && "Unexpected type");
73036a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
73046a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  // Turn <4 x signed int> -> <4 x unsigned int>
73056a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  if (const VectorType *VTy = T->getAs<VectorType>())
73066a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner    return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()),
7307e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                         VTy->getNumElements(), VTy->getVectorKind());
73086a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
73096a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  // For enums, we return the unsigned version of the base type.
73106a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  if (const EnumType *ETy = T->getAs<EnumType>())
7311ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    T = ETy->getDecl()->getIntegerType();
73126a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner
73136a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  const BuiltinType *BTy = T->getAs<BuiltinType>();
73146a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner  assert(BTy && "Unexpected signed integer type");
7315ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  switch (BTy->getKind()) {
7316ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Char_S:
7317ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::SChar:
7318ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedCharTy;
7319ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Short:
7320ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedShortTy;
7321ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Int:
7322ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedIntTy;
7323ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::Long:
7324ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedLongTy;
7325ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  case BuiltinType::LongLong:
7326ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman    return UnsignedLongLongTy;
73272df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case BuiltinType::Int128:
73282df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner    return UnsignedInt128Ty;
7329ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  default:
7330b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Unexpected signed integer type");
7331ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  }
7332ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman}
7333ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman
73347b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios KyrtzidisASTMutationListener::~ASTMutationListener() { }
73357b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
733686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
733786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===//
733886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//                          Builtin Type Computation
733986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===//
734086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
734186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the
734233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// pointer over the consumed characters.  This returns the resultant type.  If
734333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// AllowTypeModifiers is false then modifier like * are not parsed, just basic
734433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// types.  This allows "v2i*" to be parsed as a pointer to a v2i instead of
734533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// a vector of "i*".
734614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner///
734714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// RequiresICE is filled in on return to indicate whether the value is required
734814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// to be an Integer Constant Expression.
73494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,
735086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner                                  ASTContext::GetBuiltinTypeError &Error,
735114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                  bool &RequiresICE,
735233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner                                  bool AllowTypeModifiers) {
735386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  // Modifiers.
735486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  int HowLong = 0;
735586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  bool Signed = false, Unsigned = false;
735614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  RequiresICE = false;
7357393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner
735833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  // Read the prefixed modifiers first.
735986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  bool Done = false;
736086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (!Done) {
736186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    switch (*Str++) {
73621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    default: Done = true; --Str; break;
7363393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner    case 'I':
736414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner      RequiresICE = true;
7365393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner      break;
736686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'S':
736786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!");
736886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Signed && "Can't use 'S' modifier multiple times!");
736986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Signed = true;
737086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
737186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'U':
737286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Signed && "Can't use both 'S' and 'U' modifiers!");
737386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(!Unsigned && "Can't use 'S' modifier multiple times!");
737486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Unsigned = true;
737586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
737686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    case 'L':
737786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      assert(HowLong <= 2 && "Can't have LLLL modifier");
737886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      ++HowLong;
737986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      break;
738086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
738186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
738286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
738386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  QualType Type;
73841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
738586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  // Read the base type.
738686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  switch (*Str++) {
7387b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Unknown builtin type letter!");
738886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'v':
738986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned &&
739086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'v'!");
739186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.VoidTy;
739286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
739386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'f':
739486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned &&
739586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'f'!");
739686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.FloatTy;
739786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
739886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'd':
739986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong < 2 && !Signed && !Unsigned &&
740086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner           "Bad modifiers used with 'd'!");
740186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (HowLong)
740286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.LongDoubleTy;
740386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
740486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.DoubleTy;
740586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
740686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 's':
740786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && "Bad modifiers used with 's'!");
740886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Unsigned)
740986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.UnsignedShortTy;
741086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
741186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.ShortTy;
741286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
741386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'i':
741486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (HowLong == 3)
741586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
741686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (HowLong == 2)
741786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
741886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (HowLong == 1)
741986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy;
742086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
742186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy;
742286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
742386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'c':
742486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && "Bad modifiers used with 'c'!");
742586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Signed)
742686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.SignedCharTy;
742786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else if (Unsigned)
742886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.UnsignedCharTy;
742986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    else
743086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.CharTy;
743186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
743286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'b': // boolean
743386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!");
743486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.BoolTy;
743586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
743686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'z':  // size_t.
743786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!");
743886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getSizeType();
743986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
744086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'F':
744186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getCFConstantStringType();
744286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
7443ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian  case 'G':
7444ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    Type = Context.getObjCIdType();
7445ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    break;
7446ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian  case 'H':
7447ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    Type = Context.getObjCSelType();
7448ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian    break;
7449f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian  case 'M':
7450f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    Type = Context.getObjCSuperType();
7451f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian    break;
745286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'a':
745386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getBuiltinVaListType();
745486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(!Type.isNull() && "builtin va list type not initialized!");
745586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
745686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'A':
745786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // This is a "reference" to a va_list; however, what exactly
745886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // this means depends on how va_list is defined. There are two
745986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // different kinds of va_list: ones passed by value, and ones
746086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // passed by reference.  An example of a by-value va_list is
746186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // x86, where va_list is a char*. An example of by-ref va_list
746286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // is x86-64, where va_list is a __va_list_tag[1]. For x86,
746386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // we want this argument to be a char*&; for x86-64, we want
746486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // it to be a __va_list_tag*.
746586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Type = Context.getBuiltinVaListType();
746686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(!Type.isNull() && "builtin va list type not initialized!");
746714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    if (Type->isArrayType())
746886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.getArrayDecayedType(Type);
746914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    else
747086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Type = Context.getLValueReferenceType(Type);
747186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
747286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  case 'V': {
747386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    char *End;
747486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    unsigned NumElements = strtoul(Str, &End, 10);
747586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    assert(End != Str && "Missing vector size");
747686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    Str = End;
74771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
747814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType ElementType = DecodeTypeFromStr(Str, Context, Error,
747914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                             RequiresICE, false);
748014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    assert(!RequiresICE && "Can't require vector ICE");
748133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner
748233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    // TODO: No way to make AltiVec vectors in builtins yet.
7483788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    Type = Context.getVectorType(ElementType, NumElements,
7484e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                 VectorType::GenericVector);
748586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    break;
748686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
7487b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor  case 'E': {
7488b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    char *End;
7489b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7490b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    unsigned NumElements = strtoul(Str, &End, 10);
7491b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    assert(End != Str && "Missing vector size");
7492b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7493b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    Str = End;
7494b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor
7495b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
7496b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor                                             false);
7497b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    Type = Context.getExtVectorType(ElementType, NumElements);
7498b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor    break;
7499b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor  }
7500d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor  case 'X': {
750114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
750214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                             false);
750314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    assert(!RequiresICE && "Can't require complex ICE");
7504d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor    Type = Context.getComplexType(ElementType);
7505d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor    break;
7506cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  }
7507cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  case 'Y' : {
7508cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian    Type = Context.getPointerDiffType();
7509cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian    break;
7510cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian  }
75119a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner  case 'P':
7512c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor    Type = Context.getFILEType();
7513c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor    if (Type.isNull()) {
7514f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Error = ASTContext::GE_Missing_stdio;
751586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      return QualType();
751686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
7517fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    break;
75189a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner  case 'J':
7519f711c41dd9412a8182793259d355c4f6979ed5edMike Stump    if (Signed)
7520782fa308a765aeac2acb39c4e697c937ec21185bMike Stump      Type = Context.getsigjmp_bufType();
7521f711c41dd9412a8182793259d355c4f6979ed5edMike Stump    else
7522f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Type = Context.getjmp_bufType();
7523f711c41dd9412a8182793259d355c4f6979ed5edMike Stump
7524fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    if (Type.isNull()) {
7525f711c41dd9412a8182793259d355c4f6979ed5edMike Stump      Error = ASTContext::GE_Missing_setjmp;
7526fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump      return QualType();
7527fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    }
7528fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump    break;
7529e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola  case 'K':
7530e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!");
7531e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    Type = Context.getucontext_tType();
7532e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola
7533e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    if (Type.isNull()) {
7534e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      Error = ASTContext::GE_Missing_ucontext;
7535e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      return QualType();
7536e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    }
7537e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    break;
75386902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman  case 'p':
75396902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman    Type = Context.getProcessIDType();
75406902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman    break;
7541782fa308a765aeac2acb39c4e697c937ec21185bMike Stump  }
75421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
754333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  // If there are modifiers and if we're allowed to parse them, go for it.
754433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  Done = !AllowTypeModifiers;
754586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (!Done) {
7546187ab37a05b8f7015b9f39cc8cd9129a0c6d0b48John McCall    switch (char c = *Str++) {
754733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    default: Done = true; --Str; break;
754833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case '*':
754933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case '&': {
755033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      // Both pointers and references can have their pointee types
755133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      // qualified with an address space.
755233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      char *End;
755333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      unsigned AddrSpace = strtoul(Str, &End, 10);
755433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      if (End != Str && AddrSpace != 0) {
755533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getAddrSpaceQualType(Type, AddrSpace);
755633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Str = End;
755733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      }
755833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      if (c == '*')
755933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getPointerType(Type);
756033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      else
756133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner        Type = Context.getLValueReferenceType(Type);
756233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
756333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    }
756433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    // FIXME: There's no way to have a built-in with an rvalue ref arg.
756533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case 'C':
756633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      Type = Type.withConst();
756733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
756833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner    case 'D':
756933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      Type = Context.getVolatileType(Type);
757033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner      break;
757118932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek    case 'R':
757218932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek      Type = Type.withRestrict();
757318932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek      break;
757486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    }
757586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
7576393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner
757714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  assert((!RequiresICE || Type->isIntegralOrEnumerationType()) &&
7578393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner         "Integer constant 'I' type must be an integer");
75791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
758086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  return Type;
758186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner}
758286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
758386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// GetBuiltinType - Return the type for the specified builtin.
758433daae66462e8f51ee153463b32bdefd60c801aaChris LattnerQualType ASTContext::GetBuiltinType(unsigned Id,
758514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                    GetBuiltinTypeError &Error,
75864ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                    unsigned *IntegerConstantArgs) const {
758733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner  const char *TypeStr = BuiltinInfo.GetTypeString(Id);
75881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<QualType, 8> ArgTypes;
75901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
759114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  bool RequiresICE = false;
759286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  Error = GE_None;
759314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error,
759414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner                                       RequiresICE, true);
759586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  if (Error != GE_None)
759686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    return QualType();
759714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
759814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner  assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE");
759914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
760086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  while (TypeStr[0] && TypeStr[0] != '.') {
760114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true);
760286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Error != GE_None)
760386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      return QualType();
760486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
760514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    // If this argument is required to be an IntegerConstantExpression and the
760614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    // caller cares, fill in the bitmask we return.
760714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner    if (RequiresICE && IntegerConstantArgs)
760814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner      *IntegerConstantArgs |= 1 << ArgTypes.size();
760914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner
761086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    // Do array -> pointer decay.  The builtin should use the decayed type.
761186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    if (Ty->isArrayType())
761286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner      Ty = getArrayDecayedType(Ty);
76131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
761486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner    ArgTypes.push_back(Ty);
761586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  }
761686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
761786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner  assert((TypeStr[0] != '.' || TypeStr[1] == 0) &&
761886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner         "'.' should only occur at end of builtin type list!");
761986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner
762000ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  FunctionType::ExtInfo EI;
762100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true);
762200ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall
762300ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  bool Variadic = (TypeStr[0] == '.');
762400ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall
762500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  // We really shouldn't be making a no-proto type here, especially in C++.
762600ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  if (ArgTypes.empty() && Variadic)
762700ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall    return getFunctionNoProtoType(ResType, EI);
7628ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor
7629e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  FunctionProtoType::ExtProtoInfo EPI;
763000ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  EPI.ExtInfo = EI;
763100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall  EPI.Variadic = Variadic;
7632e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
7633bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose  return getFunctionType(ResType, ArgTypes, EPI);
763486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner}
7635a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman
763690e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) {
763790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  GVALinkage External = GVA_StrongExternal;
763890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
763990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  Linkage L = FD->getLinkage();
764090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  switch (L) {
764190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case NoLinkage:
764290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case InternalLinkage:
764390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case UniqueExternalLinkage:
764490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_Internal;
764590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
764690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case ExternalLinkage:
764790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    switch (FD->getTemplateSpecializationKind()) {
764890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_Undeclared:
764990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitSpecialization:
765090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      External = GVA_StrongExternal;
765190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      break;
765290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
765390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDefinition:
765490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_ExplicitTemplateInstantiation;
765590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
765690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDeclaration:
765790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ImplicitInstantiation:
765890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      External = GVA_TemplateInstantiation;
765990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      break;
766090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
766190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
766290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
766390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (!FD->isInlined())
766490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return External;
766590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
76664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getLangOpts().CPlusPlus || FD->hasAttr<GNUInlineAttr>()) {
766790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // GNU or C99 inline semantics. Determine whether this symbol should be
766890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // externally visible.
766990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (FD->isInlineDefinitionExternallyVisible())
767090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return External;
767190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
767290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // C99 inline semantics, where the symbol is not externally visible.
767390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_C99Inline;
767490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
767590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
767690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // C++0x [temp.explicit]p9:
767790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   [ Note: The intent is that an inline function that is the subject of
767890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   an explicit instantiation declaration will still be implicitly
767990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   instantiated when used so that the body can be considered for
768090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   inlining, but that no out-of-line copy of the inline function would be
768190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  //   generated in the translation unit. -- end note ]
768290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (FD->getTemplateSpecializationKind()
768390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis                                       == TSK_ExplicitInstantiationDeclaration)
768490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_C99Inline;
768590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
768690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  return GVA_CXXInline;
768790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
768890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
768990e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) {
769090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // If this is a static data member, compute the kind of template
769190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // specialization. Otherwise, this variable is not part of a
769290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // template.
769390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  TemplateSpecializationKind TSK = TSK_Undeclared;
769490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (VD->isStaticDataMember())
769590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    TSK = VD->getTemplateSpecializationKind();
769690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
769790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  Linkage L = VD->getLinkage();
769890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
769990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  switch (L) {
770090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case NoLinkage:
770190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case InternalLinkage:
770290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case UniqueExternalLinkage:
770390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return GVA_Internal;
770490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
770590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  case ExternalLinkage:
770690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    switch (TSK) {
770790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_Undeclared:
770890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitSpecialization:
770990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_StrongExternal;
771090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
771190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDeclaration:
771290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      llvm_unreachable("Variable should not be instantiated");
771390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      // Fall through to treat this like any other instantiation.
771490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
771590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ExplicitInstantiationDefinition:
771690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_ExplicitTemplateInstantiation;
771790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
771890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    case TSK_ImplicitInstantiation:
771990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return GVA_TemplateInstantiation;
772090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
772190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
772290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
77237530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid Linkage!");
772490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
772590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
77264ac7c0bb39696e92fd220118fedc484c09a69870Argyrios Kyrtzidisbool ASTContext::DeclMustBeEmitted(const Decl *D) {
772790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
772890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (!VD->isFileVarDecl())
772990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return false;
7730f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith  } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
7731f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith    // We never need to emit an uninstantiated function template.
7732f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith    if (FD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate)
7733f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith      return false;
7734f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith  } else
7735f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith    return false;
7736f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith
7737f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith  // If this is a member of a class template, we do not need to emit it.
7738f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith  if (D->getDeclContext()->isDependentContext())
773990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return false;
774090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
7741ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  // Weak references don't produce any output by themselves.
7742ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  if (D->hasAttr<WeakRefAttr>())
7743ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis    return false;
7744ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis
774590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  // Aliases and used decls are required.
774690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>())
774790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return true;
774890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
774990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
775090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Forward declarations aren't required.
775110620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt    if (!FD->doesThisDeclarationHaveABody())
7752dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky      return FD->doesDeclarationForceExternallyVisibleDefinition();
775390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
775490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Constructors and destructors are required.
775590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>())
775690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return true;
775790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
7758d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    // The key function for a class is required.  This rule only comes
7759d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    // into play when inline functions can be key functions, though.
7760d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall    if (getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
7761d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall      if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
7762d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall        const CXXRecordDecl *RD = MD->getParent();
7763d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall        if (MD->isOutOfLine() && RD->isDynamicClass()) {
7764d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall          const CXXMethodDecl *KeyFunc = getCurrentKeyFunction(RD);
7765d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall          if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl())
7766d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall            return true;
7767d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall        }
776890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      }
776990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    }
777090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
777190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    GVALinkage Linkage = GetGVALinkageForFunction(FD);
777290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
777390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // static, static inline, always_inline, and extern inline functions can
777490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // always be deferred.  Normal inline functions can be deferred in C99/C++.
777590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    // Implicit template instantiations can also be deferred in C++.
777690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    if (Linkage == GVA_Internal  || Linkage == GVA_C99Inline ||
77773a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev        Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation)
777890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis      return false;
777990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis    return true;
778090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  }
778194da1587f7d584fc61df793229d197969f204cd9Douglas Gregor
778290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  const VarDecl *VD = cast<VarDecl>(D);
778390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  assert(VD->isFileVarDecl() && "Expected file scoped var");
778490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
7785ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis  if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly)
7786ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis    return false;
7787ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis
77885f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that can be needed in other TUs are required.
778990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis  GVALinkage L = GetGVALinkageForVariable(VD);
77905f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (L != GVA_Internal && L != GVA_TemplateInstantiation)
77915f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
779290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis
77935f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that have destruction with side-effects are required.
77945f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (VD->getType().isDestructedType())
77955f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
77965f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith
77975f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  // Variables that have initialization with side-effects are required.
77985f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  if (VD->getInit() && VD->getInit()->HasSideEffects(*this))
77995f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith    return true;
78005f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith
78015f9a7e31d038843f1d3a5e2544fc365ffd563951Richard Smith  return false;
780290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis}
7803071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
78048f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur IskhodzhanovCallingConv ASTContext::getDefaultCXXMethodCallConv(bool isVariadic) {
7805ee743f903858e337434ac0335f147f4de4ecae05Charles Davis  // Pass through to the C++ ABI object
78068f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  return ABI->getDefaultMethodCallConv(isVariadic);
78078f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov}
78088f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov
78098f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur IskhodzhanovCallingConv ASTContext::getCanonicalCallConv(CallingConv CC) const {
7810b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  if (CC == CC_C && !LangOpts.MRTD &&
7811b8b2c9da87e7d70a1679db026f40548b3192b705John McCall      getTargetInfo().getCXXABI().isMemberFunctionCCDefault())
78128f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    return CC_Default;
78138f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  return CC;
7814ee743f903858e337434ac0335f147f4de4ecae05Charles Davis}
7815ee743f903858e337434ac0335f147f4de4ecae05Charles Davis
78164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const {
7817dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  // Pass through to the C++ ABI object
7818dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  return ABI->isNearlyEmpty(RD);
7819dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson}
7820dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson
782114110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *ASTContext::createMangleContext() {
7822b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  switch (Target->getCXXABI().getKind()) {
7823c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  case TargetCXXABI::GenericAArch64:
7824b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::GenericItanium:
7825b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::GenericARM:
7826b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::iOS:
782714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return createItaniumMangleContext(*this, getDiagnostics());
7828b8b2c9da87e7d70a1679db026f40548b3192b705John McCall  case TargetCXXABI::Microsoft:
782914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return createMicrosoftMangleContext(*this, getDiagnostics());
783014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
7831b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unsupported ABI");
783214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
783314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
7834071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI::~CXXABI() {}
7835ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek
7836ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremeneksize_t ASTContext::getSideTableAllocatedMemory() const {
78370c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek  return ASTRecordLayouts.getMemorySize()
78380c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(ObjCLayouts)
78390c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(KeyFunctions)
78400c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(ObjCImpls)
78410c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(BlockVarCopyInits)
78420c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(DeclAttrs)
78430c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromStaticDataMember)
78440c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUsingDecl)
78450c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl)
78460c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl)
78470c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(OverriddenMethods)
78480c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek    + llvm::capacity_in_bytes(Types)
7849af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet    + llvm::capacity_in_bytes(VariableArrayTypes)
78500d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet    + llvm::capacity_in_bytes(ClassScopeSpecializationPattern);
7851ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek}
7852d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek
785366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikievoid ASTContext::addUnnamedTag(const TagDecl *Tag) {
785466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  // FIXME: This mangling should be applied to function local classes too
785566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl() ||
785666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie      !isa<CXXRecordDecl>(Tag->getParent()) || Tag->getLinkage() != ExternalLinkage)
785766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    return;
785866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
785966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  std::pair<llvm::DenseMap<const DeclContext *, unsigned>::iterator, bool> P =
786066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    UnnamedMangleContexts.insert(std::make_pair(Tag->getParent(), 0));
786166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  UnnamedMangleNumbers.insert(std::make_pair(Tag, P.first->second++));
786266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
786366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
786466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikieint ASTContext::getUnnamedTagManglingNumber(const TagDecl *Tag) const {
786566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  llvm::DenseMap<const TagDecl *, unsigned>::const_iterator I =
786666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    UnnamedMangleNumbers.find(Tag);
786766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  return I != UnnamedMangleNumbers.end() ? I->second : -1;
786866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
786966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
78709e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorunsigned ASTContext::getLambdaManglingNumber(CXXMethodDecl *CallOperator) {
78719e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  CXXRecordDecl *Lambda = CallOperator->getParent();
78729e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  return LambdaMangleContexts[Lambda->getDeclContext()]
78739e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor           .getManglingNumber(CallOperator);
78749e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor}
78759e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
78769e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
7877d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekvoid ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) {
7878d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  ParamIndices[D] = index;
7879d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek}
7880d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek
7881d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekunsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const {
7882d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  ParameterIndexTable::const_iterator I = ParamIndices.find(D);
7883d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  assert(I != ParamIndices.end() &&
7884d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek         "ParmIndices lacks entry set by ParmVarDecl");
7885d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek  return I->second;
7886d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek}
7887