ASTContext.cpp revision fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369
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" 15bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck#include "clang/AST/CharUnits.h" 1649aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h" 17980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 19b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLoc.h" 20e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h" 21ea1471e0e967548c596a71469702f8846dbaf3c0John McCall#include "clang/AST/ExprCXX.h" 222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/ExternalASTSource.h" 237b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h" 2419cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 2514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/Mangle.h" 261b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 27a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner#include "clang/Basic/SourceManager.h" 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 29f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "llvm/ADT/SmallString.h" 3085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson#include "llvm/ADT/StringExtras.h" 316fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman#include "llvm/Support/MathExtras.h" 32f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "llvm/Support/raw_ostream.h" 330c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek#include "llvm/Support/Capacity.h" 34071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#include "CXXABI.h" 352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis#include <map> 3629445a0542d128cd7ee587ee52229670b9b54a12Anders Carlsson 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 391827403a7138946305c0058f262e02b595cf882fDouglas Gregorunsigned ASTContext::NumImplicitDefaultConstructors; 401827403a7138946305c0058f262e02b595cf882fDouglas Gregorunsigned ASTContext::NumImplicitDefaultConstructorsDeclared; 41225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorunsigned ASTContext::NumImplicitCopyConstructors; 42225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorunsigned ASTContext::NumImplicitCopyConstructorsDeclared; 43ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveConstructors; 44ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveConstructorsDeclared; 45a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorunsigned ASTContext::NumImplicitCopyAssignmentOperators; 46a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorunsigned ASTContext::NumImplicitCopyAssignmentOperatorsDeclared; 47ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveAssignmentOperators; 48ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveAssignmentOperatorsDeclared; 494923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregorunsigned ASTContext::NumImplicitDestructors; 504923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregorunsigned ASTContext::NumImplicitDestructorsDeclared; 514923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerenum FloatingRank { 53aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov HalfRank, FloatRank, DoubleRank, LongDoubleRank 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 56aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoconst RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const { 57aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (!CommentsLoaded && ExternalSource) { 58aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko ExternalSource->ReadComments(); 59aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko CommentsLoaded = true; 60aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 61aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 62aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko assert(D); 63aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 64c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko // User can not attach documentation to implicit declarations. 65c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko if (D->isImplicit()) 66c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko return NULL; 67c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko 68aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // TODO: handle comments for function parameters properly. 69aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (isa<ParmVarDecl>(D)) 70aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 71aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 72aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko ArrayRef<RawComment> RawComments = Comments.getComments(); 73aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 74aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // If there are no comments anywhere, we won't find anything. 75aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (RawComments.empty()) 76aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 77aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 78aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // If the declaration doesn't map directly to a location in a file, we 79aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // can't find the comment. 80aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceLocation DeclLoc = D->getLocation(); 81aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLoc.isInvalid() || !DeclLoc.isFileID()) 82aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 83aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 84aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Find the comment that occurs just after this declaration. 85aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko ArrayRef<RawComment>::iterator Comment 86aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko = std::lower_bound(RawComments.begin(), 87aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawComments.end(), 889530a8bf275f91f95147e1fb205dc85bea1ae45cDmitri Gribenko RawComment(SourceMgr, SourceRange(DeclLoc)), 89aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko BeforeThanCompare<RawComment>(SourceMgr)); 90aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 91aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Decompose the location for the declaration and find the beginning of the 92aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // file buffer. 93aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> DeclLocDecomp = SourceMgr.getDecomposedLoc(DeclLoc); 94aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 95aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // First check whether we have a trailing comment. 96aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Comment != RawComments.end() && 972d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko Comment->isDocumentation() && Comment->isTrailingComment() && 98aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko !isa<TagDecl>(D) && !isa<NamespaceDecl>(D)) { 99aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> CommentBeginDecomp 100aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko = SourceMgr.getDecomposedLoc(Comment->getSourceRange().getBegin()); 101aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check that Doxygen trailing comment comes after the declaration, starts 102aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // on the same line and in the same file as the declaration. 103aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLocDecomp.first == CommentBeginDecomp.first && 104aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) 105aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko == SourceMgr.getLineNumber(CommentBeginDecomp.first, 106aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko CommentBeginDecomp.second)) { 107aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return &*Comment; 108aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 109aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 110aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 111aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // The comment just after the declaration was not a trailing comment. 112aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Let's look at the previous comment. 113aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Comment == RawComments.begin()) 114aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 115aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko --Comment; 116aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 117aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check that we actually have a non-member Doxygen comment. 1182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko if (!Comment->isDocumentation() || Comment->isTrailingComment()) 119aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 120aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 121aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Decompose the end of the comment. 122aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> CommentEndDecomp 123aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko = SourceMgr.getDecomposedLoc(Comment->getSourceRange().getEnd()); 124aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 125aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // If the comment and the declaration aren't in the same file, then they 126aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // aren't related. 127aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLocDecomp.first != CommentEndDecomp.first) 128aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 129aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 130aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Get the corresponding buffer. 131aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool Invalid = false; 132aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first, 133aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko &Invalid).data(); 134aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Invalid) 135aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 136aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 137aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Extract text between the comment and declaration. 138aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko StringRef Text(Buffer + CommentEndDecomp.second, 139aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko DeclLocDecomp.second - CommentEndDecomp.second); 140aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1418bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko // There should be no other declarations or preprocessor directives between 1428bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko // comment and declaration. 1438bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko if (Text.find_first_of(",;{}#") != StringRef::npos) 144aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 145aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 146aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return &*Comment; 147aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} 148aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 149aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoconst RawComment *ASTContext::getRawCommentForDecl(const Decl *D) const { 150aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check whether we have cached a comment string for this declaration 151aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // already. 152aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko llvm::DenseMap<const Decl *, const RawComment *>::iterator Pos 153aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko = DeclComments.find(D); 154aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Pos != DeclComments.end()) 155aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return Pos->second; 156aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 157aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko const RawComment *RC = getRawCommentForDeclNoCache(D); 1588376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko // If we found a comment, it should be a documentation comment. 1598376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko assert(!RC || RC->isDocumentation()); 160aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko DeclComments[D] = RC; 161aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return RC; 162aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} 163aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregorvoid 1653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID, 1663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *Parm) { 1673e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Parm->getDepth()); 1683e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Parm->getPosition()); 16961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor ID.AddBoolean(Parm->isParameterPack()); 1703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 1713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList *Params = Parm->getTemplateParameters(); 1723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Params->size()); 1733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor for (TemplateParameterList::const_iterator P = Params->begin(), 1743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor PEnd = Params->end(); 1753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor P != PEnd; ++P) { 1763e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 1773e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(0); 1783e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddBoolean(TTP->isParameterPack()); 1793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor continue; 1803e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 1813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 1823e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 1833e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(1); 18461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor ID.AddBoolean(NTTP->isParameterPack()); 1859e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr()); 1866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 1876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddBoolean(true); 1886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddInteger(NTTP->getNumExpansionTypes()); 1899e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 1909e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman QualType T = NTTP->getExpansionType(I); 1919e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman ID.AddPointer(T.getCanonicalType().getAsOpaquePtr()); 1929e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman } 1936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else 1946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddBoolean(false); 1953e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor continue; 1963e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 1973e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 1983e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 1993e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(2); 2003e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Profile(ID, TTP); 2013e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 2023e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor} 2033e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2043e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorTemplateTemplateParmDecl * 2053e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::getCanonicalTemplateTemplateParmDecl( 2064ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad TemplateTemplateParmDecl *TTP) const { 2073e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Check if we already have a canonical template template parameter. 2083e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor llvm::FoldingSetNodeID ID; 2093e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonicalTemplateTemplateParm::Profile(ID, TTP); 2103e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor void *InsertPos = 0; 2113e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonicalTemplateTemplateParm *Canonical 2123e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 2133e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (Canonical) 2143e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor return Canonical->getParam(); 2153e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2163e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Build a canonical template parameter list. 2173e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList *Params = TTP->getTemplateParameters(); 2185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> CanonParams; 2193e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.reserve(Params->size()); 2203e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor for (TemplateParameterList::const_iterator P = Params->begin(), 2213e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor PEnd = Params->end(); 2223e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor P != PEnd; ++P) { 2233e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) 2243e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.push_back( 2253e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTypeParmDecl::Create(*this, getTranslationUnitDecl(), 226344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation(), 227344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation(), 228344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara TTP->getDepth(), 2293e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TTP->getIndex(), 0, false, 2303e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TTP->isParameterPack())); 2313e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor else if (NonTypeTemplateParmDecl *NTTP 2326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 2336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T = getCanonicalType(NTTP->getType()); 2346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T); 2356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NonTypeTemplateParmDecl *Param; 2366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 2375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 2> ExpandedTypes; 2385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TypeSourceInfo *, 2> ExpandedTInfos; 2396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 2406952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I))); 2416952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos.push_back( 2426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor getTrivialTypeSourceInfo(ExpandedTypes.back())); 2436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 2446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 246ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 247ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 2486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getDepth(), 2496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getPosition(), 0, 2506952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T, 2516952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TInfo, 2526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.data(), 2536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.size(), 2546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos.data()); 2556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else { 2566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 257ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 258ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 2596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getDepth(), 2606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getPosition(), 0, 2616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T, 2626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->isParameterPack(), 2636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TInfo); 2646952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 2656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor CanonParams.push_back(Param); 2666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else 2683e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.push_back(getCanonicalTemplateTemplateParmDecl( 2693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor cast<TemplateTemplateParmDecl>(*P))); 2703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 2713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *CanonTTP 2733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 2743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation(), TTP->getDepth(), 27561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor TTP->getPosition(), 27661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor TTP->isParameterPack(), 27761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor 0, 2783e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList::Create(*this, SourceLocation(), 2793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation(), 2803e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.data(), 2813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.size(), 2823e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation())); 2833e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2843e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Get the new insert position for the node we care about. 2853e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 2863e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor assert(Canonical == 0 && "Shouldn't be in the map!"); 2873e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor (void)Canonical; 2883e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2893e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Create the canonical template template parameter entry. 2903e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP); 2913e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos); 2923e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor return CanonTTP; 2933e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor} 2943e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 295071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *ASTContext::createCXXABI(const TargetInfo &T) { 296ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall if (!LangOpts.CPlusPlus) return 0; 297ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall 29820cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis switch (T.getCXXABI()) { 299ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall case CXXABI_ARM: 300ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall return CreateARMCXXABI(*this); 301ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall case CXXABI_Itanium: 302071cc7deffad608165b1ddd5263e8bf181861520Charles Davis return CreateItaniumCXXABI(*this); 30320cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis case CXXABI_Microsoft: 30420cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis return CreateMicrosoftCXXABI(*this); 30520cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis } 3067530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CXXABI type!"); 307071cc7deffad608165b1ddd5263e8bf181861520Charles Davis} 308071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 309bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorstatic const LangAS::Map *getAddressSpaceMap(const TargetInfo &T, 310207f4d8543529221932af82836016a2ef066c917Peter Collingbourne const LangOptions &LOpts) { 311207f4d8543529221932af82836016a2ef066c917Peter Collingbourne if (LOpts.FakeAddressSpaceMap) { 312207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // The fake address space map must have a distinct entry for each 313207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // language-specific address space. 314207f4d8543529221932af82836016a2ef066c917Peter Collingbourne static const unsigned FakeAddrSpaceMap[] = { 315207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 1, // opencl_global 316207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 2, // opencl_local 3174dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 3, // opencl_constant 3184dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 4, // cuda_device 3194dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 5, // cuda_constant 3204dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 6 // cuda_shared 321207f4d8543529221932af82836016a2ef066c917Peter Collingbourne }; 322bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return &FakeAddrSpaceMap; 323207f4d8543529221932af82836016a2ef066c917Peter Collingbourne } else { 324bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return &T.getAddressSpaceMap(); 325207f4d8543529221932af82836016a2ef066c917Peter Collingbourne } 326207f4d8543529221932af82836016a2ef066c917Peter Collingbourne} 327207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 3283e3cd93b2fd9644e970c389e715c13883faf68b6Douglas GregorASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM, 329bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor const TargetInfo *t, 330e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar IdentifierTable &idents, SelectorTable &sels, 3311b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner Builtin::Context &builtins, 332bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned size_reserve, 333bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor bool DelayInitialization) 334bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor : FunctionProtoTypes(this_()), 335bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor TemplateSpecializationTypes(this_()), 336bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor DependentTemplateSpecializationTypes(this_()), 337bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor SubstTemplateTemplateParmPacks(this_()), 338bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor GlobalNestedNameSpecifier(0), 339bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Int128Decl(0), UInt128Decl(0), 340c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge BuiltinVaListDecl(0), 341a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor ObjCIdDecl(0), ObjCSelDecl(0), ObjCClassDecl(0), ObjCProtocolClassDecl(0), 342e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor CFConstantStringTypeDecl(0), ObjCInstanceTypeDecl(0), 343bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor FILEDecl(0), 344e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola jmp_bufDecl(0), sigjmp_bufDecl(0), ucontext_tDecl(0), 345e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola BlockDescriptorType(0), BlockDescriptorExtendedType(0), 346e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola cudaConfigureCallDecl(0), 347e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor NullTypeSourceInfo(QualType()), 348e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor FirstLocalImport(), LastLocalImport(), 349bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor SourceMgr(SM), LangOpts(LOpts), 35030c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor AddrSpaceMap(0), Target(t), PrintingPolicy(LOpts), 351bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Idents(idents), Selectors(sels), 352bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor BuiltinInfo(builtins), 353bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor DeclarationNames(*this), 35430c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor ExternalSource(0), Listener(0), 355aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Comments(SM), CommentsLoaded(false), 356bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor LastSDM(0, 0), 357bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor UniqueBlockByRefTypeID(0) 358bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor{ 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (size_reserve > 0) Types.reserve(size_reserve); 360e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar TUDecl = TranslationUnitDecl::Create(*this); 361bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 362bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor if (!DelayInitialization) { 363bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor assert(t && "No target supplied for ASTContext initialization"); 364bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor InitBuiltinTypes(*t); 365bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor } 366e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar} 367e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar 3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext::~ASTContext() { 3693478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek // Release the DenseMaps associated with DeclContext objects. 3703478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek // FIXME: Is this the ideal solution? 3713478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek ReleaseDeclContextMaps(); 3727d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 37363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // Call all of the deallocation functions. 37463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor for (unsigned I = 0, N = Deallocations.size(); I != N; ++I) 37563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor Deallocations[I].first(Deallocations[I].second); 3760054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 377dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed 37863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // because they can contain DenseMaps. 37963fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor for (llvm::DenseMap<const ObjCContainerDecl*, 38063fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor const ASTRecordLayout*>::iterator 38163fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) 38263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // Increment in loop to prevent using deallocated memory. 38363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 38463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor R->Destroy(*this); 38563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor 386dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator 387dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) { 388dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek // Increment in loop to prevent using deallocated memory. 389dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 390dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek R->Destroy(*this); 391dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek } 3926320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 3936320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(), 3946320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor AEnd = DeclAttrs.end(); 3956320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor A != AEnd; ++A) 3966320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor A->second->~AttrVec(); 3976320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 398ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor 3990054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) { 4000054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor Deallocations.push_back(std::make_pair(Callback, Data)); 4010054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 4020054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 4046f42b62b6194f53bcbc349f5d17388e1936535d7Dylan NoblesmithASTContext::setExternalSource(OwningPtr<ExternalASTSource> &Source) { 4052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ExternalSource.reset(Source.take()); 4062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 4072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ASTContext::PrintStats() const { 409cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "\n*** AST Context Stats:\n"; 410cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << " " << Types.size() << " types total.\n"; 4117c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 412dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned counts[] = { 4131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define TYPE(Name, Parent) 0, 414dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent) 415dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def" 416dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor 0 // Extra 417dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor }; 418c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor 4195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Types.size(); i != e; ++i) { 4205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Type *T = Types[i]; 421dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor counts[(unsigned)T->getTypeClass()]++; 4225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 424dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned Idx = 0; 425dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned TotalBytes = 0; 426dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define TYPE(Name, Parent) \ 427dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor if (counts[Idx]) \ 428cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << " " << counts[Idx] << " " << #Name \ 429cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " types\n"; \ 430dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor TotalBytes += counts[Idx] * sizeof(Name##Type); \ 431dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor ++Idx; 432dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent) 433dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def" 4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 435cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "Total bytes = " << TotalBytes << "\n"; 436cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 4374923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor // Implicit special member functions. 438cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/" 439cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitDefaultConstructors 440cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit default constructors created\n"; 441cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitCopyConstructorsDeclared << "/" 442cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitCopyConstructors 443cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit copy constructors created\n"; 4444e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 445cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitMoveConstructorsDeclared << "/" 446cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitMoveConstructors 447cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit move constructors created\n"; 448cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/" 449cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitCopyAssignmentOperators 450cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit copy assignment operators created\n"; 4514e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 452cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/" 453cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitMoveAssignmentOperators 454cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit move assignment operators created\n"; 455cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitDestructorsDeclared << "/" 456cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitDestructors 457cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit destructors created\n"; 458cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 4592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (ExternalSource.get()) { 460cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "\n"; 4612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ExternalSource->PrintStats(); 4622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 463cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 46463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor BumpAlloc.PrintStats(); 4655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 467772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getInt128Decl() const { 468772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (!Int128Decl) { 469772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(Int128Ty); 470772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor Int128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 471772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor getTranslationUnitDecl(), 472772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 473772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 474772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor &Idents.get("__int128_t"), 475772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TInfo); 476772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 477772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 478772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor return Int128Decl; 479772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor} 480772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 481772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getUInt128Decl() const { 482772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (!UInt128Decl) { 483772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(UnsignedInt128Ty); 484772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor UInt128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 485772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor getTranslationUnitDecl(), 486772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 487772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 488772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor &Idents.get("__uint128_t"), 489772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TInfo); 490772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 491772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 492772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor return UInt128Decl; 493772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor} 4945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 495e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallvoid ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) { 4966b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K); 497e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall R = CanQualType::CreateUnsafe(QualType(Ty, 0)); 4986b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Types.push_back(Ty); 4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 501bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorvoid ASTContext::InitBuiltinTypes(const TargetInfo &Target) { 502bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor assert((!this->Target || this->Target == &Target) && 503bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor "Incorrect target reinitialization"); 5045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(VoidTy.isNull() && "Context reinitialized?"); 5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 506bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor this->Target = &Target; 507bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 508bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor ABI.reset(createCXXABI(Target)); 509bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor AddrSpaceMap = getAddressSpaceMap(Target, LangOpts); 510bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 5115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p19. 5125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(VoidTy, BuiltinType::Void); 5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p2. 5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(BoolTy, BuiltinType::Bool); 5165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p3. 51715b91764d08e886391c865c4a444d7b51141c284Eli Friedman if (LangOpts.CharIsSigned) 5185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(CharTy, BuiltinType::Char_S); 5195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 5205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(CharTy, BuiltinType::Char_U); 5215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p4. 5225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(SignedCharTy, BuiltinType::SChar); 5235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(ShortTy, BuiltinType::Short); 5245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(IntTy, BuiltinType::Int); 5255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongTy, BuiltinType::Long); 5265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongLongTy, BuiltinType::LongLong); 5271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p6. 5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedCharTy, BuiltinType::UChar); 5305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedShortTy, BuiltinType::UShort); 5315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedIntTy, BuiltinType::UInt); 5325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedLongTy, BuiltinType::ULong); 5335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedLongLongTy, BuiltinType::ULongLong); 5341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p10. 5365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(FloatTy, BuiltinType::Float); 5375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(DoubleTy, BuiltinType::Double); 5385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongDoubleTy, BuiltinType::LongDouble); 53964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 5402df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner // GNU extension, 128-bit integers. 5412df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner InitBuiltinType(Int128Ty, BuiltinType::Int128); 5422df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner InitBuiltinType(UnsignedInt128Ty, BuiltinType::UInt128); 5432df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner 5443f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner if (LangOpts.CPlusPlus) { // C++ 3.9.1p5 545d3d77cd138f8e830f6547b6f83fcd5721ccf5f5dEli Friedman if (TargetInfo::isTypeSigned(Target.getWCharType())) 5463f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner InitBuiltinType(WCharTy, BuiltinType::WChar_S); 5473f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner else // -fshort-wchar makes wchar_t be unsigned. 5483f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner InitBuiltinType(WCharTy, BuiltinType::WChar_U); 5493f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner } else // C99 5503a2503227c3db04a3619735127483263c1075ef7Chris Lattner WCharTy = getFromTargetType(Target.getWCharType()); 55164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 552392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy WIntTy = getFromTargetType(Target.getWIntType()); 553392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy 554f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 555f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith InitBuiltinType(Char16Ty, BuiltinType::Char16); 556f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith else // C99 557f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char16Ty = getFromTargetType(Target.getChar16Type()); 558f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 559f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 560f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith InitBuiltinType(Char32Ty, BuiltinType::Char32); 561f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith else // C99 562f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char32Ty = getFromTargetType(Target.getChar32Type()); 563f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 564898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // Placeholder type for type-dependent expressions whose type is 565898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // completely unknown. No code should ever check a type against 566898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // DependentTy and users should never see it; however, it is here to 567898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // help diagnose failures to properly check for type-dependent 568898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // expressions. 569898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor InitBuiltinType(DependentTy, BuiltinType::Dependent); 5708e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 5712a984cad5ac3fdceeff2bd99daa7b90979313475John McCall // Placeholder type for functions. 5722a984cad5ac3fdceeff2bd99daa7b90979313475John McCall InitBuiltinType(OverloadTy, BuiltinType::Overload); 5732a984cad5ac3fdceeff2bd99daa7b90979313475John McCall 574864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // Placeholder type for bound members. 575864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall InitBuiltinType(BoundMemberTy, BuiltinType::BoundMember); 576864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 5773c3b7f90a863af43fa63043d396553ecf205351cJohn McCall // Placeholder type for pseudo-objects. 5783c3b7f90a863af43fa63043d396553ecf205351cJohn McCall InitBuiltinType(PseudoObjectTy, BuiltinType::PseudoObject); 5793c3b7f90a863af43fa63043d396553ecf205351cJohn McCall 5801de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall // "any" type; useful for debugger-like clients. 5811de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall InitBuiltinType(UnknownAnyTy, BuiltinType::UnknownAny); 5821de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall 5830ddaeb9b031070ec64afe92d9892875ac44df427John McCall // Placeholder type for unbridged ARC casts. 5840ddaeb9b031070ec64afe92d9892875ac44df427John McCall InitBuiltinType(ARCUnbridgedCastTy, BuiltinType::ARCUnbridgedCast); 5850ddaeb9b031070ec64afe92d9892875ac44df427John McCall 5865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p11. 5875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer FloatComplexTy = getComplexType(FloatTy); 5885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DoubleComplexTy = getComplexType(DoubleTy); 5895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer LongDoubleComplexTy = getComplexType(LongDoubleTy); 5908e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 59113dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian // Builtin types for 'id', 'Class', and 'SEL'. 592de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId); 593de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass); 59413dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel); 595ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 596ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // Builtin type for __objc_yes and __objc_no 59793a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ? 59893a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian SignedCharTy : BoolTy); 599ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 600a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCConstantStringType = QualType(); 6011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // void * type 60333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian VoidPtrTy = getPointerType(VoidTy); 6046e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 6056e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // nullptr type (C++0x 2.14.7) 6066e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl InitBuiltinType(NullPtrTy, BuiltinType::NullPtr); 607aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov 608aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov // half type (OpenCL 6.1.1.1) / ARM NEON __fp16 609aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov InitBuiltinType(HalfTy, BuiltinType::Half); 610fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 611fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // Builtin type used to help define __builtin_va_list. 612fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge VaListTagTy = QualType(); 6135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 615d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikieDiagnosticsEngine &ASTContext::getDiagnostics() const { 61678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis return SourceMgr.getDiagnostics(); 61778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis} 61878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis 6196320064d0c60fa8683f5623881c9394fd4aa7689Douglas GregorAttrVec& ASTContext::getDeclAttrs(const Decl *D) { 6206320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor AttrVec *&Result = DeclAttrs[D]; 6216320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor if (!Result) { 6226320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor void *Mem = Allocate(sizeof(AttrVec)); 6236320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor Result = new (Mem) AttrVec; 6246320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor } 6256320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 6266320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor return *Result; 6276320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 6286320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 6296320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor/// \brief Erase the attributes corresponding to the given declaration. 6306320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregorvoid ASTContext::eraseDeclAttrs(const Decl *D) { 6316320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D); 6326320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor if (Pos != DeclAttrs.end()) { 6336320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor Pos->second->~AttrVec(); 6346320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor DeclAttrs.erase(Pos); 6356320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor } 6366320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 6376320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 638251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorMemberSpecializationInfo * 639663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas GregorASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) { 6407caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Var->isStaticDataMember() && "Not a static data member"); 641663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos 6427caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor = InstantiatedFromStaticDataMember.find(Var); 6437caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Pos == InstantiatedFromStaticDataMember.end()) 6447caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return 0; 6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6467caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return Pos->second; 6477caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 6487caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 650251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, 6519421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis TemplateSpecializationKind TSK, 6529421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis SourceLocation PointOfInstantiation) { 6537caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Inst->isStaticDataMember() && "Not a static data member"); 6547caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Tmpl->isStaticDataMember() && "Not a static data member"); 6557caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(!InstantiatedFromStaticDataMember[Inst] && 6567caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor "Already noted what static data member was instantiated from"); 657251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor InstantiatedFromStaticDataMember[Inst] 6589421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis = new (*this) MemberSpecializationInfo(Tmpl, TSK, PointOfInstantiation); 6597caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 6607caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 661af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetFunctionDecl *ASTContext::getClassScopeSpecializationPattern( 662af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet const FunctionDecl *FD){ 663af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(FD && "Specialization is 0"); 664af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet llvm::DenseMap<const FunctionDecl*, FunctionDecl *>::const_iterator Pos 6650d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet = ClassScopeSpecializationPattern.find(FD); 6660d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet if (Pos == ClassScopeSpecializationPattern.end()) 667af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return 0; 668af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 669af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return Pos->second; 670af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 671af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 672af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichetvoid ASTContext::setClassScopeSpecializationPattern(FunctionDecl *FD, 673af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet FunctionDecl *Pattern) { 674af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(FD && "Specialization is 0"); 675af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(Pattern && "Class scope specialization pattern is 0"); 6760d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet ClassScopeSpecializationPattern[FD] = Pattern; 677af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 678af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 6797ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallNamedDecl * 680ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) { 6817ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos 682ed97649e9574b9d854fa4d6109c9333ae0993554John McCall = InstantiatedFromUsingDecl.find(UUD); 683ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Pos == InstantiatedFromUsingDecl.end()) 6840d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return 0; 6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6860d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return Pos->second; 6870d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 6880d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 6890d8df780aef1acda5962347a32591efc629b6748Anders Carlssonvoid 690ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) { 691ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert((isa<UsingDecl>(Pattern) || 692ed97649e9574b9d854fa4d6109c9333ae0993554John McCall isa<UnresolvedUsingValueDecl>(Pattern) || 693ed97649e9574b9d854fa4d6109c9333ae0993554John McCall isa<UnresolvedUsingTypenameDecl>(Pattern)) && 694ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "pattern decl is not a using decl"); 695ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists"); 696ed97649e9574b9d854fa4d6109c9333ae0993554John McCall InstantiatedFromUsingDecl[Inst] = Pattern; 697ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 698ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 699ed97649e9574b9d854fa4d6109c9333ae0993554John McCallUsingShadowDecl * 700ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) { 701ed97649e9574b9d854fa4d6109c9333ae0993554John McCall llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos 702ed97649e9574b9d854fa4d6109c9333ae0993554John McCall = InstantiatedFromUsingShadowDecl.find(Inst); 703ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Pos == InstantiatedFromUsingShadowDecl.end()) 704ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return 0; 705ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 706ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Pos->second; 707ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 708ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 709ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid 710ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, 711ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingShadowDecl *Pattern) { 712ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists"); 713ed97649e9574b9d854fa4d6109c9333ae0993554John McCall InstantiatedFromUsingShadowDecl[Inst] = Pattern; 7140d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 7150d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 716d8b285fee4471f393da8ee30f552ceacdc362afaAnders CarlssonFieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) { 717d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos 718d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson = InstantiatedFromUnnamedFieldDecl.find(Field); 719d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (Pos == InstantiatedFromUnnamedFieldDecl.end()) 720d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return 0; 7211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 722d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return Pos->second; 723d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson} 724d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 725d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlssonvoid ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, 726d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson FieldDecl *Tmpl) { 727d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed"); 728d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Tmpl->getDeclName() && "Template field decl is not unnamed"); 729d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!InstantiatedFromUnnamedFieldDecl[Inst] && 730d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson "Already noted what unnamed field was instantiated from"); 7311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 732d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl; 733d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson} 734d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 73514d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanianbool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD, 73614d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian const FieldDecl *LastFD) const { 73714d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian return (FD->isBitField() && LastFD && !LastFD->isBitField() && 738a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) == 0); 73914d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian} 74014d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian 741340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanianbool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD, 742340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian const FieldDecl *LastFD) const { 743340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian return (FD->isBitField() && LastFD && LastFD->isBitField() && 744a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) == 0 && 745a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this) != 0); 746340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian} 747340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian 7489b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanianbool ASTContext::BitfieldFollowsBitfield(const FieldDecl *FD, 7499b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian const FieldDecl *LastFD) const { 7509b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian return (FD->isBitField() && LastFD && LastFD->isBitField() && 751a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) && 752a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this)); 7539b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian} 7549b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian 755dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::NonBitfieldFollowsBitfield(const FieldDecl *FD, 75652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian const FieldDecl *LastFD) const { 75752bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian return (!FD->isBitField() && LastFD && LastFD->isBitField() && 758a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this)); 75952bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian} 76052bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian 761dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::BitfieldFollowsNonBitfield(const FieldDecl *FD, 76252bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian const FieldDecl *LastFD) const { 76352bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian return (FD->isBitField() && LastFD && !LastFD->isBitField() && 764a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this)); 76552bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian} 76652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian 7677d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator 7687d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const { 7697d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 7707d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor = OverriddenMethods.find(Method); 7717d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor if (Pos == OverriddenMethods.end()) 7727d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return 0; 7737d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 7747d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return Pos->second.begin(); 7757d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 7767d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 7777d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator 7787d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_end(const CXXMethodDecl *Method) const { 7797d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 7807d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor = OverriddenMethods.find(Method); 7817d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor if (Pos == OverriddenMethods.end()) 7827d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return 0; 7837d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 7847d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return Pos->second.end(); 7857d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 7867d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 787c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned 788c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios KyrtzidisASTContext::overridden_methods_size(const CXXMethodDecl *Method) const { 789c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 790c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis = OverriddenMethods.find(Method); 791c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Pos == OverriddenMethods.end()) 792c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return 0; 793c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 794c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return Pos->second.size(); 795c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis} 796c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 7977d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregorvoid ASTContext::addOverriddenMethod(const CXXMethodDecl *Method, 7987d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor const CXXMethodDecl *Overridden) { 7997d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor OverriddenMethods[Method].push_back(Overridden); 8007d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 8017d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 802e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregorvoid ASTContext::addedLocalImportDecl(ImportDecl *Import) { 803e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor assert(!Import->NextLocalImport && "Import declaration already in the chain"); 804e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor assert(!Import->isFromASTFile() && "Non-local import declaration"); 805e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor if (!FirstLocalImport) { 806e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor FirstLocalImport = Import; 807e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport = Import; 808e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor return; 809e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor } 810e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor 811e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport->NextLocalImport = Import; 812e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport = Import; 813e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor} 814e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor 815464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===// 816464175bba1318bef7905122e9fda20cff926df78Chris Lattner// Type Sizing and Analysis 817464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===// 818a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 819b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified 820b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// scalar floating point type. 821b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattnerconst llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const { 822183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const BuiltinType *BT = T->getAs<BuiltinType>(); 823b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner assert(BT && "Not a floating point type!"); 824b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner switch (BT->getKind()) { 825b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Not a floating point type!"); 826aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: return Target->getHalfFormat(); 827bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::Float: return Target->getFloatFormat(); 828bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::Double: return Target->getDoubleFormat(); 829bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::LongDouble: return Target->getLongDoubleFormat(); 830b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner } 831b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner} 832b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner 8338b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck/// getDeclAlign - Return a conservative estimate of the alignment of the 834af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// specified decl. Note that bitfields do not have a valid alignment, so 835af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// this method will assert on them. 8365d484e8cf710207010720589d89602233de61d01Sebastian Redl/// If @p RefAsPointee, references are treated like their underlying type 8375d484e8cf710207010720589d89602233de61d01Sebastian Redl/// (for alignof), else they're treated like pointers (for CodeGen). 8384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const { 839bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned Align = Target->getCharWidth(); 840dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 8414081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall bool UseAlignAttrOnly = false; 8424081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (unsigned AlignFromAttr = D->getMaxAlignment()) { 8434081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall Align = AlignFromAttr; 8444081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall 8454081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // __attribute__((aligned)) can increase or decrease alignment 8464081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // *except* on a struct or struct member, where it only increases 8474081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // alignment unless 'packed' is also specified. 8484081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // 84982d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne // It is an error for alignas to decrease alignment, so we can 8504081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // ignore that possibility; Sema should diagnose it. 8514081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (isa<FieldDecl>(D)) { 8524081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall UseAlignAttrOnly = D->hasAttr<PackedAttr>() || 8534081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 8544081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } else { 8554081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall UseAlignAttrOnly = true; 8564081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } 8574081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } 85878a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian else if (isa<FieldDecl>(D)) 85978a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian UseAlignAttrOnly = 86078a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian D->hasAttr<PackedAttr>() || 86178a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 862dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 863ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // If we're using the align attribute only, just ignore everything 864ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // else about the declaration and its type. 8654081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (UseAlignAttrOnly) { 866ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // do nothing 867ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 8684081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } else if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 869af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner QualType T = VD->getType(); 8706217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const ReferenceType* RT = T->getAs<ReferenceType>()) { 8715d484e8cf710207010720589d89602233de61d01Sebastian Redl if (RefAsPointee) 8725d484e8cf710207010720589d89602233de61d01Sebastian Redl T = RT->getPointeeType(); 8735d484e8cf710207010720589d89602233de61d01Sebastian Redl else 8745d484e8cf710207010720589d89602233de61d01Sebastian Redl T = getPointerType(RT->getPointeeType()); 8755d484e8cf710207010720589d89602233de61d01Sebastian Redl } 8765d484e8cf710207010720589d89602233de61d01Sebastian Redl if (!T->isIncompleteType() && !T->isFunctionType()) { 8773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Adjust alignments of declarations with array type by the 8783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // large-array alignment on the target. 879bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned MinWidth = Target->getLargeArrayMinWidth(); 8803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall const ArrayType *arrayType; 8813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (MinWidth && (arrayType = getAsArrayType(T))) { 8823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (isa<VariableArrayType>(arrayType)) 883bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = std::max(Align, Target->getLargeArrayAlign()); 8843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall else if (isa<ConstantArrayType>(arrayType) && 8853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType))) 886bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = std::max(Align, Target->getLargeArrayAlign()); 8873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 8883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Walk through any array types while we're at it. 8893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall T = getBaseElementType(arrayType); 8906deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola } 8919f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr())); 892dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman } 893ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 894ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Fields can be subject to extra alignment constraints, like if 895ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // the field is packed, the struct is packed, or the struct has a 896ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // a max-field-alignment constraint (#pragma pack). So calculate 897ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // the actual alignment of the field within the struct, and then 898ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // (as we're expected to) constrain that by the alignment of the type. 899ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (const FieldDecl *field = dyn_cast<FieldDecl>(VD)) { 900ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // So calculate the alignment of the field. 901ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall const ASTRecordLayout &layout = getASTRecordLayout(field->getParent()); 902ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 903ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Start with the record's overall alignment. 904dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck unsigned fieldAlign = toBits(layout.getAlignment()); 905ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 906ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Use the GCD of that and the offset within the record. 907ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall uint64_t offset = layout.getFieldOffset(field->getFieldIndex()); 908ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (offset > 0) { 909ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Alignment is always a power of 2, so the GCD will be a power of 2, 910ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // which means we get to do this crazy thing instead of Euclid's. 911ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall uint64_t lowBitOfOffset = offset & (~offset + 1); 912ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (lowBitOfOffset < fieldAlign) 913ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall fieldAlign = static_cast<unsigned>(lowBitOfOffset); 914ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall } 915ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 916ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall Align = std::min(Align, fieldAlign); 91705f62474dd2b0f1cb69adbe0787f2868788aa949Charles Davis } 918af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner } 919dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 920eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(Align); 921af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner} 922b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner 923ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits> 924bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(const Type *T) const { 925ea1471e0e967548c596a71469702f8846dbaf3c0John McCall std::pair<uint64_t, unsigned> Info = getTypeInfo(T); 926eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return std::make_pair(toCharUnitsFromBits(Info.first), 927eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck toCharUnitsFromBits(Info.second)); 928ea1471e0e967548c596a71469702f8846dbaf3c0John McCall} 929ea1471e0e967548c596a71469702f8846dbaf3c0John McCall 930ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits> 931bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(QualType T) const { 932ea1471e0e967548c596a71469702f8846dbaf3c0John McCall return getTypeInfoInChars(T.getTypePtr()); 933ea1471e0e967548c596a71469702f8846dbaf3c0John McCall} 934ea1471e0e967548c596a71469702f8846dbaf3c0John McCall 935bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbarstd::pair<uint64_t, unsigned> ASTContext::getTypeInfo(const Type *T) const { 936bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar TypeInfoMap::iterator it = MemoizedTypeInfo.find(T); 937bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar if (it != MemoizedTypeInfo.end()) 938bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar return it->second; 939bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar 940bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar std::pair<uint64_t, unsigned> Info = getTypeInfoImpl(T); 941bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar MemoizedTypeInfo.insert(std::make_pair(T, Info)); 942bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar return Info; 943bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar} 944bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar 945bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// getTypeInfoImpl - Return the size of the specified type, in bits. This 946bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// method does not work on incomplete types. 9470953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// 9480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// FIXME: Pointers into different addr spaces could have different sizes and 9490953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// alignment requirements: getPointerInfo should take an AddrSpace, this 9500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// should take a QualType, &c. 951d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattnerstd::pair<uint64_t, unsigned> 952bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel DunbarASTContext::getTypeInfoImpl(const Type *T) const { 9535e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump uint64_t Width=0; 9545e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump unsigned Align=8; 955a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner switch (T->getTypeClass()) { 95672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base) 95772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base) 95818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor#define NON_CANONICAL_TYPE(Class, Base) 95972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class: 96072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def" 961d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall llvm_unreachable("Should not see dependent types"); 96272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 9635d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::FunctionNoProto: 9645d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::FunctionProto: 96518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // GCC extension: alignof(function) = 32 bits 96618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 96718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = 32; 96818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 96918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 97072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::IncompleteArray: 971fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::VariableArray: 97218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 97318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = getTypeAlign(cast<ArrayType>(T)->getElementType()); 97418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 97518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 976fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::ConstantArray: { 9771d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const ConstantArrayType *CAT = cast<ConstantArrayType>(T); 9781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 97998be4943e8dc4f3905629a7102668960873cf863Chris Lattner std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType()); 980fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara uint64_t Size = CAT->getSize().getZExtValue(); 981bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar assert((Size == 0 || EltInfo.first <= (uint64_t)(-1)/Size) && 982bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar "Overflow in array type bit size evaluation"); 983fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara Width = EltInfo.first*Size; 984030d8846c7e520330007087e949f621989876e3aChris Lattner Align = EltInfo.second; 985cd88b4171753dcb2bc0a21d78f1597c796bb8a20Argyrios Kyrtzidis Width = llvm::RoundUpToAlignment(Width, Align); 986030d8846c7e520330007087e949f621989876e3aChris Lattner break; 9875c09a02a5db85e08a432b6eeced9aa656349710dChristopher Lamb } 988213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman case Type::ExtVector: 989030d8846c7e520330007087e949f621989876e3aChris Lattner case Type::Vector: { 9909fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner const VectorType *VT = cast<VectorType>(T); 9919fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType()); 9929fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Width = EltInfo.first*VT->getNumElements(); 9934bd998bbc228915d2b9cae5b67879de48940d05eEli Friedman Align = Width; 9946fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman // If the alignment is not a power of 2, round up to the next power of 2. 9956fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman // This happens for non-power-of-2 length vectors. 9968eefcd353c1d06a10104f69e5079ebab3183f9a3Dan Gohman if (Align & (Align-1)) { 9979fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Align = llvm::NextPowerOf2(Align); 9989fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Width = llvm::RoundUpToAlignment(Width, Align); 9999fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner } 1000030d8846c7e520330007087e949f621989876e3aChris Lattner break; 1001030d8846c7e520330007087e949f621989876e3aChris Lattner } 10025d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner 10039e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner case Type::Builtin: 1004a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner switch (cast<BuiltinType>(T)->getKind()) { 1005b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown builtin type!"); 1006d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner case BuiltinType::Void: 100718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // GCC extension: alignof(void) = 8 bits. 100818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 100918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = 8; 101018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 101118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 10126f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Bool: 1013bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getBoolWidth(); 1014bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getBoolAlign(); 10156f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1016692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::Char_S: 1017692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::Char_U: 1018692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UChar: 10196f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::SChar: 1020bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getCharWidth(); 1021bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getCharAlign(); 10226f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 10233f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 10243f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 1025bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getWCharWidth(); 1026bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getWCharAlign(); 102764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis break; 1028f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case BuiltinType::Char16: 1029bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getChar16Width(); 1030bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getChar16Align(); 1031f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith break; 1032f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case BuiltinType::Char32: 1033bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getChar32Width(); 1034bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getChar32Align(); 1035f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith break; 1036692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UShort: 10376f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Short: 1038bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getShortWidth(); 1039bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getShortAlign(); 10406f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1041692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UInt: 10426f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Int: 1043bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getIntWidth(); 1044bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getIntAlign(); 10456f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1046692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::ULong: 10476f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Long: 1048bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongWidth(); 1049bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongAlign(); 10506f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1051692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::ULongLong: 10526f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::LongLong: 1053bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongLongWidth(); 1054bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongLongAlign(); 10556f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1056ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner case BuiltinType::Int128: 1057ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner case BuiltinType::UInt128: 1058ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner Width = 128; 1059ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner Align = 128; // int128_t is 128-bit aligned on all targets. 1060ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner break; 1061aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: 1062aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov Width = Target->getHalfWidth(); 1063aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov Align = Target->getHalfAlign(); 1064aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov break; 10656f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Float: 1066bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getFloatWidth(); 1067bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getFloatAlign(); 10686f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 10696f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Double: 1070bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getDoubleWidth(); 1071bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getDoubleAlign(); 10726f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 10736f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::LongDouble: 1074bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongDoubleWidth(); 1075bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongDoubleAlign(); 10766f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 10776e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl case BuiltinType::NullPtr: 1078bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t) 1079bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); // == sizeof(void*) 10801590d9c0fec4c710c2962e4bb71f76979b5163d3Sebastian Redl break; 1081e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCId: 1082e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCClass: 1083e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCSel: 1084bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); 1085bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); 1086e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian break; 1087a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner } 1088bfef6d7c67831a135d6ab79931f010f750a730adChris Lattner break; 1089d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff case Type::ObjCObjectPointer: 1090bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); 1091bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); 10926f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1093485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff case Type::BlockPointer: { 1094207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace( 1095207f4d8543529221932af82836016a2ef066c917Peter Collingbourne cast<BlockPointerType>(T)->getPointeeType()); 1096bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1097bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 1098485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff break; 1099485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff } 11005d484e8cf710207010720589d89602233de61d01Sebastian Redl case Type::LValueReference: 11015d484e8cf710207010720589d89602233de61d01Sebastian Redl case Type::RValueReference: { 11025d484e8cf710207010720589d89602233de61d01Sebastian Redl // alignof and sizeof should never enter this code path here, so we go 11035d484e8cf710207010720589d89602233de61d01Sebastian Redl // the pointer route. 1104207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace( 1105207f4d8543529221932af82836016a2ef066c917Peter Collingbourne cast<ReferenceType>(T)->getPointeeType()); 1106bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1107bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 11085d484e8cf710207010720589d89602233de61d01Sebastian Redl break; 11095d484e8cf710207010720589d89602233de61d01Sebastian Redl } 1110f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner case Type::Pointer: { 1111207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType()); 1112bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1113bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 1114f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner break; 1115f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner } 1116f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl case Type::MemberPointer: { 1117071cc7deffad608165b1ddd5263e8bf181861520Charles Davis const MemberPointerType *MPT = cast<MemberPointerType>(T); 11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<uint64_t, unsigned> PtrDiffInfo = 11191cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson getTypeInfo(getPointerDiffType()); 1120071cc7deffad608165b1ddd5263e8bf181861520Charles Davis Width = PtrDiffInfo.first * ABI->getMemberPointerSize(MPT); 11211cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson Align = PtrDiffInfo.second; 11221cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson break; 1123f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl } 11245d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::Complex: { 11255d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner // Complex types have the same alignment as their elements, but twice the 11265d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner // size. 11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<uint64_t, unsigned> EltInfo = 112898be4943e8dc4f3905629a7102668960873cf863Chris Lattner getTypeInfo(cast<ComplexType>(T)->getElementType()); 11299e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner Width = EltInfo.first*2; 11305d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner Align = EltInfo.second; 11315d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner break; 11325d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner } 1133c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: 1134c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr()); 113544a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel case Type::ObjCInterface: { 11361d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T); 113744a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl()); 1138dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck Width = toBits(Layout.getSize()); 1139dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck Align = toBits(Layout.getAlignment()); 114044a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel break; 114144a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel } 114272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Record: 114372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Enum: { 11441d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const TagType *TT = cast<TagType>(T); 11451d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar 11461d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar if (TT->getDecl()->isInvalidDecl()) { 114722ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor Width = 8; 114822ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor Align = 8; 11498389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner break; 11508389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner } 11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11521d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar if (const EnumType *ET = dyn_cast<EnumType>(TT)) 11537176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner return getTypeInfo(ET->getDecl()->getIntegerType()); 11547176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner 11551d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const RecordType *RT = cast<RecordType>(TT); 11567176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl()); 1157dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck Width = toBits(Layout.getSize()); 1158dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck Align = toBits(Layout.getAlignment()); 1159dc0d73e6495404418acf8548875aeaff07791a74Chris Lattner break; 1160a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner } 11617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 11629fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner case Type::SubstTemplateTypeParm: 116349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return getTypeInfo(cast<SubstTemplateTypeParmType>(T)-> 116449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall getReplacementType().getTypePtr()); 116549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 116634b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: { 116734b41d939a1328f484511c6002ba2456db879a29Richard Smith const AutoType *A = cast<AutoType>(T); 116834b41d939a1328f484511c6002ba2456db879a29Richard Smith assert(A->isDeduced() && "Cannot request the size of a dependent type"); 1169dc856aff4428380baa9afb5577ea04f8fb6beb13Matt Beaumont-Gay return getTypeInfo(A->getDeducedType().getTypePtr()); 117034b41d939a1328f484511c6002ba2456db879a29Richard Smith } 117134b41d939a1328f484511c6002ba2456db879a29Richard Smith 1172075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara case Type::Paren: 1173075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr()); 1174075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 117518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::Typedef: { 1176162e1c1b487352434552147967c3dd296ebee2f7Richard Smith const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl(); 1177df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor std::pair<uint64_t, unsigned> Info 1178df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor = getTypeInfo(Typedef->getUnderlyingType().getTypePtr()); 1179c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // If the typedef has an aligned attribute on it, it overrides any computed 1180c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // alignment we have. This violates the GCC documentation (which says that 1181c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // attribute(aligned) can only round up) but matches its implementation. 1182c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner if (unsigned AttrAlign = Typedef->getMaxAlignment()) 1183c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner Align = AttrAlign; 1184c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner else 1185c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner Align = Info.second; 1186df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor Width = Info.first; 11877532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor break; 11887176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner } 118918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 119018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::TypeOfExpr: 119118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType() 119218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor .getTypePtr()); 119318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 119418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::TypeOf: 119518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr()); 119618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 1197395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson case Type::Decltype: 1198395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType() 1199395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson .getTypePtr()); 1200395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 1201ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 1202ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType()); 1203ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 1204465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara case Type::Elaborated: 1205465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr()); 12061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12079d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall case Type::Attributed: 12089d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return getTypeInfo( 12099d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T)->getEquivalentType().getTypePtr()); 12109d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 12113e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith case Type::TemplateSpecialization: { 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(getCanonicalType(T) != T && 121318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor "Cannot request the size of a dependent type"); 12143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T); 12153e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // A type alias template specialization may refer to a typedef with the 12163e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // aligned attribute on it. 12173e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (TST->isTypeAlias()) 12183e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return getTypeInfo(TST->getAliasedType().getTypePtr()); 12193e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else 12203e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return getTypeInfo(getCanonicalType(T)); 12213e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 12223e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 1223b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 12242be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman std::pair<uint64_t, unsigned> Info 12252be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman = getTypeInfo(cast<AtomicType>(T)->getValueType()); 12262be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Width = Info.first; 12272be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Align = Info.second; 12282be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman if (Width != 0 && Width <= Target->getMaxAtomicPromoteWidth() && 12292be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman llvm::isPowerOf2_64(Width)) { 12302be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // We can potentially perform lock-free atomic operations for this 12312be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // type; promote the alignment appropriately. 12322be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // FIXME: We could potentially promote the width here as well... 12332be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // is that worthwhile? (Non-struct atomic types generally have 12342be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // power-of-two size anyway, but structs might not. Requires a bit 12352be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // of implementation work to make sure we zero out the extra bits.) 12362be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Align = static_cast<unsigned>(Width); 12372be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman } 1238b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 1239b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 124018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor } 12411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12422be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2"); 12439e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner return std::make_pair(Width, Align); 1244a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner} 1245a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 1246eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck/// toCharUnitsFromBits - Convert a size in bits to a size in characters. 1247eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen DyckCharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const { 1248eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return CharUnits::fromQuantity(BitSize / getCharWidth()); 1249eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck} 1250eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck 1251dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck/// toBits - Convert a size in characters to a size in characters. 1252dd76a9ab9ea675671200f94b18ce95766841952bKen Dyckint64_t ASTContext::toBits(CharUnits CharSize) const { 1253dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck return CharSize.getQuantity() * getCharWidth(); 1254dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck} 1255dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck 1256bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// getTypeSizeInChars - Return the size of the specified type, in characters. 1257bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// This method does not work on incomplete types. 12584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(QualType T) const { 1259eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeSize(T)); 1260bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck} 12614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(const Type *T) const { 1262eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeSize(T)); 1263bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck} 1264bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck 126516e20cce43385001f33f8e3f90ee345609c805d1Ken Dyck/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in 126686fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck/// characters. This method does not work on incomplete types. 12674ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(QualType T) const { 1268eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeAlign(T)); 126986fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck} 12704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(const Type *T) const { 1271eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeAlign(T)); 127286fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck} 127386fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck 127434ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// getPreferredTypeAlign - Return the "preferred" alignment of the specified 127534ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// type for the current target in bits. This can be different than the ABI 127634ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// alignment in cases where it is beneficial for performance to overalign 127734ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// a data type. 12784ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getPreferredTypeAlign(const Type *T) const { 127934ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner unsigned ABIAlign = getTypeAlign(T); 12801eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman 12811eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman // Double and long long should be naturally aligned if possible. 1282183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType* CT = T->getAs<ComplexType>()) 12831eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman T = CT->getElementType().getTypePtr(); 12841eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman if (T->isSpecificBuiltinType(BuiltinType::Double) || 1285cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier T->isSpecificBuiltinType(BuiltinType::LongLong) || 1286cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier T->isSpecificBuiltinType(BuiltinType::ULongLong)) 12871eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman return std::max(ABIAlign, (unsigned)getTypeSize(T)); 12881eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman 128934ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner return ABIAlign; 129034ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner} 129134ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner 12922c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// DeepCollectObjCIvars - 12932c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// This routine first collects all declared, but not synthesized, ivars in 12942c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// super class and then collects all ivars, including those synthesized for 12952c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// current class. This routine is used for implementation of current class 12962c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// when all ivars, declared and synthesized are known. 12979820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian/// 12982c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanianvoid ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, 12992c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian bool leafClass, 1300db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const { 13012c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass()) 13022c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian DeepCollectObjCIvars(SuperClass, false, Ivars); 13032c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (!leafClass) { 13042c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(), 13052c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian E = OI->ivar_end(); I != E; ++I) 1306581deb3da481053c4993c7600f97acf7768caac5David Blaikie Ivars.push_back(*I); 13073060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 1308bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI); 1309db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv; 1310bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian Iv= Iv->getNextIvar()) 1311bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian Ivars.push_back(Iv); 1312bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian } 13139820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian} 13149820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian 1315e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// CollectInheritedProtocols - Collect all protocols in current class and 1316e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// those inherited by it. 1317e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid ASTContext::CollectInheritedProtocols(const Decl *CDecl, 1318432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) { 1319e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) { 132053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // We can use protocol_iterator here instead of 132153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // all_referenced_protocol_iterator since we are walking all categories. 132253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator P = OI->all_referenced_protocol_begin(), 132353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PE = OI->all_referenced_protocol_end(); P != PE; ++P) { 1324e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 13253fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1326e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1327b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) { 13283fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert((*P)->getCanonicalDecl()); 1329e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1330e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1331b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian } 1332e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 1333e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian // Categories of this Interface. 1334e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (const ObjCCategoryDecl *CDeclChain = OI->getCategoryList(); 1335e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CDeclChain; CDeclChain = CDeclChain->getNextClassCategory()) 1336e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(CDeclChain, Protocols); 1337e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (ObjCInterfaceDecl *SD = OI->getSuperClass()) 1338e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian while (SD) { 1339e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(SD, Protocols); 1340e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian SD = SD->getSuperClass(); 1341e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1342b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) { 134353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = OC->protocol_begin(), 1344e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = OC->protocol_end(); P != PE; ++P) { 1345e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 13463fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1347e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1348e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) 1349e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1350e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1351b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) { 1352e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(), 1353e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = OP->protocol_end(); P != PE; ++P) { 1354e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 13553fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1356e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1357e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) 1358e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1359e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1360e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1361e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian} 1362e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 13634ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const { 13643bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian unsigned count = 0; 13653bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // Count ivars declared in class extension. 136680aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian for (const ObjCCategoryDecl *CDecl = OI->getFirstClassExtension(); CDecl; 136780aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian CDecl = CDecl->getNextClassExtension()) 1368b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer count += CDecl->ivar_size(); 1369b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer 13703bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // Count ivar defined in this class's implementation. This 13713bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // includes synthesized ivars. 13723bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) 1373b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer count += ImplDecl->ivar_size(); 1374b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer 13758e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian return count; 13768e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian} 13778e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian 13788deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidisbool ASTContext::isSentinelNullExpr(const Expr *E) { 13798deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (!E) 13808deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return false; 13818deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 13828deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis // nullptr_t is always treated as null. 13838deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (E->getType()->isNullPtrType()) return true; 13848deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 13858deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (E->getType()->isAnyPointerType() && 13868deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis E->IgnoreParenCasts()->isNullPointerConstant(*this, 13878deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis Expr::NPC_ValueDependentIsNull)) 13888deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return true; 13898deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 13908deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis // Unfortunately, __null has type 'int'. 13918deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (isa<GNUNullExpr>(E)) return true; 13928deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 13938deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return false; 13948deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis} 13958deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 13968a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists. 13978a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) { 13988a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 13998a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis I = ObjCImpls.find(D); 14008a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis if (I != ObjCImpls.end()) 14018a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return cast<ObjCImplementationDecl>(I->second); 14028a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return 0; 14038a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14048a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists. 14058a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) { 14068a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 14078a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis I = ObjCImpls.find(D); 14088a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis if (I != ObjCImpls.end()) 14098a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return cast<ObjCCategoryImplDecl>(I->second); 14108a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return 0; 14118a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14128a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis 14138a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCInterfaceDecl. 14148a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD, 14158a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImplementationDecl *ImplD) { 14168a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis assert(IFaceD && ImplD && "Passed null params"); 14178a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImpls[IFaceD] = ImplD; 14188a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14198a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCCategoryDecl. 14208a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD, 14218a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCCategoryImplDecl *ImplD) { 14228a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis assert(CatD && ImplD && "Passed null params"); 14238a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImpls[CatD] = ImplD; 14248a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14258a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis 142687ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios KyrtzidisObjCInterfaceDecl *ASTContext::getObjContainingInterface(NamedDecl *ND) const { 142787ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext())) 142887ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return ID; 142987ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ND->getDeclContext())) 143087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return CD->getClassInterface(); 143187ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(ND->getDeclContext())) 143287ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return IMD->getClassInterface(); 143387ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis 143487ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return 0; 143587ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis} 143687ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis 14371ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Get the copy initialization expression of VarDecl,or NULL if 14381ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// none exists. 1439830937bc1100fba7682f7c32c40512085870f50cFariborz JahanianExpr *ASTContext::getBlockVarCopyInits(const VarDecl*VD) { 1440d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD && "Passed null params"); 1441d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD->hasAttr<BlocksAttr>() && 1442d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian "getBlockVarCopyInits - not __block var"); 1443830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian llvm::DenseMap<const VarDecl*, Expr*>::iterator 1444d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian I = BlockVarCopyInits.find(VD); 14451ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian return (I != BlockVarCopyInits.end()) ? cast<Expr>(I->second) : 0; 14461ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian} 14471ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian 14481ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Set the copy inialization expression of a block var decl. 14491ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanianvoid ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) { 14501ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian assert(VD && Init && "Passed null params"); 1451d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD->hasAttr<BlocksAttr>() && 1452d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian "setBlockVarCopyInits - not __block var"); 14531ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian BlockVarCopyInits[VD] = Init; 14541ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian} 14551ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian 1456a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T, 14574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned DataSize) const { 1458109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall if (!DataSize) 1459109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall DataSize = TypeLoc::getFullDataSizeForType(T); 1460109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall else 1461109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall assert(DataSize == TypeLoc::getFullDataSizeForType(T) && 1462a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall "incorrect data size provided to CreateTypeSourceInfo!"); 1463109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall 1464a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *TInfo = 1465a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8); 1466a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall new (TInfo) TypeSourceInfo(T); 1467a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TInfo; 1468b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 1469b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 1470a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T, 14716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SourceLocation L) const { 1472a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = CreateTypeSourceInfo(T); 1473c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L); 1474a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall return DI; 1475a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall} 1476a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall 1477b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout & 14784ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const { 1479b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar return getObjCLayout(D, 0); 1480b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar} 1481b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar 1482b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout & 14834ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCImplementationLayout( 14844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const ObjCImplementationDecl *D) const { 1485b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar return getObjCLayout(D->getClassInterface(), D); 1486b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar} 1487b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar 1488a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===// 1489a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner// Type creation/memoization methods 1490a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===// 1491a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 14924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 14933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const { 14943b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned fastQuals = quals.getFastQualifiers(); 14953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall quals.removeFastQualifiers(); 14960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 14970953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Check if we've already instantiated this type. 14980953e767ff7817f97b3ab20896b229891eeff45bJohn McCall llvm::FoldingSetNodeID ID; 14993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQuals::Profile(ID, baseType, quals); 15003b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 15013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) { 15023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(eq->getQualifiers() == quals); 15033b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(eq, fastQuals); 15040953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 15050953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 15063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If the base type is not canonical, make the appropriate canonical type. 15073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon; 15083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!baseType->isCanonicalUnqualified()) { 15093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split(); 1510200fa53fd420aa8369586f569dbece04930ad6a3John McCall canonSplit.Quals.addConsistentQualifiers(quals); 1511200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getExtQualType(canonSplit.Ty, canonSplit.Quals); 15123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 15133b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Re-find the insert position. 15143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos); 15153b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 15163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 15173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQuals *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals); 15183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQualNodes.InsertNode(eq, insertPos); 15193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(eq, fastQuals); 15200953e767ff7817f97b3ab20896b229891eeff45bJohn McCall} 15210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 15224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 15234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const { 1524f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner QualType CanT = getCanonicalType(T); 1525f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner if (CanT.getAddressSpace() == AddressSpace) 1526f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner return T; 1527b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner 15280953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If we are composing extended qualifiers together, merge together 15290953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // into one ExtQuals node. 15300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Quals; 15310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *TypeNode = Quals.strip(T); 15321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15330953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If this type already has an address space specified, it cannot get 15340953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // another one. 15350953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Quals.hasAddressSpace() && 15360953e767ff7817f97b3ab20896b229891eeff45bJohn McCall "Type cannot be in multiple addr spaces!"); 15370953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Quals.addAddressSpace(AddressSpace); 15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15390953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getExtQualType(TypeNode, Quals); 1540ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb} 1541ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb 1542b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris LattnerQualType ASTContext::getObjCGCQualType(QualType T, 15434ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Qualifiers::GC GCAttr) const { 1544d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian QualType CanT = getCanonicalType(T); 1545b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner if (CanT.getObjCGCAttr() == GCAttr) 1546d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian return T; 15471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15487f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall if (const PointerType *ptr = T->getAs<PointerType>()) { 15497f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall QualType Pointee = ptr->getPointeeType(); 155058f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff if (Pointee->isAnyPointerType()) { 15514027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian QualType ResultType = getObjCGCQualType(Pointee, GCAttr); 15524027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian return getPointerType(ResultType); 15534027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian } 15544027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian } 15551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If we are composing extended qualifiers together, merge together 15570953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // into one ExtQuals node. 15580953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Quals; 15590953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *TypeNode = Quals.strip(T); 15601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15610953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If this type already has an ObjCGC specified, it cannot get 15620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // another one. 15630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Quals.hasObjCGCAttr() && 15640953e767ff7817f97b3ab20896b229891eeff45bJohn McCall "Type cannot have multiple ObjCGCs!"); 15650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Quals.addObjCGCAttr(GCAttr); 15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getExtQualType(TypeNode, Quals); 1568d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian} 1569a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 1570e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCallconst FunctionType *ASTContext::adjustFunctionType(const FunctionType *T, 1571e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FunctionType::ExtInfo Info) { 1572e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall if (T->getExtInfo() == Info) 1573e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall return T; 1574e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 1575e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall QualType Result; 1576e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(T)) { 1577e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall Result = getFunctionNoProtoType(FNPT->getResultType(), Info); 1578e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall } else { 1579e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall const FunctionProtoType *FPT = cast<FunctionProtoType>(T); 1580e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 1581e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall EPI.ExtInfo = Info; 1582e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall Result = getFunctionType(FPT->getResultType(), FPT->arg_type_begin(), 1583e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FPT->getNumArgs(), EPI); 1584e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall } 1585e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 1586e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall return cast<FunctionType>(Result.getTypePtr()); 1587e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall} 1588e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 15895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getComplexType - Return the uniqued reference to the type for a complex 15905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// number with the specified element type. 15914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getComplexType(QualType T) const { 15925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 15935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 15945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 15955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexType::Profile(ID, T); 15961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 15985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos)) 15995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(CT, 0); 16001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the pointee type isn't canonical, this won't be a canonical type either, 16025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 16035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 1604467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 1605f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getComplexType(getCanonicalType(T)); 16061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 16085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos); 1609c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 16105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16116b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical); 16125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 16135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexTypes.InsertNode(New, InsertPos); 16145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 16155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getPointerType - Return the uniqued reference to the type for a pointer to 16185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the specified type. 16194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPointerType(QualType T) const { 16205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 16215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 16225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 16235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerType::Profile(ID, T); 16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 16265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 16275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(PT, 0); 16281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the pointee type isn't canonical, this won't be a canonical type either, 16305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 16315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 1632467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 1633f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getPointerType(getCanonicalType(T)); 16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 16365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1637c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 16385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16396b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical); 16405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 16415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerTypes.InsertNode(New, InsertPos); 16425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 16435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getBlockPointerType - Return the uniqued reference to the type for 16465618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff/// a pointer to the specified block. 16474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockPointerType(QualType T) const { 1648296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff assert(T->isFunctionType() && "block of function types only"); 1649296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff // Unique pointers, to guarantee there is only one block of a particular 16505618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // structure. 16515618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff llvm::FoldingSetNodeID ID; 16525618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerType::Profile(ID, T); 16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16545618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff void *InsertPos = 0; 16555618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff if (BlockPointerType *PT = 16565618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 16575618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return QualType(PT, 0); 16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the block pointee type isn't canonical, this won't be a canonical 16605618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // type either so fill in the canonical type field. 16615618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff QualType Canonical; 1662467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 16635618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Canonical = getBlockPointerType(getCanonicalType(T)); 16641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16655618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // Get the new insert position for the node we care about. 16665618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerType *NewIP = 16675618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1668c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 16695618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff } 16706b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall BlockPointerType *New 16716b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) BlockPointerType(T, Canonical); 16725618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Types.push_back(New); 16735618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.InsertNode(New, InsertPos); 16745618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return QualType(New, 0); 16755618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff} 16765618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff 16777c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getLValueReferenceType - Return the uniqued reference to the type for an 16787c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// lvalue reference to the specified type. 16794ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 16804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const { 16819625e44c0252485277a340746ed8ac950686156fDouglas Gregor assert(getCanonicalType(T) != OverloadTy && 16829625e44c0252485277a340746ed8ac950686156fDouglas Gregor "Unresolved overloaded function type"); 16839625e44c0252485277a340746ed8ac950686156fDouglas Gregor 16845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 16855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 16865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 168754e14c4db764c0636160d26c5bbf491637c83a76John McCall ReferenceType::Profile(ID, T, SpelledAsLValue); 16885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 16907c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (LValueReferenceType *RT = 16917c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 16925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(RT, 0); 16937c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 169454e14c4db764c0636160d26c5bbf491637c83a76John McCall const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 169554e14c4db764c0636160d26c5bbf491637c83a76John McCall 16965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the referencee type isn't canonical, this won't be a canonical type 16975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // either, so fill in the canonical type field. 16985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 169954e14c4db764c0636160d26c5bbf491637c83a76John McCall if (!SpelledAsLValue || InnerRef || !T.isCanonical()) { 170054e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 170154e14c4db764c0636160d26c5bbf491637c83a76John McCall Canonical = getLValueReferenceType(getCanonicalType(PointeeType)); 17027c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17037c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // Get the new insert position for the node we care about. 17047c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceType *NewIP = 17057c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1706c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17077c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl } 17087c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17096b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall LValueReferenceType *New 171054e14c4db764c0636160d26c5bbf491637c83a76John McCall = new (*this, TypeAlignment) LValueReferenceType(T, Canonical, 171154e14c4db764c0636160d26c5bbf491637c83a76John McCall SpelledAsLValue); 17127c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl Types.push_back(New); 17137c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.InsertNode(New, InsertPos); 171454e14c4db764c0636160d26c5bbf491637c83a76John McCall 17157c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl return QualType(New, 0); 17167c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl} 17177c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17187c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getRValueReferenceType - Return the uniqued reference to the type for an 17197c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// rvalue reference to the specified type. 17204ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRValueReferenceType(QualType T) const { 17217c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // Unique pointers, to guarantee there is only one pointer of a particular 17227c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // structure. 17237c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl llvm::FoldingSetNodeID ID; 172454e14c4db764c0636160d26c5bbf491637c83a76John McCall ReferenceType::Profile(ID, T, false); 17257c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17267c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl void *InsertPos = 0; 17277c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (RValueReferenceType *RT = 17287c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 17297c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl return QualType(RT, 0); 17307c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 173154e14c4db764c0636160d26c5bbf491637c83a76John McCall const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 173254e14c4db764c0636160d26c5bbf491637c83a76John McCall 17337c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // If the referencee type isn't canonical, this won't be a canonical type 17347c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // either, so fill in the canonical type field. 17357c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl QualType Canonical; 173654e14c4db764c0636160d26c5bbf491637c83a76John McCall if (InnerRef || !T.isCanonical()) { 173754e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 173854e14c4db764c0636160d26c5bbf491637c83a76John McCall Canonical = getRValueReferenceType(getCanonicalType(PointeeType)); 17397c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 17417c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceType *NewIP = 17427c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1743c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 17455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17466b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall RValueReferenceType *New 17476b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) RValueReferenceType(T, Canonical); 17485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 17497c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.InsertNode(New, InsertPos); 17505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 17515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 17525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1753f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// getMemberPointerType - Return the uniqued reference to the type for a 1754f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// member pointer to the specified type, in the specified class. 17554ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const { 1756f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Unique pointers, to guarantee there is only one pointer of a particular 1757f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // structure. 1758f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl llvm::FoldingSetNodeID ID; 1759f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerType::Profile(ID, T, Cls); 1760f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1761f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl void *InsertPos = 0; 1762f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl if (MemberPointerType *PT = 1763f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 1764f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl return QualType(PT, 0); 1765f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1766f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // If the pointee or class type isn't canonical, this won't be a canonical 1767f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // type either, so fill in the canonical type field. 1768f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl QualType Canonical; 176987c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) { 1770f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls)); 1771f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1772f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Get the new insert position for the node we care about. 1773f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerType *NewIP = 1774f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1775c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1776f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl } 17776b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall MemberPointerType *New 17786b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical); 1779f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl Types.push_back(New); 1780f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.InsertNode(New, InsertPos); 1781f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl return QualType(New, 0); 1782f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl} 1783f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 17841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getConstantArrayType - Return the unique reference to the type for an 1785fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff/// array of the specified element type. 17861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getConstantArrayType(QualType EltTy, 178738aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner const llvm::APInt &ArySizeIn, 1788c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff ArrayType::ArraySizeModifier ASM, 178963e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara unsigned IndexTypeQuals) const { 1790923d56d436f750bc1f29db50e641078725558a1bSebastian Redl assert((EltTy->isDependentType() || 1791923d56d436f750bc1f29db50e641078725558a1bSebastian Redl EltTy->isIncompleteType() || EltTy->isConstantSizeType()) && 1792587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman "Constant array of VLAs is illegal!"); 1793587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman 179438aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner // Convert the array size into a canonical width matching the pointer size for 179538aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner // the target. 179638aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner llvm::APInt ArySize(ArySizeIn); 17979f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad ArySize = 1798bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor ArySize.zextOrTrunc(Target->getPointerWidth(getTargetAddressSpace(EltTy))); 17991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 180163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, IndexTypeQuals); 18021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 18041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ConstantArrayType *ATP = 18057192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos)) 18065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(ATP, 0); 18071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If the element type isn't canonical or has qualifiers, this won't 18093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // be a canonical type either, so fill in the canonical type field. 18103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType Canon; 18113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 18123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(EltTy).split(); 1813200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize, 181463e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ASM, IndexTypeQuals); 1815200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getQualifiedType(Canon, canonSplit.Quals); 18163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 18175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 18181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ConstantArrayType *NewIP = 18197192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos); 1820c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 18215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 18221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18236b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ConstantArrayType *New = new(*this,TypeAlignment) 182463e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ConstantArrayType(EltTy, Canon, ArySize, ASM, IndexTypeQuals); 18257192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.InsertNode(New, InsertPos); 18265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 18275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 18285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 18295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1830ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// getVariableArrayDecayedType - Turns the given type, which may be 1831ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// variably-modified, into the corresponding type with all the known 1832ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// sizes replaced with [*]. 1833ce8890371fcdb983ae487c87fa40606a34896ff7John McCallQualType ASTContext::getVariableArrayDecayedType(QualType type) const { 1834ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Vastly most common case. 1835ce8890371fcdb983ae487c87fa40606a34896ff7John McCall if (!type->isVariablyModifiedType()) return type; 1836ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1837ce8890371fcdb983ae487c87fa40606a34896ff7John McCall QualType result; 1838ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1839ce8890371fcdb983ae487c87fa40606a34896ff7John McCall SplitQualType split = type.getSplitDesugaredType(); 1840200fa53fd420aa8369586f569dbece04930ad6a3John McCall const Type *ty = split.Ty; 1841ce8890371fcdb983ae487c87fa40606a34896ff7John McCall switch (ty->getTypeClass()) { 1842ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define TYPE(Class, Base) 1843ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define ABSTRACT_TYPE(Class, Base) 1844ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 1845ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#include "clang/AST/TypeNodes.def" 1846ce8890371fcdb983ae487c87fa40606a34896ff7John McCall llvm_unreachable("didn't desugar past all non-canonical types?"); 1847ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1848ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types should never be variably-modified. 1849ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Builtin: 1850ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Complex: 1851ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Vector: 1852ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ExtVector: 1853ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentSizedExtVector: 1854ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCObject: 1855ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCInterface: 1856ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCObjectPointer: 1857ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Record: 1858ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Enum: 1859ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::UnresolvedUsing: 1860ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TypeOfExpr: 1861ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TypeOf: 1862ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Decltype: 1863ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 1864ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentName: 1865ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::InjectedClassName: 1866ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TemplateSpecialization: 1867ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentTemplateSpecialization: 1868ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TemplateTypeParm: 1869ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::SubstTemplateTypeParmPack: 187034b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: 1871ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::PackExpansion: 1872ce8890371fcdb983ae487c87fa40606a34896ff7John McCall llvm_unreachable("type should never be variably-modified"); 1873ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1874ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types can be variably-modified but should never need to 1875ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // further decay. 1876ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::FunctionNoProto: 1877ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::FunctionProto: 1878ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::BlockPointer: 1879ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::MemberPointer: 1880ce8890371fcdb983ae487c87fa40606a34896ff7John McCall return type; 1881ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1882ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types can be variably-modified. All these modifications 1883ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // preserve structure except as noted by comments. 1884ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // TODO: if we ever care about optimizing VLAs, there are no-op 1885ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // optimizations available here. 1886ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Pointer: 1887ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getPointerType(getVariableArrayDecayedType( 1888ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cast<PointerType>(ty)->getPointeeType())); 1889ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1890ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1891ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::LValueReference: { 1892ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const LValueReferenceType *lv = cast<LValueReferenceType>(ty); 1893ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getLValueReferenceType( 1894ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(lv->getPointeeType()), 1895ce8890371fcdb983ae487c87fa40606a34896ff7John McCall lv->isSpelledAsLValue()); 1896ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1897745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1898ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1899ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::RValueReference: { 1900ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const RValueReferenceType *lv = cast<RValueReferenceType>(ty); 1901ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getRValueReferenceType( 1902ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(lv->getPointeeType())); 1903ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1904745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1905745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1906b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 1907b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman const AtomicType *at = cast<AtomicType>(ty); 1908b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman result = getAtomicType(getVariableArrayDecayedType(at->getValueType())); 1909b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman break; 1910b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 1911b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 1912ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ConstantArray: { 1913ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const ConstantArrayType *cat = cast<ConstantArrayType>(ty); 1914ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getConstantArrayType( 1915ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(cat->getElementType()), 1916ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getSize(), 1917ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getSizeModifier(), 1918ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getIndexTypeCVRQualifiers()); 1919ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1920745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1921745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1922ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentSizedArray: { 1923ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const DependentSizedArrayType *dat = cast<DependentSizedArrayType>(ty); 1924ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getDependentSizedArrayType( 1925ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(dat->getElementType()), 1926ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getSizeExpr(), 1927ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getSizeModifier(), 1928ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getIndexTypeCVRQualifiers(), 1929ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getBracketsRange()); 1930ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1931ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1932ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1933ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Turn incomplete types into [*] types. 1934ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::IncompleteArray: { 1935ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const IncompleteArrayType *iat = cast<IncompleteArrayType>(ty); 1936ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getVariableArrayType( 1937ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(iat->getElementType()), 1938ce8890371fcdb983ae487c87fa40606a34896ff7John McCall /*size*/ 0, 1939ce8890371fcdb983ae487c87fa40606a34896ff7John McCall ArrayType::Normal, 1940ce8890371fcdb983ae487c87fa40606a34896ff7John McCall iat->getIndexTypeCVRQualifiers(), 1941ce8890371fcdb983ae487c87fa40606a34896ff7John McCall SourceRange()); 1942ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1943ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1944ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1945ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Turn VLA types into [*] types. 1946ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::VariableArray: { 1947ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const VariableArrayType *vat = cast<VariableArrayType>(ty); 1948ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getVariableArrayType( 1949ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(vat->getElementType()), 1950ce8890371fcdb983ae487c87fa40606a34896ff7John McCall /*size*/ 0, 1951ce8890371fcdb983ae487c87fa40606a34896ff7John McCall ArrayType::Star, 1952ce8890371fcdb983ae487c87fa40606a34896ff7John McCall vat->getIndexTypeCVRQualifiers(), 1953ce8890371fcdb983ae487c87fa40606a34896ff7John McCall vat->getBracketsRange()); 1954ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1955ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1956ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1957ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1958ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Apply the top-level qualifiers from the original. 1959200fa53fd420aa8369586f569dbece04930ad6a3John McCall return getQualifiedType(result, split.Quals); 1960ce8890371fcdb983ae487c87fa40606a34896ff7John McCall} 1961745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1962bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// getVariableArrayType - Returns a non-unique reference to the type for a 1963bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// variable array of the specified element type. 19647e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas GregorQualType ASTContext::getVariableArrayType(QualType EltTy, 19657e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor Expr *NumElts, 1966c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff ArrayType::ArraySizeModifier ASM, 196763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara unsigned IndexTypeQuals, 19684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceRange Brackets) const { 1969c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // Since we don't unique expressions, it isn't possible to unique VLA's 1970c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // that have an expression provided for their size. 19713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType Canon; 1972715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor 19733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Be sure to pull qualifiers off the element type. 19743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 19753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(EltTy).split(); 1976200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM, 197763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara IndexTypeQuals, Brackets); 1978200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getQualifiedType(Canon, canonSplit.Quals); 1979715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor } 1980715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor 19816b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall VariableArrayType *New = new(*this, TypeAlignment) 198263e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets); 1983c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 1984c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman VariableArrayTypes.push_back(New); 1985c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman Types.push_back(New); 1986c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman return QualType(New, 0); 1987c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman} 1988c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 1989898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// getDependentSizedArrayType - Returns a non-unique reference to 1990898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// the type for a dependently-sized array of the specified element 199104d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor/// type. 19923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getDependentSizedArrayType(QualType elementType, 19933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Expr *numElements, 1994898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor ArrayType::ArraySizeModifier ASM, 19953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned elementTypeQuals, 19963b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SourceRange brackets) const { 19973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert((!numElements || numElements->isTypeDependent() || 19983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall numElements->isValueDependent()) && 1999898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor "Size must be type- or value-dependent!"); 2000898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 20013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Dependently-sized array types that do not have a specified number 20023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // of elements will have their sizes deduced from a dependent 20033b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // initializer. We do no canonicalization here at all, which is okay 20043b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // because they can't be used in most locations. 20053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!numElements) { 20063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *newType 20073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = new (*this, TypeAlignment) 20083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType(*this, elementType, QualType(), 20093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall numElements, ASM, elementTypeQuals, 20103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall brackets); 20113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(newType); 20123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(newType, 0); 2013cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor } 2014cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor 20153b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Otherwise, we actually build a new type every time, but we 20163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // also build a canonical type. 20171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonElementType = getCanonicalType(elementType).split(); 2019898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 20203b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 20213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall llvm::FoldingSetNodeID ID; 20223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType::Profile(ID, *this, 2023200fa53fd420aa8369586f569dbece04930ad6a3John McCall QualType(canonElementType.Ty, 0), 20243b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals, numElements); 20253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Look for an existing type with these properties. 20273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *canonTy = 20283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos); 20293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If we don't have one, build one. 20313b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!canonTy) { 20323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall canonTy = new (*this, TypeAlignment) 2033200fa53fd420aa8369586f569dbece04930ad6a3John McCall DependentSizedArrayType(*this, QualType(canonElementType.Ty, 0), 20343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType(), numElements, ASM, elementTypeQuals, 20353b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall brackets); 20363b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayTypes.InsertNode(canonTy, insertPos); 20373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(canonTy); 20383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 20393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Apply qualifiers from the element type to the array. 20413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon = getQualifiedType(QualType(canonTy,0), 2042200fa53fd420aa8369586f569dbece04930ad6a3John McCall canonElementType.Quals); 20433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If we didn't need extra canonicalization for the element type, 20453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // then just use that as our result. 2046200fa53fd420aa8369586f569dbece04930ad6a3John McCall if (QualType(canonElementType.Ty, 0) == elementType) 20473b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return canon; 20483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Otherwise, we need to build a type which follows the spelling 20503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // of the element type. 20513b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *sugaredType 20523b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = new (*this, TypeAlignment) 20533b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType(*this, elementType, canon, numElements, 20543b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals, brackets); 20553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(sugaredType); 20563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(sugaredType, 0); 20573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall} 20583b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20593b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getIncompleteArrayType(QualType elementType, 2060c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman ArrayType::ArraySizeModifier ASM, 20613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned elementTypeQuals) const { 2062c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman llvm::FoldingSetNodeID ID; 20633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals); 2064c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 20653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 20663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (IncompleteArrayType *iat = 20673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos)) 20683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(iat, 0); 2069c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2070c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // If the element type isn't canonical, this won't be a canonical type 20713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // either, so fill in the canonical type field. We also have to pull 20723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // qualifiers off the element type. 20733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon; 2074c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 20753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) { 20763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(elementType).split(); 2077200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0), 20783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals); 2079200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getQualifiedType(canon, canonSplit.Quals); 2080c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2081c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // Get the new insert position for the node we care about. 20823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType *existing = 20833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos); 20843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(!existing && "Shouldn't be in the map!"); (void) existing; 20852bd24ba6d10f8c811c8e2a57c8397e07082ba497Ted Kremenek } 2086c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 20873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType *newType = new (*this, TypeAlignment) 20883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType(elementType, canon, ASM, elementTypeQuals); 2089c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 20903b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.InsertNode(newType, insertPos); 20913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(newType); 20923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(newType, 0); 2093fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff} 2094fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff 209573322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// getVectorType - Return the unique reference to a vector type of 209673322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type. 209782287d19ded35248c4ce6a425ce74116a13ce44eJohn ThompsonQualType ASTContext::getVectorType(QualType vecType, unsigned NumElts, 20984ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad VectorType::VectorKind VecKind) const { 20993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(vecType->isBuiltinType()); 21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Check if we've already instantiated a vector of this type. 21025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 2103e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind); 2104788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 21055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 21065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 21075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(VTP, 0); 21085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 21095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the element type isn't canonical, this won't be a canonical type either, 21105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 21115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 2112255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor if (!vecType.isCanonical()) { 2113231da7eb3dd13007e5e40fffe48998e5ef284e06Bob Wilson Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind); 21141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 21165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2117c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 21185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 21196b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall VectorType *New = new (*this, TypeAlignment) 2120e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType(vecType, NumElts, Canonical, VecKind); 21215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VectorTypes.InsertNode(New, InsertPos); 21225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 21235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 21245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 21255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2126213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman/// getExtVectorType - Return the unique reference to an extended vector type of 212773322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type. 21284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 21294ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const { 21304ac01401b1ec602a1f58c217544d3dcb5fcbd7f1Douglas Gregor assert(vecType->isBuiltinType() || vecType->isDependentType()); 21311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 213273322924127c873c13101b705dd823f5539ffa5fSteve Naroff // Check if we've already instantiated a vector of this type. 213373322924127c873c13101b705dd823f5539ffa5fSteve Naroff llvm::FoldingSetNodeID ID; 2134788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner VectorType::Profile(ID, vecType, NumElts, Type::ExtVector, 2135e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::GenericVector); 213673322924127c873c13101b705dd823f5539ffa5fSteve Naroff void *InsertPos = 0; 213773322924127c873c13101b705dd823f5539ffa5fSteve Naroff if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 213873322924127c873c13101b705dd823f5539ffa5fSteve Naroff return QualType(VTP, 0); 213973322924127c873c13101b705dd823f5539ffa5fSteve Naroff 214073322924127c873c13101b705dd823f5539ffa5fSteve Naroff // If the element type isn't canonical, this won't be a canonical type either, 214173322924127c873c13101b705dd823f5539ffa5fSteve Naroff // so fill in the canonical type field. 214273322924127c873c13101b705dd823f5539ffa5fSteve Naroff QualType Canonical; 2143467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!vecType.isCanonical()) { 2144213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman Canonical = getExtVectorType(getCanonicalType(vecType), NumElts); 21451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 214673322924127c873c13101b705dd823f5539ffa5fSteve Naroff // Get the new insert position for the node we care about. 214773322924127c873c13101b705dd823f5539ffa5fSteve Naroff VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2148c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 214973322924127c873c13101b705dd823f5539ffa5fSteve Naroff } 21506b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ExtVectorType *New = new (*this, TypeAlignment) 21516b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ExtVectorType(vecType, NumElts, Canonical); 215273322924127c873c13101b705dd823f5539ffa5fSteve Naroff VectorTypes.InsertNode(New, InsertPos); 215373322924127c873c13101b705dd823f5539ffa5fSteve Naroff Types.push_back(New); 215473322924127c873c13101b705dd823f5539ffa5fSteve Naroff return QualType(New, 0); 215573322924127c873c13101b705dd823f5539ffa5fSteve Naroff} 215673322924127c873c13101b705dd823f5539ffa5fSteve Naroff 21574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 21584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentSizedExtVectorType(QualType vecType, 21594ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Expr *SizeExpr, 21604ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceLocation AttrLoc) const { 21612ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor llvm::FoldingSetNodeID ID; 21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType), 21632ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SizeExpr); 21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21652ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor void *InsertPos = 0; 21662ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorType *Canon 21672ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 21682ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorType *New; 21692ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor if (Canon) { 21702ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor // We already have a canonical version of this array type; use it as 21712ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor // the canonical type for a newly-built type. 21726b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 21736b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0), 21746b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall SizeExpr, AttrLoc); 21752ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } else { 21762ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType CanonVecTy = getCanonicalType(vecType); 21772ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor if (CanonVecTy == vecType) { 21786b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 21796b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr, 21806b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall AttrLoc); 2181789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2182789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentSizedExtVectorType *CanonCheck 2183789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2184789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken"); 2185789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CanonCheck; 21862ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorTypes.InsertNode(New, InsertPos); 21872ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } else { 21882ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr, 21892ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SourceLocation()); 21906b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 21916b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc); 21922ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } 21932ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } 21941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21959cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor Types.push_back(New); 21969cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor return QualType(New, 0); 21979cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor} 21989cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor 219972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'. 22005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 22014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 22024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionNoProtoType(QualType ResultTy, 22034ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FunctionType::ExtInfo &Info) const { 2204cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv DefaultCC = Info.getCC(); 2205cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2206cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CC_X86StdCall : DefaultCC; 22075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique functions, to guarantee there is only one function of a particular 22085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 22095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 2210264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionNoProtoType::Profile(ID, ResultTy, Info); 22111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 22131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionNoProtoType *FT = 221472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 22155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FT, 0); 22161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 2218ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor if (!ResultTy.isCanonical() || 221904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall getCanonicalCallConv(CallConv) != CallConv) { 2220264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Canonical = 2221264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola getFunctionNoProtoType(getCanonicalType(ResultTy), 2222264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Info.withCallingConv(getCanonicalCallConv(CallConv))); 22231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 222572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoType *NewIP = 222672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2227c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 22285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 22291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2230cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionProtoType::ExtInfo newInfo = Info.withCallingConv(CallConv); 22316b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall FunctionNoProtoType *New = new (*this, TypeAlignment) 2232cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionNoProtoType(ResultTy, Canonical, newInfo); 22335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 223472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.InsertNode(New, InsertPos); 22355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 22365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 22375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFunctionType - Return a normal function type with a typed argument 22395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// list. isVariadic indicates whether the argument list includes '...'. 22404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 22414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionType(QualType ResultTy, 22424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const QualType *ArgArray, unsigned NumArgs, 22434ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FunctionProtoType::ExtProtoInfo &EPI) const { 22445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique functions, to guarantee there is only one function of a particular 22455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 22465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 22478026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl FunctionProtoType::Profile(ID, ResultTy, ArgArray, NumArgs, EPI, *this); 22485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionProtoType *FTP = 225172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 22525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FTP, 0); 2253465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2254465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl // Determine whether the type being created is already canonical or not. 2255eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith bool isCanonical = 2256eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith EPI.ExceptionSpecType == EST_None && ResultTy.isCanonical() && 2257eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith !EPI.HasTrailingReturn; 22585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs && isCanonical; ++i) 225954e14c4db764c0636160d26c5bbf491637c83a76John McCall if (!ArgArray[i].isCanonicalAsParam()) 22605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer isCanonical = false; 22615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2262cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv DefaultCC = EPI.ExtInfo.getCC(); 2263cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2264cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CC_X86StdCall : DefaultCC; 2265e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 22665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this type isn't canonical, get the canonical version of it. 2267465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl // The exception spec is not part of the canonical type. 22685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 226904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) { 22705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 16> CanonicalArgs; 22715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer CanonicalArgs.reserve(NumArgs); 22725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs; ++i) 227354e14c4db764c0636160d26c5bbf491637c83a76John McCall CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i])); 2274465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2275e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI; 2276eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith CanonicalEPI.HasTrailingReturn = false; 22778b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl CanonicalEPI.ExceptionSpecType = EST_None; 22788b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl CanonicalEPI.NumExceptions = 0; 2279e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall CanonicalEPI.ExtInfo 2280e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall = CanonicalEPI.ExtInfo.withCallingConv(getCanonicalCallConv(CallConv)); 2281e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 2282f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getFunctionType(getCanonicalType(ResultTy), 2283beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad CanonicalArgs.data(), NumArgs, 2284e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall CanonicalEPI); 2285465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 22865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 228772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoType *NewIP = 228872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2289c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 22905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2291465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2292f85e193739c953358c865005855253af4f68a497John McCall // FunctionProtoType objects are allocated with extra bytes after 2293f85e193739c953358c865005855253af4f68a497John McCall // them for three variable size arrays at the end: 2294f85e193739c953358c865005855253af4f68a497John McCall // - parameter types 2295f85e193739c953358c865005855253af4f68a497John McCall // - exception types 2296f85e193739c953358c865005855253af4f68a497John McCall // - consumed-arguments flags 2297f85e193739c953358c865005855253af4f68a497John McCall // Instead of the exception types, there could be a noexcept 2298f85e193739c953358c865005855253af4f68a497John McCall // expression. 2299e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall size_t Size = sizeof(FunctionProtoType) + 230060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl NumArgs * sizeof(QualType); 230160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (EPI.ExceptionSpecType == EST_Dynamic) 230260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Size += EPI.NumExceptions * sizeof(QualType); 230360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) { 23048026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl Size += sizeof(Expr*); 2305e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith } else if (EPI.ExceptionSpecType == EST_Uninstantiated) { 230613bffc532bafd45d4a77867993c1afb83c7661beRichard Smith Size += 2 * sizeof(FunctionDecl*); 230760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 2308f85e193739c953358c865005855253af4f68a497John McCall if (EPI.ConsumedArguments) 2309f85e193739c953358c865005855253af4f68a497John McCall Size += NumArgs * sizeof(bool); 2310f85e193739c953358c865005855253af4f68a497John McCall 2311e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment); 2312cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionProtoType::ExtProtoInfo newEPI = EPI; 2313cfe9af250f466e7e38becea4428990448ae07737Roman Divacky newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv); 23148026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl new (FTP) FunctionProtoType(ResultTy, ArgArray, NumArgs, Canonical, newEPI); 23155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(FTP); 231672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.InsertNode(FTP, InsertPos); 23175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FTP, 0); 23185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 23195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 23203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#ifndef NDEBUG 23213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallstatic bool NeedsInjectedClassNameType(const RecordDecl *D) { 23223cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!isa<CXXRecordDecl>(D)) return false; 23233cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const CXXRecordDecl *RD = cast<CXXRecordDecl>(D); 23243cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (isa<ClassTemplatePartialSpecializationDecl>(RD)) 23253cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return true; 23263cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (RD->getDescribedClassTemplate() && 23273cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall !isa<ClassTemplateSpecializationDecl>(RD)) 23283cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return true; 23293cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return false; 23303cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 23313cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif 23323cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 23333cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// getInjectedClassNameType - Return the unique reference to the 23343cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// injected class name type for the specified templated declaration. 23353cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl, 23364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType TST) const { 23373cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(NeedsInjectedClassNameType(Decl)); 23383cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (Decl->TypeForDecl) { 23393cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 2340ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) { 23413cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(PrevDecl->TypeForDecl && "previous declaration has no type"); 23423cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Decl->TypeForDecl = PrevDecl->TypeForDecl; 23433cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 23443cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } else { 2345f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Type *newType = 234631f17ecbef57b5679c017c375db330546b7b5145John McCall new (*this, TypeAlignment) InjectedClassNameType(Decl, TST); 2347f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2348f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 23493cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } 23503cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return QualType(Decl->TypeForDecl, 0); 23513cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 23523cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 23532ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// getTypeDeclType - Return the unique reference to the type for the 23542ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// specified type declaration. 23554ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const { 23561e6759e9e33dcaa73ce14c8a908ac9f87ac16463Argyrios Kyrtzidis assert(Decl && "Passed null for Decl param"); 2357becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!Decl->TypeForDecl && "TypeForDecl present in slow case"); 23581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2359162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (const TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Decl)) 23602ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor return getTypedefType(Typedef); 2361becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall 2362becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!isa<TemplateTypeParmDecl>(Decl) && 2363becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "Template type parameter types are always available."); 2364becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall 236519c8576b7328f4dc2d07682f5da552875c1912efJohn McCall if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) { 2366ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor assert(!Record->getPreviousDecl() && 2367becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "struct/union has previous declaration"); 2368becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!NeedsInjectedClassNameType(Record)); 2369400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return getRecordType(Record); 237019c8576b7328f4dc2d07682f5da552875c1912efJohn McCall } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) { 2371ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor assert(!Enum->getPreviousDecl() && 2372becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "enum has previous declaration"); 2373400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return getEnumType(Enum); 237419c8576b7328f4dc2d07682f5da552875c1912efJohn McCall } else if (const UnresolvedUsingTypenameDecl *Using = 2375ed97649e9574b9d854fa4d6109c9333ae0993554John McCall dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) { 2376f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using); 2377f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2378f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 23799fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump } else 2380becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall llvm_unreachable("TypeDecl without a type?"); 238149aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis 238249aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis return QualType(Decl->TypeForDecl, 0); 23832ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor} 23842ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor 23855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTypedefType - Return the unique reference to the type for the 2386162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// specified typedef name decl. 23879763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType 2388162e1c1b487352434552147967c3dd296ebee2f7Richard SmithASTContext::getTypedefType(const TypedefNameDecl *Decl, 2389162e1c1b487352434552147967c3dd296ebee2f7Richard Smith QualType Canonical) const { 23905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 23911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23929763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis if (Canonical.isNull()) 23939763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Canonical = getCanonicalType(Decl->getUnderlyingType()); 2394f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall TypedefType *newType = new(*this, TypeAlignment) 23956b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypedefType(Type::Typedef, Decl, Canonical); 2396f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2397f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2398f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 23995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 24005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 24014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRecordType(const RecordDecl *Decl) const { 2402400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2403400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2404ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (const RecordDecl *PrevDecl = Decl->getPreviousDecl()) 2405400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (PrevDecl->TypeForDecl) 2406400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2407400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2408f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall RecordType *newType = new (*this, TypeAlignment) RecordType(Decl); 2409f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2410f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2411f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 2412400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis} 2413400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 24144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getEnumType(const EnumDecl *Decl) const { 2415400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2416400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2417ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (const EnumDecl *PrevDecl = Decl->getPreviousDecl()) 2418400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (PrevDecl->TypeForDecl) 2419400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2420400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2421f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall EnumType *newType = new (*this, TypeAlignment) EnumType(Decl); 2422f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2423f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2424f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 2425400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis} 2426400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 24279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType ASTContext::getAttributedType(AttributedType::Kind attrKind, 24289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType modifiedType, 24299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType equivalentType) { 24309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall llvm::FoldingSetNodeID id; 24319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType::Profile(id, attrKind, modifiedType, equivalentType); 24329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall void *insertPos = 0; 24349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos); 24359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (type) return QualType(type, 0); 24369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24379d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType canon = getCanonicalType(equivalentType); 24389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall type = new (*this, TypeAlignment) 24399d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType(canon, attrKind, modifiedType, equivalentType); 24409d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall Types.push_back(type); 24429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedTypes.InsertNode(type, insertPos); 24439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24449d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return QualType(type, 0); 24459d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 24469d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24479d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 244849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/// \brief Retrieve a substitution-result type. 244949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType 245049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm, 24514ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType Replacement) const { 2452467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(Replacement.isCanonical() 245349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall && "replacement types must always be canonical"); 245449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 245549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall llvm::FoldingSetNodeID ID; 245649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType::Profile(ID, Parm, Replacement); 245749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall void *InsertPos = 0; 245849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType *SubstParm 245949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 246049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 246149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall if (!SubstParm) { 246249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstParm = new (*this, TypeAlignment) 246349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType(Parm, Replacement); 246449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall Types.push_back(SubstParm); 246549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 246649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall } 246749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 246849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return QualType(SubstParm, 0); 246949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 247049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 2471c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor/// \brief Retrieve a 2472c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType ASTContext::getSubstTemplateTypeParmPackType( 2473c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const TemplateTypeParmType *Parm, 2474c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const TemplateArgument &ArgPack) { 2475c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifndef NDEBUG 2476c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(), 2477c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor PEnd = ArgPack.pack_end(); 2478c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor P != PEnd; ++P) { 2479c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type"); 2480c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor assert(P->getAsType().isCanonical() && "Pack contains non-canonical type"); 2481c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2482c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#endif 2483c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2484c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor llvm::FoldingSetNodeID ID; 2485c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack); 2486c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor void *InsertPos = 0; 2487c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (SubstTemplateTypeParmPackType *SubstParm 2488c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos)) 2489c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return QualType(SubstParm, 0); 2490c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2491c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor QualType Canon; 2492c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (!Parm->isCanonicalUnqualified()) { 2493c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Canon = getCanonicalType(QualType(Parm, 0)); 2494c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon), 2495c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor ArgPack); 2496c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos); 2497c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2498c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2499c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackType *SubstParm 2500c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon, 2501c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor ArgPack); 2502c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Types.push_back(SubstParm); 2503c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 2504c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return QualType(SubstParm, 0); 2505c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 2506c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2507fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor/// \brief Retrieve the template type parameter type for a template 25081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parameter or parameter pack with the given depth, index, and (optionally) 250976e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson/// name. 25101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index, 251176e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson bool ParameterPack, 25124fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl) const { 2513fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor llvm::FoldingSetNodeID ID; 25144fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl); 2515fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor void *InsertPos = 0; 25161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateTypeParmType *TypeParm 2517fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2518fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2519fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor if (TypeParm) 2520fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return QualType(TypeParm, 0); 25211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25224fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth if (TTPDecl) { 252376e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack); 25244fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon); 2525789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2526789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor TemplateTypeParmType *TypeCheck 2527789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2528789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!TypeCheck && "Template type parameter canonical type broken"); 2529789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)TypeCheck; 253076e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson } else 25316b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeParm = new (*this, TypeAlignment) 25326b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TemplateTypeParmType(Depth, Index, ParameterPack); 2533fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2534fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor Types.push_back(TypeParm); 2535fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos); 2536fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2537fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return QualType(TypeParm, 0); 2538fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor} 2539fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 25403cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallTypeSourceInfo * 25413cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallASTContext::getTemplateSpecializationTypeInfo(TemplateName Name, 25423cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall SourceLocation NameLoc, 25433cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const TemplateArgumentListInfo &Args, 25443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 25457c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Name.getAsDependentTemplateName() && 25467c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 25473e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType TST = getTemplateSpecializationType(Name, Args, Underlying); 25483cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 25493cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeSourceInfo *DI = CreateTypeSourceInfo(TST); 25503cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TemplateSpecializationTypeLoc TL 25513cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc()); 255255d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara TL.setTemplateKeywordLoc(SourceLocation()); 25533cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setTemplateNameLoc(NameLoc); 25543cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setLAngleLoc(Args.getLAngleLoc()); 25553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setRAngleLoc(Args.getRAngleLoc()); 25563cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 25573cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setArgLocInfo(i, Args[i].getLocInfo()); 25583cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return DI; 25593cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 25603cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 25611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 25627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorASTContext::getTemplateSpecializationType(TemplateName Template, 2563d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args, 25643e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 25657c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 25667c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 25677c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 2568d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned NumArgs = Args.size(); 2569d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 25705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> ArgVec; 2571833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ArgVec.reserve(NumArgs); 2572833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0; i != NumArgs; ++i) 2573833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ArgVec.push_back(Args[i].getArgument()); 2574833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 257531f17ecbef57b5679c017c375db330546b7b5145John McCall return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs, 25763e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Underlying); 2577833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2578833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2579b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#ifndef NDEBUG 2580b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregorstatic bool hasAnyPackExpansions(const TemplateArgument *Args, 2581b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor unsigned NumArgs) { 2582b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 2583b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor if (Args[I].isPackExpansion()) 2584b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor return true; 2585b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor 2586b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor return true; 2587b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor} 2588b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#endif 2589b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor 2590833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType 2591833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallASTContext::getTemplateSpecializationType(TemplateName Template, 25927532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor const TemplateArgument *Args, 25937532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor unsigned NumArgs, 25943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 25957c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 25967c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 25970f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor // Look through qualified template names. 25980f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 25990f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor Template = TemplateName(QTN->getTemplateDecl()); 26007c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 2601b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor bool IsTypeAlias = 26023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Template.getAsTemplateDecl() && 26033e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl()); 26043e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType CanonType; 26053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!Underlying.isNull()) 26063e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith CanonType = getCanonicalType(Underlying); 26073e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else { 2608b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor // We can get here with an alias template when the specialization contains 2609b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor // a pack expansion that does not match up with a parameter pack. 2610b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor assert((!IsTypeAlias || hasAnyPackExpansions(Args, NumArgs)) && 2611b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor "Caller must compute aliased type"); 2612b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor IsTypeAlias = false; 26133e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith CanonType = getCanonicalTemplateSpecializationType(Template, Args, 26143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NumArgs); 26153e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 2616fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor 26171275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // Allocate the (non-canonical) template specialization type, but don't 26181275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // try to unique it: these types typically have location information that 26191275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // we don't unique and don't want to lose. 26203e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith void *Mem = Allocate(sizeof(TemplateSpecializationType) + 26213e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith sizeof(TemplateArgument) * NumArgs + 2622b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor (IsTypeAlias? sizeof(QualType) : 0), 26236b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeAlignment); 26241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateSpecializationType *Spec 2625b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, CanonType, 2626b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor IsTypeAlias ? Underlying : QualType()); 26271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 262855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor Types.push_back(Spec); 26291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(Spec, 0); 263055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor} 263155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor 26321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 26339763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisASTContext::getCanonicalTemplateSpecializationType(TemplateName Template, 26349763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis const TemplateArgument *Args, 26354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned NumArgs) const { 26367c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 26377c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 26383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 26390f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor // Look through qualified template names. 26400f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 26410f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor Template = TemplateName(QTN->getTemplateDecl()); 26427c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 26439763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Build the canonical template specialization type. 26449763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateName CanonTemplate = getCanonicalTemplateName(Template); 26455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> CanonArgs; 26469763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.reserve(NumArgs); 26479763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis for (unsigned I = 0; I != NumArgs; ++I) 26489763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.push_back(getCanonicalTemplateArgument(Args[I])); 26499763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 26509763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Determine whether this canonical template specialization type already 26519763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // exists. 26529763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis llvm::FoldingSetNodeID ID; 26539763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationType::Profile(ID, CanonTemplate, 26549763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.data(), NumArgs, *this); 26559763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 26569763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis void *InsertPos = 0; 26579763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationType *Spec 26589763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 26599763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 26609763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis if (!Spec) { 26619763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Allocate a new canonical template specialization type. 26629763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis void *Mem = Allocate((sizeof(TemplateSpecializationType) + 26639763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis sizeof(TemplateArgument) * NumArgs), 26649763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TypeAlignment); 26659763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Spec = new (Mem) TemplateSpecializationType(CanonTemplate, 26669763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.data(), NumArgs, 26673e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType(), QualType()); 26689763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Types.push_back(Spec); 26699763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationTypes.InsertNode(Spec, InsertPos); 26709763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis } 26719763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 26729763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis assert(Spec->isDependentType() && 26739763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis "Non-dependent template-id type must have a canonical type"); 26749763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis return QualType(Spec, 0); 26759763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis} 26769763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 26779763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType 2678465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword, 2679465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara NestedNameSpecifier *NNS, 26804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType NamedType) const { 2681e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor llvm::FoldingSetNodeID ID; 2682465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType::Profile(ID, Keyword, NNS, NamedType); 2683e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2684e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor void *InsertPos = 0; 2685465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2686e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor if (T) 2687e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor return QualType(T, 0); 2688e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2689789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor QualType Canon = NamedType; 2690789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor if (!Canon.isCanonical()) { 2691789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor Canon = getCanonicalType(NamedType); 2692465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2693465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara assert(!CheckT && "Elaborated canonical type broken"); 2694789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckT; 2695789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor } 2696789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2697465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara T = new (*this) ElaboratedType(Keyword, NNS, NamedType, Canon); 2698e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor Types.push_back(T); 2699465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedTypes.InsertNode(T, InsertPos); 2700e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor return QualType(T, 0); 2701e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor} 2702e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2703075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType 27044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getParenType(QualType InnerType) const { 2705075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara llvm::FoldingSetNodeID ID; 2706075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType::Profile(ID, InnerType); 2707075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2708075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara void *InsertPos = 0; 2709075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2710075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (T) 2711075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(T, 0); 2712075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2713075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType Canon = InnerType; 2714075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (!Canon.isCanonical()) { 2715075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Canon = getCanonicalType(InnerType); 2716075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2717075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara assert(!CheckT && "Paren canonical type broken"); 2718075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara (void)CheckT; 2719075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara } 2720075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2721075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara T = new (*this) ParenType(InnerType, Canon); 2722075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Types.push_back(T); 2723075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenTypes.InsertNode(T, InsertPos); 2724075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(T, 0); 2725075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 2726075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 27274a2023f5014e82389d5980d307b89c545dbbac81Douglas GregorQualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword, 27284a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 27294a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor const IdentifierInfo *Name, 27304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType Canon) const { 2731d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor assert(NNS->isDependent() && "nested-name-specifier must be dependent"); 2732d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2733d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor if (Canon.isNull()) { 2734d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 27354a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor ElaboratedTypeKeyword CanonKeyword = Keyword; 27364a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor if (Keyword == ETK_None) 27374a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor CanonKeyword = ETK_Typename; 27384a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor 27394a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor if (CanonNNS != NNS || CanonKeyword != Keyword) 27404a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor Canon = getDependentNameType(CanonKeyword, CanonNNS, Name); 2741d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 2742d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2743d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor llvm::FoldingSetNodeID ID; 27444a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor DependentNameType::Profile(ID, Keyword, NNS, Name); 2745d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2746d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor void *InsertPos = 0; 27474714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameType *T 27484714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos); 2749d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor if (T) 2750d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return QualType(T, 0); 2751d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 27524a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor T = new (*this) DependentNameType(Keyword, NNS, Name, Canon); 2753d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor Types.push_back(T); 27544714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameTypes.InsertNode(T, InsertPos); 27551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 2756d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor} 2757d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 27581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 275933500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType( 276033500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword Keyword, 27614a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 276233500955d731c73717af52088b7fc0e7a85681e7John McCall const IdentifierInfo *Name, 27634ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const TemplateArgumentListInfo &Args) const { 276433500955d731c73717af52088b7fc0e7a85681e7John McCall // TODO: avoid this copy 27655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> ArgCopy; 276633500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, E = Args.size(); I != E; ++I) 276733500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.push_back(Args[I].getArgument()); 276833500955d731c73717af52088b7fc0e7a85681e7John McCall return getDependentTemplateSpecializationType(Keyword, NNS, Name, 276933500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.size(), 277033500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.data()); 277133500955d731c73717af52088b7fc0e7a85681e7John McCall} 277233500955d731c73717af52088b7fc0e7a85681e7John McCall 277333500955d731c73717af52088b7fc0e7a85681e7John McCallQualType 277433500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType( 277533500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword Keyword, 277633500955d731c73717af52088b7fc0e7a85681e7John McCall NestedNameSpecifier *NNS, 277733500955d731c73717af52088b7fc0e7a85681e7John McCall const IdentifierInfo *Name, 277833500955d731c73717af52088b7fc0e7a85681e7John McCall unsigned NumArgs, 27794ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const TemplateArgument *Args) const { 2780aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor assert((!NNS || NNS->isDependent()) && 2781aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor "nested-name-specifier must be dependent"); 27821734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 2783789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor llvm::FoldingSetNodeID ID; 278433500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS, 278533500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, Args); 2786789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2787789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor void *InsertPos = 0; 278833500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationType *T 278933500955d731c73717af52088b7fc0e7a85681e7John McCall = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 2790789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor if (T) 2791789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor return QualType(T, 0); 2792789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 279333500955d731c73717af52088b7fc0e7a85681e7John McCall NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 279433500955d731c73717af52088b7fc0e7a85681e7John McCall 279533500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword CanonKeyword = Keyword; 279633500955d731c73717af52088b7fc0e7a85681e7John McCall if (Keyword == ETK_None) CanonKeyword = ETK_Typename; 27971734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 279833500955d731c73717af52088b7fc0e7a85681e7John McCall bool AnyNonCanonArgs = false; 27995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> CanonArgs(NumArgs); 280033500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0; I != NumArgs; ++I) { 280133500955d731c73717af52088b7fc0e7a85681e7John McCall CanonArgs[I] = getCanonicalTemplateArgument(Args[I]); 280233500955d731c73717af52088b7fc0e7a85681e7John McCall if (!CanonArgs[I].structurallyEquals(Args[I])) 280333500955d731c73717af52088b7fc0e7a85681e7John McCall AnyNonCanonArgs = true; 2804789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor } 28051734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 280633500955d731c73717af52088b7fc0e7a85681e7John McCall QualType Canon; 280733500955d731c73717af52088b7fc0e7a85681e7John McCall if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) { 280833500955d731c73717af52088b7fc0e7a85681e7John McCall Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS, 280933500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, 281033500955d731c73717af52088b7fc0e7a85681e7John McCall CanonArgs.data()); 281133500955d731c73717af52088b7fc0e7a85681e7John McCall 281233500955d731c73717af52088b7fc0e7a85681e7John McCall // Find the insert position again. 281333500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 281433500955d731c73717af52088b7fc0e7a85681e7John McCall } 281533500955d731c73717af52088b7fc0e7a85681e7John McCall 281633500955d731c73717af52088b7fc0e7a85681e7John McCall void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) + 281733500955d731c73717af52088b7fc0e7a85681e7John McCall sizeof(TemplateArgument) * NumArgs), 281833500955d731c73717af52088b7fc0e7a85681e7John McCall TypeAlignment); 2819ef99001908e799c388f1363b1e607dad5f5b57d3John McCall T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS, 282033500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, Args, Canon); 28211734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor Types.push_back(T); 282233500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypes.InsertNode(T, InsertPos); 28231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 28241734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor} 28251734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 2826cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas GregorQualType ASTContext::getPackExpansionType(QualType Pattern, 2827cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 28287536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor llvm::FoldingSetNodeID ID; 2829cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor PackExpansionType::Profile(ID, Pattern, NumExpansions); 28307536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 28317536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor assert(Pattern->containsUnexpandedParameterPack() && 28327536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor "Pack expansions must expand one or more parameter packs"); 28337536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor void *InsertPos = 0; 28347536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionType *T 28357536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 28367536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (T) 28377536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return QualType(T, 0); 28387536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 28397536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor QualType Canon; 28407536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (!Pattern.isCanonical()) { 2841cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions); 28427536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 28437536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor // Find the insert position again. 28447536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 28457536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor } 28467536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 2847cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor T = new (*this) PackExpansionType(Pattern, Canon, NumExpansions); 28487536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor Types.push_back(T); 28497536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypes.InsertNode(T, InsertPos); 28507536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return QualType(T, 0); 28517536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 28527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 285388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// CmpProtocolNames - Comparison predicate for sorting protocols 285488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// alphabetically. 285588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattnerstatic bool CmpProtocolNames(const ObjCProtocolDecl *LHS, 285688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner const ObjCProtocolDecl *RHS) { 28572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS->getDeclName() < RHS->getDeclName(); 285888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner} 285988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2860c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallstatic bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols, 286154e14c4db764c0636160d26c5bbf491637c83a76John McCall unsigned NumProtocols) { 286254e14c4db764c0636160d26c5bbf491637c83a76John McCall if (NumProtocols == 0) return true; 286354e14c4db764c0636160d26c5bbf491637c83a76John McCall 286461cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor if (Protocols[0]->getCanonicalDecl() != Protocols[0]) 286561cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor return false; 286661cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor 286754e14c4db764c0636160d26c5bbf491637c83a76John McCall for (unsigned i = 1; i != NumProtocols; ++i) 286861cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor if (!CmpProtocolNames(Protocols[i-1], Protocols[i]) || 286961cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor Protocols[i]->getCanonicalDecl() != Protocols[i]) 287054e14c4db764c0636160d26c5bbf491637c83a76John McCall return false; 287154e14c4db764c0636160d26c5bbf491637c83a76John McCall return true; 287254e14c4db764c0636160d26c5bbf491637c83a76John McCall} 287354e14c4db764c0636160d26c5bbf491637c83a76John McCall 287454e14c4db764c0636160d26c5bbf491637c83a76John McCallstatic void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols, 287588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner unsigned &NumProtocols) { 287688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols; 28771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 287888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner // Sort protocols, keyed by name. 287988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames); 288088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 288161cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor // Canonicalize. 288261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor for (unsigned I = 0, N = NumProtocols; I != N; ++I) 288361cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor Protocols[I] = Protocols[I]->getCanonicalDecl(); 288461cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor 288588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner // Remove duplicates. 288688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner ProtocolsEnd = std::unique(Protocols, ProtocolsEnd); 288788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner NumProtocols = ProtocolsEnd-Protocols; 288888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner} 288988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2890c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType ASTContext::getObjCObjectType(QualType BaseType, 2891c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCProtocolDecl * const *Protocols, 28924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned NumProtocols) const { 2893c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // If the base type is an interface and there aren't any protocols 2894c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // to add, then the interface type will do just fine. 2895c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!NumProtocols && isa<ObjCInterfaceType>(BaseType)) 2896c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return BaseType; 2897d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff 2898c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Look in the folding set for an existing type. 2899c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall llvm::FoldingSetNodeID ID; 2900c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypeImpl::Profile(ID, BaseType, Protocols, NumProtocols); 2901d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff void *InsertPos = 0; 2902c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos)) 2903c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(QT, 0); 2904d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff 2905c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Build the canonical type, which has the canonical base type and 2906c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // a sorted-and-uniqued list of protocols. 290754e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Canonical; 2908c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall bool ProtocolsSorted = areSortedAndUniqued(Protocols, NumProtocols); 2909c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ProtocolsSorted || !BaseType.isCanonical()) { 2910c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ProtocolsSorted) { 29115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols, 29120237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer Protocols + NumProtocols); 291354e14c4db764c0636160d26c5bbf491637c83a76John McCall unsigned UniqueCount = NumProtocols; 291454e14c4db764c0636160d26c5bbf491637c83a76John McCall 291554e14c4db764c0636160d26c5bbf491637c83a76John McCall SortAndUniqueProtocols(&Sorted[0], UniqueCount); 2916c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectType(getCanonicalType(BaseType), 2917c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall &Sorted[0], UniqueCount); 291854e14c4db764c0636160d26c5bbf491637c83a76John McCall } else { 2919c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectType(getCanonicalType(BaseType), 2920c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Protocols, NumProtocols); 292154e14c4db764c0636160d26c5bbf491637c83a76John McCall } 292254e14c4db764c0636160d26c5bbf491637c83a76John McCall 292354e14c4db764c0636160d26c5bbf491637c83a76John McCall // Regenerate InsertPos. 2924c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos); 292554e14c4db764c0636160d26c5bbf491637c83a76John McCall } 292654e14c4db764c0636160d26c5bbf491637c83a76John McCall 2927c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall unsigned Size = sizeof(ObjCObjectTypeImpl); 2928c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Size += NumProtocols * sizeof(ObjCProtocolDecl *); 2929fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor void *Mem = Allocate(Size, TypeAlignment); 2930c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypeImpl *T = 2931c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall new (Mem) ObjCObjectTypeImpl(Canonical, BaseType, Protocols, NumProtocols); 29321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2933c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Types.push_back(T); 2934c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypes.InsertNode(T, InsertPos); 2935c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(T, 0); 2936d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff} 293788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2938c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for 2939c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// the given object type. 29404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const { 29414b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian llvm::FoldingSetNodeID ID; 2942c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerType::Profile(ID, ObjectT); 29431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29444b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian void *InsertPos = 0; 2945c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ObjCObjectPointerType *QT = 2946c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 29474b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian return QualType(QT, 0); 29481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2949c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Find the canonical object type. 295054e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Canonical; 2951c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ObjectT.isCanonical()) { 2952c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT)); 295354e14c4db764c0636160d26c5bbf491637c83a76John McCall 2954c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Regenerate InsertPos. 2955c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 295654e14c4db764c0636160d26c5bbf491637c83a76John McCall } 295754e14c4db764c0636160d26c5bbf491637c83a76John McCall 2958c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // No match. 2959c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment); 2960c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerType *QType = 2961c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall new (Mem) ObjCObjectPointerType(Canonical, ObjectT); 296224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 296324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis Types.push_back(QType); 2964c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.InsertNode(QType, InsertPos); 296524fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis return QualType(QType, 0); 296624fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 296724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2968deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// getObjCInterfaceType - Return the unique reference to the type for the 2969deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// specified ObjC interface decl. The list of protocols is optional. 29700af550115df1f57f17a4f125ff0e8b34820c65d1Douglas GregorQualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl, 29710af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor ObjCInterfaceDecl *PrevDecl) const { 2972deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (Decl->TypeForDecl) 2973deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor return QualType(Decl->TypeForDecl, 0); 297474c730ad1f6818b676b0bad46d806a9176950328Sebastian Redl 29750af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor if (PrevDecl) { 29760af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl"); 29770af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor Decl->TypeForDecl = PrevDecl->TypeForDecl; 29780af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor return QualType(PrevDecl->TypeForDecl, 0); 29790af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor } 29800af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor 29818d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor // Prefer the definition, if there is one. 29828d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor if (const ObjCInterfaceDecl *Def = Decl->getDefinition()) 29838d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor Decl = Def; 29848d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor 2985deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment); 2986deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ObjCInterfaceType *T = new (Mem) ObjCInterfaceType(Decl); 2987deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Decl->TypeForDecl = T; 2988deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Types.push_back(T); 2989deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor return QualType(T, 0); 2990c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 2991c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 299272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique 299372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// TypeOfExprType AST's (since expression's are never shared). For example, 29949752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// multiple declarations that refer to "typeof(x)" all contain different 29951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// DeclRefExpr's. This doesn't effect the type checker, since it operates 29969752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique). 29974ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfExprType(Expr *tofExpr) const { 2998dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor TypeOfExprType *toe; 2999b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor if (tofExpr->isTypeDependent()) { 3000b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor llvm::FoldingSetNodeID ID; 3001b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprType::Profile(ID, *this, tofExpr); 30021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3003b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor void *InsertPos = 0; 3004b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprType *Canon 3005b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos); 3006b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor if (Canon) { 3007b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // We already have a "canonical" version of an identical, dependent 3008b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // typeof(expr) type. Use that as our canonical type. 30096b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, 3010b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor QualType((TypeOfExprType*)Canon, 0)); 30113060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 3012b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // Build a new, canonical typeof(expr) type. 30136b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Canon 30146b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr); 3015b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprTypes.InsertNode(Canon, InsertPos); 3016b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor toe = Canon; 3017b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor } 3018b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor } else { 3019dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor QualType Canonical = getCanonicalType(tofExpr->getType()); 30206b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical); 3021dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor } 30229752f25748d954df99087d741ea35db37ff16beaSteve Naroff Types.push_back(toe); 30239752f25748d954df99087d741ea35db37ff16beaSteve Naroff return QualType(toe, 0); 3024d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff} 3025d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff 30269752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// getTypeOfType - Unlike many "get<Type>" functions, we don't unique 30279752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// TypeOfType AST's. The only motivation to unique these nodes would be 30289752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be 30291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates 30309752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique). 30314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfType(QualType tofType) const { 3032f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner QualType Canonical = getCanonicalType(tofType); 30336b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical); 30349752f25748d954df99087d741ea35db37ff16beaSteve Naroff Types.push_back(tot); 30359752f25748d954df99087d741ea35db37ff16beaSteve Naroff return QualType(tot, 0); 3036d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff} 3037d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff 303860a9a2a404a4cf259d39133383e922aa00ca9043Anders Carlsson 3039395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// getDecltypeType - Unlike many "get<Type>" functions, we don't unique 3040395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// DecltypeType AST's. The only motivation to unique these nodes would be 3041395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be 30421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates 304339e02032b01874a0d02ba85a4cd3922adda81376David Blaikie/// on canonical types (which are always unique). 3044f8af98286022f72157d84951b48fde5fb369ab29Douglas GregorQualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const { 3045dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor DecltypeType *dt; 3046561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 3047561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // C++0x [temp.type]p2: 3048561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // If an expression e involves a template parameter, decltype(e) denotes a 3049561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // unique dependent type. Two such decltype-specifiers refer to the same 3050561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // type only if their expressions are equivalent (14.5.6.1). 3051561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (e->isInstantiationDependent()) { 30529d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor llvm::FoldingSetNodeID ID; 30539d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeType::Profile(ID, *this, e); 30541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30559d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor void *InsertPos = 0; 30569d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeType *Canon 30579d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos); 30589d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor if (Canon) { 30599d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // We already have a "canonical" version of an equivalent, dependent 30609d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // decltype type. Use that as our canonical type. 30616b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall dt = new (*this, TypeAlignment) DecltypeType(e, DependentTy, 30629d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor QualType((DecltypeType*)Canon, 0)); 30633060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 30649d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // Build a new, canonical typeof(expr) type. 30656b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e); 30669d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeTypes.InsertNode(Canon, InsertPos); 30679d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor dt = Canon; 30689d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor } 30699d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor } else { 3070f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType, 3071f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor getCanonicalType(UnderlyingType)); 3072dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor } 3073395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson Types.push_back(dt); 3074395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson return QualType(dt, 0); 3075395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson} 3076395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 3077ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// getUnaryTransformationType - We don't unique these, since the memory 3078ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// savings are minimal and these are rare. 3079ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTContext::getUnaryTransformType(QualType BaseType, 3080ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType UnderlyingType, 3081ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt UnaryTransformType::UTTKind Kind) 3082ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt const { 3083ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt UnaryTransformType *Ty = 308469d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType, 308569d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor Kind, 308669d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor UnderlyingType->isDependentType() ? 308712fc4b0624706b474fa10308631fa8daf92f340fPeter Collingbourne QualType() : getCanonicalType(UnderlyingType)); 3088ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt Types.push_back(Ty); 3089ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return QualType(Ty, 0); 3090ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 3091ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 3092483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith/// getAutoType - We only unique auto types after they've been deduced. 309334b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTContext::getAutoType(QualType DeducedType) const { 3094483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith void *InsertPos = 0; 3095483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (!DeducedType.isNull()) { 3096483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith // Look in the folding set for an existing type. 3097483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith llvm::FoldingSetNodeID ID; 3098483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoType::Profile(ID, DeducedType); 3099483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos)) 3100483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith return QualType(AT, 0); 3101483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith } 3102483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith 3103483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType); 3104483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith Types.push_back(AT); 3105483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (InsertPos) 3106483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoTypes.InsertNode(AT, InsertPos); 3107483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith return QualType(AT, 0); 310834b41d939a1328f484511c6002ba2456db879a29Richard Smith} 310934b41d939a1328f484511c6002ba2456db879a29Richard Smith 3110b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// getAtomicType - Return the uniqued reference to the atomic type for 3111b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// the given value type. 3112b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanQualType ASTContext::getAtomicType(QualType T) const { 3113b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Unique pointers, to guarantee there is only one pointer of a particular 3114b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // structure. 3115b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman llvm::FoldingSetNodeID ID; 3116b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType::Profile(ID, T); 3117b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3118b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman void *InsertPos = 0; 3119b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos)) 3120b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return QualType(AT, 0); 3121b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3122b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // If the atomic value type isn't canonical, this won't be a canonical type 3123b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // either, so fill in the canonical type field. 3124b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType Canonical; 3125b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (!T.isCanonical()) { 3126b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Canonical = getAtomicType(getCanonicalType(T)); 3127b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3128b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Get the new insert position for the node we care about. 3129b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos); 3130b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 3131b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 3132b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType *New = new (*this, TypeAlignment) AtomicType(T, Canonical); 3133b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Types.push_back(New); 3134b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicTypes.InsertNode(New, InsertPos); 3135b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return QualType(New, 0); 3136b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman} 3137b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3138ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoDeductType - Get type pattern for deducing against 'auto'. 3139ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoDeductType() const { 3140ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith if (AutoDeductTy.isNull()) 3141ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith AutoDeductTy = getAutoType(QualType()); 3142ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith assert(!AutoDeductTy.isNull() && "can't build 'auto' pattern"); 3143ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith return AutoDeductTy; 3144ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 3145ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 3146ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'. 3147ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoRRefDeductType() const { 3148ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith if (AutoRRefDeductTy.isNull()) 3149ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType()); 3150ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern"); 3151ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith return AutoRRefDeductTy; 3152ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 3153ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 31545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTagDeclType - Return the unique reference to the type for the 31555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified TagDecl (struct/union/class/enum) decl. 31564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTagDeclType(const TagDecl *Decl) const { 3157d778f88d32b96a74c9edb7342c81357606a7cdc0Ted Kremenek assert (Decl); 3158e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump // FIXME: What is the design on getTagDeclType when it requires casting 3159e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump // away const? mutable? 3160e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump return getTypeDeclType(const_cast<TagDecl*>(Decl)); 31615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 31625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 31631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result 31641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and 31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// needs to agree with the definition in <stddef.h>. 3166a3ccda58913cc1a4b8564e349448b12acc462da7Anders CarlssonCanQualType ASTContext::getSizeType() const { 3167bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return getFromTargetType(Target->getSizeType()); 31685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 31695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 317029e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5). 317129e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getIntMaxType() const { 317229e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg return getFromTargetType(Target->getIntMaxType()); 317329e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg} 317429e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg 317529e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5). 317629e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getUIntMaxType() const { 317729e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg return getFromTargetType(Target->getUIntMaxType()); 317829e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg} 317929e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg 318064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getSignedWCharType - Return the type of "signed wchar_t". 318164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension. 318264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getSignedWCharType() const { 318364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // FIXME: derive from "Target" ? 318464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis return WCharTy; 318564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis} 318664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 318764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getUnsignedWCharType - Return the type of "unsigned wchar_t". 318864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension. 318964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getUnsignedWCharType() const { 319064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // FIXME: derive from "Target" ? 319164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis return UnsignedIntTy; 319264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis} 319364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 319429e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17) 31958b9023ba35a86838789e2c9034a6128728c547aaChris Lattner/// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9). 31968b9023ba35a86838789e2c9034a6128728c547aaChris LattnerQualType ASTContext::getPointerDiffType() const { 3197bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return getFromTargetType(Target->getPtrDiffType(0)); 31988b9023ba35a86838789e2c9034a6128728c547aaChris Lattner} 31998b9023ba35a86838789e2c9034a6128728c547aaChris Lattner 3200e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===// 3201e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner// Type Operators 3202e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===// 3203e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 32044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCanQualType ASTContext::getCanonicalParamType(QualType T) const { 320554e14c4db764c0636160d26c5bbf491637c83a76John McCall // Push qualifiers into arrays, and then discard any remaining 320654e14c4db764c0636160d26c5bbf491637c83a76John McCall // qualifiers. 320754e14c4db764c0636160d26c5bbf491637c83a76John McCall T = getCanonicalType(T); 3208745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian T = getVariableArrayDecayedType(T); 320954e14c4db764c0636160d26c5bbf491637c83a76John McCall const Type *Ty = T.getTypePtr(); 321054e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Result; 321154e14c4db764c0636160d26c5bbf491637c83a76John McCall if (isa<ArrayType>(Ty)) { 321254e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = getArrayDecayedType(QualType(Ty,0)); 321354e14c4db764c0636160d26c5bbf491637c83a76John McCall } else if (isa<FunctionType>(Ty)) { 321454e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = getPointerType(QualType(Ty, 0)); 321554e14c4db764c0636160d26c5bbf491637c83a76John McCall } else { 321654e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = QualType(Ty, 0); 321754e14c4db764c0636160d26c5bbf491637c83a76John McCall } 321854e14c4db764c0636160d26c5bbf491637c83a76John McCall 321954e14c4db764c0636160d26c5bbf491637c83a76John McCall return CanQualType::CreateUnsafe(Result); 322054e14c4db764c0636160d26c5bbf491637c83a76John McCall} 322154e14c4db764c0636160d26c5bbf491637c83a76John McCall 322262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCallQualType ASTContext::getUnqualifiedArrayType(QualType type, 322362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall Qualifiers &quals) { 322462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall SplitQualType splitType = type.getSplitUnqualifiedType(); 322562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 322662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // FIXME: getSplitUnqualifiedType() actually walks all the way to 322762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // the unqualified desugared type and then drops it on the floor. 322862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // We then have to strip that sugar back off with 322962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // getUnqualifiedDesugaredType(), which is silly. 323062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall const ArrayType *AT = 3231200fa53fd420aa8369586f569dbece04930ad6a3John McCall dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType()); 323262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 323362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // If we don't have an array, just use the results in splitType. 32349dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (!AT) { 3235200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals = splitType.Quals; 3236200fa53fd420aa8369586f569dbece04930ad6a3John McCall return QualType(splitType.Ty, 0); 323728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 323828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 323962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // Otherwise, recurse on the array's element type. 324062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall QualType elementType = AT->getElementType(); 324162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall QualType unqualElementType = getUnqualifiedArrayType(elementType, quals); 324262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 324362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // If that didn't change the element type, AT has no qualifiers, so we 324462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // can just use the results in splitType. 324562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall if (elementType == unqualElementType) { 324662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall assert(quals.empty()); // from the recursive call 3247200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals = splitType.Quals; 3248200fa53fd420aa8369586f569dbece04930ad6a3John McCall return QualType(splitType.Ty, 0); 324962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall } 325062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 325162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // Otherwise, add in the qualifiers from the outermost type, then 325262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // build the type back up. 3253200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals.addConsistentQualifiers(splitType.Quals); 325428e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 32559dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 325662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getConstantArrayType(unqualElementType, CAT->getSize(), 325728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth CAT->getSizeModifier(), 0); 325828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 325928e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 32609dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 326162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0); 326228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 326328e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 32649dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(AT)) { 326562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getVariableArrayType(unqualElementType, 32663fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall VAT->getSizeExpr(), 32679dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getSizeModifier(), 32689dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getIndexTypeCVRQualifiers(), 32699dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getBracketsRange()); 32709dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor } 32719dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor 32729dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(AT); 327362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(), 327428e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth DSAT->getSizeModifier(), 0, 327528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth SourceRange()); 327628e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth} 327728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 32785a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types that 32795a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// may be similar (C++ 4.4), replaces T1 and T2 with the type that 32805a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// they point to and return true. If T1 and T2 aren't pointer types 32815a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// or pointer-to-member types, or if they are not similar at this 32825a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// level, returns false and leaves T1 and T2 unchanged. Top-level 32835a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// qualifiers on T1 and T2 are ignored. This function will typically 32845a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// be called in a loop that successively "unwraps" pointer and 32855a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// pointer-to-member types to compare them at each level. 32865a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregorbool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) { 32875a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const PointerType *T1PtrType = T1->getAs<PointerType>(), 32885a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2PtrType = T2->getAs<PointerType>(); 32895a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1PtrType && T2PtrType) { 32905a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1PtrType->getPointeeType(); 32915a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2PtrType->getPointeeType(); 32925a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 32935a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 32945a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 32955a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(), 32965a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2MPType = T2->getAs<MemberPointerType>(); 32975a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1MPType && T2MPType && 32985a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0), 32995a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor QualType(T2MPType->getClass(), 0))) { 33005a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1MPType->getPointeeType(); 33015a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2MPType->getPointeeType(); 33025a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 33035a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33045a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33054e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1) { 33065a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const ObjCObjectPointerType *T1OPType = T1->getAs<ObjCObjectPointerType>(), 33075a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2OPType = T2->getAs<ObjCObjectPointerType>(); 33085a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1OPType && T2OPType) { 33095a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1OPType->getPointeeType(); 33105a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2OPType->getPointeeType(); 33115a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 33125a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33135a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33145a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33155a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor // FIXME: Block pointers, too? 33165a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33175a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return false; 33185a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor} 33195a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33204ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameInfo 33214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getNameForTemplate(TemplateName Name, 33224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceLocation NameLoc) const { 3323146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall switch (Name.getKind()) { 3324146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::QualifiedTemplate: 3325146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::Template: 33262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: CHECKME: what about DNLoc? 3327146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(), 3328146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 33292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 3330146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::OverloadedTemplate: { 3331146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate(); 3332146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall // DNInfo work in progress: CHECKME: what about DNLoc? 3333146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc); 3334146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3335146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3336146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::DependentTemplate: { 3337146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 33382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName DName; 333980ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall if (DTN->isIdentifier()) { 33402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DName = DeclarationNames.getIdentifier(DTN->getIdentifier()); 33412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(DName, NameLoc); 334280ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } else { 33432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DName = DeclarationNames.getCXXOperatorName(DTN->getOperator()); 33442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: FIXME: source locations? 33452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameLoc DNLoc; 33462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DNLoc.CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding(); 33472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DNLoc.CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding(); 33482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(DName, NameLoc, DNLoc); 334980ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } 335080ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } 335180ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall 3352146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 3353146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 3354146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 3355146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(subst->getParameter()->getDeclName(), 3356146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 3357146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3358146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3359146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParmPack: { 3360146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmPackStorage *subst 3361146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParmPack(); 3362146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(subst->getParameterPack()->getDeclName(), 3363146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 3364146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3365146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3366146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3367146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("bad template name kind!"); 336880ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall} 336980ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall 33704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const { 3371146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall switch (Name.getKind()) { 3372146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::QualifiedTemplate: 3373146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::Template: { 3374146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateDecl *Template = Name.getAsTemplateDecl(); 33753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTemplateParmDecl *TTP 3376146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = dyn_cast<TemplateTemplateParmDecl>(Template)) 33773e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Template = getCanonicalTemplateTemplateParmDecl(TTP); 33783e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 33793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // The canonical template name is the canonical template declaration. 338097fbaa2a38804268a024f1a104b43fcf8b4411b0Argyrios Kyrtzidis return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl())); 33813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 338225a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor 3383146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::OverloadedTemplate: 3384146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("cannot canonicalize overloaded template"); 3385146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3386146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::DependentTemplate: { 3387146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 3388146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall assert(DTN && "Non-dependent template names must refer to template decls."); 3389146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DTN->CanonicalTemplateName; 3390146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3391146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3392146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 3393146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 3394146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 3395146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return getCanonicalTemplateName(subst->getReplacement()); 33961aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 33971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3398146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParmPack: { 3399146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmPackStorage *subst 3400146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParmPack(); 3401146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateTemplateParmDecl *canonParameter 3402146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack()); 3403146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateArgument canonArgPack 3404146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = getCanonicalTemplateArgument(subst->getArgumentPack()); 3405146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack); 3406146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3407146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3408146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3409146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("bad template name!"); 341025a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor} 341125a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor 3412db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregorbool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) { 3413db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor X = getCanonicalTemplateName(X); 3414db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor Y = getCanonicalTemplateName(Y); 3415db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor return X.getAsVoidPointer() == Y.getAsVoidPointer(); 3416db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor} 3417db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor 34181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument 34194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const { 34201275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor switch (Arg.getKind()) { 34211275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Null: 34221275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor return Arg; 34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34241275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Expression: 34251275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor return Arg; 34261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3427d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor case TemplateArgument::Declaration: { 3428d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor if (Decl *D = Arg.getAsDecl()) 3429d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor return TemplateArgument(D->getCanonicalDecl()); 3430d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor return TemplateArgument((Decl*)0); 3431d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor } 34321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3433788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 3434788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate())); 3435a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 3436a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 3437a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgument(getCanonicalTemplateName( 3438a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg.getAsTemplateOrTemplatePattern()), 34392be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor Arg.getNumTemplateExpansions()); 3440a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 34411275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Integral: 3442855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer return TemplateArgument(Arg, getCanonicalType(Arg.getIntegralType())); 34431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34441275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Type: 3445833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TemplateArgument(getCanonicalType(Arg.getAsType())); 34461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34471275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Pack: { 344887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor if (Arg.pack_size() == 0) 344987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor return Arg; 345087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 3451910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *CanonArgs 3452910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = new (*this) TemplateArgument[Arg.pack_size()]; 34531275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor unsigned Idx = 0; 34541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 34551275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor AEnd = Arg.pack_end(); 34561275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor A != AEnd; (void)++A, ++Idx) 34571275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor CanonArgs[Idx] = getCanonicalTemplateArgument(*A); 34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3459910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return TemplateArgument(CanonArgs, Arg.pack_size()); 34601275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor } 34611275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor } 34621275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor 34631275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // Silence GCC warning 3464b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unhandled template argument kind"); 34651275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor} 34661275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor 3467d57959af02b4af695276f4204443afe6e5d86bd8Douglas GregorNestedNameSpecifier * 34684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const { 34691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!NNS) 3470d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return 0; 3471d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3472d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor switch (NNS->getKind()) { 3473d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Identifier: 3474d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // Canonicalize the prefix but keep the identifier the same. 34751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return NestedNameSpecifier::Create(*this, 3476d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor getCanonicalNestedNameSpecifier(NNS->getPrefix()), 3477d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor NNS->getAsIdentifier()); 3478d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3479d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Namespace: 3480d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // A namespace is canonical; build a nested-name-specifier with 3481d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // this namespace and no prefix. 348214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(*this, 0, 348314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespace()->getOriginalNamespace()); 348414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 348514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor case NestedNameSpecifier::NamespaceAlias: 348614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor // A namespace is canonical; build a nested-name-specifier with 348714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor // this namespace and no prefix. 348814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(*this, 0, 348914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespaceAlias()->getNamespace() 349014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor ->getOriginalNamespace()); 3491d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3492d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::TypeSpec: 3493d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: { 3494d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor QualType T = getCanonicalType(QualType(NNS->getAsType(), 0)); 3495264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor 3496264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // If we have some kind of dependent-named type (e.g., "typename T::type"), 3497264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // break it apart into its prefix and identifier, then reconsititute those 3498264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // as the canonical nested-name-specifier. This is required to canonicalize 3499264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // a dependent nested-name-specifier involving typedefs of dependent-name 3500264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // types, e.g., 3501264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // typedef typename T::type T1; 3502264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // typedef typename T1::type T2; 350316412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman if (const DependentNameType *DNT = T->getAs<DependentNameType>()) 350416412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman return NestedNameSpecifier::Create(*this, DNT->getQualifier(), 3505264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor const_cast<IdentifierInfo *>(DNT->getIdentifier())); 3506264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor 350716412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // Otherwise, just canonicalize the type, and force it to be a TypeSpec. 350816412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // FIXME: Why are TypeSpec and TypeSpecWithTemplate distinct in the 350916412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // first place? 35103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return NestedNameSpecifier::Create(*this, 0, false, 35113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall const_cast<Type*>(T.getTypePtr())); 3512d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 3513d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3514d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Global: 3515d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // The global specifier is canonical and unique. 3516d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return NNS; 3517d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 3518d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 35197530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid NestedNameSpecifier::Kind!"); 3520d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor} 3521d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3522c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner 35234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadconst ArrayType *ASTContext::getAsArrayType(QualType T) const { 3524c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Handle the non-qualified case efficiently. 3525a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor if (!T.hasLocalQualifiers()) { 3526c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Handle the common positive case fast. 3527c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ArrayType *AT = dyn_cast<ArrayType>(T)) 3528c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return AT; 3529c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner } 35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Handle the common negative case fast. 35323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!isa<ArrayType>(T.getCanonicalType())) 3533c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return 0; 35341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35350953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Apply any qualifiers from the array type to the element type. This 3536c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // implements C99 6.7.3p8: "If the specification of an array type includes 3537c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // any type qualifiers, the element type is so qualified, not the array type." 35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3539c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If we get here, we either have type qualifiers on the type, or we have 3540c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // sugar such as a typedef in the way. If we have type qualifiers on the type 354150d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor // we must propagate them down into the element type. 35420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 35433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType split = T.getSplitDesugaredType(); 3544200fa53fd420aa8369586f569dbece04930ad6a3John McCall Qualifiers qs = split.Quals; 35451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3546c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If we have a simple case, just return now. 3547200fa53fd420aa8369586f569dbece04930ad6a3John McCall const ArrayType *ATy = dyn_cast<ArrayType>(split.Ty); 35483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (ATy == 0 || qs.empty()) 3549c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return ATy; 35501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3551c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Otherwise, we have an array and we have qualifiers on it. Push the 3552c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // qualifiers into the array element type and return a new array type. 35533b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs); 35541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3555c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy)) 3556c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(), 3557c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner CAT->getSizeModifier(), 35580953e767ff7817f97b3ab20896b229891eeff45bJohn McCall CAT->getIndexTypeCVRQualifiers())); 3559c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy)) 3560c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return cast<ArrayType>(getIncompleteArrayType(NewEltTy, 3561c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner IAT->getSizeModifier(), 35620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall IAT->getIndexTypeCVRQualifiers())); 3563898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 35641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const DependentSizedArrayType *DSAT 3565898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor = dyn_cast<DependentSizedArrayType>(ATy)) 3566898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return cast<ArrayType>( 35671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDependentSizedArrayType(NewEltTy, 35683fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall DSAT->getSizeExpr(), 3569898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor DSAT->getSizeModifier(), 35700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall DSAT->getIndexTypeCVRQualifiers(), 35717e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor DSAT->getBracketsRange())); 35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3573c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner const VariableArrayType *VAT = cast<VariableArrayType>(ATy); 35747e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor return cast<ArrayType>(getVariableArrayType(NewEltTy, 35753fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall VAT->getSizeExpr(), 3576c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner VAT->getSizeModifier(), 35770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall VAT->getIndexTypeCVRQualifiers(), 35787e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor VAT->getBracketsRange())); 357977c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner} 358077c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner 3581ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getAdjustedParameterType(QualType T) const { 358279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // C99 6.7.5.3p7: 358379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // A declaration of a parameter as "array of type" shall be 358479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // adjusted to "qualified pointer to type", where the type 358579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // qualifiers (if any) are those specified within the [ and ] of 358679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // the array type derivation. 358779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor if (T->isArrayType()) 358879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return getArrayDecayedType(T); 358979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 359079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // C99 6.7.5.3p8: 359179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // A declaration of a parameter as "function returning type" 359279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // shall be adjusted to "pointer to function returning type", as 359379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // in 6.3.2.1. 359479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor if (T->isFunctionType()) 359579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return getPointerType(T); 359679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 359779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return T; 359879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor} 359979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 3600ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getSignatureParameterType(QualType T) const { 360179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor T = getVariableArrayDecayedType(T); 360279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor T = getAdjustedParameterType(T); 360379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return T.getUnqualifiedType(); 360479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor} 360579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 3606e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// getArrayDecayedType - Return the properly qualified result of decaying the 3607e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// specified array type to a pointer. This operation is non-trivial when 3608e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// handling typedefs etc. The canonical type of "T" must be an array type, 3609e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// this returns a pointer to a properly qualified element of the array. 3610e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// 3611e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// See C99 6.7.5.3p7 and C99 6.3.2.1p3. 36124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getArrayDecayedType(QualType Ty) const { 3613c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Get the element type with 'getAsArrayType' so that we don't lose any 3614c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // typedefs in the element type of the array. This also handles propagation 3615c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // of type qualifiers from the array type into the element type if present 3616c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // (C99 6.7.3p8). 3617c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner const ArrayType *PrettyArrayType = getAsArrayType(Ty); 3618c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner assert(PrettyArrayType && "Not an array type!"); 36191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3620c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner QualType PtrTy = getPointerType(PrettyArrayType->getElementType()); 3621e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 3622e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner // int x[restrict 4] -> int *restrict 36230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers()); 3624e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner} 3625e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 36263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(const ArrayType *array) const { 36273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return getBaseElementType(array->getElementType()); 36285e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor} 36295e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor 36303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(QualType type) const { 36313b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Qualifiers qs; 36323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall while (true) { 36333b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType split = type.getSplitDesugaredType(); 3634200fa53fd420aa8369586f569dbece04930ad6a3John McCall const ArrayType *array = split.Ty->getAsArrayTypeUnsafe(); 36353b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!array) break; 36361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall type = array->getElementType(); 3638200fa53fd420aa8369586f569dbece04930ad6a3John McCall qs.addConsistentQualifiers(split.Quals); 36393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 36401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return getQualifiedType(type, qs); 36426183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson} 36436183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson 36440de78998e7bda473b408437053e48661b510d453Fariborz Jahanian/// getConstantArrayElementCount - Returns number of constant array elements. 36451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpuint64_t 36460de78998e7bda473b408437053e48661b510d453Fariborz JahanianASTContext::getConstantArrayElementCount(const ConstantArrayType *CA) const { 36470de78998e7bda473b408437053e48661b510d453Fariborz Jahanian uint64_t ElementCount = 1; 36480de78998e7bda473b408437053e48661b510d453Fariborz Jahanian do { 36490de78998e7bda473b408437053e48661b510d453Fariborz Jahanian ElementCount *= CA->getSize().getZExtValue(); 36500de78998e7bda473b408437053e48661b510d453Fariborz Jahanian CA = dyn_cast<ConstantArrayType>(CA->getElementType()); 36510de78998e7bda473b408437053e48661b510d453Fariborz Jahanian } while (CA); 36520de78998e7bda473b408437053e48661b510d453Fariborz Jahanian return ElementCount; 36530de78998e7bda473b408437053e48661b510d453Fariborz Jahanian} 36540de78998e7bda473b408437053e48661b510d453Fariborz Jahanian 36555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFloatingRank - Return a relative rank for floating point types. 36565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// This routine will assert if passed a built-in type that isn't a float. 3657a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattnerstatic FloatingRank getFloatingRank(QualType T) { 3658183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType *CT = T->getAs<ComplexType>()) 36595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return getFloatingRank(CT->getElementType()); 3660a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner 3661183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type"); 3662183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall switch (T->getAs<BuiltinType>()->getKind()) { 3663b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("getFloatingRank(): not a floating type"); 3664aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: return HalfRank; 36655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Float: return FloatRank; 36665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Double: return DoubleRank; 36675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongDouble: return LongDoubleRank; 36685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 36695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 36705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 36711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getFloatingTypeOfSizeWithinDomain - Returns a real floating 36721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// point or a complex type (based on typeDomain/typeSize). 3673716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeDomain' is a real floating point or complex type. 3674716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeSize' is a real floating point or complex type. 36751361b11066239ea15764a2a844405352d87296b3Chris LattnerQualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size, 36761361b11066239ea15764a2a844405352d87296b3Chris Lattner QualType Domain) const { 36771361b11066239ea15764a2a844405352d87296b3Chris Lattner FloatingRank EltRank = getFloatingRank(Size); 36781361b11066239ea15764a2a844405352d87296b3Chris Lattner if (Domain->isComplexType()) { 36791361b11066239ea15764a2a844405352d87296b3Chris Lattner switch (EltRank) { 3680561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie case HalfRank: llvm_unreachable("Complex half is not supported"); 3681f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case FloatRank: return FloatComplexTy; 3682f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case DoubleRank: return DoubleComplexTy; 3683f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case LongDoubleRank: return LongDoubleComplexTy; 3684f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff } 3685f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff } 36861361b11066239ea15764a2a844405352d87296b3Chris Lattner 36871361b11066239ea15764a2a844405352d87296b3Chris Lattner assert(Domain->isRealFloatingType() && "Unknown domain!"); 36881361b11066239ea15764a2a844405352d87296b3Chris Lattner switch (EltRank) { 3689561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie case HalfRank: llvm_unreachable("Half ranks are not valid here"); 36901361b11066239ea15764a2a844405352d87296b3Chris Lattner case FloatRank: return FloatTy; 36911361b11066239ea15764a2a844405352d87296b3Chris Lattner case DoubleRank: return DoubleTy; 36921361b11066239ea15764a2a844405352d87296b3Chris Lattner case LongDoubleRank: return LongDoubleTy; 36935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3694561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie llvm_unreachable("getFloatingRank(): illegal value for rank"); 36955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 36965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 36977cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// getFloatingTypeOrder - Compare the rank of the two specified floating 36987cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// point types, ignoring the domain of the type (i.e. 'double' == 36997cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If 37001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1. 37014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const { 3702a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner FloatingRank LHSR = getFloatingRank(LHS); 3703a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner FloatingRank RHSR = getFloatingRank(RHS); 37041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3705a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner if (LHSR == RHSR) 3706fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return 0; 3707a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner if (LHSR > RHSR) 3708fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return 1; 3709fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return -1; 37105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 37115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3712f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This 3713f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// routine will assert if passed a built-in type that isn't an integer or enum, 3714f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// or if it is not canonicalized. 3715f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallunsigned ASTContext::getIntegerRank(const Type *T) const { 3716467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(T->isCanonicalUnqualified() && "T should be canonicalized"); 3717f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 3718f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner switch (cast<BuiltinType>(T)->getKind()) { 3719b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("getIntegerRank(): not a built-in integer"); 37207cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Bool: 3721f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 1 + (getIntWidth(BoolTy) << 3); 37227cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Char_S: 37237cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Char_U: 37247cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::SChar: 37257cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UChar: 3726f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 2 + (getIntWidth(CharTy) << 3); 37277cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Short: 37287cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UShort: 3729f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 3 + (getIntWidth(ShortTy) << 3); 37307cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Int: 37317cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UInt: 3732f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 4 + (getIntWidth(IntTy) << 3); 37337cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Long: 37347cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::ULong: 3735f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 5 + (getIntWidth(LongTy) << 3); 37367cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::LongLong: 37377cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::ULongLong: 3738f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 6 + (getIntWidth(LongLongTy) << 3); 37392df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::Int128: 37402df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::UInt128: 37412df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner return 7 + (getIntWidth(Int128Ty) << 3); 3742f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner } 3743f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner} 3744f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner 374504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \brief Whether this is a promotable bitfield reference according 374604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions). 374704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// 374804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \returns the type this bit-field will promote to, or NULL if no 374904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// promotion occurs. 37504ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::isPromotableBitField(Expr *E) const { 3751ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor if (E->isTypeDependent() || E->isValueDependent()) 3752ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor return QualType(); 3753ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor 375404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman FieldDecl *Field = E->getBitField(); 375504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (!Field) 375604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return QualType(); 375704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 375804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman QualType FT = Field->getType(); 375904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 3760a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith uint64_t BitWidth = Field->getBitWidthValue(*this); 376104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman uint64_t IntSize = getTypeSize(IntTy); 376204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // GCC extension compatibility: if the bit-field size is less than or equal 376304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // to the size of int, it gets promoted no matter what its type is. 376404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // For instance, unsigned long bf : 4 gets promoted to signed int. 376504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (BitWidth < IntSize) 376604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return IntTy; 376704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 376804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (BitWidth == IntSize) 376904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy; 377004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 377104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // Types bigger than int are not subject to promotions, and therefore act 377204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // like the base type. 377304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // FIXME: This doesn't quite match what gcc does, but what gcc does here 377404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // is ridiculous. 377504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return QualType(); 377604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman} 377704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 3778a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// getPromotedIntegerType - Returns the type that Promotable will 3779a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable 3780a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// integer type. 37814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPromotedIntegerType(QualType Promotable) const { 3782a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(!Promotable.isNull()); 3783a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(Promotable->isPromotableIntegerType()); 3784842aef8d942a880eeb9535d40de31a86838264cbJohn McCall if (const EnumType *ET = Promotable->getAs<EnumType>()) 3785842aef8d942a880eeb9535d40de31a86838264cbJohn McCall return ET->getDecl()->getPromotionType(); 378668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman 378768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (const BuiltinType *BT = Promotable->getAs<BuiltinType>()) { 378868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t 378968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // (3.9.1) can be converted to a prvalue of the first of the following 379068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // types that can represent all the values of its underlying type: 379168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // int, unsigned int, long int, unsigned long int, long long int, or 379268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // unsigned long long int [...] 379368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // FIXME: Is there some better way to compute this? 379468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (BT->getKind() == BuiltinType::WChar_S || 379568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::WChar_U || 379668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::Char16 || 379768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::Char32) { 379868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S; 379968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman uint64_t FromSize = getTypeSize(BT); 380068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy, 380168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman LongLongTy, UnsignedLongLongTy }; 380268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman for (size_t Idx = 0; Idx < llvm::array_lengthof(PromoteTypes); ++Idx) { 380368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman uint64_t ToSize = getTypeSize(PromoteTypes[Idx]); 380468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (FromSize < ToSize || 380568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman (FromSize == ToSize && 380668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) 380768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman return PromoteTypes[Idx]; 380868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 380968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman llvm_unreachable("char type should fit into long long"); 381068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 381168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 381268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman 381368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // At this point, we should have a signed or unsigned integer type. 3814a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman if (Promotable->isSignedIntegerType()) 3815a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman return IntTy; 3816a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman uint64_t PromotableSize = getTypeSize(Promotable); 3817a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman uint64_t IntSize = getTypeSize(IntTy); 3818a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize); 3819a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy; 3820a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman} 3821a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman 382231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// \brief Recurses in pointer/array types until it finds an objc retainable 382331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// type and returns its ownership. 382431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios KyrtzidisQualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const { 382531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis while (!T.isNull()) { 382631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis if (T.getObjCLifetime() != Qualifiers::OCL_None) 382731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis return T.getObjCLifetime(); 382831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis if (T->isArrayType()) 382931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis T = getBaseElementType(T); 383031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else if (const PointerType *PT = T->getAs<PointerType>()) 383131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis T = PT->getPointeeType(); 383231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 383328445f0b62f6aed851ff87ce64d9b19200d3211fArgyrios Kyrtzidis T = RT->getPointeeType(); 383431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else 383531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis break; 383631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis } 383731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis 383831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis return Qualifiers::OCL_None; 383931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis} 384031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis 38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getIntegerTypeOrder - Returns the highest ranked integer type: 38427cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If 38431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1. 38444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const { 3845f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *LHSC = getCanonicalType(LHS).getTypePtr(); 3846f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *RHSC = getCanonicalType(RHS).getTypePtr(); 38477cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSC == RHSC) return 0; 38481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3849f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner bool LHSUnsigned = LHSC->isUnsignedIntegerType(); 3850f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner bool RHSUnsigned = RHSC->isUnsignedIntegerType(); 38511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38527cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner unsigned LHSRank = getIntegerRank(LHSC); 38537cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner unsigned RHSRank = getIntegerRank(RHSC); 38541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38557cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSUnsigned == RHSUnsigned) { // Both signed or both unsigned. 38567cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSRank == RHSRank) return 0; 38577cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return LHSRank > RHSRank ? 1 : -1; 38587cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner } 38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38607cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // Otherwise, the LHS is signed and the RHS is unsigned or visa versa. 38617cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSUnsigned) { 38627cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the unsigned [LHS] type is larger, return it. 38637cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSRank >= RHSRank) 38647cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return 1; 38651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38667cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the signed type can represent all values of the unsigned type, it 38677cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // wins. Because we are dealing with 2's complement and types that are 38681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // powers of two larger than each other, this is always safe. 38697cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return -1; 38707cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner } 38717cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner 38727cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the unsigned [RHS] type is larger, return it. 38737cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (RHSRank >= LHSRank) 38747cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return -1; 38751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38767cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the signed type can represent all values of the unsigned type, it 38777cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // wins. Because we are dealing with 2's complement and types that are 38781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // powers of two larger than each other, this is always safe. 38797cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return 1; 38805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 388171993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson 388279cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlssonstatic RecordDecl * 3883ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, 3884ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, IdentifierInfo *Id) { 3885ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation Loc; 38864e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Ctx.getLangOpts().CPlusPlus) 3887ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 388879cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson else 3889ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 389079cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson} 3891ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara 38921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// getCFConstantStringType - Return the type used for constant CFStrings. 38934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getCFConstantStringType() const { 389471993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson if (!CFConstantStringTypeDecl) { 38951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CFConstantStringTypeDecl = 3896ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara CreateRecordDecl(*this, TTK_Struct, TUDecl, 389779cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("NSConstantString")); 38985cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall CFConstantStringTypeDecl->startDefinition(); 389979cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson 3900f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson QualType FieldTypes[4]; 39011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 390271993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // const int *isa; 39030953e767ff7817f97b3ab20896b229891eeff45bJohn McCall FieldTypes[0] = getPointerType(IntTy.withConst()); 3904f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson // int flags; 3905f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson FieldTypes[1] = IntTy; 390671993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // const char *str; 39070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall FieldTypes[2] = getPointerType(CharTy.withConst()); 390871993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // long length; 39091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldTypes[3] = LongTy; 39101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 391144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Create fields 391244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor for (unsigned i = 0; i < 4; ++i) { 39131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl, 3914ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 391544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor SourceLocation(), 0, 3916a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 39171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*BitWidth=*/0, 39187a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 3919ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 39202888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 392117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis CFConstantStringTypeDecl->addDecl(Field); 392244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 392344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 3924838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor CFConstantStringTypeDecl->completeDefinition(); 392571993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson } 39261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 392771993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson return getTagDeclType(CFConstantStringTypeDecl); 39288467583c2704e7a9691ea56939a029015f0ade0aGabor Greif} 3929b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson 3930319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregorvoid ASTContext::setCFConstantStringType(QualType T) { 39316217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *Rec = T->getAs<RecordType>(); 3932319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor assert(Rec && "Invalid CFConstantStringType"); 3933319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor CFConstantStringTypeDecl = Rec->getDecl(); 3934319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor} 3935319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor 39364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorType() const { 3937adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump if (BlockDescriptorType) 3938adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump return getTagDeclType(BlockDescriptorType); 3939adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3940adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump RecordDecl *T; 3941adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump // FIXME: Needs the FlagAppleBlock bit. 3942ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 394379cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("__block_descriptor")); 39445cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall T->startDefinition(); 3945adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3946adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump QualType FieldTypes[] = { 3947adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump UnsignedLongTy, 3948adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump UnsignedLongTy, 3949adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump }; 3950adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3951adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump const char *FieldNames[] = { 3952adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump "reserved", 3953083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "Size" 3954adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump }; 3955adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3956adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump for (size_t i = 0; i < 2; ++i) { 3957ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 3958adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump SourceLocation(), 3959adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump &Idents.get(FieldNames[i]), 3960a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 3961adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump /*BitWidth=*/0, 39627a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 3963ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 39642888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 3965adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump T->addDecl(Field); 3966adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump } 3967adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3968838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 3969adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3970adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump BlockDescriptorType = T; 3971adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3972adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump return getTagDeclType(BlockDescriptorType); 3973adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump} 3974adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 39754ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorExtendedType() const { 3976083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump if (BlockDescriptorExtendedType) 3977083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump return getTagDeclType(BlockDescriptorExtendedType); 3978083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3979083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump RecordDecl *T; 3980083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump // FIXME: Needs the FlagAppleBlock bit. 3981ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 398279cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("__block_descriptor_withcopydispose")); 39835cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall T->startDefinition(); 3984083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3985083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump QualType FieldTypes[] = { 3986083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump UnsignedLongTy, 3987083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump UnsignedLongTy, 3988083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump getPointerType(VoidPtrTy), 3989083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump getPointerType(VoidPtrTy) 3990083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump }; 3991083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3992083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump const char *FieldNames[] = { 3993083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "reserved", 3994083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "Size", 3995083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "CopyFuncPtr", 3996083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "DestroyFuncPtr" 3997083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump }; 3998083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3999083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump for (size_t i = 0; i < 4; ++i) { 4000ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 4001083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump SourceLocation(), 4002083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump &Idents.get(FieldNames[i]), 4003a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 4004083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump /*BitWidth=*/0, 40057a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 4006ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 40072888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 4008083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump T->addDecl(Field); 4009083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump } 4010083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4011838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 4012083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4013083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump BlockDescriptorExtendedType = T; 4014083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4015083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump return getTagDeclType(BlockDescriptorExtendedType); 4016083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump} 4017083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 40184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::BlockRequiresCopying(QualType Ty) const { 4019f85e193739c953358c865005855253af4f68a497John McCall if (Ty->isObjCRetainableType()) 4020af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return true; 40214e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 4022e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian if (const RecordType *RT = Ty->getAs<RecordType>()) { 4023e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 4024ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt return RD->hasConstCopyConstructor(); 4025e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian 4026e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian } 4027e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian } 4028af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return false; 4029af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump} 4030af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 40314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 40325f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerASTContext::BuildByRefType(StringRef DeclName, QualType Ty) const { 4033af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // type = struct __Block_byref_1_X { 4034ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // void *__isa; 4035af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // struct __Block_byref_1_X *__forwarding; 4036ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // unsigned int __flags; 4037ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // unsigned int __size; 4038a7e6845660f91ec611427e1db842780e1ec12bdbEli Friedman // void *__copy_helper; // as needed 4039a7e6845660f91ec611427e1db842780e1ec12bdbEli Friedman // void *__destroy_help // as needed 4040af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // int X; 4041ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // } * 4042ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump 4043af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump bool HasCopyAndDispose = BlockRequiresCopying(Ty); 4044af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4045af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // FIXME: Move up 4046f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<36> Name; 4047f5942a44880be26878592eb052b737579349411eBenjamin Kramer llvm::raw_svector_ostream(Name) << "__Block_byref_" << 4048f5942a44880be26878592eb052b737579349411eBenjamin Kramer ++UniqueBlockByRefTypeID << '_' << DeclName; 4049af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump RecordDecl *T; 4050ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, &Idents.get(Name.str())); 4051af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump T->startDefinition(); 4052af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump QualType Int32Ty = IntTy; 4053af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump assert(getIntWidth(IntTy) == 32 && "non-32bit int not supported"); 4054af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump QualType FieldTypes[] = { 4055af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4056af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(getTagDeclType(T)), 4057af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Int32Ty, 4058af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Int32Ty, 4059af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4060af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4061af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Ty 4062af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump }; 4063af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 40645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FieldNames[] = { 4065af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__isa", 4066af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__forwarding", 4067af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__flags", 4068af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__size", 4069af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__copy_helper", 4070af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__destroy_helper", 4071af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump DeclName, 4072af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump }; 4073af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4074af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump for (size_t i = 0; i < 7; ++i) { 4075af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump if (!HasCopyAndDispose && i >=4 && i <= 5) 4076af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump continue; 4077af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 4078ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 4079af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump &Idents.get(FieldNames[i]), 4080a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 40817a614d8380297fcd2bc23986241905d97222948cRichard Smith /*BitWidth=*/0, /*Mutable=*/false, 4082ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 40832888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 4084af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump T->addDecl(Field); 4085af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump } 4086af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4087838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 4088af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4089af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return getPointerType(getTagDeclType(T)); 4090ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump} 4091ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump 4092e97179c675b341927807c718be215c8d1aab8acbDouglas GregorTypedefDecl *ASTContext::getObjCInstanceTypeDecl() { 4093e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor if (!ObjCInstanceTypeDecl) 4094e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor ObjCInstanceTypeDecl = TypedefDecl::Create(*this, 4095e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor getTranslationUnitDecl(), 4096e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor SourceLocation(), 4097e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor SourceLocation(), 4098e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor &Idents.get("instancetype"), 4099e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor getTrivialTypeSourceInfo(getObjCIdType())); 4100e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor return ObjCInstanceTypeDecl; 4101e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor} 4102e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor 4103e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// This returns true if a type has been typedefed to BOOL: 4104e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// typedef <type> BOOL; 41052d99833e8c956775f2183601cd120b65b569c867Chris Lattnerstatic bool isTypeTypedefedAsBOOL(QualType T) { 4106e8c49533521c40643653f943d47229e62d277f88Anders Carlsson if (const TypedefType *TT = dyn_cast<TypedefType>(T)) 4107bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner if (IdentifierInfo *II = TT->getDecl()->getIdentifier()) 4108bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner return II->isStr("BOOL"); 41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 411085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson return false; 411185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson} 411285f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson 4113a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingTypeSize returns size of type for objective-c encoding 411433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// purpose. 41154ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const { 4116f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (!type->isIncompleteArrayType() && type->isIncompleteType()) 4117f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return CharUnits::Zero(); 4118f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4119199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits sz = getTypeSizeInChars(type); 41201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 412133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Make all integer and enum types at least as large as an int 41222ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (sz.isPositive() && type->isIntegralOrEnumerationType()) 4123199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck sz = std::max(sz, getTypeSizeInChars(IntTy)); 412433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Treat arrays as pointers, since that's how they're passed in. 412533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian else if (type->isArrayType()) 4126199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck sz = getTypeSizeInChars(VoidPtrTy); 4127aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck return sz; 4128199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck} 4129199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck 4130199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstatic inline 4131199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstd::string charUnitsToString(const CharUnits &CU) { 4132199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck return llvm::itostr(CU.getQuantity()); 413333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 413433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 41356b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// getObjCEncodingForBlock - Return the encoded type for this block 41365e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall/// declaration. 41376b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallstd::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const { 41386b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall std::string S; 41396b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 41405e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall const BlockDecl *Decl = Expr->getBlockDecl(); 41415e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType BlockTy = 41425e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Expr->getType()->getAs<BlockPointerType>()->getPointeeType(); 41435e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Encode result type. 4144c71a4915ca216847599d03cab4ed1c5086b0eb43John McCall getObjCEncodingForType(BlockTy->getAs<FunctionType>()->getResultType(), S); 41455e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Compute size of all parameters. 41465e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Start with computing size of a pointer in number of bytes. 41475e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // FIXME: There might(should) be a better way of doing this computation! 41485e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall SourceLocation Loc; 4149199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 4150199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ParmOffset = PtrSize; 41516f46c2653c1545cc3fef0c0df996d18160160ce8Fariborz Jahanian for (BlockDecl::param_const_iterator PI = Decl->param_begin(), 41525e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall E = Decl->param_end(); PI != E; ++PI) { 41535e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType PType = (*PI)->getType(); 4154aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck CharUnits sz = getObjCEncodingTypeSize(PType); 4155075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian if (sz.isZero()) 4156075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian continue; 4157199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck assert (sz.isPositive() && "BlockExpr - Incomplete param type"); 41585e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmOffset += sz; 41595e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 41605e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Size of the argument frame 4161199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 41625e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Block pointer and offset. 41635e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall S += "@?0"; 41645e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall 41655e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Argument types. 41665e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmOffset = PtrSize; 41675e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E = 41685e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Decl->param_end(); PI != E; ++PI) { 41695e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmVarDecl *PVDecl = *PI; 41705e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType PType = PVDecl->getOriginalType(); 41715e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall if (const ArrayType *AT = 41725e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 41735e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Use array's original type only if it has known number of 41745389f48b24937ad7b4093307128b3cbf25235654David Chisnall // elements. 41755389f48b24937ad7b4093307128b3cbf25235654David Chisnall if (!isa<ConstantArrayType>(AT)) 41765389f48b24937ad7b4093307128b3cbf25235654David Chisnall PType = PVDecl->getType(); 41775389f48b24937ad7b4093307128b3cbf25235654David Chisnall } else if (PType->isFunctionType()) 41785389f48b24937ad7b4093307128b3cbf25235654David Chisnall PType = PVDecl->getType(); 41795389f48b24937ad7b4093307128b3cbf25235654David Chisnall getObjCEncodingForType(PType, S); 41805389f48b24937ad7b4093307128b3cbf25235654David Chisnall S += charUnitsToString(ParmOffset); 41815389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset += getObjCEncodingTypeSize(PType); 41825389f48b24937ad7b4093307128b3cbf25235654David Chisnall } 41836b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 41846b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall return S; 41855389f48b24937ad7b4093307128b3cbf25235654David Chisnall} 41865389f48b24937ad7b4093307128b3cbf25235654David Chisnall 4187f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl, 41885389f48b24937ad7b4093307128b3cbf25235654David Chisnall std::string& S) { 41895389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Encode result type. 41905389f48b24937ad7b4093307128b3cbf25235654David Chisnall getObjCEncodingForType(Decl->getResultType(), S); 41915389f48b24937ad7b4093307128b3cbf25235654David Chisnall CharUnits ParmOffset; 41925389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Compute size of all parameters. 41935389f48b24937ad7b4093307128b3cbf25235654David Chisnall for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 41945389f48b24937ad7b4093307128b3cbf25235654David Chisnall E = Decl->param_end(); PI != E; ++PI) { 41955389f48b24937ad7b4093307128b3cbf25235654David Chisnall QualType PType = (*PI)->getType(); 41965389f48b24937ad7b4093307128b3cbf25235654David Chisnall CharUnits sz = getObjCEncodingTypeSize(PType); 4197f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (sz.isZero()) 41987e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian continue; 41997e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian 42005389f48b24937ad7b4093307128b3cbf25235654David Chisnall assert (sz.isPositive() && 4201f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor "getObjCEncodingForFunctionDecl - Incomplete param type"); 42025389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset += sz; 42035389f48b24937ad7b4093307128b3cbf25235654David Chisnall } 42045389f48b24937ad7b4093307128b3cbf25235654David Chisnall S += charUnitsToString(ParmOffset); 42055389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset = CharUnits::Zero(); 42065389f48b24937ad7b4093307128b3cbf25235654David Chisnall 42075389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Argument types. 42085389f48b24937ad7b4093307128b3cbf25235654David Chisnall for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 42095389f48b24937ad7b4093307128b3cbf25235654David Chisnall E = Decl->param_end(); PI != E; ++PI) { 42105389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmVarDecl *PVDecl = *PI; 42115389f48b24937ad7b4093307128b3cbf25235654David Chisnall QualType PType = PVDecl->getOriginalType(); 42125389f48b24937ad7b4093307128b3cbf25235654David Chisnall if (const ArrayType *AT = 42135389f48b24937ad7b4093307128b3cbf25235654David Chisnall dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 42145389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Use array's original type only if it has known number of 42155e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // elements. 42165e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall if (!isa<ConstantArrayType>(AT)) 42175e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall PType = PVDecl->getType(); 42185e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } else if (PType->isFunctionType()) 42195e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall PType = PVDecl->getType(); 42205e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall getObjCEncodingForType(PType, S); 4221199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 4222aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck ParmOffset += getObjCEncodingTypeSize(PType); 42235e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 4224f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4225f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return false; 42265e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall} 42275e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall 4228dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// getObjCEncodingForMethodParameter - Return the encoded type for a single 4229dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// method parameter or return type. If Extended, include class names and 4230dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// block object types. 4231dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilsonvoid ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, 4232dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson QualType T, std::string& S, 4233dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool Extended) const { 4234dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode type qualifer, 'in', 'inout', etc. for the parameter. 4235dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeQualifier(QT, S); 4236dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode parameter type. 4237dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(T, S, true, true, 0, 4238dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson true /*OutermostType*/, 4239dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /*EncodingProperty*/, 4240dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /*StructField*/, 4241dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Extended /*EncodeBlockParameters*/, 4242dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Extended /*EncodeClassNames*/); 4243dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson} 4244dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson 4245a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingForMethodDecl - Return the encoded type for this method 424633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// declaration. 4247f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, 4248dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson std::string& S, 4249dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool Extended) const { 4250c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: This is not very efficient. 4251dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode return type. 4252dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(), 4253dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Decl->getResultType(), S, Extended); 425433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Compute size of all parameters. 425533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Start with computing size of a pointer in number of bytes. 425633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // FIXME: There might(should) be a better way of doing this computation! 425733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian SourceLocation Loc; 4258199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 425933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // The first two arguments (self and _cmd) are pointers; account for 426033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // their size. 4261199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ParmOffset = 2 * PtrSize; 4262491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(), 42637732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian E = Decl->sel_param_end(); PI != E; ++PI) { 426489951a86b594513c2a013532ed45d197413b1087Chris Lattner QualType PType = (*PI)->getType(); 4265aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck CharUnits sz = getObjCEncodingTypeSize(PType); 4266f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (sz.isZero()) 42677e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian continue; 42687e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian 4269199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck assert (sz.isPositive() && 4270199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck "getObjCEncodingForMethodDecl - Incomplete param type"); 427133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian ParmOffset += sz; 427233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian } 4273199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 427433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian S += "@0:"; 4275199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(PtrSize); 42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 427733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Argument types. 427833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian ParmOffset = 2 * PtrSize; 4279491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(), 42807732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian E = Decl->sel_param_end(); PI != E; ++PI) { 4281491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis const ParmVarDecl *PVDecl = *PI; 42821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType PType = PVDecl->getOriginalType(); 42834306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian if (const ArrayType *AT = 4284ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 4285ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff // Use array's original type only if it has known number of 4286ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff // elements. 4287bb3fde337fb712c0e6da8790d431621be4793048Steve Naroff if (!isa<ConstantArrayType>(AT)) 4288ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff PType = PVDecl->getType(); 4289ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff } else if (PType->isFunctionType()) 4290ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff PType = PVDecl->getType(); 4291dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(), 4292dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson PType, S, Extended); 4293199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 4294aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck ParmOffset += getObjCEncodingTypeSize(PType); 429533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian } 4296f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4297f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return false; 429833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 429933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 4300c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// getObjCEncodingForPropertyDecl - Return the encoded type for this 430183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// property declaration. If non-NULL, Container must be either an 4302c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be 4303c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// NULL when getting encodings for protocol properties. 43041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Property attributes are stored as a comma-delimited C string. The simple 43051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// attributes readonly and bycopy are encoded as single characters. The 43061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parametrized attributes, getter=name, setter=name, and ivar=name, are 43071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// encoded as single characters, followed by an identifier. Property types 43081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// are also encoded as a parametrized attribute. The characters used to encode 430983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// these attributes are defined by the following enumeration: 431083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @code 431183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// enum PropertyAttributes { 431283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyReadOnly = 'R', // property is read-only. 431383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyBycopy = 'C', // property is a copy of the value last assigned 431483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyByref = '&', // property is a reference to the value last assigned 431583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyDynamic = 'D', // property is dynamic 431683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyGetter = 'G', // followed by getter selector name 431783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertySetter = 'S', // followed by setter selector name 431883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyInstanceVariable = 'V' // followed by instance variable name 43190d4cb85130d91da61c45aecb9fd31c7097a7cfccBob Wilson/// kPropertyType = 'T' // followed by old-style type encoding. 432083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyWeak = 'W' // 'weak' property 432183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyStrong = 'P' // property GC'able 432283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyNonAtomic = 'N' // property non-atomic 432383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// }; 432483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @endcode 43251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, 4326c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar const Decl *Container, 43274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad std::string& S) const { 4328c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // Collect information from the property implementation decl(s). 4329c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar bool Dynamic = false; 4330c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar ObjCPropertyImplDecl *SynthesizePID = 0; 4331c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4332c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: Duplicated code due to poor abstraction. 4333c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (Container) { 43341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ObjCCategoryImplDecl *CID = 4335c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar dyn_cast<ObjCCategoryImplDecl>(Container)) { 4336c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar for (ObjCCategoryImplDecl::propimpl_iterator 433717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i = CID->propimpl_begin(), e = CID->propimpl_end(); 4338653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor i != e; ++i) { 4339581deb3da481053c4993c7600f97acf7768caac5David Blaikie ObjCPropertyImplDecl *PID = *i; 4340c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyDecl() == PD) { 4341c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4342c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar Dynamic = true; 4343c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4344c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar SynthesizePID = PID; 4345c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4346c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4347c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4348c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 434961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container); 4350c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar for (ObjCCategoryImplDecl::propimpl_iterator 435117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i = OID->propimpl_begin(), e = OID->propimpl_end(); 4352653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor i != e; ++i) { 4353581deb3da481053c4993c7600f97acf7768caac5David Blaikie ObjCPropertyImplDecl *PID = *i; 4354c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyDecl() == PD) { 4355c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4356c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar Dynamic = true; 4357c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4358c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar SynthesizePID = PID; 4359c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4360c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 43611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4362c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4363c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4364c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4365c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: This is not very efficient. 4366c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S = "T"; 4367c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4368c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // Encode result type. 4369090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian // GCC has some special rules regarding encoding of properties which 4370090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian // closely resembles encoding of ivars. 43711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0, 4372090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian true /* outermost type */, 4373090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian true /* encoding for property */); 4374c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4375c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->isReadOnly()) { 4376c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",R"; 4377c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4378c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar switch (PD->getSetterKind()) { 4379c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar case ObjCPropertyDecl::Assign: break; 4380c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar case ObjCPropertyDecl::Copy: S += ",C"; break; 43811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case ObjCPropertyDecl::Retain: S += ",&"; break; 43823a02b44e3948f7762dbfba94b7961281ca29d022Fariborz Jahanian case ObjCPropertyDecl::Weak: S += ",W"; break; 4383c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4384c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4385c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4386c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // It really isn't clear at all what this means, since properties 4387c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // are "dynamic by default". 4388c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (Dynamic) 4389c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",D"; 4390c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4391090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic) 4392090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian S += ",N"; 43931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4394c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) { 4395c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",G"; 4396077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S += PD->getGetterName().getAsString(); 4397c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4398c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4399c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) { 4400c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",S"; 4401077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S += PD->getSetterName().getAsString(); 4402c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4403c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4404c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (SynthesizePID) { 4405c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl(); 4406c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",V"; 440739f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner S += OID->getNameAsString(); 4408c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4409c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4410c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: OBJCGC: weak & strong 4411c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar} 4412c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4413a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// getLegacyIntegralTypeEncoding - 44141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Another legacy compatibility encoding: 32-bit longs are encoded as 44151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 'l' or 'L' , but not always. For typedefs, we need to use 4416a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 'i' or 'I' instead if encoding a struct field, or a pointer! 4417a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 4418a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanianvoid ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const { 44198e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump if (isa<TypedefType>(PointeeTy.getTypePtr())) { 4420183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) { 44214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32) 4422a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian PointeeTy = UnsignedIntTy; 44231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 44244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32) 4425a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian PointeeTy = IntTy; 4426a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4427a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4428a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian} 4429a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian 44307d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanianvoid ASTContext::getObjCEncodingForType(QualType T, std::string& S, 44314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FieldDecl *Field) const { 443282a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // We follow the behavior of gcc, expanding structures which are 443382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // directly pointed to, and expanding embedded structures. Note that 443482a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // these rules are sufficient to prevent recursive encoding of the 443582a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // same type. 44361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(T, S, true, true, Field, 44375b8c7d9fb620ba3a71e996d61e7b9bdf763b5c09Fariborz Jahanian true /* outermost type */); 443882a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar} 443982a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar 444064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnallstatic char ObjCEncodingForPrimitiveKind(const ASTContext *C, QualType T) { 444164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall switch (T->getAs<BuiltinType>()->getKind()) { 4442b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unhandled builtin type kind"); 444364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Void: return 'v'; 444464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Bool: return 'B'; 444564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Char_U: 444664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UChar: return 'C'; 444764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UShort: return 'S'; 444864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UInt: return 'I'; 444964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::ULong: 44504ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad return C->getIntWidth(T) == 32 ? 'L' : 'Q'; 445164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UInt128: return 'T'; 445264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::ULongLong: return 'Q'; 445364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Char_S: 445464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::SChar: return 'c'; 445564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Short: return 's'; 44563f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 44573f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 445864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Int: return 'i'; 445964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Long: 44604ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad return C->getIntWidth(T) == 32 ? 'l' : 'q'; 446164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::LongLong: return 'q'; 446264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Int128: return 't'; 446364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Float: return 'f'; 446464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Double: return 'd'; 44653a0be84b2aed8563150cdbd976a98838afa261ebDaniel Dunbar case BuiltinType::LongDouble: return 'D'; 446664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall } 446764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall} 446864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall 44695471bc85b69912e3b448de004498a80c0de32296Douglas Gregorstatic char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) { 44705471bc85b69912e3b448de004498a80c0de32296Douglas Gregor EnumDecl *Enum = ET->getDecl(); 44715471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 44725471bc85b69912e3b448de004498a80c0de32296Douglas Gregor // The encoding of an non-fixed enum type is always 'i', regardless of size. 44735471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (!Enum->isFixed()) 44745471bc85b69912e3b448de004498a80c0de32296Douglas Gregor return 'i'; 44755471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 44765471bc85b69912e3b448de004498a80c0de32296Douglas Gregor // The encoding of a fixed enum type matches its fixed underlying type. 44775471bc85b69912e3b448de004498a80c0de32296Douglas Gregor return ObjCEncodingForPrimitiveKind(C, Enum->getIntegerType()); 44785471bc85b69912e3b448de004498a80c0de32296Douglas Gregor} 44795471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 44804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic void EncodeBitField(const ASTContext *Ctx, std::string& S, 448164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall QualType T, const FieldDecl *FD) { 4482a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl"); 44838b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian S += 'b'; 448464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // The NeXT runtime encodes bit fields as b followed by the number of bits. 448564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // The GNU runtime requires more information; bitfields are encoded as b, 448664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // then the offset (in bits) of the first element, then the type of the 448764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // bitfield, then the size in bits. For example, in this structure: 448864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // 448964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // struct 449064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // { 449164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // int integer; 449264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // int flags:2; 449364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // }; 449464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // On a 32-bit system, the encoding for flags would be b2 for the NeXT 449564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // runtime, but b32i2 for the GNU runtime. The reason for this extra 449664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // information is not especially sensible, but we're stuck with it for 449764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // compatibility with GCC, although providing it breaks anything that 449864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // actually uses runtime introspection and wants to work on both runtimes... 4499260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (Ctx->getLangOpts().ObjCRuntime.isGNUFamily()) { 450064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall const RecordDecl *RD = FD->getParent(); 450164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD); 450282905749d5c8d8b4edec11de754a73349cb96603Eli Friedman S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex())); 45035471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (const EnumType *ET = T->getAs<EnumType>()) 45045471bc85b69912e3b448de004498a80c0de32296Douglas Gregor S += ObjCEncodingForEnumType(Ctx, ET); 4505c7ff82c2040f45eaad2eddea0e4461dddc972cd1David Chisnall else 45064ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad S += ObjCEncodingForPrimitiveKind(Ctx, T); 450764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall } 4508a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith S += llvm::utostr(FD->getBitWidthValue(*Ctx)); 45098b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian} 45108b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian 451101eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar// FIXME: Use SmallString for accumulating string. 451282a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbarvoid ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, 451382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar bool ExpandPointedToStructures, 451482a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar bool ExpandStructures, 4515153bfe5795e2c1a5a738e73d3784964e082237fcDaniel Dunbar const FieldDecl *FD, 4516090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian bool OutermostType, 45172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis bool EncodingProperty, 4518dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool StructField, 4519dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool EncodeBlockParameters, 4520dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool EncodeClassNames) const { 452164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall if (T->getAs<BuiltinType>()) { 4522ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (FD && FD->isBitField()) 452364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall return EncodeBitField(this, S, T, FD); 452464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall S += ObjCEncodingForPrimitiveKind(this, T); 4525ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4526ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 45271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4528183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType *CT = T->getAs<ComplexType>()) { 4529c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson S += 'j'; 45301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false, 4531c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson false); 4532ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4533ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 453460bce3ef20a4c9684e3825cdd739fefb9810327dFariborz Jahanian 4535aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian // encoding for pointer or r3eference types. 4536aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian QualType PointeeTy; 45376217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = T->getAs<PointerType>()) { 45388d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian if (PT->isObjCSelType()) { 45398d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian S += ':'; 45408d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian return; 45418d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian } 4542aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian PointeeTy = PT->getPointeeType(); 4543aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian } 4544aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 4545aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian PointeeTy = RT->getPointeeType(); 4546aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian if (!PointeeTy.isNull()) { 4547a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian bool isReadOnly = false; 4548a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // For historical/compatibility reasons, the read-only qualifier of the 4549a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // pointee gets emitted _before_ the '^'. The read-only qualifier of 4550a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // the pointer itself gets ignored, _unless_ we are looking at a typedef! 45511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Also, do not emit the 'r' for anything but the outermost type! 45528e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump if (isa<TypedefType>(T.getTypePtr())) { 4553a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (OutermostType && T.isConstQualified()) { 4554a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian isReadOnly = true; 4555a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian S += 'r'; 4556a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 45579fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump } else if (OutermostType) { 4558a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian QualType P = PointeeTy; 45596217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek while (P->getAs<PointerType>()) 45606217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek P = P->getAs<PointerType>()->getPointeeType(); 4561a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (P.isConstQualified()) { 4562a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian isReadOnly = true; 4563a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian S += 'r'; 4564a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4565a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4566a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (isReadOnly) { 4567a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // Another legacy compatibility encoding. Some ObjC qualifier and type 4568a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // combinations need to be rearranged. 4569a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // Rewrite "in const" from "nr" to "rn" 45705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (StringRef(S).endswith("nr")) 45710237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer S.replace(S.end()-2, S.end(), "rn"); 4572a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 45731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 457485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson if (PointeeTy->isCharType()) { 457585f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson // char pointer types should be encoded as '*' unless it is a 457685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson // type that has been typedef'd to 'BOOL'. 4577e8c49533521c40643653f943d47229e62d277f88Anders Carlsson if (!isTypeTypedefedAsBOOL(PointeeTy)) { 457885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson S += '*'; 457985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson return; 458085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson } 45816217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) { 45829533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // GCC binary compat: Need to convert "struct objc_class *" to "#". 45839533a7fdb8397421f3be52e879442460a87389f6Steve Naroff if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) { 45849533a7fdb8397421f3be52e879442460a87389f6Steve Naroff S += '#'; 45859533a7fdb8397421f3be52e879442460a87389f6Steve Naroff return; 45869533a7fdb8397421f3be52e879442460a87389f6Steve Naroff } 45879533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // GCC binary compat: Need to convert "struct objc_object *" to "@". 45889533a7fdb8397421f3be52e879442460a87389f6Steve Naroff if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) { 45899533a7fdb8397421f3be52e879442460a87389f6Steve Naroff S += '@'; 45909533a7fdb8397421f3be52e879442460a87389f6Steve Naroff return; 45919533a7fdb8397421f3be52e879442460a87389f6Steve Naroff } 45929533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // fall through... 459385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson } 459485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson S += '^'; 4595a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian getLegacyIntegralTypeEncoding(PointeeTy); 4596a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian 45971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures, 459843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian NULL); 4599ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4600ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4601aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian 4602ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (const ArrayType *AT = 4603ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // Ignore type qualifiers etc. 4604ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) { 46052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (isa<IncompleteArrayType>(AT) && !StructField) { 4606559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson // Incomplete arrays are encoded as a pointer to the array element. 4607559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '^'; 4608559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson 46091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(AT->getElementType(), S, 4610559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson false, ExpandStructures, FD); 4611559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } else { 4612559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '['; 46131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 46152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (getTypeSize(CAT->getElementType()) == 0) 46162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '0'; 46172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis else 46182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += llvm::utostr(CAT->getSize().getZExtValue()); 46192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 4620559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson //Variable length arrays are encoded as a regular array with 0 elements. 46212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) && 46222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis "Unknown array type!"); 4623559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '0'; 4624559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } 46251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(AT->getElementType(), S, 4627559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson false, ExpandStructures, FD); 4628559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += ']'; 4629559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } 4630ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4631ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4633183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (T->getAs<FunctionType>()) { 4634c0a87b7db06643178ad2cbce0767548c139ea387Anders Carlsson S += '?'; 4635ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4636ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46386217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RTy = T->getAs<RecordType>()) { 463982a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar RecordDecl *RDecl = RTy->getDecl(); 4640d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar S += RDecl->isUnion() ? '(' : '{'; 4641502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar // Anonymous structures print as '?' 4642502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar if (const IdentifierInfo *II = RDecl->getIdentifier()) { 4643502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar S += II->getName(); 46446fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian if (ClassTemplateSpecializationDecl *Spec 46456fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) { 46466fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 46476fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian std::string TemplateArgsStr 46486fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian = TemplateSpecializationType::PrintTemplateArgumentList( 4649910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.data(), 4650910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.size(), 465130c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor (*this).getPrintingPolicy()); 46526fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian 46536fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian S += TemplateArgsStr; 46546fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian } 4655502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar } else { 4656502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar S += '?'; 4657502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar } 46580d504c1da852e58ff802545c823ecff3b6c654b8Daniel Dunbar if (ExpandStructures) { 46597d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian S += '='; 46602636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->isUnion()) { 46612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForStructureImpl(RDecl, S, FD); 46622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 46632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RDecl->field_begin(), 46642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldEnd = RDecl->field_end(); 46652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis Field != FieldEnd; ++Field) { 46662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 46672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 46682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += Field->getNameAsString(); 46692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 46702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 46711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // Special case bit-fields. 46732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (Field->isBitField()) { 46742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(Field->getType(), S, false, true, 4675581deb3da481053c4993c7600f97acf7768caac5David Blaikie *Field); 46762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 46772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis QualType qt = Field->getType(); 46782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getLegacyIntegralTypeEncoding(qt); 46792636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(qt, S, false, true, 46802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FD, /*OutermostType*/false, 46812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*EncodingProperty*/false, 46822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*StructField*/true); 46832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 4684d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar } 46857d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian } 46866de88a873a4cbe06d72602eef57d68006730a80bFariborz Jahanian } 4687d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar S += RDecl->isUnion() ? ')' : '}'; 4688ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4689ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4690e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 46915471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (const EnumType *ET = T->getAs<EnumType>()) { 46928b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian if (FD && FD->isBitField()) 469364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall EncodeBitField(this, S, T, FD); 46948b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian else 46955471bc85b69912e3b448de004498a80c0de32296Douglas Gregor S += ObjCEncodingForEnumType(this, ET); 4696ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4697ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4699dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) { 470021a98b188857d690aa4510c52ac4317ffa0908a8Steve Naroff S += "@?"; // Unlike a pointer-to-function, which is "^?". 4701dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (EncodeBlockParameters) { 4702dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson const FunctionType *FT = BT->getPointeeType()->getAs<FunctionType>(); 4703dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson 4704dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += '<'; 4705dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block return type 4706dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(FT->getResultType(), S, 4707dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandPointedToStructures, ExpandStructures, 4708dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson FD, 4709dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* OutermostType */, 4710dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodingProperty, 4711dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* StructField */, 4712dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeBlockParameters, 4713dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeClassNames); 4714dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block self 4715dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += "@?"; 4716dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block parameters 4717dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) { 4718dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson for (FunctionProtoType::arg_type_iterator I = FPT->arg_type_begin(), 4719dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson E = FPT->arg_type_end(); I && (I != E); ++I) { 4720dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(*I, S, 4721dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandPointedToStructures, 4722dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandStructures, 4723dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson FD, 4724dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* OutermostType */, 4725dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodingProperty, 4726dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* StructField */, 4727dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeBlockParameters, 4728dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeClassNames); 4729dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4730dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4731dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += '>'; 4732dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4733ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4734ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4736c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Ignore protocol qualifiers when mangling at this level. 4737c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *OT = T->getAs<ObjCObjectType>()) 4738c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall T = OT->getBaseType(); 4739c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 47400953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (const ObjCInterfaceType *OIT = T->getAs<ObjCInterfaceType>()) { 474143822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian // @encode(class_name) 47420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall ObjCInterfaceDecl *OI = OIT->getDecl(); 474343822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '{'; 474443822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian const IdentifierInfo *II = OI->getIdentifier(); 474543822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += II->getName(); 474643822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '='; 4747db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose SmallVector<const ObjCIvarDecl*, 32> Ivars; 47482c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian DeepCollectObjCIvars(OI, true, Ivars); 47492c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian for (unsigned i = 0, e = Ivars.size(); i != e; ++i) { 4750db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose const FieldDecl *Field = cast<FieldDecl>(Ivars[i]); 47512c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (Field->isBitField()) 47522c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field); 475343822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian else 47542c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD); 475543822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian } 475643822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '}'; 4757ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 475843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian } 47591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4760183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ObjCObjectPointerType *OPT = T->getAs<ObjCObjectPointerType>()) { 476114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (OPT->isObjCIdType()) { 476214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '@'; 476314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4764ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 476627d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) { 476727d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // FIXME: Consider if we need to output qualifiers for 'Class<p>'. 476827d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // Since this is a binary compatibility issue, need to consult with runtime 476927d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // folks. Fortunately, this is a *very* obsure construct. 477014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '#'; 477114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4772ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4774ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (OPT->isObjCQualifiedIdType()) { 47751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(getObjCIdType(), S, 477614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ExpandPointedToStructures, 477714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ExpandStructures, FD); 4778dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (FD || EncodingProperty || EncodeClassNames) { 477914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff // Note that we do extended encoding of protocol qualifer list 478014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff // Only when doing ivar or property encoding. 478114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '"'; 478267ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 478367ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff E = OPT->qual_end(); I != E; ++I) { 478414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '<'; 478514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += (*I)->getNameAsString(); 478614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '>'; 478714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 478814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '"'; 478914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 479014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4791ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4793ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner QualType PointeeTy = OPT->getPointeeType(); 4794ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (!EncodingProperty && 4795ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner isa<TypedefType>(PointeeTy.getTypePtr())) { 4796ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // Another historical/compatibility reason. 47971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // We encode the underlying type which comes out as 4798ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // {...}; 4799ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '^'; 48001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PointeeTy, S, 48011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump false, ExpandPointedToStructures, 4802ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner NULL); 480314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 480414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 4805ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner 4806ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '@'; 4807dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (OPT->getInterfaceDecl() && 4808dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson (FD || EncodingProperty || EncodeClassNames)) { 4809ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '"'; 481027d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff S += OPT->getInterfaceDecl()->getIdentifier()->getName(); 481167ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 481267ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff E = OPT->qual_end(); I != E; ++I) { 4813ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '<'; 4814ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += (*I)->getNameAsString(); 4815ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '>'; 48161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4817ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '"'; 4818ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4819ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4820ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 48211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4822532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall // gcc just blithely ignores member pointers. 4823532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall // TODO: maybe there should be a mangling for these 4824532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall if (T->getAs<MemberPointerType>()) 4825532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall return; 4826e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 4827e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian if (T->isVectorType()) { 4828e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // This matches gcc's encoding, even though technically it is 4829e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // insufficient. 4830e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // FIXME. We should do a better job than gcc. 4831e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian return; 4832e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian } 4833e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 4834b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("@encode for type not implemented!"); 483585f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson} 483685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson 48372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidisvoid ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl, 48382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::string &S, 48392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis const FieldDecl *FD, 48402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis bool includeVBases) const { 48412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(RDecl && "Expected non-null RecordDecl"); 48422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(!RDecl->isUnion() && "Should not be called for unions"); 48432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->getDefinition()) 48442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis return; 48452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl); 48472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets; 48482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis const ASTRecordLayout &layout = getASTRecordLayout(RDecl); 48492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec) { 48512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (CXXRecordDecl::base_class_iterator 48522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BI = CXXRec->bases_begin(), 48532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BE = CXXRec->bases_end(); BI != BE; ++BI) { 48542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!BI->isVirtual()) { 48552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4856829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis if (base->isEmpty()) 4857829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis continue; 48582636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = layout.getBaseClassOffsetInBits(base); 48592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 48602636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, base)); 48612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis unsigned i = 0; 48662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RDecl->field_begin(), 48672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldEnd = RDecl->field_end(); 48682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis Field != FieldEnd; ++Field, ++i) { 48692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = layout.getFieldOffset(i); 48702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 4871581deb3da481053c4993c7600f97acf7768caac5David Blaikie std::make_pair(offs, *Field)); 48722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec && includeVBases) { 48752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (CXXRecordDecl::base_class_iterator 48762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BI = CXXRec->vbases_begin(), 48772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BE = CXXRec->vbases_end(); BI != BE; ++BI) { 48782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4879829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis if (base->isEmpty()) 4880829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis continue; 48812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = layout.getVBaseClassOffsetInBits(base); 488219aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end()) 488319aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(), 488419aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis std::make_pair(offs, base)); 48852636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CharUnits size; 48892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec) { 48902636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis size = includeVBases ? layout.getSize() : layout.getNonVirtualSize(); 48912636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 48922636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis size = layout.getSize(); 48932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t CurOffs = 0; 48962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::multimap<uint64_t, NamedDecl *>::iterator 48972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurLayObj = FieldOrBaseOffsets.begin(); 48982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 489958db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor if (CXXRec && CXXRec->isDynamicClass() && 490058db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) { 49012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 49022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += "\"_vptr$"; 49032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::string recname = CXXRec->getNameAsString(); 49042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (recname.empty()) recname = "?"; 49052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += recname; 49062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 49072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += "^^?"; 49092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += getTypeSize(VoidPtrTy); 49102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->hasFlexibleArrayMember()) { 49132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // Mark the end of the structure. 49142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = toBits(size); 49152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 49162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, (NamedDecl*)0)); 49172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) { 49202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(CurOffs <= CurLayObj->first); 49212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CurOffs < CurLayObj->first) { 49232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t padding = CurLayObj->first - CurOffs; 49242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // FIXME: There doesn't seem to be a way to indicate in the encoding that 49252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // packing/alignment of members is different that normal, in which case 49262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // the encoding will be out-of-sync with the real layout. 49272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // If the runtime switches to just consider the size of types without 49282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // taking into account alignment, we could make padding explicit in the 49292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // encoding (e.g. using arrays of chars). The encoding strings would be 49302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // longer then though. 49312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += padding; 49322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis NamedDecl *dcl = CurLayObj->second; 49352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (dcl == 0) 49362636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis break; // reached end of structure. 49372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) { 49392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // We expand the bases without their virtual bases since those are going 49402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // in the initial structure. Note that this differs from gcc which 49412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // expands virtual bases each time one is encountered in the hierarchy, 49422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // making the encoding type bigger than it really is. 49432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false); 4944829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis assert(!base->isEmpty()); 4945829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize()); 49462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 49472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldDecl *field = cast<FieldDecl>(dcl); 49482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 49492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 49502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += field->getNameAsString(); 49512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 49522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (field->isBitField()) { 49552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis EncodeBitField(this, S, field->getType(), field); 4956a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith CurOffs += field->getBitWidthValue(*this); 49572636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 49582636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis QualType qt = field->getType(); 49592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getLegacyIntegralTypeEncoding(qt); 49602636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(qt, S, false, true, FD, 49612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*OutermostType*/false, 49622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*EncodingProperty*/false, 49632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*StructField*/true); 49642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += getTypeSize(field->getType()); 49652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis} 49692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, 4971ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian std::string& S) const { 4972ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_In) 4973ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'n'; 4974ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Inout) 4975ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'N'; 4976ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Out) 4977ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'o'; 4978ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Bycopy) 4979ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'O'; 4980ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Byref) 4981ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'R'; 4982ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Oneway) 4983ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'V'; 4984ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian} 4985ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian 49864dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas GregorTypedefDecl *ASTContext::getObjCIdDecl() const { 49874dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor if (!ObjCIdDecl) { 49884dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0); 49894dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor T = getObjCObjectPointerType(T); 49904dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T); 49914dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 49924dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor getTranslationUnitDecl(), 49934dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor SourceLocation(), SourceLocation(), 49944dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor &Idents.get("id"), IdInfo); 49954dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor } 49964dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor 49974dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor return ObjCIdDecl; 49987e219e47de26346885d667131977bd9ca2d7662aSteve Naroff} 49997e219e47de26346885d667131977bd9ca2d7662aSteve Naroff 50007a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas GregorTypedefDecl *ASTContext::getObjCSelDecl() const { 50017a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor if (!ObjCSelDecl) { 50027a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor QualType SelT = getPointerType(ObjCBuiltinSelTy); 50037a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor TypeSourceInfo *SelInfo = getTrivialTypeSourceInfo(SelT); 50047a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor ObjCSelDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 50057a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor getTranslationUnitDecl(), 50067a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor SourceLocation(), SourceLocation(), 50077a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor &Idents.get("SEL"), SelInfo); 50087a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor } 50097a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor return ObjCSelDecl; 5010b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 5011b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 501279d6726921897811232554ed94c5d77b5b7b3fc0Douglas GregorTypedefDecl *ASTContext::getObjCClassDecl() const { 501379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor if (!ObjCClassDecl) { 501479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor QualType T = getObjCObjectType(ObjCBuiltinClassTy, 0, 0); 501579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor T = getObjCObjectPointerType(T); 501679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor TypeSourceInfo *ClassInfo = getTrivialTypeSourceInfo(T); 501779d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor ObjCClassDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 501879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor getTranslationUnitDecl(), 501979d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor SourceLocation(), SourceLocation(), 502079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor &Idents.get("Class"), ClassInfo); 502179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor } 502279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor 502379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor return ObjCClassDecl; 5024a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor} 5025a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 5026a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas GregorObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const { 5027a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor if (!ObjCProtocolClassDecl) { 5028a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor ObjCProtocolClassDecl 5029a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(), 5030a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor SourceLocation(), 5031a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor &Idents.get("Protocol"), 5032a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor /*PrevDecl=*/0, 5033a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor SourceLocation(), true); 5034a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor } 5035a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 5036a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor return ObjCProtocolClassDecl; 50378baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson} 50388baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson 5039c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===// 5040c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge// __builtin_va_list Construction Functions 5041c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===// 5042c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5043c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateCharPtrBuiltinVaListDecl(const ASTContext *Context) { 5044c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef char* __builtin_va_list; 5045c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType CharPtrType = Context->getPointerType(Context->CharTy); 5046c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5047c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(CharPtrType); 5048c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5049c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypeDecl 5050c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5051c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5052c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5053c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5054c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5055c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypeDecl; 5056c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5057c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5058c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) { 5059c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef void* __builtin_va_list; 5060c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VoidPtrType = Context->getPointerType(Context->VoidTy); 5061c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5062c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VoidPtrType); 5063c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5064c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypeDecl 5065c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5066c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5067c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5068c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5069c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5070c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypeDecl; 5071c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5072c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5073c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePowerABIBuiltinVaListDecl(const ASTContext *Context) { 5074c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef struct __va_list_tag { 5075c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge RecordDecl *VaListTagDecl; 5076c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5077c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct, 5078c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5079c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag")); 5080c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->startDefinition(); 5081c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5082c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const size_t NumFields = 5; 5083c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType FieldTypes[NumFields]; 5084c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const char *FieldNames[NumFields]; 5085c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5086c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned char gpr; 5087c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[0] = Context->UnsignedCharTy; 5088c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[0] = "gpr"; 5089c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5090c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned char fpr; 5091c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[1] = Context->UnsignedCharTy; 5092c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[1] = "fpr"; 5093c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5094c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned short reserved; 5095c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[2] = Context->UnsignedShortTy; 5096c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[2] = "reserved"; 5097c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5098c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* overflow_arg_area; 5099c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[3] = Context->getPointerType(Context->VoidTy); 5100c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[3] = "overflow_arg_area"; 5101c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5102c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* reg_save_area; 5103c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[4] = Context->getPointerType(Context->VoidTy); 5104c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[4] = "reg_save_area"; 5105c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5106c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // Create fields 5107c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge for (unsigned i = 0; i < NumFields; ++i) { 5108c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldDecl *Field = FieldDecl::Create(*Context, VaListTagDecl, 5109c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5110c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5111c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get(FieldNames[i]), 5112c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[i], /*TInfo=*/0, 5113c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*BitWidth=*/0, 5114c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*Mutable=*/false, 5115c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge ICIS_NoInit); 5116c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Field->setAccess(AS_public); 5117c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->addDecl(Field); 5118c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5119c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->completeDefinition(); 5120c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagType = Context->getRecordType(VaListTagDecl); 5121fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge Context->VaListTagTy = VaListTagType; 5122c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5123c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // } __va_list_tag; 5124c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTagTypedefDecl 5125c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5126c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5127c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5128c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag"), 5129c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(VaListTagType)); 5130c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagTypedefType = 5131c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTypedefType(VaListTagTypedefDecl); 5132c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5133c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef __va_list_tag __builtin_va_list[1]; 5134c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1); 5135c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagArrayType 5136c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(VaListTagTypedefType, 5137c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal, 0); 5138c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5139c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VaListTagArrayType); 5140c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5141c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5142c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5143c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5144c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5145c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5146c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5147c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5148c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5149c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5150c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl * 5151c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeCreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context) { 5152c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef struct __va_list_tag { 5153c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge RecordDecl *VaListTagDecl; 5154c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct, 5155c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5156c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag")); 5157c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->startDefinition(); 5158c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5159c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const size_t NumFields = 4; 5160c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType FieldTypes[NumFields]; 5161c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const char *FieldNames[NumFields]; 5162c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5163c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned gp_offset; 5164c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[0] = Context->UnsignedIntTy; 5165c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[0] = "gp_offset"; 5166c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5167c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned fp_offset; 5168c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[1] = Context->UnsignedIntTy; 5169c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[1] = "fp_offset"; 5170c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5171c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* overflow_arg_area; 5172c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[2] = Context->getPointerType(Context->VoidTy); 5173c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[2] = "overflow_arg_area"; 5174c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5175c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* reg_save_area; 5176c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[3] = Context->getPointerType(Context->VoidTy); 5177c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[3] = "reg_save_area"; 5178c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5179c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // Create fields 5180c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge for (unsigned i = 0; i < NumFields; ++i) { 5181c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context), 5182c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl, 5183c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5184c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5185c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get(FieldNames[i]), 5186c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[i], /*TInfo=*/0, 5187c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*BitWidth=*/0, 5188c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*Mutable=*/false, 5189c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge ICIS_NoInit); 5190c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Field->setAccess(AS_public); 5191c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->addDecl(Field); 5192c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5193c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->completeDefinition(); 5194c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagType = Context->getRecordType(VaListTagDecl); 5195fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge Context->VaListTagTy = VaListTagType; 5196c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5197c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // } __va_list_tag; 5198c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTagTypedefDecl 5199c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5200c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5201c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5202c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag"), 5203c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(VaListTagType)); 5204c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagTypedefType = 5205c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTypedefType(VaListTagTypedefDecl); 5206c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5207c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef __va_list_tag __builtin_va_list[1]; 5208c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1); 5209c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagArrayType 5210c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(VaListTagTypedefType, 5211c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal,0); 5212c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5213c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VaListTagArrayType); 5214c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5215c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5216c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5217c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5218c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5219c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5220c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5221c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5222c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5223c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5224c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context) { 5225c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef int __builtin_va_list[4]; 5226c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 4); 5227c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType IntArrayType 5228c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(Context->IntTy, 5229c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal, 0); 5230c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5231c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5232c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5233c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5234c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5235c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(IntArrayType)); 5236c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5237c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5238c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5239c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5240c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVaListDecl(const ASTContext *Context, 5241c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TargetInfo::BuiltinVaListKind Kind) { 5242c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge switch (Kind) { 5243c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::CharPtrBuiltinVaList: 5244c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateCharPtrBuiltinVaListDecl(Context); 5245c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::VoidPtrBuiltinVaList: 5246c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateVoidPtrBuiltinVaListDecl(Context); 5247c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::PowerABIBuiltinVaList: 5248c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreatePowerABIBuiltinVaListDecl(Context); 5249c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::X86_64ABIBuiltinVaList: 5250c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateX86_64ABIBuiltinVaListDecl(Context); 5251c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::PNaClABIBuiltinVaList: 5252c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreatePNaClABIBuiltinVaListDecl(Context); 5253c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5254c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5255c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm_unreachable("Unhandled __builtin_va_list type kind"); 5256c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5257c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5258c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeTypedefDecl *ASTContext::getBuiltinVaListDecl() const { 5259c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge if (!BuiltinVaListDecl) 5260c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge BuiltinVaListDecl = CreateVaListDecl(this, Target->getBuiltinVaListKind()); 5261c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5262c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return BuiltinVaListDecl; 5263c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5264c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5265fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador IngeQualType ASTContext::getVaListTagType() const { 5266fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // Force the creation of VaListTagTy by building the __builtin_va_list 5267fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // declaration. 5268fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge if (VaListTagTy.isNull()) 5269fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge (void) getBuiltinVaListDecl(); 5270fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 5271fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge return VaListTagTy; 5272fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge} 5273fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 5274a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) { 52751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(ObjCConstantStringType.isNull() && 52762198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff "'NSConstantString' type already set!"); 52771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5278a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCConstantStringType = getObjCInterfaceType(Decl); 52792198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff} 52802198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff 52810bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// \brief Retrieve the template name that corresponds to a non-empty 52820bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// lookup. 52834ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 52844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin, 52854ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad UnresolvedSetIterator End) const { 52860bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall unsigned size = End - Begin; 52870bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall assert(size > 1 && "set is not overloaded!"); 52887532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 52890bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall void *memory = Allocate(sizeof(OverloadedTemplateStorage) + 52900bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall size * sizeof(FunctionTemplateDecl*)); 52910bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size); 52920bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall 52930bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall NamedDecl **Storage = OT->getStorage(); 5294eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetIterator I = Begin; I != End; ++I) { 52950bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall NamedDecl *D = *I; 52960bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall assert(isa<FunctionTemplateDecl>(D) || 52970bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall (isa<UsingShadowDecl>(D) && 52980bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall isa<FunctionTemplateDecl>(D->getUnderlyingDecl()))); 52990bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall *Storage++ = D; 53007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } 53017532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53020bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall return TemplateName(OT); 53037532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor} 53047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 5305d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// \brief Retrieve the template name that represents a qualified 5306d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// template name such as \c std::vector. 53074ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 53084ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS, 53094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool TemplateKeyword, 53104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad TemplateDecl *Template) const { 53110f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor assert(NNS && "Missing nested-name-specifier in qualified template name"); 53120f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor 5313789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor // FIXME: Canonicalization? 5314d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor llvm::FoldingSetNodeID ID; 5315d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template); 53161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5317d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor void *InsertPos = 0; 5318d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateName *QTN = 53190bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5320d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor if (!QTN) { 5321d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QTN = new (*this,4) QualifiedTemplateName(NNS, TemplateKeyword, Template); 5322d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateNames.InsertNode(QTN, InsertPos); 5323d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor } 53241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5325d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor return TemplateName(QTN); 5326d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor} 5327d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor 53287532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Retrieve the template name that represents a dependent 53297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name such as \c MetaFun::template apply. 53304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 53314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 53324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const IdentifierInfo *Name) const { 53331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((!NNS || NNS->isDependent()) && 53343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor "Nested name specifier must be dependent"); 53357532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53367532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor llvm::FoldingSetNodeID ID; 53377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateName::Profile(ID, NNS, Name); 53387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53397532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor void *InsertPos = 0; 53407532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateName *QTN = 53417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 53427532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53437532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor if (QTN) 53447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor return TemplateName(QTN); 53457532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 53477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor if (CanonNNS == NNS) { 53487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Name); 53497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } else { 53507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor TemplateName Canon = getDependentTemplateName(CanonNNS, Name); 53517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Name, Canon); 5352789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *CheckQTN = 5353789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5354789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CheckQTN && "Dependent type name canonicalization broken"); 5355789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckQTN; 53567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } 53577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateNames.InsertNode(QTN, InsertPos); 53597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor return TemplateName(QTN); 53607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor} 53617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 5362ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// \brief Retrieve the template name that represents a dependent 5363ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// template name such as \c MetaFun::template operator+. 5364ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5365ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 53664ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad OverloadedOperatorKind Operator) const { 5367ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor assert((!NNS || NNS->isDependent()) && 5368ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor "Nested name specifier must be dependent"); 5369ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5370ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor llvm::FoldingSetNodeID ID; 5371ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateName::Profile(ID, NNS, Operator); 5372ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5373ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor void *InsertPos = 0; 5374789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *QTN 5375789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5376ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5377ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (QTN) 5378ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return TemplateName(QTN); 5379ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5380ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 5381ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (CanonNNS == NNS) { 5382ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Operator); 5383ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } else { 5384ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName Canon = getDependentTemplateName(CanonNNS, Operator); 5385ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Operator, Canon); 5386789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 5387789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *CheckQTN 5388789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5389789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CheckQTN && "Dependent template name canonicalization broken"); 5390789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckQTN; 5391ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } 5392ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5393ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateNames.InsertNode(QTN, InsertPos); 5394ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return TemplateName(QTN); 5395ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5396ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 53971aee05d08b2184acadeb36de300e216390780d6cDouglas GregorTemplateName 5398146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param, 5399146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateName replacement) const { 5400146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm::FoldingSetNodeID ID; 5401146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage::Profile(ID, param, replacement); 5402146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5403146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall void *insertPos = 0; 5404146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 5405146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos); 5406146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5407146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall if (!subst) { 5408146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement); 5409146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParms.InsertNode(subst, insertPos); 5410146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 5411146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5412146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return TemplateName(subst); 5413146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall} 5414146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5415146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallTemplateName 54161aee05d08b2184acadeb36de300e216390780d6cDouglas GregorASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param, 54171aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor const TemplateArgument &ArgPack) const { 54181aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ASTContext &Self = const_cast<ASTContext &>(*this); 54191aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor llvm::FoldingSetNodeID ID; 54201aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack); 54211aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54221aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor void *InsertPos = 0; 54231aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage *Subst 54241aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos); 54251aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54261aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!Subst) { 5427146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param, 54281aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ArgPack.pack_size(), 54291aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ArgPack.pack_begin()); 54301aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos); 54311aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 54321aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54331aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(Subst); 54341aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor} 54351aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 5436b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor/// getFromTargetType - Given one of the integer types provided by 5437d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// TargetInfo, produce the corresponding type. The unsigned @p Type 5438d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// is actually a value of type @c TargetInfo::IntType. 5439e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallCanQualType ASTContext::getFromTargetType(unsigned Type) const { 5440b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor switch (Type) { 5441e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall case TargetInfo::NoInt: return CanQualType(); 5442b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedShort: return ShortTy; 5443b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedShort: return UnsignedShortTy; 5444b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedInt: return IntTy; 5445b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedInt: return UnsignedIntTy; 5446b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedLong: return LongTy; 5447b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedLong: return UnsignedLongTy; 5448b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedLongLong: return LongLongTy; 5449b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy; 5450b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor } 5451b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor 5452b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unhandled TargetInfo::IntType value"); 5453b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor} 5454b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek 5455b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===// 5456b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek// Type Predicates. 5457b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===// 5458b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek 54594fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's 54604fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// garbage collection attribute. 54614fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// 5462ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCallQualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const { 54634e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().getGC() == LangOptions::NonGC) 5464ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return Qualifiers::GCNone; 5465ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall 54664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie assert(getLangOpts().ObjC1); 5467ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall Qualifiers::GC GCAttrs = Ty.getObjCGCAttr(); 5468ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall 5469ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // Default behaviour under objective-C's gc is for ObjC pointers 5470ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // (or pointers to them) be treated as though they were declared 5471ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // as __strong. 5472ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall if (GCAttrs == Qualifiers::GCNone) { 5473ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType()) 5474ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return Qualifiers::Strong; 5475ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall else if (Ty->isPointerType()) 5476ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType()); 5477ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall } else { 5478ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // It's not valid to set GC attributes on anything that isn't a 5479ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // pointer. 5480ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#ifndef NDEBUG 5481ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall QualType CT = Ty->getCanonicalTypeInternal(); 5482ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall while (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 5483ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall CT = AT->getElementType(); 5484ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall assert(CT->isAnyPointerType() || CT->isBlockPointerType()); 5485ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#endif 54864fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian } 5487b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner return GCAttrs; 54884fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian} 54894fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian 54906ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===// 54916ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner// Type Compatibility Testing 54926ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===// 5493770951b5bb6028a8d326ddb4a13cef7d4a128162Chris Lattner 54941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// areCompatVectorTypes - Return true if the two specified vector types are 54956ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner/// compatible. 54966ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattnerstatic bool areCompatVectorTypes(const VectorType *LHS, 54976ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner const VectorType *RHS) { 5498467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified()); 54996ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return LHS->getElementType() == RHS->getElementType() && 550061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner LHS->getNumElements() == RHS->getNumElements(); 55016ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner} 55026ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner 5503255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregorbool ASTContext::areCompatibleVectorTypes(QualType FirstVec, 5504255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor QualType SecondVec) { 5505255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor assert(FirstVec->isVectorType() && "FirstVec should be a vector type"); 5506255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor assert(SecondVec->isVectorType() && "SecondVec should be a vector type"); 5507255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5508255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor if (hasSameUnqualifiedType(FirstVec, SecondVec)) 5509255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return true; 5510255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5511f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson // Treat Neon vector types and most AltiVec vector types as if they are the 5512f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson // equivalent GCC vector types. 5513255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor const VectorType *First = FirstVec->getAs<VectorType>(); 5514255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor const VectorType *Second = SecondVec->getAs<VectorType>(); 5515f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson if (First->getNumElements() == Second->getNumElements() && 5516255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor hasSameType(First->getElementType(), Second->getElementType()) && 5517f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson First->getVectorKind() != VectorType::AltiVecPixel && 5518f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson First->getVectorKind() != VectorType::AltiVecBool && 5519f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson Second->getVectorKind() != VectorType::AltiVecPixel && 5520f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson Second->getVectorKind() != VectorType::AltiVecBool) 5521255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return true; 5522255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5523255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return false; 5524255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor} 5525255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 55264084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===// 55274084c306635b70f37029dca938444e6013f08684Steve Naroff// ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's. 55284084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===// 55294084c306635b70f37029dca938444e6013f08684Steve Naroff 55304084c306635b70f37029dca938444e6013f08684Steve Naroff/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the 55314084c306635b70f37029dca938444e6013f08684Steve Naroff/// inheritance hierarchy of 'rProto'. 55324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool 55334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, 55344ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad ObjCProtocolDecl *rProto) const { 55353fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor if (declaresSameEntity(lProto, rProto)) 553614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return true; 55374084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(), 55384084c306635b70f37029dca938444e6013f08684Steve Naroff E = rProto->protocol_end(); PI != E; ++PI) 55394084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lProto, *PI)) 55404084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 55414084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 55424084c306635b70f37029dca938444e6013f08684Steve Naroff} 554314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 55444084c306635b70f37029dca938444e6013f08684Steve Naroff/// QualifiedIdConformsQualifiedId - compare id<p,...> with id<p1,...> 55454084c306635b70f37029dca938444e6013f08684Steve Naroff/// return true if lhs's protocols conform to rhs's protocol; false 55464084c306635b70f37029dca938444e6013f08684Steve Naroff/// otherwise. 55474084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) { 55484084c306635b70f37029dca938444e6013f08684Steve Naroff if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType()) 55494084c306635b70f37029dca938444e6013f08684Steve Naroff return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false); 55504084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 55514084c306635b70f37029dca938444e6013f08684Steve Naroff} 55524084c306635b70f37029dca938444e6013f08684Steve Naroff 5553a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian/// ObjCQualifiedClassTypesAreCompatible - compare Class<p,...> and 5554a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian/// Class<p1, ...>. 5555a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanianbool ASTContext::ObjCQualifiedClassTypesAreCompatible(QualType lhs, 5556a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian QualType rhs) { 5557a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian const ObjCObjectPointerType *lhsQID = lhs->getAs<ObjCObjectPointerType>(); 5558a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 5559a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian assert ((lhsQID && rhsOPT) && "ObjCQualifiedClassTypesAreCompatible"); 5560a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5561a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 5562a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian E = lhsQID->qual_end(); I != E; ++I) { 5563a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian bool match = false; 5564a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian ObjCProtocolDecl *lhsProto = *I; 5565a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 5566a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian E = rhsOPT->qual_end(); J != E; ++J) { 5567a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian ObjCProtocolDecl *rhsProto = *J; 5568a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) { 5569a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian match = true; 5570a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian break; 5571a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5572a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5573a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (!match) 5574a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return false; 5575a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5576a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return true; 5577a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian} 5578a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 55794084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an 55804084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIDType. 55814084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, 55824084c306635b70f37029dca938444e6013f08684Steve Naroff bool compare) { 55834084c306635b70f37029dca938444e6013f08684Steve Naroff // Allow id<P..> and an 'id' or void* type in all cases. 55841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (lhs->isVoidPointerType() || 55854084c306635b70f37029dca938444e6013f08684Steve Naroff lhs->isObjCIdType() || lhs->isObjCClassType()) 55864084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 55871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (rhs->isVoidPointerType() || 55884084c306635b70f37029dca938444e6013f08684Steve Naroff rhs->isObjCIdType() || rhs->isObjCClassType()) 55894084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 55904084c306635b70f37029dca938444e6013f08684Steve Naroff 55914084c306635b70f37029dca938444e6013f08684Steve Naroff if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) { 5592183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 55931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55944084c306635b70f37029dca938444e6013f08684Steve Naroff if (!rhsOPT) return false; 55951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55964084c306635b70f37029dca938444e6013f08684Steve Naroff if (rhsOPT->qual_empty()) { 55971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the RHS is a unqualified interface pointer "NSString*", 55984084c306635b70f37029dca938444e6013f08684Steve Naroff // make sure we check the class hierarchy. 55994084c306635b70f37029dca938444e6013f08684Steve Naroff if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 56004084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56014084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56024084c306635b70f37029dca938444e6013f08684Steve Naroff // when comparing an id<P> on lhs with a static type on rhs, 56034084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 56044084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 56050fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian if (!rhsID->ClassImplementsProtocol(*I, true)) 56064084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 56074084c306635b70f37029dca938444e6013f08684Steve Naroff } 56084084c306635b70f37029dca938444e6013f08684Steve Naroff } 56094084c306635b70f37029dca938444e6013f08684Steve Naroff // If there are no qualifiers and no interface, we have an 'id'. 56104084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 56114084c306635b70f37029dca938444e6013f08684Steve Naroff } 56121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Both the right and left sides have qualifiers. 56134084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56144084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56154084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *lhsProto = *I; 56164084c306635b70f37029dca938444e6013f08684Steve Naroff bool match = false; 5617de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff 5618de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // when comparing an id<P> on lhs with a static type on rhs, 5619de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // see if static class implements all of id's protocols, directly or 5620de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // through its super class and categories. 56214084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 56224084c306635b70f37029dca938444e6013f08684Steve Naroff E = rhsOPT->qual_end(); J != E; ++J) { 56234084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *rhsProto = *J; 56244084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 56254084c306635b70f37029dca938444e6013f08684Steve Naroff (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 56264084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 56278f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff break; 56288f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff } 5629de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 56301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the RHS is a qualified interface pointer "NSString<P>*", 56314084c306635b70f37029dca938444e6013f08684Steve Naroff // make sure we check the class hierarchy. 56324084c306635b70f37029dca938444e6013f08684Steve Naroff if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 56334084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56344084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56354084c306635b70f37029dca938444e6013f08684Steve Naroff // when comparing an id<P> on lhs with a static type on rhs, 56364084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 56374084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 56380fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian if (rhsID->ClassImplementsProtocol(*I, true)) { 56394084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 56404084c306635b70f37029dca938444e6013f08684Steve Naroff break; 56414084c306635b70f37029dca938444e6013f08684Steve Naroff } 56424084c306635b70f37029dca938444e6013f08684Steve Naroff } 56434084c306635b70f37029dca938444e6013f08684Steve Naroff } 56444084c306635b70f37029dca938444e6013f08684Steve Naroff if (!match) 5645de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff return false; 5646de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 56471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5648de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff return true; 5649de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 56501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56514084c306635b70f37029dca938444e6013f08684Steve Naroff const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType(); 56524084c306635b70f37029dca938444e6013f08684Steve Naroff assert(rhsQID && "One of the LHS/RHS should be id<x>"); 56534084c306635b70f37029dca938444e6013f08684Steve Naroff 56541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ObjCObjectPointerType *lhsOPT = 56554084c306635b70f37029dca938444e6013f08684Steve Naroff lhs->getAsObjCInterfacePointerType()) { 5656de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // If both the right and left sides have qualifiers. 56574084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(), 56584084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsOPT->qual_end(); I != E; ++I) { 56594084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *lhsProto = *I; 56604084c306635b70f37029dca938444e6013f08684Steve Naroff bool match = false; 56614084c306635b70f37029dca938444e6013f08684Steve Naroff 5662de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // when comparing an id<P> on rhs with a static type on lhs, 56634084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 56644084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 5665de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // First, lhs protocols in the qualifier list must be found, direct 5666de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // or indirect in rhs's qualifier list or it is a mismatch. 56674084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 56684084c306635b70f37029dca938444e6013f08684Steve Naroff E = rhsQID->qual_end(); J != E; ++J) { 56694084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *rhsProto = *J; 56704084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 56714084c306635b70f37029dca938444e6013f08684Steve Naroff (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 56724084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 56734084c306635b70f37029dca938444e6013f08684Steve Naroff break; 56744084c306635b70f37029dca938444e6013f08684Steve Naroff } 56754084c306635b70f37029dca938444e6013f08684Steve Naroff } 56764084c306635b70f37029dca938444e6013f08684Steve Naroff if (!match) 56774084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 56784084c306635b70f37029dca938444e6013f08684Steve Naroff } 5679de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian 5680de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // Static class's protocols, or its super class or category protocols 5681de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // must be found, direct or indirect in rhs's qualifier list or it is a mismatch. 5682de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) { 5683de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5684de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian CollectInheritedProtocols(lhsID, LHSInheritedProtocols); 5685de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // This is rather dubious but matches gcc's behavior. If lhs has 5686de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // no type qualifier and its class has no static protocol(s) 5687de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // assume that it is mismatch. 5688de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty()) 5689de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian return false; 5690de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5691de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian LHSInheritedProtocols.begin(), 5692de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian E = LHSInheritedProtocols.end(); I != E; ++I) { 5693de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian bool match = false; 5694de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian ObjCProtocolDecl *lhsProto = (*I); 5695de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 5696de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian E = rhsQID->qual_end(); J != E; ++J) { 5697de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian ObjCProtocolDecl *rhsProto = *J; 5698de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 5699de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 5700de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian match = true; 5701de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian break; 5702de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5703de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5704de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (!match) 5705de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian return false; 5706de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5707de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 57084084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 57094084c306635b70f37029dca938444e6013f08684Steve Naroff } 57104084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 57114084c306635b70f37029dca938444e6013f08684Steve Naroff} 57124084c306635b70f37029dca938444e6013f08684Steve Naroff 57134084c306635b70f37029dca938444e6013f08684Steve Naroff/// canAssignObjCInterfaces - Return true if the two interface types are 57144084c306635b70f37029dca938444e6013f08684Steve Naroff/// compatible for assignment from RHS to LHS. This handles validation of any 57154084c306635b70f37029dca938444e6013f08684Steve Naroff/// protocol qualifiers on the LHS or RHS. 57164084c306635b70f37029dca938444e6013f08684Steve Naroff/// 57174084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, 57184084c306635b70f37029dca938444e6013f08684Steve Naroff const ObjCObjectPointerType *RHSOPT) { 5719c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5720c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5721c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 57224084c306635b70f37029dca938444e6013f08684Steve Naroff // If either type represents the built-in 'id' or 'Class' types, return true. 5723c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->isObjCUnqualifiedIdOrClass() || 5724c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHS->isObjCUnqualifiedIdOrClass()) 57254084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 57264084c306635b70f37029dca938444e6013f08684Steve Naroff 5727c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) 57281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 57291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType(RHSOPT,0), 57304084c306635b70f37029dca938444e6013f08684Steve Naroff false); 5731a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5732a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) 5733a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return ObjCQualifiedClassTypesAreCompatible(QualType(LHSOPT,0), 5734a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian QualType(RHSOPT,0)); 5735a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5736c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // If we have 2 user-defined types, fall into that path. 5737c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->getInterface() && RHS->getInterface()) 57384084c306635b70f37029dca938444e6013f08684Steve Naroff return canAssignObjCInterfaces(LHS, RHS); 57391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57404084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 574114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff} 574214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 5743132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// canAssignObjCInterfacesInBlockPointer - This routine is specifically written 5744fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// for providing type-safety for objective-c pointers used to pass/return 5745132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// arguments in block literals. When passed as arguments, passing 'A*' where 5746132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is 5747132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// not OK. For the return type, the opposite is not OK. 5748132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::canAssignObjCInterfacesInBlockPointer( 5749132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCObjectPointerType *LHSOPT, 5750a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian const ObjCObjectPointerType *RHSOPT, 5751a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian bool BlockReturnType) { 5752a98344869c278295f38e106583906377520079b8Fariborz Jahanian if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType()) 5753132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return true; 5754132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5755132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHSOPT->isObjCBuiltinType()) { 5756132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType(); 5757132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5758132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5759a98344869c278295f38e106583906377520079b8Fariborz Jahanian if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) 5760132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 5761132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian QualType(RHSOPT,0), 5762132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian false); 5763132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5764132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType(); 5765132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType(); 5766132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS && RHS) { // We have 2 user-defined types. 5767132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS != RHS) { 5768132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS->getDecl()->isSuperClassOf(RHS->getDecl())) 5769a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian return BlockReturnType; 5770132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (RHS->getDecl()->isSuperClassOf(LHS->getDecl())) 5771a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian return !BlockReturnType; 5772132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5773132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian else 5774132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return true; 5775132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5776132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return false; 5777132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian} 5778132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5779e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// getIntersectionOfProtocols - This routine finds the intersection of set 5780e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// of protocols inherited from two distinct objective-c pointer objects. 5781e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// It is used to build composite qualifier list of the composite type of 5782e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// the conditional expression involving two objective-c pointer objects. 5783e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianstatic 5784e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid getIntersectionOfProtocols(ASTContext &Context, 5785e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian const ObjCObjectPointerType *LHSOPT, 5786e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian const ObjCObjectPointerType *RHSOPT, 57875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) { 5788e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5789c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5790c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5791c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(LHS->getInterface() && "LHS must have an interface base"); 5792c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(RHS->getInterface() && "RHS must have an interface base"); 5793e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5794e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet; 5795e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian unsigned LHSNumProtocols = LHS->getNumProtocols(); 5796e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (LHSNumProtocols > 0) 5797e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end()); 5798e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian else { 5799432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5800c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Context.CollectInheritedProtocols(LHS->getInterface(), 5801c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHSInheritedProtocols); 5802e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian InheritedProtocolSet.insert(LHSInheritedProtocols.begin(), 5803e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian LHSInheritedProtocols.end()); 5804e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 5805e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5806e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian unsigned RHSNumProtocols = RHS->getNumProtocols(); 5807e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (RHSNumProtocols > 0) { 5808cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman ObjCProtocolDecl **RHSProtocols = 5809cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman const_cast<ObjCProtocolDecl **>(RHS->qual_begin()); 5810e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (unsigned i = 0; i < RHSNumProtocols; ++i) 5811e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (InheritedProtocolSet.count(RHSProtocols[i])) 5812e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian IntersectionOfProtocols.push_back(RHSProtocols[i]); 58133060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 5814432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols; 5815c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Context.CollectInheritedProtocols(RHS->getInterface(), 5816c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHSInheritedProtocols); 5817432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5818432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian RHSInheritedProtocols.begin(), 5819432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian E = RHSInheritedProtocols.end(); I != E; ++I) 5820432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian if (InheritedProtocolSet.count((*I))) 5821432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian IntersectionOfProtocols.push_back((*I)); 5822e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 5823e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian} 5824e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5825db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// areCommonBaseCompatible - Returns common base class of the two classes if 5826db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// one found. Note that this is O'2 algorithm. But it will be called as the 5827db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// last type comparison in a ?-exp of ObjC pointer types before a 5828db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// warning is issued. So, its invokation is extremely rare. 5829db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz JahanianQualType ASTContext::areCommonBaseCompatible( 5830c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectPointerType *Lptr, 5831c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectPointerType *Rptr) { 5832c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *LHS = Lptr->getObjectType(); 5833c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *RHS = Rptr->getObjectType(); 5834c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCInterfaceDecl* LDecl = LHS->getInterface(); 5835c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCInterfaceDecl* RDecl = RHS->getInterface(); 583660ef308e51c71b760d7f598c1b763ceb7b768148Douglas Gregor if (!LDecl || !RDecl || (declaresSameEntity(LDecl, RDecl))) 5837db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian return QualType(); 5838db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 58397c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian do { 5840c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHS = cast<ObjCInterfaceType>(getObjCInterfaceType(LDecl)); 5841e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (canAssignObjCInterfaces(LHS, RHS)) { 58425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl *, 8> Protocols; 5843c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall getIntersectionOfProtocols(*this, Lptr, Rptr, Protocols); 5844c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 5845c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall QualType Result = QualType(LHS, 0); 5846c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!Protocols.empty()) 5847c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = getObjCObjectType(Result, Protocols.data(), Protocols.size()); 5848c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = getObjCObjectPointerType(Result); 5849c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Result; 5850e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 58517c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian } while ((LDecl = LDecl->getSuperClass())); 5852db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 5853db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian return QualType(); 5854db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian} 5855db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 5856c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallbool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS, 5857c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *RHS) { 5858c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(LHS->getInterface() && "LHS is not an interface type"); 5859c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(RHS->getInterface() && "RHS is not an interface type"); 5860c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 58616ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // Verify that the base decls are compatible: the RHS must be a subclass of 58626ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // the LHS. 5863c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!LHS->getInterface()->isSuperClassOf(RHS->getInterface())) 58646ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return false; 58651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58666ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // RHS must have a superset of the protocols in the LHS. If the LHS is not 58676ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // protocol qualified at all, then we are good. 5868c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff if (LHS->getNumProtocols() == 0) 58696ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return true; 58701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5871b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // Okay, we know the LHS has protocol qualifiers. If the RHS doesn't, 5872b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // more detailed analysis is required. 5873b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (RHS->getNumProtocols() == 0) { 5874b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // OK, if LHS is a superclass of RHS *and* 5875b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // this superclass is assignment compatible with LHS. 5876b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // false otherwise. 5877627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian bool IsSuperClass = 5878627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian LHS->getInterface()->isSuperClassOf(RHS->getInterface()); 5879627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian if (IsSuperClass) { 5880b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // OK if conversion of LHS to SuperClass results in narrowing of types 5881b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // ; i.e., SuperClass may implement at least one of the protocols 5882b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok. 5883b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // But not SuperObj<P1,P2,P3> = lhs<P1,P2>. 5884b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols; 5885627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols); 5886b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // If super class has no protocols, it is not a match. 5887b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (SuperClassInheritedProtocols.empty()) 5888b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5889b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian 5890b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5891b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian LHSPE = LHS->qual_end(); 5892b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian LHSPI != LHSPE; LHSPI++) { 5893b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian bool SuperImplementsProtocol = false; 5894b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian ObjCProtocolDecl *LHSProto = (*LHSPI); 5895b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian 5896b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5897b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian SuperClassInheritedProtocols.begin(), 5898b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian E = SuperClassInheritedProtocols.end(); I != E; ++I) { 5899b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian ObjCProtocolDecl *SuperClassProto = (*I); 5900b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) { 5901b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian SuperImplementsProtocol = true; 5902b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian break; 5903b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5904b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5905b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (!SuperImplementsProtocol) 5906b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5907b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5908b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return true; 5909b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5910b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5911b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 59121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5913c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5914c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHSPE = LHS->qual_end(); 591591b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff LHSPI != LHSPE; LHSPI++) { 591691b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff bool RHSImplementsProtocol = false; 591791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff 591891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // If the RHS doesn't implement the protocol on the left, the types 591991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // are incompatible. 5920c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator RHSPI = RHS->qual_begin(), 5921c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHSPE = RHS->qual_end(); 59228f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff RHSPI != RHSPE; RHSPI++) { 59238f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) { 592491b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff RHSImplementsProtocol = true; 59258f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff break; 59268f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff } 592791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff } 592891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // FIXME: For better diagnostics, consider passing back the protocol name. 592991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff if (!RHSImplementsProtocol) 593091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff return false; 593191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff } 593291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // The RHS implements all protocols listed on the LHS. 593391b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff return true; 59346ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner} 59356ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner 5936389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroffbool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) { 5937389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff // get the "pointed to" types 5938183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>(); 5939183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>(); 59401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 594114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (!LHSOPT || !RHSOPT) 5942389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff return false; 594314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 594414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return canAssignObjCInterfaces(LHSOPT, RHSOPT) || 594514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff canAssignObjCInterfaces(RHSOPT, LHSOPT); 5946389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff} 5947389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff 5948569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorbool ASTContext::canBindObjCObjectType(QualType To, QualType From) { 5949569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor return canAssignObjCInterfaces( 5950569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor getObjCObjectPointerType(To)->getAs<ObjCObjectPointerType>(), 5951569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor getObjCObjectPointerType(From)->getAs<ObjCObjectPointerType>()); 5952569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 5953569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 59541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible, 5955ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// both shall have the identically qualified version of a compatible type. 59561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// C99 6.2.7p1: Two types have compatible types if their types are the 5957ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// same. See 6.7.[2,3,5] for additional rules. 5958447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregorbool ASTContext::typesAreCompatible(QualType LHS, QualType RHS, 5959447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool CompareUnqualified) { 59604e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 59610e709abafbd939326850501f795cc7a92c88a354Douglas Gregor return hasSameType(LHS, RHS); 59620e709abafbd939326850501f795cc7a92c88a354Douglas Gregor 5963447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull(); 59643d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman} 59653d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 5966c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanianbool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) { 596782378391dfc3b2fc22f63dbf1552bd9aed39dc42Fariborz Jahanian return typesAreCompatible(LHS, RHS); 5968c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian} 5969c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian 5970132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) { 5971132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return !mergeTypes(LHS, RHS, true).isNull(); 5972132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian} 5973132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 59744846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeTransparentUnionType - if T is a transparent union type and a member 59754846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// of T is compatible with SubType, return the merged type, else return 59764846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// QualType() 59774846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType, 59784846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool OfBlockPointer, 59794846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool Unqualified) { 59804846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (const RecordType *UT = T->getAsUnionType()) { 59814846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne RecordDecl *UD = UT->getDecl(); 59824846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (UD->hasAttr<TransparentUnionAttr>()) { 59834846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne for (RecordDecl::field_iterator it = UD->field_begin(), 59844846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne itend = UD->field_end(); it != itend; ++it) { 5985f91d7572ee7fa6f2926c8e7e816039a1154a59f8Peter Collingbourne QualType ET = it->getType().getUnqualifiedType(); 59864846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified); 59874846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!MT.isNull()) 59884846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return MT; 59894846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 59904846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 59914846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 59924846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 59934846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return QualType(); 59944846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne} 59954846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 59964846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeFunctionArgumentTypes - merge two types which appear as function 59974846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// argument types 59984846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeFunctionArgumentTypes(QualType lhs, QualType rhs, 59994846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool OfBlockPointer, 60004846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool Unqualified) { 60014846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // GNU extension: two types are compatible if they appear as a function 60024846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // argument, one of the types is a transparent union type and the other 60034846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // type is compatible with a union member 60044846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer, 60054846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 60064846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!lmerge.isNull()) 60074846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return lmerge; 60084846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60094846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer, 60104846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 60114846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!rmerge.isNull()) 60124846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return rmerge; 60134846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60144846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified); 60154846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne} 60164846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 6017132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs, 6018447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool OfBlockPointer, 6019447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool Unqualified) { 6020183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *lbase = lhs->getAs<FunctionType>(); 6021183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *rbase = rhs->getAs<FunctionType>(); 602272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase); 602372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase); 60243d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman bool allLTypes = true; 60253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman bool allRTypes = true; 60263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 60273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check return type 6028132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian QualType retType; 6029d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian if (OfBlockPointer) { 6030d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian QualType RHS = rbase->getResultType(); 6031d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian QualType LHS = lbase->getResultType(); 6032d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian bool UnqualifiedResult = Unqualified; 6033d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian if (!UnqualifiedResult) 6034d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers()); 6035a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true); 6036d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian } 6037132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian else 60388cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall retType = mergeTypes(lbase->getResultType(), rbase->getResultType(), false, 60398cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall Unqualified); 60403d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (retType.isNull()) return QualType(); 6041447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6042447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) 6043447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor retType = retType.getUnqualifiedType(); 6044447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6045447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor CanQualType LRetType = getCanonicalType(lbase->getResultType()); 6046447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor CanQualType RRetType = getCanonicalType(rbase->getResultType()); 6047447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6048447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LRetType = LRetType.getUnqualifiedType(); 6049447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RRetType = RRetType.getUnqualifiedType(); 6050447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6051447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6052447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (getCanonicalType(retType) != LRetType) 605361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allLTypes = false; 6054447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (getCanonicalType(retType) != RRetType) 605561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allRTypes = false; 60568cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 60576a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // FIXME: double check this 60586a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // FIXME: should we error if lbase->getRegParmAttr() != 0 && 60596a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // rbase->getRegParmAttr() != 0 && 60606a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // lbase->getRegParmAttr() != rbase->getRegParmAttr()? 6061264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo(); 6062264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo(); 60638cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 60648cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall // Compatible functions must have compatible calling conventions 60658cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall if (!isSameCallConv(lbaseInfo.getCC(), rbaseInfo.getCC())) 60668cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return QualType(); 60678cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 60688cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall // Regparm is part of the calling convention. 6069a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm()) 6070a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman return QualType(); 60718cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm()) 60728cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return QualType(); 60738cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 6074f85e193739c953358c865005855253af4f68a497John McCall if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult()) 6075f85e193739c953358c865005855253af4f68a497John McCall return QualType(); 6076f85e193739c953358c865005855253af4f68a497John McCall 607753c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian // functypes which return are preferred over those that do not. 607853c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian if (lbaseInfo.getNoReturn() && !rbaseInfo.getNoReturn()) 60796a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar allLTypes = false; 608053c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian else if (!lbaseInfo.getNoReturn() && rbaseInfo.getNoReturn()) 60816a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar allRTypes = false; 608253c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'. 608353c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn(); 60841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6085f85e193739c953358c865005855253af4f68a497John McCall FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn); 6086e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 60873d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto && rproto) { // two C99 style function prototypes 6088465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() && 6089465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl "C++ shouldn't be here"); 60903d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned lproto_nargs = lproto->getNumArgs(); 60913d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned rproto_nargs = rproto->getNumArgs(); 60923d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 60933d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Compatible functions must have the same number of arguments 60943d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto_nargs != rproto_nargs) 60953d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 60963d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 60973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Variadic and non-variadic functions aren't compatible 60983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto->isVariadic() != rproto->isVariadic()) 60993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 61003d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61017fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis if (lproto->getTypeQuals() != rproto->getTypeQuals()) 61027fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis return QualType(); 61037fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis 610478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (LangOpts.ObjCAutoRefCount && 610578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian !FunctionTypesMatchOnNSConsumedAttrs(rproto, lproto)) 610678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return QualType(); 610778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 61083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check argument compatibility 61095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 10> types; 61103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman for (unsigned i = 0; i < lproto_nargs; i++) { 61113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType largtype = lproto->getArgType(i).getUnqualifiedType(); 61123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType rargtype = rproto->getArgType(i).getUnqualifiedType(); 61134846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType argtype = mergeFunctionArgumentTypes(largtype, rargtype, 61144846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne OfBlockPointer, 61154846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 61163d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (argtype.isNull()) return QualType(); 6117447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6118447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) 6119447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor argtype = argtype.getUnqualifiedType(); 6120447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 61213d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman types.push_back(argtype); 6122447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6123447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor largtype = largtype.getUnqualifiedType(); 6124447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor rargtype = rargtype.getUnqualifiedType(); 6125447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6126447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 612761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (getCanonicalType(argtype) != getCanonicalType(largtype)) 612861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allLTypes = false; 612961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (getCanonicalType(argtype) != getCanonicalType(rargtype)) 613061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allRTypes = false; 61313d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 613278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 61333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 61343d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 6135e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6136e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo(); 6137e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = einfo; 6138e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return getFunctionType(retType, types.begin(), types.size(), EPI); 61393d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 61403d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61413d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto) allRTypes = false; 61423d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (rproto) allLTypes = false; 61433d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 614472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *proto = lproto ? lproto : rproto; 61453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (proto) { 6146465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl assert(!proto->hasExceptionSpec() && "C++ shouldn't be here"); 61473d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (proto->isVariadic()) return QualType(); 61483d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check that the types are compatible with the types that 61493d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // would result from default argument promotions (C99 6.7.5.3p15). 61503d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // The only types actually affected are promotable integer 61513d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // types and floats, which would be passed as a different 61523d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // type depending on whether the prototype is visible. 61533d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned proto_nargs = proto->getNumArgs(); 61543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman for (unsigned i = 0; i < proto_nargs; ++i) { 61553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType argTy = proto->getArgType(i); 6156b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor 6157b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor // Look at the promotion type of enum types, since that is the type used 6158b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor // to pass enum values. 6159b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor if (const EnumType *Enum = argTy->getAs<EnumType>()) 6160b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor argTy = Enum->getDecl()->getPromotionType(); 6161b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor 61623d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (argTy->isPromotableIntegerType() || 61633d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman getCanonicalType(argTy).getUnqualifiedType() == FloatTy) 61643d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 61653d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 61663d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61673d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 61683d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 6169e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6170e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo(); 6171e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = einfo; 61723d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return getFunctionType(retType, proto->arg_type_begin(), 6173e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall proto->getNumArgs(), EPI); 61743d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 61753d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61763d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 61773d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 61788cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return getFunctionNoProtoType(retType, einfo); 61793d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman} 61803d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6181132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeTypes(QualType LHS, QualType RHS, 6182447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool OfBlockPointer, 6183a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian bool Unqualified, bool BlockReturnType) { 618443d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // C++ [expr]: If an expression initially has the type "reference to T", the 618543d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // type is adjusted to "T" prior to any further analysis, the expression 618643d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // designates the object or function denoted by the reference, and the 61877c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // expression is an lvalue unless the reference is an rvalue reference and 61887c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // the expression is a function call (possibly inside parentheses). 61890e709abafbd939326850501f795cc7a92c88a354Douglas Gregor assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?"); 61900e709abafbd939326850501f795cc7a92c88a354Douglas Gregor assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?"); 6191447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6192447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6193447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHS = LHS.getUnqualifiedType(); 6194447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHS = RHS.getUnqualifiedType(); 6195447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 61960e709abafbd939326850501f795cc7a92c88a354Douglas Gregor 61973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType LHSCan = getCanonicalType(LHS), 61983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman RHSCan = getCanonicalType(RHS); 61993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6200f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner // If two types are identical, they are compatible. 62013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LHSCan == RHSCan) 62023d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 62033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62040953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If the qualifiers are different, the types aren't compatible... mostly. 6205a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers LQuals = LHSCan.getLocalQualifiers(); 6206a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers RQuals = RHSCan.getLocalQualifiers(); 62070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (LQuals != RQuals) { 62080953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If any of these qualifiers are different, we have a type 62090953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // mismatch. 62100953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 6211f85e193739c953358c865005855253af4f68a497John McCall LQuals.getAddressSpace() != RQuals.getAddressSpace() || 6212f85e193739c953358c865005855253af4f68a497John McCall LQuals.getObjCLifetime() != RQuals.getObjCLifetime()) 62130953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(); 62140953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62150953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Exactly one GC qualifier difference is allowed: __strong is 62160953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // okay if the other type has no GC qualifier but is an Objective 62170953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // C object pointer (i.e. implicitly strong by default). We fix 62180953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // this by pretending that the unqualified type was actually 62190953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // qualified __strong. 62200953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 62210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 62220953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 62230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 62250953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(); 62260953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62270953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) { 62280953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong)); 62290953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) { 62310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS); 62320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 62340953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62350953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62360953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Okay, qualifiers are equal. 62373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6238852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman Type::TypeClass LHSClass = LHSCan->getTypeClass(); 6239852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman Type::TypeClass RHSClass = RHSCan->getTypeClass(); 6240f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner 62411adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // We want to consider the two function types to be the same for these 62421adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // comparisons, just force one to the other. 62431adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto; 62441adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto; 62454c721d381fb279899337d120edd4a24d405e56b2Eli Friedman 62464c721d381fb279899337d120edd4a24d405e56b2Eli Friedman // Same as above for arrays 6247a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray) 6248a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner LHSClass = Type::ConstantArray; 6249a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray) 6250a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner RHSClass = Type::ConstantArray; 62511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6252c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // ObjCInterfaces are just specialized ObjCObjects. 6253c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject; 6254c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject; 6255c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 6256213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman // Canonicalize ExtVector -> Vector. 6257213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (LHSClass == Type::ExtVector) LHSClass = Type::Vector; 6258213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (RHSClass == Type::ExtVector) RHSClass = Type::Vector; 62591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 62604e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff // If the canonical type classes don't match. 62614e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff if (LHSClass != RHSClass) { 62621adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // C99 6.7.2.2p4: Each enumerated type shall be compatible with char, 62631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // a signed integer type, or an unsigned integer type. 6264842aef8d942a880eeb9535d40de31a86838264cbJohn McCall // Compatibility is based on the underlying type, not the promotion 6265842aef8d942a880eeb9535d40de31a86838264cbJohn McCall // type. 6266183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const EnumType* ETy = LHS->getAs<EnumType>()) { 6267b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian QualType TINT = ETy->getDecl()->getIntegerType(); 6268b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian if (!TINT.isNull() && hasSameType(TINT, RHSCan.getUnqualifiedType())) 62693d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return RHS; 6270bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman } 6271183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const EnumType* ETy = RHS->getAs<EnumType>()) { 6272b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian QualType TINT = ETy->getDecl()->getIntegerType(); 6273b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian if (!TINT.isNull() && hasSameType(TINT, LHSCan.getUnqualifiedType())) 62743d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 6275bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman } 6276e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian // allow block pointer type to match an 'id' type. 6277419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (OfBlockPointer && !BlockReturnType) { 6278419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (LHS->isObjCIdType() && RHS->isBlockPointerType()) 6279419636316c04d570c183b4797fc811932c588358Fariborz Jahanian return LHS; 6280419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (RHS->isObjCIdType() && LHS->isBlockPointerType()) 6281419636316c04d570c183b4797fc811932c588358Fariborz Jahanian return RHS; 6282419636316c04d570c183b4797fc811932c588358Fariborz Jahanian } 6283e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian 62843d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 6285ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff } 62863d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62874a74678ed6c3dedac05d02b1ee341f1db869f049Steve Naroff // The canonical type classes match. 62881adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner switch (LHSClass) { 628972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base) 629072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base) 6291ad5e73887052193afda72db8efcb812bd083a4a8John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 629272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 629372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class: 629472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def" 6295b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 629672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 62977c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case Type::LValueReference: 62987c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case Type::RValueReference: 629972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::MemberPointer: 6300b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("C++ should never be in mergeTypes"); 630172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 6302c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCInterface: 630372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::IncompleteArray: 630472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::VariableArray: 630572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::FunctionProto: 630672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::ExtVector: 6307b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Types are eliminated above"); 630872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 63091adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::Pointer: 63103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman { 63113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Merge two pointer types, while trying to preserve typedef info 63126217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType(); 63136217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType(); 6314447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6315447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSPointee = LHSPointee.getUnqualifiedType(); 6316447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSPointee = RHSPointee.getUnqualifiedType(); 6317447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6318447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false, 6319447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor Unqualified); 63203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (ResultType.isNull()) return QualType(); 632107d258756dc856c6987c394a0972884e6ed46765Eli Friedman if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 632261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 632307d258756dc856c6987c394a0972884e6ed46765Eli Friedman if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 632461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 63253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return getPointerType(ResultType); 63263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 6327c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff case Type::BlockPointer: 6328c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff { 6329c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff // Merge two block pointer types, while trying to preserve typedef info 63306217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType(); 63316217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType(); 6332447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6333447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSPointee = LHSPointee.getUnqualifiedType(); 6334447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSPointee = RHSPointee.getUnqualifiedType(); 6335447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6336447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer, 6337447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor Unqualified); 6338c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (ResultType.isNull()) return QualType(); 6339c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 6340c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return LHS; 6341c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 6342c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return RHS; 6343c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return getBlockPointerType(ResultType); 6344c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff } 6345b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: 6346b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman { 6347b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Merge two pointer types, while trying to preserve typedef info 6348b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType LHSValue = LHS->getAs<AtomicType>()->getValueType(); 6349b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType RHSValue = RHS->getAs<AtomicType>()->getValueType(); 6350b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (Unqualified) { 6351b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman LHSValue = LHSValue.getUnqualifiedType(); 6352b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman RHSValue = RHSValue.getUnqualifiedType(); 6353b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 6354b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType ResultType = mergeTypes(LHSValue, RHSValue, false, 6355b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Unqualified); 6356b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (ResultType.isNull()) return QualType(); 6357b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (getCanonicalType(LHSValue) == getCanonicalType(ResultType)) 6358b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return LHS; 6359b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (getCanonicalType(RHSValue) == getCanonicalType(ResultType)) 6360b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return RHS; 6361b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return getAtomicType(ResultType); 6362b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 63631adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::ConstantArray: 63643d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman { 63653d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const ConstantArrayType* LCAT = getAsConstantArrayType(LHS); 63663d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const ConstantArrayType* RCAT = getAsConstantArrayType(RHS); 63673d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize()) 63683d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 63693d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 63703d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType LHSElem = getAsArrayType(LHS)->getElementType(); 63713d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType RHSElem = getAsArrayType(RHS)->getElementType(); 6372447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6373447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSElem = LHSElem.getUnqualifiedType(); 6374447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSElem = RHSElem.getUnqualifiedType(); 6375447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6376447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6377447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified); 63783d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (ResultType.isNull()) return QualType(); 637961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 638061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 638161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 638261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 63833bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(), 63843bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman ArrayType::ArraySizeModifier(), 0); 63853bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(), 63863bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman ArrayType::ArraySizeModifier(), 0); 63873d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const VariableArrayType* LVAT = getAsVariableArrayType(LHS); 63883d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const VariableArrayType* RVAT = getAsVariableArrayType(RHS); 638961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 639061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 639161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 639261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 63933d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LVAT) { 63943d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // FIXME: This isn't correct! But tricky to implement because 63953d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // the array's size has to be the size of LHS, but the type 63963d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // has to be different. 63973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 63983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 63993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (RVAT) { 64003d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // FIXME: This isn't correct! But tricky to implement because 64013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // the array's size has to be the size of RHS, but the type 64023d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // has to be different. 64033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return RHS; 64043d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 64053bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS; 64063bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS; 64077e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor return getIncompleteArrayType(ResultType, 64087e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor ArrayType::ArraySizeModifier(), 0); 64093d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 64101adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::FunctionNoProto: 6411447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified); 641272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Record: 641372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Enum: 64143d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 64151adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::Builtin: 64163cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner // Only exactly equal builtin types are compatible, which is tested above. 64173d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 641864cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar case Type::Complex: 641964cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar // Distinct complex types are incompatible. 642064cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar return QualType(); 64213cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner case Type::Vector: 64225a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // FIXME: The merged type should be an ExtVector! 64231c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall if (areCompatVectorTypes(LHSCan->getAs<VectorType>(), 64241c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall RHSCan->getAs<VectorType>())) 64253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 642661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return QualType(); 6427c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: { 6428c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Check if the types are assignment compatible. 64295a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // FIXME: This should be type compatibility, e.g. whether 64305a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // "LHS x; RHS x;" at global scope is legal. 6431c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHSIface = LHS->getAs<ObjCObjectType>(); 6432c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHSIface = RHS->getAs<ObjCObjectType>(); 6433c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (canAssignObjCInterfaces(LHSIface, RHSIface)) 64345fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff return LHS; 64355fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff 64363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 643761490e9a965cfee8a78c12c6802138844f04250dCedric Venet } 643814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff case Type::ObjCObjectPointer: { 6439132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (OfBlockPointer) { 6440132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (canAssignObjCInterfacesInBlockPointer( 6441132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian LHS->getAs<ObjCObjectPointerType>(), 6442a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian RHS->getAs<ObjCObjectPointerType>(), 6443a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian BlockReturnType)) 64447530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return LHS; 6445132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return QualType(); 6446132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 6447183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(), 6448183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall RHS->getAs<ObjCObjectPointerType>())) 644914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return LHS; 645014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 6451bc76dd06eb881c70c9775b74bab8b88cd747f173Steve Naroff return QualType(); 64527530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie } 6453ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff } 645472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 64557530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid Type::Class!"); 6456ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff} 64577192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek 645878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanianbool ASTContext::FunctionTypesMatchOnNSConsumedAttrs( 645978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian const FunctionProtoType *FromFunctionType, 646078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian const FunctionProtoType *ToFunctionType) { 646178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromFunctionType->hasAnyConsumedArgs() != 646278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToFunctionType->hasAnyConsumedArgs()) 646378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return false; 646478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FunctionProtoType::ExtProtoInfo FromEPI = 646578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FromFunctionType->getExtProtoInfo(); 646678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FunctionProtoType::ExtProtoInfo ToEPI = 646778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToFunctionType->getExtProtoInfo(); 646878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromEPI.ConsumedArguments && ToEPI.ConsumedArguments) 646978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs(); 647078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ArgIdx != NumArgs; ++ArgIdx) { 647178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromEPI.ConsumedArguments[ArgIdx] != 647278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToEPI.ConsumedArguments[ArgIdx]) 647378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return false; 647478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian } 647578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return true; 647678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian} 647778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 64782390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 64792390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// 'RHS' attributes and returns the merged version; including for function 64802390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// return types. 64812390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz JahanianQualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) { 64822390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType LHSCan = getCanonicalType(LHS), 64832390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian RHSCan = getCanonicalType(RHS); 64842390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If two types are identical, they are compatible. 64852390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LHSCan == RHSCan) 64862390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 64872390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (RHSCan->isFunctionType()) { 64882390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (!LHSCan->isFunctionType()) 64892390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 64902390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType OldReturnType = 64912390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian cast<FunctionType>(RHSCan.getTypePtr())->getResultType(); 64922390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType NewReturnType = 64932390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian cast<FunctionType>(LHSCan.getTypePtr())->getResultType(); 64942390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResReturnType = 64952390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian mergeObjCGCQualifiers(NewReturnType, OldReturnType); 64962390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResReturnType.isNull()) 64972390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 64982390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) { 64992390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo(); 65002390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // In either case, use OldReturnType to build the new function type. 65012390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian const FunctionType *F = LHS->getAs<FunctionType>(); 65022390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (const FunctionProtoType *FPT = cast<FunctionProtoType>(F)) { 6503e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 6504e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = getFunctionExtInfo(LHS); 65052390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResultType 65062390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian = getFunctionType(OldReturnType, FPT->arg_type_begin(), 6507e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FPT->getNumArgs(), EPI); 65082390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return ResultType; 65092390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65102390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65112390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65122390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65132390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65142390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If the qualifiers are different, the types can still be merged. 65152390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers LQuals = LHSCan.getLocalQualifiers(); 65162390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers RQuals = RHSCan.getLocalQualifiers(); 65172390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LQuals != RQuals) { 65182390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If any of these qualifiers are different, we have a type mismatch. 65192390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 65202390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian LQuals.getAddressSpace() != RQuals.getAddressSpace()) 65212390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65222390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65232390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // Exactly one GC qualifier difference is allowed: __strong is 65242390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // okay if the other type has no GC qualifier but is an Objective 65252390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // C object pointer (i.e. implicitly strong by default). We fix 65262390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // this by pretending that the unqualified type was actually 65272390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // qualified __strong. 65282390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 65292390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 65302390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 65312390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65322390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 65332390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65342390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65352390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_L == Qualifiers::Strong) 65362390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 65372390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_R == Qualifiers::Strong) 65382390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return RHS; 65392390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65402390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65412390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65422390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) { 65432390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType LHSBaseQT = LHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 65442390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType RHSBaseQT = RHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 65452390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT); 65462390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResQT == LHSBaseQT) 65472390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 65482390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResQT == RHSBaseQT) 65492390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return RHS; 65502390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65512390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65522390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian} 65532390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65545426bf6456a5aeac416a9150de157904d101c819Chris Lattner//===----------------------------------------------------------------------===// 6555ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman// Integer Predicates 6556ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//===----------------------------------------------------------------------===// 655788054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner 65584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getIntWidth(QualType T) const { 6559f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall if (const EnumType *ET = dyn_cast<EnumType>(T)) 656029a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman T = ET->getDecl()->getIntegerType(); 65611274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (T->isBooleanType()) 65621274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor return 1; 6563f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman // For builtin types, just use the standard type sizing method 6564ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return (unsigned)getTypeSize(T); 6565ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman} 6566ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman 6567ad74a758189180b8ab8faea648e4766c3bfd7fcbEli FriedmanQualType ASTContext::getCorrespondingUnsignedType(QualType T) { 6568f60946222721d9ba3c059563935c17b84703187aDouglas Gregor assert(T->hasSignedIntegerRepresentation() && "Unexpected type"); 65696a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 65706a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner // Turn <4 x signed int> -> <4 x unsigned int> 65716a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner if (const VectorType *VTy = T->getAs<VectorType>()) 65726a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()), 6573e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VTy->getNumElements(), VTy->getVectorKind()); 65746a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 65756a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner // For enums, we return the unsigned version of the base type. 65766a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner if (const EnumType *ETy = T->getAs<EnumType>()) 6577ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman T = ETy->getDecl()->getIntegerType(); 65786a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 65796a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner const BuiltinType *BTy = T->getAs<BuiltinType>(); 65806a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner assert(BTy && "Unexpected signed integer type"); 6581ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman switch (BTy->getKind()) { 6582ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Char_S: 6583ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::SChar: 6584ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedCharTy; 6585ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Short: 6586ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedShortTy; 6587ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Int: 6588ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedIntTy; 6589ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Long: 6590ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedLongTy; 6591ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::LongLong: 6592ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedLongLongTy; 65932df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::Int128: 65942df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner return UnsignedInt128Ty; 6595ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman default: 6596b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unexpected signed integer type"); 6597ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman } 6598ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman} 6599ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman 66007b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios KyrtzidisASTMutationListener::~ASTMutationListener() { } 66017b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 660286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 660386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===// 660486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner// Builtin Type Computation 660586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===// 660686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 660786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the 660833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// pointer over the consumed characters. This returns the resultant type. If 660933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// AllowTypeModifiers is false then modifier like * are not parsed, just basic 661033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// types. This allows "v2i*" to be parsed as a pointer to a v2i instead of 661133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// a vector of "i*". 661214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// 661314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// RequiresICE is filled in on return to indicate whether the value is required 661414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// to be an Integer Constant Expression. 66154ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, 661686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ASTContext::GetBuiltinTypeError &Error, 661714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner bool &RequiresICE, 661833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner bool AllowTypeModifiers) { 661986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Modifiers. 662086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner int HowLong = 0; 662186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner bool Signed = false, Unsigned = false; 662214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE = false; 6623393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner 662433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // Read the prefixed modifiers first. 662586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner bool Done = false; 662686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (!Done) { 662786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner switch (*Str++) { 66281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump default: Done = true; --Str; break; 6629393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner case 'I': 663014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE = true; 6631393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner break; 663286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'S': 663386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!"); 663486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Signed && "Can't use 'S' modifier multiple times!"); 663586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Signed = true; 663686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 663786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'U': 663886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Signed && "Can't use both 'S' and 'U' modifiers!"); 663986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Unsigned && "Can't use 'S' modifier multiple times!"); 664086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Unsigned = true; 664186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 664286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'L': 664386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong <= 2 && "Can't have LLLL modifier"); 664486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ++HowLong; 664586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 664686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 664786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 664886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 664986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner QualType Type; 66501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 665186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Read the base type. 665286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner switch (*Str++) { 6653b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown builtin type letter!"); 665486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'v': 665586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && 665686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'v'!"); 665786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.VoidTy; 665886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 665986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'f': 666086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && 666186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'f'!"); 666286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.FloatTy; 666386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 666486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'd': 666586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong < 2 && !Signed && !Unsigned && 666686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'd'!"); 666786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (HowLong) 666886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.LongDoubleTy; 666986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 667086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.DoubleTy; 667186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 667286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 's': 667386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && "Bad modifiers used with 's'!"); 667486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Unsigned) 667586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.UnsignedShortTy; 667686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 667786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.ShortTy; 667886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 667986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'i': 668086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (HowLong == 3) 668186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty; 668286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (HowLong == 2) 668386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy; 668486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (HowLong == 1) 668586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy; 668686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 668786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy; 668886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 668986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'c': 669086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && "Bad modifiers used with 'c'!"); 669186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Signed) 669286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.SignedCharTy; 669386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (Unsigned) 669486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.UnsignedCharTy; 669586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 669686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.CharTy; 669786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 669886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'b': // boolean 669986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!"); 670086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.BoolTy; 670186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 670286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'z': // size_t. 670386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!"); 670486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getSizeType(); 670586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 670686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'F': 670786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getCFConstantStringType(); 670886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 6709ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian case 'G': 6710ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian Type = Context.getObjCIdType(); 6711ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian break; 6712ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian case 'H': 6713ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian Type = Context.getObjCSelType(); 6714ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian break; 671586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'a': 671686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getBuiltinVaListType(); 671786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Type.isNull() && "builtin va list type not initialized!"); 671886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 671986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'A': 672086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // This is a "reference" to a va_list; however, what exactly 672186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // this means depends on how va_list is defined. There are two 672286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // different kinds of va_list: ones passed by value, and ones 672386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // passed by reference. An example of a by-value va_list is 672486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // x86, where va_list is a char*. An example of by-ref va_list 672586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // is x86-64, where va_list is a __va_list_tag[1]. For x86, 672686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // we want this argument to be a char*&; for x86-64, we want 672786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // it to be a __va_list_tag*. 672886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getBuiltinVaListType(); 672986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Type.isNull() && "builtin va list type not initialized!"); 673014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner if (Type->isArrayType()) 673186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getArrayDecayedType(Type); 673214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner else 673386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getLValueReferenceType(Type); 673486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 673586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'V': { 673686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner char *End; 673786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner unsigned NumElements = strtoul(Str, &End, 10); 673886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(End != Str && "Missing vector size"); 673986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Str = End; 67401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 674114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ElementType = DecodeTypeFromStr(Str, Context, Error, 674214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE, false); 674314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Can't require vector ICE"); 674433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner 674533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // TODO: No way to make AltiVec vectors in builtins yet. 6746788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner Type = Context.getVectorType(ElementType, NumElements, 6747e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::GenericVector); 674886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 674986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6750b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor case 'E': { 6751b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor char *End; 6752b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6753b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor unsigned NumElements = strtoul(Str, &End, 10); 6754b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor assert(End != Str && "Missing vector size"); 6755b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6756b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor Str = End; 6757b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6758b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE, 6759b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor false); 6760b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor Type = Context.getExtVectorType(ElementType, NumElements); 6761b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor break; 6762b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor } 6763d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor case 'X': { 676414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE, 676514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner false); 676614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Can't require complex ICE"); 6767d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor Type = Context.getComplexType(ElementType); 6768d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor break; 6769cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian } 6770cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian case 'Y' : { 6771cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian Type = Context.getPointerDiffType(); 6772cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian break; 6773cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian } 67749a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner case 'P': 6775c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor Type = Context.getFILEType(); 6776c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor if (Type.isNull()) { 6777f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Error = ASTContext::GE_Missing_stdio; 677886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 677986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6780fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump break; 67819a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner case 'J': 6782f711c41dd9412a8182793259d355c4f6979ed5edMike Stump if (Signed) 6783782fa308a765aeac2acb39c4e697c937ec21185bMike Stump Type = Context.getsigjmp_bufType(); 6784f711c41dd9412a8182793259d355c4f6979ed5edMike Stump else 6785f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Type = Context.getjmp_bufType(); 6786f711c41dd9412a8182793259d355c4f6979ed5edMike Stump 6787fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump if (Type.isNull()) { 6788f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Error = ASTContext::GE_Missing_setjmp; 6789fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump return QualType(); 6790fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump } 6791fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump break; 6792e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola case 'K': 6793e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!"); 6794e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola Type = Context.getucontext_tType(); 6795e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola 6796e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola if (Type.isNull()) { 6797e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola Error = ASTContext::GE_Missing_ucontext; 6798e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola return QualType(); 6799e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola } 6800e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola break; 6801782fa308a765aeac2acb39c4e697c937ec21185bMike Stump } 68021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 680333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // If there are modifiers and if we're allowed to parse them, go for it. 680433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Done = !AllowTypeModifiers; 680586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (!Done) { 6806187ab37a05b8f7015b9f39cc8cd9129a0c6d0b48John McCall switch (char c = *Str++) { 680733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner default: Done = true; --Str; break; 680833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case '*': 680933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case '&': { 681033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // Both pointers and references can have their pointee types 681133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // qualified with an address space. 681233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner char *End; 681333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner unsigned AddrSpace = strtoul(Str, &End, 10); 681433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner if (End != Str && AddrSpace != 0) { 681533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getAddrSpaceQualType(Type, AddrSpace); 681633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Str = End; 681733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner } 681833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner if (c == '*') 681933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getPointerType(Type); 682033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner else 682133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getLValueReferenceType(Type); 682233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 682333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner } 682433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // FIXME: There's no way to have a built-in with an rvalue ref arg. 682533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case 'C': 682633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Type.withConst(); 682733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 682833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case 'D': 682933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getVolatileType(Type); 683033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 683118932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek case 'R': 683218932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek Type = Type.withRestrict(); 683318932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek break; 683486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 683586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6836393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner 683714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert((!RequiresICE || Type->isIntegralOrEnumerationType()) && 6838393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner "Integer constant 'I' type must be an integer"); 68391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 684086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return Type; 684186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner} 684286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 684386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// GetBuiltinType - Return the type for the specified builtin. 684433daae66462e8f51ee153463b32bdefd60c801aaChris LattnerQualType ASTContext::GetBuiltinType(unsigned Id, 684514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner GetBuiltinTypeError &Error, 68464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned *IntegerConstantArgs) const { 684733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner const char *TypeStr = BuiltinInfo.GetTypeString(Id); 68481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 8> ArgTypes; 68501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 685114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner bool RequiresICE = false; 685286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Error = GE_None; 685314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error, 685414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE, true); 685586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Error != GE_None) 685686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 685714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 685814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE"); 685914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 686086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (TypeStr[0] && TypeStr[0] != '.') { 686114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true); 686286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Error != GE_None) 686386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 686486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 686514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner // If this argument is required to be an IntegerConstantExpression and the 686614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner // caller cares, fill in the bitmask we return. 686714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner if (RequiresICE && IntegerConstantArgs) 686814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner *IntegerConstantArgs |= 1 << ArgTypes.size(); 686914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 687086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Do array -> pointer decay. The builtin should use the decayed type. 687186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Ty->isArrayType()) 687286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Ty = getArrayDecayedType(Ty); 68731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 687486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ArgTypes.push_back(Ty); 687586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 687686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 687786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert((TypeStr[0] != '.' || TypeStr[1] == 0) && 687886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "'.' should only occur at end of builtin type list!"); 687986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 688000ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall FunctionType::ExtInfo EI; 688100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true); 688200ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall 688300ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall bool Variadic = (TypeStr[0] == '.'); 688400ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall 688500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall // We really shouldn't be making a no-proto type here, especially in C++. 688600ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall if (ArgTypes.empty() && Variadic) 688700ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall return getFunctionNoProtoType(ResType, EI); 6888ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor 6889e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI; 689000ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall EPI.ExtInfo = EI; 689100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall EPI.Variadic = Variadic; 6892e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6893e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return getFunctionType(ResType, ArgTypes.data(), ArgTypes.size(), EPI); 689486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner} 6895a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman 689690e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) { 689790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage External = GVA_StrongExternal; 689890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 689990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis Linkage L = FD->getLinkage(); 690090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (L) { 690190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case NoLinkage: 690290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case InternalLinkage: 690390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case UniqueExternalLinkage: 690490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_Internal; 690590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 690690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case ExternalLinkage: 690790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (FD->getTemplateSpecializationKind()) { 690890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_Undeclared: 690990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitSpecialization: 691090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis External = GVA_StrongExternal; 691190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis break; 691290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 691390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDefinition: 691490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_ExplicitTemplateInstantiation; 691590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 691690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDeclaration: 691790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ImplicitInstantiation: 691890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis External = GVA_TemplateInstantiation; 691990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis break; 692090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 692190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 692290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 692390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!FD->isInlined()) 692490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return External; 692590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 69264e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().CPlusPlus || FD->hasAttr<GNUInlineAttr>()) { 692790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // GNU or C99 inline semantics. Determine whether this symbol should be 692890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // externally visible. 692990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->isInlineDefinitionExternallyVisible()) 693090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return External; 693190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 693290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // C99 inline semantics, where the symbol is not externally visible. 693390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_C99Inline; 693490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 693590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 693690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // C++0x [temp.explicit]p9: 693790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // [ Note: The intent is that an inline function that is the subject of 693890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // an explicit instantiation declaration will still be implicitly 693990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // instantiated when used so that the body can be considered for 694090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // inlining, but that no out-of-line copy of the inline function would be 694190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // generated in the translation unit. -- end note ] 694290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->getTemplateSpecializationKind() 694390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis == TSK_ExplicitInstantiationDeclaration) 694490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_C99Inline; 694590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 694690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_CXXInline; 694790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 694890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 694990e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) { 695090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // If this is a static data member, compute the kind of template 695190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // specialization. Otherwise, this variable is not part of a 695290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // template. 695390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis TemplateSpecializationKind TSK = TSK_Undeclared; 695490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (VD->isStaticDataMember()) 695590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis TSK = VD->getTemplateSpecializationKind(); 695690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 695790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis Linkage L = VD->getLinkage(); 69584e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (L == ExternalLinkage && getLangOpts().CPlusPlus && 695990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis VD->getType()->getLinkage() == UniqueExternalLinkage) 696090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis L = UniqueExternalLinkage; 696190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 696290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (L) { 696390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case NoLinkage: 696490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case InternalLinkage: 696590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case UniqueExternalLinkage: 696690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_Internal; 696790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 696890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case ExternalLinkage: 696990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (TSK) { 697090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_Undeclared: 697190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitSpecialization: 697290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_StrongExternal; 697390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 697490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDeclaration: 697590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis llvm_unreachable("Variable should not be instantiated"); 697690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Fall through to treat this like any other instantiation. 697790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 697890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDefinition: 697990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_ExplicitTemplateInstantiation; 698090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 698190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ImplicitInstantiation: 698290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_TemplateInstantiation; 698390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 698490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 698590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 69867530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid Linkage!"); 698790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 698890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 69894ac7c0bb39696e92fd220118fedc484c09a69870Argyrios Kyrtzidisbool ASTContext::DeclMustBeEmitted(const Decl *D) { 699090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 699190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!VD->isFileVarDecl()) 699290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 6993144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis } else if (!isa<FunctionDecl>(D)) 699490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 699590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 6996ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis // Weak references don't produce any output by themselves. 6997ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis if (D->hasAttr<WeakRefAttr>()) 6998ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis return false; 6999ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 700090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Aliases and used decls are required. 700190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>()) 700290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 700390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 700490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 700590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Forward declarations aren't required. 700610620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (!FD->doesThisDeclarationHaveABody()) 7007dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky return FD->doesDeclarationForceExternallyVisibleDefinition(); 700890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 700990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Constructors and destructors are required. 701090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>()) 701190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 701290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 701390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // The key function for a class is required. 701490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 701590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const CXXRecordDecl *RD = MD->getParent(); 701690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (MD->isOutOfLine() && RD->isDynamicClass()) { 701790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const CXXMethodDecl *KeyFunc = getKeyFunction(RD); 701890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl()) 701990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 702090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 702190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 702290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 702390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage Linkage = GetGVALinkageForFunction(FD); 702490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 702590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // static, static inline, always_inline, and extern inline functions can 702690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // always be deferred. Normal inline functions can be deferred in C99/C++. 702790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Implicit template instantiations can also be deferred in C++. 702890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (Linkage == GVA_Internal || Linkage == GVA_C99Inline || 70293a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) 703090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 703190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 703290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 703394da1587f7d584fc61df793229d197969f204cd9Douglas Gregor 703490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const VarDecl *VD = cast<VarDecl>(D); 703590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis assert(VD->isFileVarDecl() && "Expected file scoped var"); 703690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 7037ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly) 7038ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis return false; 7039ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 704090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Structs that have non-trivial constructors or destructors are required. 704190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 704290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // FIXME: Handle references. 7043023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // FIXME: Be more selective about which constructors we care about. 704490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const RecordType *RT = VD->getType()->getAs<RecordType>()) { 704590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 7046023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt if (RD->hasDefinition() && !(RD->hasTrivialDefaultConstructor() && 7047023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialCopyConstructor() && 7048023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialMoveConstructor() && 7049023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialDestructor())) 705090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 705190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 705290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 705390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 705490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage L = GetGVALinkageForVariable(VD); 705590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (L == GVA_Internal || L == GVA_TemplateInstantiation) { 705690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!(VD->getInit() && VD->getInit()->HasSideEffects(*this))) 705790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 705890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 705990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 706090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 706190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 7062071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 7063ee743f903858e337434ac0335f147f4de4ecae05Charles DavisCallingConv ASTContext::getDefaultMethodCallConv() { 7064ee743f903858e337434ac0335f147f4de4ecae05Charles Davis // Pass through to the C++ ABI object 7065ee743f903858e337434ac0335f147f4de4ecae05Charles Davis return ABI->getDefaultMethodCallConv(); 7066ee743f903858e337434ac0335f147f4de4ecae05Charles Davis} 7067ee743f903858e337434ac0335f147f4de4ecae05Charles Davis 70684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const { 7069dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson // Pass through to the C++ ABI object 7070dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson return ABI->isNearlyEmpty(RD); 7071dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson} 7072dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson 707314110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *ASTContext::createMangleContext() { 7074bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor switch (Target->getCXXABI()) { 707514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_ARM: 707614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_Itanium: 707714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne return createItaniumMangleContext(*this, getDiagnostics()); 707814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_Microsoft: 707914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne return createMicrosoftMangleContext(*this, getDiagnostics()); 708014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne } 7081b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unsupported ABI"); 708214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne} 708314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne 7084071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI::~CXXABI() {} 7085ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek 7086ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremeneksize_t ASTContext::getSideTableAllocatedMemory() const { 70870c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek return ASTRecordLayouts.getMemorySize() 70880c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(ObjCLayouts) 70890c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(KeyFunctions) 70900c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(ObjCImpls) 70910c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(BlockVarCopyInits) 70920c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(DeclAttrs) 70930c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromStaticDataMember) 70940c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUsingDecl) 70950c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) 70960c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) 70970c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(OverriddenMethods) 70980c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(Types) 7099af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet + llvm::capacity_in_bytes(VariableArrayTypes) 71000d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet + llvm::capacity_in_bytes(ClassScopeSpecializationPattern); 7101ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek} 7102d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek 71039e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorunsigned ASTContext::getLambdaManglingNumber(CXXMethodDecl *CallOperator) { 71049e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor CXXRecordDecl *Lambda = CallOperator->getParent(); 71059e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor return LambdaMangleContexts[Lambda->getDeclContext()] 71069e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor .getManglingNumber(CallOperator); 71079e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor} 71089e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 71099e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 7110d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekvoid ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) { 7111d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek ParamIndices[D] = index; 7112d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek} 7113d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek 7114d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekunsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const { 7115d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek ParameterIndexTable::const_iterator I = ParamIndices.find(D); 7116d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek assert(I != ParamIndices.end() && 7117d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek "ParmIndices lacks entry set by ParmVarDecl"); 7118d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek return I->second; 7119d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek} 7120