ASTContext.cpp revision 811c820257746b1799b790b6adc7804f44154011
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" 168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentLexer.h" 178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentSema.h" 188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentParser.h" 1949aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h" 20980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h" 21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 22b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLoc.h" 23e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h" 24ea1471e0e967548c596a71469702f8846dbaf3c0John McCall#include "clang/AST/ExprCXX.h" 252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/ExternalASTSource.h" 267b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h" 2719cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 2814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/Mangle.h" 291b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 30a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner#include "clang/Basic/SourceManager.h" 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 32f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "llvm/ADT/SmallString.h" 3385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson#include "llvm/ADT/StringExtras.h" 346fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman#include "llvm/Support/MathExtras.h" 35f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "llvm/Support/raw_ostream.h" 360c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek#include "llvm/Support/Capacity.h" 37071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#include "CXXABI.h" 382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis#include <map> 3929445a0542d128cd7ee587ee52229670b9b54a12Anders Carlsson 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 421827403a7138946305c0058f262e02b595cf882fDouglas Gregorunsigned ASTContext::NumImplicitDefaultConstructors; 431827403a7138946305c0058f262e02b595cf882fDouglas Gregorunsigned ASTContext::NumImplicitDefaultConstructorsDeclared; 44225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorunsigned ASTContext::NumImplicitCopyConstructors; 45225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorunsigned ASTContext::NumImplicitCopyConstructorsDeclared; 46ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveConstructors; 47ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveConstructorsDeclared; 48a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorunsigned ASTContext::NumImplicitCopyAssignmentOperators; 49a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorunsigned ASTContext::NumImplicitCopyAssignmentOperatorsDeclared; 50ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveAssignmentOperators; 51ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveAssignmentOperatorsDeclared; 524923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregorunsigned ASTContext::NumImplicitDestructors; 534923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregorunsigned ASTContext::NumImplicitDestructorsDeclared; 544923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerenum FloatingRank { 56aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov HalfRank, FloatRank, DoubleRank, LongDoubleRank 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 59aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoconst RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const { 60aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (!CommentsLoaded && ExternalSource) { 61aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko ExternalSource->ReadComments(); 62aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko CommentsLoaded = true; 63aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 64aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 65aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko assert(D); 66aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 67c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko // User can not attach documentation to implicit declarations. 68c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko if (D->isImplicit()) 69c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko return NULL; 70c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko 71aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // TODO: handle comments for function parameters properly. 72aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (isa<ParmVarDecl>(D)) 73aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 74aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 75811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko ArrayRef<RawComment *> RawComments = Comments.getComments(); 76aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 77aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // If there are no comments anywhere, we won't find anything. 78aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (RawComments.empty()) 79aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 80aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 81aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // If the declaration doesn't map directly to a location in a file, we 82aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // can't find the comment. 83aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceLocation DeclLoc = D->getLocation(); 84aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLoc.isInvalid() || !DeclLoc.isFileID()) 85aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 86aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 87aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Find the comment that occurs just after this declaration. 88811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko RawComment CommentAtDeclLoc(SourceMgr, SourceRange(DeclLoc)); 89811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko ArrayRef<RawComment *>::iterator Comment 90aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko = std::lower_bound(RawComments.begin(), 91aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawComments.end(), 92811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko &CommentAtDeclLoc, 93aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko BeforeThanCompare<RawComment>(SourceMgr)); 94aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 95aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Decompose the location for the declaration and find the beginning of the 96aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // file buffer. 97aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> DeclLocDecomp = SourceMgr.getDecomposedLoc(DeclLoc); 98aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 99aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // First check whether we have a trailing comment. 100aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Comment != RawComments.end() && 101811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko (*Comment)->isDocumentation() && (*Comment)->isTrailingComment() && 102aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko !isa<TagDecl>(D) && !isa<NamespaceDecl>(D)) { 103aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> CommentBeginDecomp 104811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getBegin()); 105aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check that Doxygen trailing comment comes after the declaration, starts 106aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // on the same line and in the same file as the declaration. 107aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLocDecomp.first == CommentBeginDecomp.first && 108aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) 109aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko == SourceMgr.getLineNumber(CommentBeginDecomp.first, 110aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko CommentBeginDecomp.second)) { 111811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko return *Comment; 112aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 113aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 114aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 115aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // The comment just after the declaration was not a trailing comment. 116aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Let's look at the previous comment. 117aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Comment == RawComments.begin()) 118aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 119aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko --Comment; 120aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 121aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check that we actually have a non-member Doxygen comment. 122811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko if (!(*Comment)->isDocumentation() || (*Comment)->isTrailingComment()) 123aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 124aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 125aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Decompose the end of the comment. 126aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> CommentEndDecomp 127811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getEnd()); 128aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 129aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // If the comment and the declaration aren't in the same file, then they 130aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // aren't related. 131aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLocDecomp.first != CommentEndDecomp.first) 132aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 133aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 134aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Get the corresponding buffer. 135aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool Invalid = false; 136aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first, 137aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko &Invalid).data(); 138aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Invalid) 139aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 140aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 141aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Extract text between the comment and declaration. 142aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko StringRef Text(Buffer + CommentEndDecomp.second, 143aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko DeclLocDecomp.second - CommentEndDecomp.second); 144aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1458bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko // There should be no other declarations or preprocessor directives between 1468bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko // comment and declaration. 1478bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko if (Text.find_first_of(",;{}#") != StringRef::npos) 148aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 149aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 150811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko return *Comment; 151aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} 152aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 153aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoconst RawComment *ASTContext::getRawCommentForDecl(const Decl *D) const { 154aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check whether we have cached a comment string for this declaration 155aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // already. 1568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::DenseMap<const Decl *, RawAndParsedComment>::iterator Pos 157aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko = DeclComments.find(D); 1588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Pos != DeclComments.end()) { 1598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RawAndParsedComment C = Pos->second; 1608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C.first; 1618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 162aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 163aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko const RawComment *RC = getRawCommentForDeclNoCache(D); 1648376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko // If we found a comment, it should be a documentation comment. 1658376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko assert(!RC || RC->isDocumentation()); 1669bf997e63d4e4004588b374e702a5e64da5ebb49Dmitri Gribenko DeclComments[D] = 1679bf997e63d4e4004588b374e702a5e64da5ebb49Dmitri Gribenko RawAndParsedComment(RC, static_cast<comments::FullComment *>(NULL)); 168aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return RC; 169aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} 170aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkocomments::FullComment *ASTContext::getCommentForDecl(const Decl *D) const { 1728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::DenseMap<const Decl *, RawAndParsedComment>::iterator Pos 1738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko = DeclComments.find(D); 1748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const RawComment *RC; 1758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Pos != DeclComments.end()) { 1768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RawAndParsedComment C = Pos->second; 1778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (comments::FullComment *FC = C.second) 1788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return FC; 1798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RC = C.first; 1808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } else 1818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RC = getRawCommentForDecl(D); 1828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (!RC) 1848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return NULL; 1858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const StringRef RawText = RC->getRawText(SourceMgr); 1878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko comments::Lexer L(RC->getSourceRange().getBegin(), comments::CommentOptions(), 1888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RawText.begin(), RawText.end()); 1898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko comments::Sema S(this->BumpAlloc); 1918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko comments::Parser P(L, S, this->BumpAlloc); 1928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko comments::FullComment *FC = P.parseFullComment(); 1948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko DeclComments[D].second = FC; 1958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return FC; 1968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} 1978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1983e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregorvoid 1993e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID, 2003e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *Parm) { 2013e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Parm->getDepth()); 2023e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Parm->getPosition()); 20361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor ID.AddBoolean(Parm->isParameterPack()); 2043e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2053e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList *Params = Parm->getTemplateParameters(); 2063e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Params->size()); 2073e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor for (TemplateParameterList::const_iterator P = Params->begin(), 2083e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor PEnd = Params->end(); 2093e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor P != PEnd; ++P) { 2103e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 2113e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(0); 2123e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddBoolean(TTP->isParameterPack()); 2133e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor continue; 2143e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 2153e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2163e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 2173e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(1); 21861c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor ID.AddBoolean(NTTP->isParameterPack()); 2199e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr()); 2206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 2216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddBoolean(true); 2226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddInteger(NTTP->getNumExpansionTypes()); 2239e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 2249e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman QualType T = NTTP->getExpansionType(I); 2259e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman ID.AddPointer(T.getCanonicalType().getAsOpaquePtr()); 2269e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman } 2276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else 2286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddBoolean(false); 2293e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor continue; 2303e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 2313e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2323e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 2333e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(2); 2343e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Profile(ID, TTP); 2353e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 2363e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor} 2373e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2383e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorTemplateTemplateParmDecl * 2393e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::getCanonicalTemplateTemplateParmDecl( 2404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad TemplateTemplateParmDecl *TTP) const { 2413e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Check if we already have a canonical template template parameter. 2423e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor llvm::FoldingSetNodeID ID; 2433e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonicalTemplateTemplateParm::Profile(ID, TTP); 2443e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor void *InsertPos = 0; 2453e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonicalTemplateTemplateParm *Canonical 2463e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 2473e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (Canonical) 2483e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor return Canonical->getParam(); 2493e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2503e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Build a canonical template parameter list. 2513e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList *Params = TTP->getTemplateParameters(); 2525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> CanonParams; 2533e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.reserve(Params->size()); 2543e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor for (TemplateParameterList::const_iterator P = Params->begin(), 2553e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor PEnd = Params->end(); 2563e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor P != PEnd; ++P) { 2573e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) 2583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.push_back( 2593e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTypeParmDecl::Create(*this, getTranslationUnitDecl(), 260344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation(), 261344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation(), 262344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara TTP->getDepth(), 2633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TTP->getIndex(), 0, false, 2643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TTP->isParameterPack())); 2653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor else if (NonTypeTemplateParmDecl *NTTP 2666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 2676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T = getCanonicalType(NTTP->getType()); 2686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T); 2696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NonTypeTemplateParmDecl *Param; 2706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 2715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 2> ExpandedTypes; 2725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TypeSourceInfo *, 2> ExpandedTInfos; 2736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 2746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I))); 2756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos.push_back( 2766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor getTrivialTypeSourceInfo(ExpandedTypes.back())); 2776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 2786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 280ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 281ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 2826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getDepth(), 2836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getPosition(), 0, 2846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T, 2856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TInfo, 2866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.data(), 2876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.size(), 2886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos.data()); 2896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else { 2906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 291ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 292ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 2936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getDepth(), 2946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getPosition(), 0, 2956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T, 2966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->isParameterPack(), 2976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TInfo); 2986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 2996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor CanonParams.push_back(Param); 3006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 3016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else 3023e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.push_back(getCanonicalTemplateTemplateParmDecl( 3033e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor cast<TemplateTemplateParmDecl>(*P))); 3043e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 3053e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 3063e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *CanonTTP 3073e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 3083e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation(), TTP->getDepth(), 30961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor TTP->getPosition(), 31061c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor TTP->isParameterPack(), 31161c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor 0, 3123e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList::Create(*this, SourceLocation(), 3133e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation(), 3143e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.data(), 3153e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.size(), 3163e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation())); 3173e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 3183e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Get the new insert position for the node we care about. 3193e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 3203e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor assert(Canonical == 0 && "Shouldn't be in the map!"); 3213e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor (void)Canonical; 3223e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 3233e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Create the canonical template template parameter entry. 3243e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP); 3253e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos); 3263e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor return CanonTTP; 3273e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor} 3283e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 329071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *ASTContext::createCXXABI(const TargetInfo &T) { 330ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall if (!LangOpts.CPlusPlus) return 0; 331ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall 33220cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis switch (T.getCXXABI()) { 333ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall case CXXABI_ARM: 334ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall return CreateARMCXXABI(*this); 335ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall case CXXABI_Itanium: 336071cc7deffad608165b1ddd5263e8bf181861520Charles Davis return CreateItaniumCXXABI(*this); 33720cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis case CXXABI_Microsoft: 33820cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis return CreateMicrosoftCXXABI(*this); 33920cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis } 3407530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CXXABI type!"); 341071cc7deffad608165b1ddd5263e8bf181861520Charles Davis} 342071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 343bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorstatic const LangAS::Map *getAddressSpaceMap(const TargetInfo &T, 344207f4d8543529221932af82836016a2ef066c917Peter Collingbourne const LangOptions &LOpts) { 345207f4d8543529221932af82836016a2ef066c917Peter Collingbourne if (LOpts.FakeAddressSpaceMap) { 346207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // The fake address space map must have a distinct entry for each 347207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // language-specific address space. 348207f4d8543529221932af82836016a2ef066c917Peter Collingbourne static const unsigned FakeAddrSpaceMap[] = { 349207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 1, // opencl_global 350207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 2, // opencl_local 3514dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 3, // opencl_constant 3524dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 4, // cuda_device 3534dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 5, // cuda_constant 3544dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 6 // cuda_shared 355207f4d8543529221932af82836016a2ef066c917Peter Collingbourne }; 356bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return &FakeAddrSpaceMap; 357207f4d8543529221932af82836016a2ef066c917Peter Collingbourne } else { 358bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return &T.getAddressSpaceMap(); 359207f4d8543529221932af82836016a2ef066c917Peter Collingbourne } 360207f4d8543529221932af82836016a2ef066c917Peter Collingbourne} 361207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 3623e3cd93b2fd9644e970c389e715c13883faf68b6Douglas GregorASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM, 363bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor const TargetInfo *t, 364e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar IdentifierTable &idents, SelectorTable &sels, 3651b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner Builtin::Context &builtins, 366bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned size_reserve, 367bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor bool DelayInitialization) 368bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor : FunctionProtoTypes(this_()), 369bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor TemplateSpecializationTypes(this_()), 370bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor DependentTemplateSpecializationTypes(this_()), 371bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor SubstTemplateTemplateParmPacks(this_()), 372bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor GlobalNestedNameSpecifier(0), 373bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Int128Decl(0), UInt128Decl(0), 374c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge BuiltinVaListDecl(0), 375a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor ObjCIdDecl(0), ObjCSelDecl(0), ObjCClassDecl(0), ObjCProtocolClassDecl(0), 376e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor CFConstantStringTypeDecl(0), ObjCInstanceTypeDecl(0), 377bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor FILEDecl(0), 378e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola jmp_bufDecl(0), sigjmp_bufDecl(0), ucontext_tDecl(0), 379e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola BlockDescriptorType(0), BlockDescriptorExtendedType(0), 380e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola cudaConfigureCallDecl(0), 381e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor NullTypeSourceInfo(QualType()), 382e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor FirstLocalImport(), LastLocalImport(), 383bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor SourceMgr(SM), LangOpts(LOpts), 38430c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor AddrSpaceMap(0), Target(t), PrintingPolicy(LOpts), 385bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Idents(idents), Selectors(sels), 386bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor BuiltinInfo(builtins), 387bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor DeclarationNames(*this), 38830c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor ExternalSource(0), Listener(0), 389aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Comments(SM), CommentsLoaded(false), 390bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor LastSDM(0, 0), 391bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor UniqueBlockByRefTypeID(0) 392bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor{ 3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (size_reserve > 0) Types.reserve(size_reserve); 394e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar TUDecl = TranslationUnitDecl::Create(*this); 395bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 396bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor if (!DelayInitialization) { 397bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor assert(t && "No target supplied for ASTContext initialization"); 398bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor InitBuiltinTypes(*t); 399bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor } 400e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar} 401e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar 4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext::~ASTContext() { 4033478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek // Release the DenseMaps associated with DeclContext objects. 4043478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek // FIXME: Is this the ideal solution? 4053478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek ReleaseDeclContextMaps(); 4067d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 40763fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // Call all of the deallocation functions. 40863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor for (unsigned I = 0, N = Deallocations.size(); I != N; ++I) 40963fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor Deallocations[I].first(Deallocations[I].second); 4100054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 411dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed 41263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // because they can contain DenseMaps. 41363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor for (llvm::DenseMap<const ObjCContainerDecl*, 41463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor const ASTRecordLayout*>::iterator 41563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) 41663fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // Increment in loop to prevent using deallocated memory. 41763fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 41863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor R->Destroy(*this); 41963fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor 420dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator 421dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) { 422dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek // Increment in loop to prevent using deallocated memory. 423dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 424dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek R->Destroy(*this); 425dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek } 4266320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 4276320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(), 4286320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor AEnd = DeclAttrs.end(); 4296320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor A != AEnd; ++A) 4306320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor A->second->~AttrVec(); 4316320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 432ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor 4330054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) { 4340054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor Deallocations.push_back(std::make_pair(Callback, Data)); 4350054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 4360054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 4371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 4386f42b62b6194f53bcbc349f5d17388e1936535d7Dylan NoblesmithASTContext::setExternalSource(OwningPtr<ExternalASTSource> &Source) { 4392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ExternalSource.reset(Source.take()); 4402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 4412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 4425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ASTContext::PrintStats() const { 443cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "\n*** AST Context Stats:\n"; 444cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << " " << Types.size() << " types total.\n"; 4457c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 446dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned counts[] = { 4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define TYPE(Name, Parent) 0, 448dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent) 449dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def" 450dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor 0 // Extra 451dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor }; 452c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor 4535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Types.size(); i != e; ++i) { 4545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Type *T = Types[i]; 455dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor counts[(unsigned)T->getTypeClass()]++; 4565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 458dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned Idx = 0; 459dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned TotalBytes = 0; 460dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define TYPE(Name, Parent) \ 461dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor if (counts[Idx]) \ 462cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << " " << counts[Idx] << " " << #Name \ 463cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " types\n"; \ 464dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor TotalBytes += counts[Idx] * sizeof(Name##Type); \ 465dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor ++Idx; 466dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent) 467dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def" 4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 469cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "Total bytes = " << TotalBytes << "\n"; 470cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 4714923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor // Implicit special member functions. 472cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/" 473cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitDefaultConstructors 474cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit default constructors created\n"; 475cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitCopyConstructorsDeclared << "/" 476cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitCopyConstructors 477cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit copy constructors created\n"; 4784e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 479cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitMoveConstructorsDeclared << "/" 480cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitMoveConstructors 481cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit move constructors created\n"; 482cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/" 483cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitCopyAssignmentOperators 484cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit copy assignment operators created\n"; 4854e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 486cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/" 487cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitMoveAssignmentOperators 488cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit move assignment operators created\n"; 489cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitDestructorsDeclared << "/" 490cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitDestructors 491cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit destructors created\n"; 492cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 4932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (ExternalSource.get()) { 494cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "\n"; 4952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ExternalSource->PrintStats(); 4962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 497cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 49863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor BumpAlloc.PrintStats(); 4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 501772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getInt128Decl() const { 502772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (!Int128Decl) { 503772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(Int128Ty); 504772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor Int128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 505772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor getTranslationUnitDecl(), 506772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 507772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 508772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor &Idents.get("__int128_t"), 509772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TInfo); 510772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 511772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 512772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor return Int128Decl; 513772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor} 514772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 515772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getUInt128Decl() const { 516772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (!UInt128Decl) { 517772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(UnsignedInt128Ty); 518772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor UInt128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 519772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor getTranslationUnitDecl(), 520772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 521772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 522772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor &Idents.get("__uint128_t"), 523772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TInfo); 524772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 525772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 526772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor return UInt128Decl; 527772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor} 5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 529e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallvoid ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) { 5306b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K); 531e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall R = CanQualType::CreateUnsafe(QualType(Ty, 0)); 5326b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Types.push_back(Ty); 5335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 535bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorvoid ASTContext::InitBuiltinTypes(const TargetInfo &Target) { 536bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor assert((!this->Target || this->Target == &Target) && 537bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor "Incorrect target reinitialization"); 5385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(VoidTy.isNull() && "Context reinitialized?"); 5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 540bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor this->Target = &Target; 541bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 542bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor ABI.reset(createCXXABI(Target)); 543bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor AddrSpaceMap = getAddressSpaceMap(Target, LangOpts); 544bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 5455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p19. 5465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(VoidTy, BuiltinType::Void); 5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p2. 5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(BoolTy, BuiltinType::Bool); 5505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p3. 55115b91764d08e886391c865c4a444d7b51141c284Eli Friedman if (LangOpts.CharIsSigned) 5525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(CharTy, BuiltinType::Char_S); 5535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 5545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(CharTy, BuiltinType::Char_U); 5555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p4. 5565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(SignedCharTy, BuiltinType::SChar); 5575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(ShortTy, BuiltinType::Short); 5585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(IntTy, BuiltinType::Int); 5595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongTy, BuiltinType::Long); 5605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongLongTy, BuiltinType::LongLong); 5611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p6. 5635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedCharTy, BuiltinType::UChar); 5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedShortTy, BuiltinType::UShort); 5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedIntTy, BuiltinType::UInt); 5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedLongTy, BuiltinType::ULong); 5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedLongLongTy, BuiltinType::ULongLong); 5681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p10. 5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(FloatTy, BuiltinType::Float); 5715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(DoubleTy, BuiltinType::Double); 5725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongDoubleTy, BuiltinType::LongDouble); 57364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 5742df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner // GNU extension, 128-bit integers. 5752df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner InitBuiltinType(Int128Ty, BuiltinType::Int128); 5762df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner InitBuiltinType(UnsignedInt128Ty, BuiltinType::UInt128); 5772df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner 5783f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner if (LangOpts.CPlusPlus) { // C++ 3.9.1p5 579d3d77cd138f8e830f6547b6f83fcd5721ccf5f5dEli Friedman if (TargetInfo::isTypeSigned(Target.getWCharType())) 5803f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner InitBuiltinType(WCharTy, BuiltinType::WChar_S); 5813f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner else // -fshort-wchar makes wchar_t be unsigned. 5823f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner InitBuiltinType(WCharTy, BuiltinType::WChar_U); 5833f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner } else // C99 5843a2503227c3db04a3619735127483263c1075ef7Chris Lattner WCharTy = getFromTargetType(Target.getWCharType()); 58564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 586392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy WIntTy = getFromTargetType(Target.getWIntType()); 587392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy 588f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 589f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith InitBuiltinType(Char16Ty, BuiltinType::Char16); 590f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith else // C99 591f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char16Ty = getFromTargetType(Target.getChar16Type()); 592f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 593f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 594f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith InitBuiltinType(Char32Ty, BuiltinType::Char32); 595f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith else // C99 596f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char32Ty = getFromTargetType(Target.getChar32Type()); 597f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 598898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // Placeholder type for type-dependent expressions whose type is 599898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // completely unknown. No code should ever check a type against 600898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // DependentTy and users should never see it; however, it is here to 601898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // help diagnose failures to properly check for type-dependent 602898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // expressions. 603898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor InitBuiltinType(DependentTy, BuiltinType::Dependent); 6048e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 6052a984cad5ac3fdceeff2bd99daa7b90979313475John McCall // Placeholder type for functions. 6062a984cad5ac3fdceeff2bd99daa7b90979313475John McCall InitBuiltinType(OverloadTy, BuiltinType::Overload); 6072a984cad5ac3fdceeff2bd99daa7b90979313475John McCall 608864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // Placeholder type for bound members. 609864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall InitBuiltinType(BoundMemberTy, BuiltinType::BoundMember); 610864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 6113c3b7f90a863af43fa63043d396553ecf205351cJohn McCall // Placeholder type for pseudo-objects. 6123c3b7f90a863af43fa63043d396553ecf205351cJohn McCall InitBuiltinType(PseudoObjectTy, BuiltinType::PseudoObject); 6133c3b7f90a863af43fa63043d396553ecf205351cJohn McCall 6141de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall // "any" type; useful for debugger-like clients. 6151de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall InitBuiltinType(UnknownAnyTy, BuiltinType::UnknownAny); 6161de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall 6170ddaeb9b031070ec64afe92d9892875ac44df427John McCall // Placeholder type for unbridged ARC casts. 6180ddaeb9b031070ec64afe92d9892875ac44df427John McCall InitBuiltinType(ARCUnbridgedCastTy, BuiltinType::ARCUnbridgedCast); 6190ddaeb9b031070ec64afe92d9892875ac44df427John McCall 6205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p11. 6215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer FloatComplexTy = getComplexType(FloatTy); 6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DoubleComplexTy = getComplexType(DoubleTy); 6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer LongDoubleComplexTy = getComplexType(LongDoubleTy); 6248e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 62513dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian // Builtin types for 'id', 'Class', and 'SEL'. 626de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId); 627de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass); 62813dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel); 629ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 630ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // Builtin type for __objc_yes and __objc_no 63193a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ? 63293a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian SignedCharTy : BoolTy); 633ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 634a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCConstantStringType = QualType(); 6351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // void * type 63733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian VoidPtrTy = getPointerType(VoidTy); 6386e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 6396e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // nullptr type (C++0x 2.14.7) 6406e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl InitBuiltinType(NullPtrTy, BuiltinType::NullPtr); 641aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov 642aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov // half type (OpenCL 6.1.1.1) / ARM NEON __fp16 643aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov InitBuiltinType(HalfTy, BuiltinType::Half); 644fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 645fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // Builtin type used to help define __builtin_va_list. 646fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge VaListTagTy = QualType(); 6475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 649d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikieDiagnosticsEngine &ASTContext::getDiagnostics() const { 65078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis return SourceMgr.getDiagnostics(); 65178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis} 65278a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis 6536320064d0c60fa8683f5623881c9394fd4aa7689Douglas GregorAttrVec& ASTContext::getDeclAttrs(const Decl *D) { 6546320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor AttrVec *&Result = DeclAttrs[D]; 6556320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor if (!Result) { 6566320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor void *Mem = Allocate(sizeof(AttrVec)); 6576320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor Result = new (Mem) AttrVec; 6586320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor } 6596320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 6606320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor return *Result; 6616320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 6626320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 6636320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor/// \brief Erase the attributes corresponding to the given declaration. 6646320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregorvoid ASTContext::eraseDeclAttrs(const Decl *D) { 6656320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D); 6666320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor if (Pos != DeclAttrs.end()) { 6676320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor Pos->second->~AttrVec(); 6686320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor DeclAttrs.erase(Pos); 6696320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor } 6706320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 6716320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 672251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorMemberSpecializationInfo * 673663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas GregorASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) { 6747caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Var->isStaticDataMember() && "Not a static data member"); 675663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos 6767caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor = InstantiatedFromStaticDataMember.find(Var); 6777caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Pos == InstantiatedFromStaticDataMember.end()) 6787caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return 0; 6791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6807caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return Pos->second; 6817caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 6827caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 6831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 684251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, 6859421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis TemplateSpecializationKind TSK, 6869421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis SourceLocation PointOfInstantiation) { 6877caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Inst->isStaticDataMember() && "Not a static data member"); 6887caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Tmpl->isStaticDataMember() && "Not a static data member"); 6897caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(!InstantiatedFromStaticDataMember[Inst] && 6907caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor "Already noted what static data member was instantiated from"); 691251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor InstantiatedFromStaticDataMember[Inst] 6929421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis = new (*this) MemberSpecializationInfo(Tmpl, TSK, PointOfInstantiation); 6937caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 6947caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 695af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetFunctionDecl *ASTContext::getClassScopeSpecializationPattern( 696af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet const FunctionDecl *FD){ 697af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(FD && "Specialization is 0"); 698af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet llvm::DenseMap<const FunctionDecl*, FunctionDecl *>::const_iterator Pos 6990d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet = ClassScopeSpecializationPattern.find(FD); 7000d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet if (Pos == ClassScopeSpecializationPattern.end()) 701af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return 0; 702af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 703af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return Pos->second; 704af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 705af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 706af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichetvoid ASTContext::setClassScopeSpecializationPattern(FunctionDecl *FD, 707af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet FunctionDecl *Pattern) { 708af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(FD && "Specialization is 0"); 709af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(Pattern && "Class scope specialization pattern is 0"); 7100d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet ClassScopeSpecializationPattern[FD] = Pattern; 711af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 712af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 7137ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallNamedDecl * 714ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) { 7157ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos 716ed97649e9574b9d854fa4d6109c9333ae0993554John McCall = InstantiatedFromUsingDecl.find(UUD); 717ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Pos == InstantiatedFromUsingDecl.end()) 7180d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return 0; 7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7200d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return Pos->second; 7210d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 7220d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 7230d8df780aef1acda5962347a32591efc629b6748Anders Carlssonvoid 724ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) { 725ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert((isa<UsingDecl>(Pattern) || 726ed97649e9574b9d854fa4d6109c9333ae0993554John McCall isa<UnresolvedUsingValueDecl>(Pattern) || 727ed97649e9574b9d854fa4d6109c9333ae0993554John McCall isa<UnresolvedUsingTypenameDecl>(Pattern)) && 728ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "pattern decl is not a using decl"); 729ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists"); 730ed97649e9574b9d854fa4d6109c9333ae0993554John McCall InstantiatedFromUsingDecl[Inst] = Pattern; 731ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 732ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 733ed97649e9574b9d854fa4d6109c9333ae0993554John McCallUsingShadowDecl * 734ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) { 735ed97649e9574b9d854fa4d6109c9333ae0993554John McCall llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos 736ed97649e9574b9d854fa4d6109c9333ae0993554John McCall = InstantiatedFromUsingShadowDecl.find(Inst); 737ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Pos == InstantiatedFromUsingShadowDecl.end()) 738ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return 0; 739ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 740ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Pos->second; 741ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 742ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 743ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid 744ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, 745ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingShadowDecl *Pattern) { 746ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists"); 747ed97649e9574b9d854fa4d6109c9333ae0993554John McCall InstantiatedFromUsingShadowDecl[Inst] = Pattern; 7480d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 7490d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 750d8b285fee4471f393da8ee30f552ceacdc362afaAnders CarlssonFieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) { 751d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos 752d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson = InstantiatedFromUnnamedFieldDecl.find(Field); 753d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (Pos == InstantiatedFromUnnamedFieldDecl.end()) 754d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return 0; 7551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 756d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return Pos->second; 757d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson} 758d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 759d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlssonvoid ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, 760d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson FieldDecl *Tmpl) { 761d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed"); 762d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Tmpl->getDeclName() && "Template field decl is not unnamed"); 763d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!InstantiatedFromUnnamedFieldDecl[Inst] && 764d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson "Already noted what unnamed field was instantiated from"); 7651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 766d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl; 767d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson} 768d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 76914d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanianbool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD, 77014d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian const FieldDecl *LastFD) const { 77114d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian return (FD->isBitField() && LastFD && !LastFD->isBitField() && 772a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) == 0); 77314d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian} 77414d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian 775340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanianbool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD, 776340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian const FieldDecl *LastFD) const { 777340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian return (FD->isBitField() && LastFD && LastFD->isBitField() && 778a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) == 0 && 779a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this) != 0); 780340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian} 781340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian 7829b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanianbool ASTContext::BitfieldFollowsBitfield(const FieldDecl *FD, 7839b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian const FieldDecl *LastFD) const { 7849b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian return (FD->isBitField() && LastFD && LastFD->isBitField() && 785a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) && 786a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this)); 7879b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian} 7889b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian 789dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::NonBitfieldFollowsBitfield(const FieldDecl *FD, 79052bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian const FieldDecl *LastFD) const { 79152bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian return (!FD->isBitField() && LastFD && LastFD->isBitField() && 792a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this)); 79352bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian} 79452bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian 795dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::BitfieldFollowsNonBitfield(const FieldDecl *FD, 79652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian const FieldDecl *LastFD) const { 79752bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian return (FD->isBitField() && LastFD && !LastFD->isBitField() && 798a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this)); 79952bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian} 80052bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian 8017d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator 8027d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const { 8037d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 8047d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor = OverriddenMethods.find(Method); 8057d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor if (Pos == OverriddenMethods.end()) 8067d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return 0; 8077d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 8087d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return Pos->second.begin(); 8097d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 8107d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 8117d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator 8127d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_end(const CXXMethodDecl *Method) const { 8137d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 8147d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor = OverriddenMethods.find(Method); 8157d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor if (Pos == OverriddenMethods.end()) 8167d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return 0; 8177d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 8187d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return Pos->second.end(); 8197d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 8207d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 821c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned 822c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios KyrtzidisASTContext::overridden_methods_size(const CXXMethodDecl *Method) const { 823c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 824c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis = OverriddenMethods.find(Method); 825c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Pos == OverriddenMethods.end()) 826c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return 0; 827c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 828c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return Pos->second.size(); 829c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis} 830c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 8317d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregorvoid ASTContext::addOverriddenMethod(const CXXMethodDecl *Method, 8327d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor const CXXMethodDecl *Overridden) { 8337d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor OverriddenMethods[Method].push_back(Overridden); 8347d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 8357d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 836e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregorvoid ASTContext::addedLocalImportDecl(ImportDecl *Import) { 837e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor assert(!Import->NextLocalImport && "Import declaration already in the chain"); 838e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor assert(!Import->isFromASTFile() && "Non-local import declaration"); 839e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor if (!FirstLocalImport) { 840e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor FirstLocalImport = Import; 841e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport = Import; 842e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor return; 843e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor } 844e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor 845e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport->NextLocalImport = Import; 846e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport = Import; 847e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor} 848e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor 849464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===// 850464175bba1318bef7905122e9fda20cff926df78Chris Lattner// Type Sizing and Analysis 851464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===// 852a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 853b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified 854b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// scalar floating point type. 855b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattnerconst llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const { 856183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const BuiltinType *BT = T->getAs<BuiltinType>(); 857b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner assert(BT && "Not a floating point type!"); 858b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner switch (BT->getKind()) { 859b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Not a floating point type!"); 860aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: return Target->getHalfFormat(); 861bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::Float: return Target->getFloatFormat(); 862bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::Double: return Target->getDoubleFormat(); 863bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::LongDouble: return Target->getLongDoubleFormat(); 864b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner } 865b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner} 866b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner 8678b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck/// getDeclAlign - Return a conservative estimate of the alignment of the 868af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// specified decl. Note that bitfields do not have a valid alignment, so 869af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// this method will assert on them. 8705d484e8cf710207010720589d89602233de61d01Sebastian Redl/// If @p RefAsPointee, references are treated like their underlying type 8715d484e8cf710207010720589d89602233de61d01Sebastian Redl/// (for alignof), else they're treated like pointers (for CodeGen). 8724ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const { 873bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned Align = Target->getCharWidth(); 874dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 8754081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall bool UseAlignAttrOnly = false; 8764081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (unsigned AlignFromAttr = D->getMaxAlignment()) { 8774081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall Align = AlignFromAttr; 8784081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall 8794081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // __attribute__((aligned)) can increase or decrease alignment 8804081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // *except* on a struct or struct member, where it only increases 8814081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // alignment unless 'packed' is also specified. 8824081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // 88382d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne // It is an error for alignas to decrease alignment, so we can 8844081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // ignore that possibility; Sema should diagnose it. 8854081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (isa<FieldDecl>(D)) { 8864081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall UseAlignAttrOnly = D->hasAttr<PackedAttr>() || 8874081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 8884081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } else { 8894081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall UseAlignAttrOnly = true; 8904081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } 8914081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } 89278a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian else if (isa<FieldDecl>(D)) 89378a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian UseAlignAttrOnly = 89478a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian D->hasAttr<PackedAttr>() || 89578a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 896dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 897ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // If we're using the align attribute only, just ignore everything 898ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // else about the declaration and its type. 8994081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (UseAlignAttrOnly) { 900ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // do nothing 901ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 9024081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } else if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 903af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner QualType T = VD->getType(); 9046217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const ReferenceType* RT = T->getAs<ReferenceType>()) { 9055d484e8cf710207010720589d89602233de61d01Sebastian Redl if (RefAsPointee) 9065d484e8cf710207010720589d89602233de61d01Sebastian Redl T = RT->getPointeeType(); 9075d484e8cf710207010720589d89602233de61d01Sebastian Redl else 9085d484e8cf710207010720589d89602233de61d01Sebastian Redl T = getPointerType(RT->getPointeeType()); 9095d484e8cf710207010720589d89602233de61d01Sebastian Redl } 9105d484e8cf710207010720589d89602233de61d01Sebastian Redl if (!T->isIncompleteType() && !T->isFunctionType()) { 9113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Adjust alignments of declarations with array type by the 9123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // large-array alignment on the target. 913bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned MinWidth = Target->getLargeArrayMinWidth(); 9143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall const ArrayType *arrayType; 9153b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (MinWidth && (arrayType = getAsArrayType(T))) { 9163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (isa<VariableArrayType>(arrayType)) 917bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = std::max(Align, Target->getLargeArrayAlign()); 9183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall else if (isa<ConstantArrayType>(arrayType) && 9193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType))) 920bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = std::max(Align, Target->getLargeArrayAlign()); 9213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 9223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Walk through any array types while we're at it. 9233b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall T = getBaseElementType(arrayType); 9246deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola } 9259f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr())); 926dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman } 927ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 928ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Fields can be subject to extra alignment constraints, like if 929ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // the field is packed, the struct is packed, or the struct has a 930ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // a max-field-alignment constraint (#pragma pack). So calculate 931ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // the actual alignment of the field within the struct, and then 932ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // (as we're expected to) constrain that by the alignment of the type. 933ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (const FieldDecl *field = dyn_cast<FieldDecl>(VD)) { 934ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // So calculate the alignment of the field. 935ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall const ASTRecordLayout &layout = getASTRecordLayout(field->getParent()); 936ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 937ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Start with the record's overall alignment. 938dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck unsigned fieldAlign = toBits(layout.getAlignment()); 939ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 940ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Use the GCD of that and the offset within the record. 941ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall uint64_t offset = layout.getFieldOffset(field->getFieldIndex()); 942ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (offset > 0) { 943ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Alignment is always a power of 2, so the GCD will be a power of 2, 944ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // which means we get to do this crazy thing instead of Euclid's. 945ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall uint64_t lowBitOfOffset = offset & (~offset + 1); 946ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (lowBitOfOffset < fieldAlign) 947ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall fieldAlign = static_cast<unsigned>(lowBitOfOffset); 948ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall } 949ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 950ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall Align = std::min(Align, fieldAlign); 95105f62474dd2b0f1cb69adbe0787f2868788aa949Charles Davis } 952af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner } 953dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 954eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(Align); 955af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner} 956b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner 957ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits> 958bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(const Type *T) const { 959ea1471e0e967548c596a71469702f8846dbaf3c0John McCall std::pair<uint64_t, unsigned> Info = getTypeInfo(T); 960eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return std::make_pair(toCharUnitsFromBits(Info.first), 961eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck toCharUnitsFromBits(Info.second)); 962ea1471e0e967548c596a71469702f8846dbaf3c0John McCall} 963ea1471e0e967548c596a71469702f8846dbaf3c0John McCall 964ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits> 965bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(QualType T) const { 966ea1471e0e967548c596a71469702f8846dbaf3c0John McCall return getTypeInfoInChars(T.getTypePtr()); 967ea1471e0e967548c596a71469702f8846dbaf3c0John McCall} 968ea1471e0e967548c596a71469702f8846dbaf3c0John McCall 969bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbarstd::pair<uint64_t, unsigned> ASTContext::getTypeInfo(const Type *T) const { 970bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar TypeInfoMap::iterator it = MemoizedTypeInfo.find(T); 971bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar if (it != MemoizedTypeInfo.end()) 972bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar return it->second; 973bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar 974bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar std::pair<uint64_t, unsigned> Info = getTypeInfoImpl(T); 975bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar MemoizedTypeInfo.insert(std::make_pair(T, Info)); 976bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar return Info; 977bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar} 978bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar 979bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// getTypeInfoImpl - Return the size of the specified type, in bits. This 980bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// method does not work on incomplete types. 9810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// 9820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// FIXME: Pointers into different addr spaces could have different sizes and 9830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// alignment requirements: getPointerInfo should take an AddrSpace, this 9840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// should take a QualType, &c. 985d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattnerstd::pair<uint64_t, unsigned> 986bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel DunbarASTContext::getTypeInfoImpl(const Type *T) const { 9875e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump uint64_t Width=0; 9885e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump unsigned Align=8; 989a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner switch (T->getTypeClass()) { 99072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base) 99172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base) 99218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor#define NON_CANONICAL_TYPE(Class, Base) 99372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class: 99472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def" 995d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall llvm_unreachable("Should not see dependent types"); 99672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 9975d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::FunctionNoProto: 9985d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::FunctionProto: 99918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // GCC extension: alignof(function) = 32 bits 100018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 100118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = 32; 100218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 100318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 100472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::IncompleteArray: 1005fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::VariableArray: 100618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 100718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = getTypeAlign(cast<ArrayType>(T)->getElementType()); 100818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 100918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 1010fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::ConstantArray: { 10111d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const ConstantArrayType *CAT = cast<ConstantArrayType>(T); 10121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 101398be4943e8dc4f3905629a7102668960873cf863Chris Lattner std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType()); 1014fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara uint64_t Size = CAT->getSize().getZExtValue(); 1015bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar assert((Size == 0 || EltInfo.first <= (uint64_t)(-1)/Size) && 1016bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar "Overflow in array type bit size evaluation"); 1017fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara Width = EltInfo.first*Size; 1018030d8846c7e520330007087e949f621989876e3aChris Lattner Align = EltInfo.second; 1019cd88b4171753dcb2bc0a21d78f1597c796bb8a20Argyrios Kyrtzidis Width = llvm::RoundUpToAlignment(Width, Align); 1020030d8846c7e520330007087e949f621989876e3aChris Lattner break; 10215c09a02a5db85e08a432b6eeced9aa656349710dChristopher Lamb } 1022213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman case Type::ExtVector: 1023030d8846c7e520330007087e949f621989876e3aChris Lattner case Type::Vector: { 10249fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner const VectorType *VT = cast<VectorType>(T); 10259fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType()); 10269fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Width = EltInfo.first*VT->getNumElements(); 10274bd998bbc228915d2b9cae5b67879de48940d05eEli Friedman Align = Width; 10286fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman // If the alignment is not a power of 2, round up to the next power of 2. 10296fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman // This happens for non-power-of-2 length vectors. 10308eefcd353c1d06a10104f69e5079ebab3183f9a3Dan Gohman if (Align & (Align-1)) { 10319fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Align = llvm::NextPowerOf2(Align); 10329fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Width = llvm::RoundUpToAlignment(Width, Align); 10339fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner } 1034030d8846c7e520330007087e949f621989876e3aChris Lattner break; 1035030d8846c7e520330007087e949f621989876e3aChris Lattner } 10365d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner 10379e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner case Type::Builtin: 1038a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner switch (cast<BuiltinType>(T)->getKind()) { 1039b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown builtin type!"); 1040d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner case BuiltinType::Void: 104118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // GCC extension: alignof(void) = 8 bits. 104218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 104318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = 8; 104418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 104518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 10466f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Bool: 1047bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getBoolWidth(); 1048bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getBoolAlign(); 10496f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1050692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::Char_S: 1051692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::Char_U: 1052692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UChar: 10536f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::SChar: 1054bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getCharWidth(); 1055bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getCharAlign(); 10566f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 10573f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 10583f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 1059bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getWCharWidth(); 1060bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getWCharAlign(); 106164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis break; 1062f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case BuiltinType::Char16: 1063bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getChar16Width(); 1064bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getChar16Align(); 1065f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith break; 1066f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case BuiltinType::Char32: 1067bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getChar32Width(); 1068bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getChar32Align(); 1069f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith break; 1070692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UShort: 10716f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Short: 1072bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getShortWidth(); 1073bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getShortAlign(); 10746f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1075692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UInt: 10766f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Int: 1077bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getIntWidth(); 1078bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getIntAlign(); 10796f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1080692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::ULong: 10816f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Long: 1082bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongWidth(); 1083bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongAlign(); 10846f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1085692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::ULongLong: 10866f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::LongLong: 1087bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongLongWidth(); 1088bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongLongAlign(); 10896f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1090ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner case BuiltinType::Int128: 1091ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner case BuiltinType::UInt128: 1092ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner Width = 128; 1093ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner Align = 128; // int128_t is 128-bit aligned on all targets. 1094ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner break; 1095aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: 1096aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov Width = Target->getHalfWidth(); 1097aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov Align = Target->getHalfAlign(); 1098aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov break; 10996f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Float: 1100bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getFloatWidth(); 1101bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getFloatAlign(); 11026f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 11036f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Double: 1104bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getDoubleWidth(); 1105bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getDoubleAlign(); 11066f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 11076f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::LongDouble: 1108bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongDoubleWidth(); 1109bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongDoubleAlign(); 11106f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 11116e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl case BuiltinType::NullPtr: 1112bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t) 1113bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); // == sizeof(void*) 11141590d9c0fec4c710c2962e4bb71f76979b5163d3Sebastian Redl break; 1115e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCId: 1116e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCClass: 1117e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCSel: 1118bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); 1119bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); 1120e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian break; 1121a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner } 1122bfef6d7c67831a135d6ab79931f010f750a730adChris Lattner break; 1123d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff case Type::ObjCObjectPointer: 1124bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); 1125bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); 11266f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1127485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff case Type::BlockPointer: { 1128207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace( 1129207f4d8543529221932af82836016a2ef066c917Peter Collingbourne cast<BlockPointerType>(T)->getPointeeType()); 1130bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1131bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 1132485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff break; 1133485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff } 11345d484e8cf710207010720589d89602233de61d01Sebastian Redl case Type::LValueReference: 11355d484e8cf710207010720589d89602233de61d01Sebastian Redl case Type::RValueReference: { 11365d484e8cf710207010720589d89602233de61d01Sebastian Redl // alignof and sizeof should never enter this code path here, so we go 11375d484e8cf710207010720589d89602233de61d01Sebastian Redl // the pointer route. 1138207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace( 1139207f4d8543529221932af82836016a2ef066c917Peter Collingbourne cast<ReferenceType>(T)->getPointeeType()); 1140bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1141bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 11425d484e8cf710207010720589d89602233de61d01Sebastian Redl break; 11435d484e8cf710207010720589d89602233de61d01Sebastian Redl } 1144f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner case Type::Pointer: { 1145207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType()); 1146bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1147bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 1148f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner break; 1149f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner } 1150f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl case Type::MemberPointer: { 1151071cc7deffad608165b1ddd5263e8bf181861520Charles Davis const MemberPointerType *MPT = cast<MemberPointerType>(T); 11521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<uint64_t, unsigned> PtrDiffInfo = 11531cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson getTypeInfo(getPointerDiffType()); 1154071cc7deffad608165b1ddd5263e8bf181861520Charles Davis Width = PtrDiffInfo.first * ABI->getMemberPointerSize(MPT); 11551cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson Align = PtrDiffInfo.second; 11561cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson break; 1157f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl } 11585d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::Complex: { 11595d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner // Complex types have the same alignment as their elements, but twice the 11605d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner // size. 11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<uint64_t, unsigned> EltInfo = 116298be4943e8dc4f3905629a7102668960873cf863Chris Lattner getTypeInfo(cast<ComplexType>(T)->getElementType()); 11639e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner Width = EltInfo.first*2; 11645d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner Align = EltInfo.second; 11655d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner break; 11665d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner } 1167c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: 1168c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr()); 116944a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel case Type::ObjCInterface: { 11701d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T); 117144a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl()); 1172dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck Width = toBits(Layout.getSize()); 1173dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck Align = toBits(Layout.getAlignment()); 117444a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel break; 117544a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel } 117672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Record: 117772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Enum: { 11781d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const TagType *TT = cast<TagType>(T); 11791d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar 11801d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar if (TT->getDecl()->isInvalidDecl()) { 118122ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor Width = 8; 118222ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor Align = 8; 11838389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner break; 11848389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner } 11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11861d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar if (const EnumType *ET = dyn_cast<EnumType>(TT)) 11877176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner return getTypeInfo(ET->getDecl()->getIntegerType()); 11887176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner 11891d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const RecordType *RT = cast<RecordType>(TT); 11907176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl()); 1191dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck Width = toBits(Layout.getSize()); 1192dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck Align = toBits(Layout.getAlignment()); 1193dc0d73e6495404418acf8548875aeaff07791a74Chris Lattner break; 1194a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner } 11957532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 11969fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner case Type::SubstTemplateTypeParm: 119749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return getTypeInfo(cast<SubstTemplateTypeParmType>(T)-> 119849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall getReplacementType().getTypePtr()); 119949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 120034b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: { 120134b41d939a1328f484511c6002ba2456db879a29Richard Smith const AutoType *A = cast<AutoType>(T); 120234b41d939a1328f484511c6002ba2456db879a29Richard Smith assert(A->isDeduced() && "Cannot request the size of a dependent type"); 1203dc856aff4428380baa9afb5577ea04f8fb6beb13Matt Beaumont-Gay return getTypeInfo(A->getDeducedType().getTypePtr()); 120434b41d939a1328f484511c6002ba2456db879a29Richard Smith } 120534b41d939a1328f484511c6002ba2456db879a29Richard Smith 1206075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara case Type::Paren: 1207075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr()); 1208075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 120918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::Typedef: { 1210162e1c1b487352434552147967c3dd296ebee2f7Richard Smith const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl(); 1211df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor std::pair<uint64_t, unsigned> Info 1212df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor = getTypeInfo(Typedef->getUnderlyingType().getTypePtr()); 1213c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // If the typedef has an aligned attribute on it, it overrides any computed 1214c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // alignment we have. This violates the GCC documentation (which says that 1215c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // attribute(aligned) can only round up) but matches its implementation. 1216c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner if (unsigned AttrAlign = Typedef->getMaxAlignment()) 1217c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner Align = AttrAlign; 1218c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner else 1219c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner Align = Info.second; 1220df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor Width = Info.first; 12217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor break; 12227176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner } 122318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 122418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::TypeOfExpr: 122518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType() 122618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor .getTypePtr()); 122718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 122818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::TypeOf: 122918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr()); 123018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 1231395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson case Type::Decltype: 1232395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType() 1233395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson .getTypePtr()); 1234395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 1235ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 1236ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType()); 1237ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 1238465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara case Type::Elaborated: 1239465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr()); 12401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall case Type::Attributed: 12429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return getTypeInfo( 12439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T)->getEquivalentType().getTypePtr()); 12449d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 12453e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith case Type::TemplateSpecialization: { 12461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(getCanonicalType(T) != T && 124718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor "Cannot request the size of a dependent type"); 12483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T); 12493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // A type alias template specialization may refer to a typedef with the 12503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // aligned attribute on it. 12513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (TST->isTypeAlias()) 12523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return getTypeInfo(TST->getAliasedType().getTypePtr()); 12533e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else 12543e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return getTypeInfo(getCanonicalType(T)); 12553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 12563e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 1257b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 12582be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman std::pair<uint64_t, unsigned> Info 12592be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman = getTypeInfo(cast<AtomicType>(T)->getValueType()); 12602be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Width = Info.first; 12612be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Align = Info.second; 12622be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman if (Width != 0 && Width <= Target->getMaxAtomicPromoteWidth() && 12632be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman llvm::isPowerOf2_64(Width)) { 12642be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // We can potentially perform lock-free atomic operations for this 12652be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // type; promote the alignment appropriately. 12662be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // FIXME: We could potentially promote the width here as well... 12672be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // is that worthwhile? (Non-struct atomic types generally have 12682be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // power-of-two size anyway, but structs might not. Requires a bit 12692be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // of implementation work to make sure we zero out the extra bits.) 12702be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Align = static_cast<unsigned>(Width); 12712be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman } 1272b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 1273b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 127418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor } 12751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12762be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2"); 12779e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner return std::make_pair(Width, Align); 1278a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner} 1279a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 1280eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck/// toCharUnitsFromBits - Convert a size in bits to a size in characters. 1281eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen DyckCharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const { 1282eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return CharUnits::fromQuantity(BitSize / getCharWidth()); 1283eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck} 1284eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck 1285dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck/// toBits - Convert a size in characters to a size in characters. 1286dd76a9ab9ea675671200f94b18ce95766841952bKen Dyckint64_t ASTContext::toBits(CharUnits CharSize) const { 1287dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck return CharSize.getQuantity() * getCharWidth(); 1288dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck} 1289dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck 1290bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// getTypeSizeInChars - Return the size of the specified type, in characters. 1291bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// This method does not work on incomplete types. 12924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(QualType T) const { 1293eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeSize(T)); 1294bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck} 12954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(const Type *T) const { 1296eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeSize(T)); 1297bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck} 1298bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck 129916e20cce43385001f33f8e3f90ee345609c805d1Ken Dyck/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in 130086fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck/// characters. This method does not work on incomplete types. 13014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(QualType T) const { 1302eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeAlign(T)); 130386fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck} 13044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(const Type *T) const { 1305eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeAlign(T)); 130686fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck} 130786fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck 130834ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// getPreferredTypeAlign - Return the "preferred" alignment of the specified 130934ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// type for the current target in bits. This can be different than the ABI 131034ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// alignment in cases where it is beneficial for performance to overalign 131134ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// a data type. 13124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getPreferredTypeAlign(const Type *T) const { 131334ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner unsigned ABIAlign = getTypeAlign(T); 13141eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman 13151eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman // Double and long long should be naturally aligned if possible. 1316183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType* CT = T->getAs<ComplexType>()) 13171eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman T = CT->getElementType().getTypePtr(); 13181eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman if (T->isSpecificBuiltinType(BuiltinType::Double) || 1319cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier T->isSpecificBuiltinType(BuiltinType::LongLong) || 1320cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier T->isSpecificBuiltinType(BuiltinType::ULongLong)) 13211eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman return std::max(ABIAlign, (unsigned)getTypeSize(T)); 13221eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman 132334ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner return ABIAlign; 132434ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner} 132534ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner 13262c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// DeepCollectObjCIvars - 13272c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// This routine first collects all declared, but not synthesized, ivars in 13282c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// super class and then collects all ivars, including those synthesized for 13292c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// current class. This routine is used for implementation of current class 13302c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// when all ivars, declared and synthesized are known. 13319820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian/// 13322c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanianvoid ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, 13332c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian bool leafClass, 1334db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const { 13352c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass()) 13362c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian DeepCollectObjCIvars(SuperClass, false, Ivars); 13372c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (!leafClass) { 13382c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(), 13392c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian E = OI->ivar_end(); I != E; ++I) 1340581deb3da481053c4993c7600f97acf7768caac5David Blaikie Ivars.push_back(*I); 13413060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 1342bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI); 1343db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv; 1344bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian Iv= Iv->getNextIvar()) 1345bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian Ivars.push_back(Iv); 1346bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian } 13479820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian} 13489820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian 1349e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// CollectInheritedProtocols - Collect all protocols in current class and 1350e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// those inherited by it. 1351e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid ASTContext::CollectInheritedProtocols(const Decl *CDecl, 1352432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) { 1353e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) { 135453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // We can use protocol_iterator here instead of 135553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // all_referenced_protocol_iterator since we are walking all categories. 135653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator P = OI->all_referenced_protocol_begin(), 135753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PE = OI->all_referenced_protocol_end(); P != PE; ++P) { 1358e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 13593fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1360e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1361b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) { 13623fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert((*P)->getCanonicalDecl()); 1363e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1364e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1365b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian } 1366e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 1367e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian // Categories of this Interface. 1368e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (const ObjCCategoryDecl *CDeclChain = OI->getCategoryList(); 1369e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CDeclChain; CDeclChain = CDeclChain->getNextClassCategory()) 1370e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(CDeclChain, Protocols); 1371e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (ObjCInterfaceDecl *SD = OI->getSuperClass()) 1372e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian while (SD) { 1373e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(SD, Protocols); 1374e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian SD = SD->getSuperClass(); 1375e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1376b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) { 137753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = OC->protocol_begin(), 1378e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = OC->protocol_end(); P != PE; ++P) { 1379e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 13803fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1381e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1382e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) 1383e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1384e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1385b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) { 1386e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(), 1387e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = OP->protocol_end(); P != PE; ++P) { 1388e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 13893fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1390e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1391e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) 1392e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1393e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1394e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1395e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian} 1396e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 13974ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const { 13983bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian unsigned count = 0; 13993bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // Count ivars declared in class extension. 140080aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian for (const ObjCCategoryDecl *CDecl = OI->getFirstClassExtension(); CDecl; 140180aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian CDecl = CDecl->getNextClassExtension()) 1402b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer count += CDecl->ivar_size(); 1403b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer 14043bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // Count ivar defined in this class's implementation. This 14053bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // includes synthesized ivars. 14063bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) 1407b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer count += ImplDecl->ivar_size(); 1408b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer 14098e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian return count; 14108e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian} 14118e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian 14128deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidisbool ASTContext::isSentinelNullExpr(const Expr *E) { 14138deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (!E) 14148deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return false; 14158deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14168deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis // nullptr_t is always treated as null. 14178deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (E->getType()->isNullPtrType()) return true; 14188deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14198deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (E->getType()->isAnyPointerType() && 14208deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis E->IgnoreParenCasts()->isNullPointerConstant(*this, 14218deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis Expr::NPC_ValueDependentIsNull)) 14228deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return true; 14238deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14248deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis // Unfortunately, __null has type 'int'. 14258deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (isa<GNUNullExpr>(E)) return true; 14268deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14278deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return false; 14288deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis} 14298deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14308a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists. 14318a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) { 14328a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 14338a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis I = ObjCImpls.find(D); 14348a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis if (I != ObjCImpls.end()) 14358a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return cast<ObjCImplementationDecl>(I->second); 14368a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return 0; 14378a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14388a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists. 14398a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) { 14408a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 14418a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis I = ObjCImpls.find(D); 14428a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis if (I != ObjCImpls.end()) 14438a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return cast<ObjCCategoryImplDecl>(I->second); 14448a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return 0; 14458a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14468a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis 14478a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCInterfaceDecl. 14488a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD, 14498a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImplementationDecl *ImplD) { 14508a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis assert(IFaceD && ImplD && "Passed null params"); 14518a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImpls[IFaceD] = ImplD; 14528a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14538a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCCategoryDecl. 14548a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD, 14558a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCCategoryImplDecl *ImplD) { 14568a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis assert(CatD && ImplD && "Passed null params"); 14578a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImpls[CatD] = ImplD; 14588a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14598a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis 146087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios KyrtzidisObjCInterfaceDecl *ASTContext::getObjContainingInterface(NamedDecl *ND) const { 146187ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext())) 146287ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return ID; 146387ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ND->getDeclContext())) 146487ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return CD->getClassInterface(); 146587ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(ND->getDeclContext())) 146687ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return IMD->getClassInterface(); 146787ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis 146887ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return 0; 146987ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis} 147087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis 14711ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Get the copy initialization expression of VarDecl,or NULL if 14721ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// none exists. 1473830937bc1100fba7682f7c32c40512085870f50cFariborz JahanianExpr *ASTContext::getBlockVarCopyInits(const VarDecl*VD) { 1474d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD && "Passed null params"); 1475d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD->hasAttr<BlocksAttr>() && 1476d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian "getBlockVarCopyInits - not __block var"); 1477830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian llvm::DenseMap<const VarDecl*, Expr*>::iterator 1478d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian I = BlockVarCopyInits.find(VD); 14791ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian return (I != BlockVarCopyInits.end()) ? cast<Expr>(I->second) : 0; 14801ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian} 14811ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian 14821ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Set the copy inialization expression of a block var decl. 14831ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanianvoid ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) { 14841ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian assert(VD && Init && "Passed null params"); 1485d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD->hasAttr<BlocksAttr>() && 1486d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian "setBlockVarCopyInits - not __block var"); 14871ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian BlockVarCopyInits[VD] = Init; 14881ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian} 14891ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian 1490a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T, 14914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned DataSize) const { 1492109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall if (!DataSize) 1493109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall DataSize = TypeLoc::getFullDataSizeForType(T); 1494109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall else 1495109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall assert(DataSize == TypeLoc::getFullDataSizeForType(T) && 1496a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall "incorrect data size provided to CreateTypeSourceInfo!"); 1497109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall 1498a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *TInfo = 1499a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8); 1500a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall new (TInfo) TypeSourceInfo(T); 1501a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TInfo; 1502b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 1503b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 1504a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T, 15056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SourceLocation L) const { 1506a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = CreateTypeSourceInfo(T); 1507c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L); 1508a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall return DI; 1509a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall} 1510a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall 1511b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout & 15124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const { 1513b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar return getObjCLayout(D, 0); 1514b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar} 1515b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar 1516b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout & 15174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCImplementationLayout( 15184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const ObjCImplementationDecl *D) const { 1519b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar return getObjCLayout(D->getClassInterface(), D); 1520b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar} 1521b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar 1522a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===// 1523a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner// Type creation/memoization methods 1524a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===// 1525a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 15264ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 15273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const { 15283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned fastQuals = quals.getFastQualifiers(); 15293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall quals.removeFastQualifiers(); 15300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 15310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Check if we've already instantiated this type. 15320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall llvm::FoldingSetNodeID ID; 15333b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQuals::Profile(ID, baseType, quals); 15343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 15353b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) { 15363b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(eq->getQualifiers() == quals); 15373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(eq, fastQuals); 15380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 15390953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 15403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If the base type is not canonical, make the appropriate canonical type. 15413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon; 15423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!baseType->isCanonicalUnqualified()) { 15433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split(); 1544200fa53fd420aa8369586f569dbece04930ad6a3John McCall canonSplit.Quals.addConsistentQualifiers(quals); 1545200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getExtQualType(canonSplit.Ty, canonSplit.Quals); 15463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 15473b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Re-find the insert position. 15483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos); 15493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 15503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 15513b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQuals *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals); 15523b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQualNodes.InsertNode(eq, insertPos); 15533b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(eq, fastQuals); 15540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall} 15550953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 15564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 15574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const { 1558f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner QualType CanT = getCanonicalType(T); 1559f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner if (CanT.getAddressSpace() == AddressSpace) 1560f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner return T; 1561b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner 15620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If we are composing extended qualifiers together, merge together 15630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // into one ExtQuals node. 15640953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Quals; 15650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *TypeNode = Quals.strip(T); 15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If this type already has an address space specified, it cannot get 15680953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // another one. 15690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Quals.hasAddressSpace() && 15700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall "Type cannot be in multiple addr spaces!"); 15710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Quals.addAddressSpace(AddressSpace); 15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15730953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getExtQualType(TypeNode, Quals); 1574ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb} 1575ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb 1576b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris LattnerQualType ASTContext::getObjCGCQualType(QualType T, 15774ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Qualifiers::GC GCAttr) const { 1578d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian QualType CanT = getCanonicalType(T); 1579b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner if (CanT.getObjCGCAttr() == GCAttr) 1580d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian return T; 15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15827f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall if (const PointerType *ptr = T->getAs<PointerType>()) { 15837f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall QualType Pointee = ptr->getPointeeType(); 158458f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff if (Pointee->isAnyPointerType()) { 15854027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian QualType ResultType = getObjCGCQualType(Pointee, GCAttr); 15864027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian return getPointerType(ResultType); 15874027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian } 15884027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian } 15891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If we are composing extended qualifiers together, merge together 15910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // into one ExtQuals node. 15920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Quals; 15930953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *TypeNode = Quals.strip(T); 15941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15950953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If this type already has an ObjCGC specified, it cannot get 15960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // another one. 15970953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Quals.hasObjCGCAttr() && 15980953e767ff7817f97b3ab20896b229891eeff45bJohn McCall "Type cannot have multiple ObjCGCs!"); 15990953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Quals.addObjCGCAttr(GCAttr); 16001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16010953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getExtQualType(TypeNode, Quals); 1602d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian} 1603a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 1604e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCallconst FunctionType *ASTContext::adjustFunctionType(const FunctionType *T, 1605e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FunctionType::ExtInfo Info) { 1606e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall if (T->getExtInfo() == Info) 1607e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall return T; 1608e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 1609e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall QualType Result; 1610e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(T)) { 1611e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall Result = getFunctionNoProtoType(FNPT->getResultType(), Info); 1612e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall } else { 1613e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall const FunctionProtoType *FPT = cast<FunctionProtoType>(T); 1614e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 1615e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall EPI.ExtInfo = Info; 1616e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall Result = getFunctionType(FPT->getResultType(), FPT->arg_type_begin(), 1617e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FPT->getNumArgs(), EPI); 1618e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall } 1619e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 1620e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall return cast<FunctionType>(Result.getTypePtr()); 1621e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall} 1622e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 16235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getComplexType - Return the uniqued reference to the type for a complex 16245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// number with the specified element type. 16254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getComplexType(QualType T) const { 16265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 16275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 16285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 16295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexType::Profile(ID, T); 16301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 16325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos)) 16335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(CT, 0); 16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the pointee type isn't canonical, this won't be a canonical type either, 16365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 16375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 1638467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 1639f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getComplexType(getCanonicalType(T)); 16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 16425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos); 1643c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 16445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16456b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical); 16465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 16475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexTypes.InsertNode(New, InsertPos); 16485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 16495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getPointerType - Return the uniqued reference to the type for a pointer to 16525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the specified type. 16534ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPointerType(QualType T) const { 16545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 16555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 16565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 16575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerType::Profile(ID, T); 16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 16605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 16615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(PT, 0); 16621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the pointee type isn't canonical, this won't be a canonical type either, 16645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 16655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 1666467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 1667f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getPointerType(getCanonicalType(T)); 16681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 16705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1671c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 16725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16736b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical); 16745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 16755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerTypes.InsertNode(New, InsertPos); 16765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 16775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getBlockPointerType - Return the uniqued reference to the type for 16805618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff/// a pointer to the specified block. 16814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockPointerType(QualType T) const { 1682296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff assert(T->isFunctionType() && "block of function types only"); 1683296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff // Unique pointers, to guarantee there is only one block of a particular 16845618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // structure. 16855618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff llvm::FoldingSetNodeID ID; 16865618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerType::Profile(ID, T); 16871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16885618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff void *InsertPos = 0; 16895618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff if (BlockPointerType *PT = 16905618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 16915618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return QualType(PT, 0); 16921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the block pointee type isn't canonical, this won't be a canonical 16945618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // type either so fill in the canonical type field. 16955618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff QualType Canonical; 1696467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 16975618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Canonical = getBlockPointerType(getCanonicalType(T)); 16981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16995618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // Get the new insert position for the node we care about. 17005618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerType *NewIP = 17015618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1702c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17035618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff } 17046b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall BlockPointerType *New 17056b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) BlockPointerType(T, Canonical); 17065618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Types.push_back(New); 17075618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.InsertNode(New, InsertPos); 17085618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return QualType(New, 0); 17095618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff} 17105618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff 17117c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getLValueReferenceType - Return the uniqued reference to the type for an 17127c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// lvalue reference to the specified type. 17134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 17144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const { 17159625e44c0252485277a340746ed8ac950686156fDouglas Gregor assert(getCanonicalType(T) != OverloadTy && 17169625e44c0252485277a340746ed8ac950686156fDouglas Gregor "Unresolved overloaded function type"); 17179625e44c0252485277a340746ed8ac950686156fDouglas Gregor 17185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 17195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 17205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 172154e14c4db764c0636160d26c5bbf491637c83a76John McCall ReferenceType::Profile(ID, T, SpelledAsLValue); 17225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 17247c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (LValueReferenceType *RT = 17257c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 17265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(RT, 0); 17277c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 172854e14c4db764c0636160d26c5bbf491637c83a76John McCall const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 172954e14c4db764c0636160d26c5bbf491637c83a76John McCall 17305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the referencee type isn't canonical, this won't be a canonical type 17315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // either, so fill in the canonical type field. 17325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 173354e14c4db764c0636160d26c5bbf491637c83a76John McCall if (!SpelledAsLValue || InnerRef || !T.isCanonical()) { 173454e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 173554e14c4db764c0636160d26c5bbf491637c83a76John McCall Canonical = getLValueReferenceType(getCanonicalType(PointeeType)); 17367c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17377c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // Get the new insert position for the node we care about. 17387c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceType *NewIP = 17397c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1740c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17417c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl } 17427c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17436b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall LValueReferenceType *New 174454e14c4db764c0636160d26c5bbf491637c83a76John McCall = new (*this, TypeAlignment) LValueReferenceType(T, Canonical, 174554e14c4db764c0636160d26c5bbf491637c83a76John McCall SpelledAsLValue); 17467c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl Types.push_back(New); 17477c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.InsertNode(New, InsertPos); 174854e14c4db764c0636160d26c5bbf491637c83a76John McCall 17497c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl return QualType(New, 0); 17507c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl} 17517c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17527c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getRValueReferenceType - Return the uniqued reference to the type for an 17537c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// rvalue reference to the specified type. 17544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRValueReferenceType(QualType T) const { 17557c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // Unique pointers, to guarantee there is only one pointer of a particular 17567c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // structure. 17577c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl llvm::FoldingSetNodeID ID; 175854e14c4db764c0636160d26c5bbf491637c83a76John McCall ReferenceType::Profile(ID, T, false); 17597c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17607c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl void *InsertPos = 0; 17617c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (RValueReferenceType *RT = 17627c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 17637c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl return QualType(RT, 0); 17647c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 176554e14c4db764c0636160d26c5bbf491637c83a76John McCall const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 176654e14c4db764c0636160d26c5bbf491637c83a76John McCall 17677c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // If the referencee type isn't canonical, this won't be a canonical type 17687c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // either, so fill in the canonical type field. 17697c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl QualType Canonical; 177054e14c4db764c0636160d26c5bbf491637c83a76John McCall if (InnerRef || !T.isCanonical()) { 177154e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 177254e14c4db764c0636160d26c5bbf491637c83a76John McCall Canonical = getRValueReferenceType(getCanonicalType(PointeeType)); 17737c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 17757c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceType *NewIP = 17767c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1777c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 17795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17806b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall RValueReferenceType *New 17816b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) RValueReferenceType(T, Canonical); 17825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 17837c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.InsertNode(New, InsertPos); 17845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 17855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 17865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1787f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// getMemberPointerType - Return the uniqued reference to the type for a 1788f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// member pointer to the specified type, in the specified class. 17894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const { 1790f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Unique pointers, to guarantee there is only one pointer of a particular 1791f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // structure. 1792f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl llvm::FoldingSetNodeID ID; 1793f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerType::Profile(ID, T, Cls); 1794f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1795f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl void *InsertPos = 0; 1796f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl if (MemberPointerType *PT = 1797f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 1798f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl return QualType(PT, 0); 1799f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1800f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // If the pointee or class type isn't canonical, this won't be a canonical 1801f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // type either, so fill in the canonical type field. 1802f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl QualType Canonical; 180387c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) { 1804f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls)); 1805f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1806f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Get the new insert position for the node we care about. 1807f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerType *NewIP = 1808f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1809c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1810f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl } 18116b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall MemberPointerType *New 18126b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical); 1813f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl Types.push_back(New); 1814f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.InsertNode(New, InsertPos); 1815f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl return QualType(New, 0); 1816f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl} 1817f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 18181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getConstantArrayType - Return the unique reference to the type for an 1819fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff/// array of the specified element type. 18201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getConstantArrayType(QualType EltTy, 182138aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner const llvm::APInt &ArySizeIn, 1822c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff ArrayType::ArraySizeModifier ASM, 182363e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara unsigned IndexTypeQuals) const { 1824923d56d436f750bc1f29db50e641078725558a1bSebastian Redl assert((EltTy->isDependentType() || 1825923d56d436f750bc1f29db50e641078725558a1bSebastian Redl EltTy->isIncompleteType() || EltTy->isConstantSizeType()) && 1826587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman "Constant array of VLAs is illegal!"); 1827587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman 182838aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner // Convert the array size into a canonical width matching the pointer size for 182938aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner // the target. 183038aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner llvm::APInt ArySize(ArySizeIn); 18319f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad ArySize = 1832bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor ArySize.zextOrTrunc(Target->getPointerWidth(getTargetAddressSpace(EltTy))); 18331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 183563e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, IndexTypeQuals); 18361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 18381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ConstantArrayType *ATP = 18397192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos)) 18405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(ATP, 0); 18411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If the element type isn't canonical or has qualifiers, this won't 18433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // be a canonical type either, so fill in the canonical type field. 18443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType Canon; 18453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 18463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(EltTy).split(); 1847200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize, 184863e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ASM, IndexTypeQuals); 1849200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getQualifiedType(Canon, canonSplit.Quals); 18503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 18515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ConstantArrayType *NewIP = 18537192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos); 1854c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 18555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18576b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ConstantArrayType *New = new(*this,TypeAlignment) 185863e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ConstantArrayType(EltTy, Canon, ArySize, ASM, IndexTypeQuals); 18597192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.InsertNode(New, InsertPos); 18605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 18615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 18625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 18635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1864ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// getVariableArrayDecayedType - Turns the given type, which may be 1865ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// variably-modified, into the corresponding type with all the known 1866ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// sizes replaced with [*]. 1867ce8890371fcdb983ae487c87fa40606a34896ff7John McCallQualType ASTContext::getVariableArrayDecayedType(QualType type) const { 1868ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Vastly most common case. 1869ce8890371fcdb983ae487c87fa40606a34896ff7John McCall if (!type->isVariablyModifiedType()) return type; 1870ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1871ce8890371fcdb983ae487c87fa40606a34896ff7John McCall QualType result; 1872ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1873ce8890371fcdb983ae487c87fa40606a34896ff7John McCall SplitQualType split = type.getSplitDesugaredType(); 1874200fa53fd420aa8369586f569dbece04930ad6a3John McCall const Type *ty = split.Ty; 1875ce8890371fcdb983ae487c87fa40606a34896ff7John McCall switch (ty->getTypeClass()) { 1876ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define TYPE(Class, Base) 1877ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define ABSTRACT_TYPE(Class, Base) 1878ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 1879ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#include "clang/AST/TypeNodes.def" 1880ce8890371fcdb983ae487c87fa40606a34896ff7John McCall llvm_unreachable("didn't desugar past all non-canonical types?"); 1881ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1882ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types should never be variably-modified. 1883ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Builtin: 1884ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Complex: 1885ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Vector: 1886ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ExtVector: 1887ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentSizedExtVector: 1888ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCObject: 1889ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCInterface: 1890ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCObjectPointer: 1891ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Record: 1892ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Enum: 1893ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::UnresolvedUsing: 1894ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TypeOfExpr: 1895ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TypeOf: 1896ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Decltype: 1897ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 1898ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentName: 1899ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::InjectedClassName: 1900ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TemplateSpecialization: 1901ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentTemplateSpecialization: 1902ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TemplateTypeParm: 1903ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::SubstTemplateTypeParmPack: 190434b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: 1905ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::PackExpansion: 1906ce8890371fcdb983ae487c87fa40606a34896ff7John McCall llvm_unreachable("type should never be variably-modified"); 1907ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1908ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types can be variably-modified but should never need to 1909ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // further decay. 1910ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::FunctionNoProto: 1911ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::FunctionProto: 1912ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::BlockPointer: 1913ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::MemberPointer: 1914ce8890371fcdb983ae487c87fa40606a34896ff7John McCall return type; 1915ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1916ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types can be variably-modified. All these modifications 1917ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // preserve structure except as noted by comments. 1918ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // TODO: if we ever care about optimizing VLAs, there are no-op 1919ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // optimizations available here. 1920ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Pointer: 1921ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getPointerType(getVariableArrayDecayedType( 1922ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cast<PointerType>(ty)->getPointeeType())); 1923ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1924ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1925ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::LValueReference: { 1926ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const LValueReferenceType *lv = cast<LValueReferenceType>(ty); 1927ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getLValueReferenceType( 1928ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(lv->getPointeeType()), 1929ce8890371fcdb983ae487c87fa40606a34896ff7John McCall lv->isSpelledAsLValue()); 1930ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1931745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1932ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1933ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::RValueReference: { 1934ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const RValueReferenceType *lv = cast<RValueReferenceType>(ty); 1935ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getRValueReferenceType( 1936ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(lv->getPointeeType())); 1937ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1938745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1939745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1940b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 1941b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman const AtomicType *at = cast<AtomicType>(ty); 1942b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman result = getAtomicType(getVariableArrayDecayedType(at->getValueType())); 1943b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman break; 1944b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 1945b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 1946ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ConstantArray: { 1947ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const ConstantArrayType *cat = cast<ConstantArrayType>(ty); 1948ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getConstantArrayType( 1949ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(cat->getElementType()), 1950ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getSize(), 1951ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getSizeModifier(), 1952ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getIndexTypeCVRQualifiers()); 1953ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1954745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1955745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1956ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentSizedArray: { 1957ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const DependentSizedArrayType *dat = cast<DependentSizedArrayType>(ty); 1958ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getDependentSizedArrayType( 1959ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(dat->getElementType()), 1960ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getSizeExpr(), 1961ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getSizeModifier(), 1962ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getIndexTypeCVRQualifiers(), 1963ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getBracketsRange()); 1964ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1965ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1966ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1967ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Turn incomplete types into [*] types. 1968ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::IncompleteArray: { 1969ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const IncompleteArrayType *iat = cast<IncompleteArrayType>(ty); 1970ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getVariableArrayType( 1971ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(iat->getElementType()), 1972ce8890371fcdb983ae487c87fa40606a34896ff7John McCall /*size*/ 0, 1973ce8890371fcdb983ae487c87fa40606a34896ff7John McCall ArrayType::Normal, 1974ce8890371fcdb983ae487c87fa40606a34896ff7John McCall iat->getIndexTypeCVRQualifiers(), 1975ce8890371fcdb983ae487c87fa40606a34896ff7John McCall SourceRange()); 1976ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1977ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1978ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1979ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Turn VLA types into [*] types. 1980ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::VariableArray: { 1981ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const VariableArrayType *vat = cast<VariableArrayType>(ty); 1982ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getVariableArrayType( 1983ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(vat->getElementType()), 1984ce8890371fcdb983ae487c87fa40606a34896ff7John McCall /*size*/ 0, 1985ce8890371fcdb983ae487c87fa40606a34896ff7John McCall ArrayType::Star, 1986ce8890371fcdb983ae487c87fa40606a34896ff7John McCall vat->getIndexTypeCVRQualifiers(), 1987ce8890371fcdb983ae487c87fa40606a34896ff7John McCall vat->getBracketsRange()); 1988ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1989ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1990ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1991ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1992ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Apply the top-level qualifiers from the original. 1993200fa53fd420aa8369586f569dbece04930ad6a3John McCall return getQualifiedType(result, split.Quals); 1994ce8890371fcdb983ae487c87fa40606a34896ff7John McCall} 1995745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1996bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// getVariableArrayType - Returns a non-unique reference to the type for a 1997bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// variable array of the specified element type. 19987e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas GregorQualType ASTContext::getVariableArrayType(QualType EltTy, 19997e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor Expr *NumElts, 2000c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff ArrayType::ArraySizeModifier ASM, 200163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara unsigned IndexTypeQuals, 20024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceRange Brackets) const { 2003c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // Since we don't unique expressions, it isn't possible to unique VLA's 2004c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // that have an expression provided for their size. 20053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType Canon; 2006715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor 20073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Be sure to pull qualifiers off the element type. 20083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 20093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(EltTy).split(); 2010200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM, 201163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara IndexTypeQuals, Brackets); 2012200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getQualifiedType(Canon, canonSplit.Quals); 2013715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor } 2014715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor 20156b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall VariableArrayType *New = new(*this, TypeAlignment) 201663e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets); 2017c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2018c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman VariableArrayTypes.push_back(New); 2019c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman Types.push_back(New); 2020c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman return QualType(New, 0); 2021c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman} 2022c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2023898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// getDependentSizedArrayType - Returns a non-unique reference to 2024898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// the type for a dependently-sized array of the specified element 202504d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor/// type. 20263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getDependentSizedArrayType(QualType elementType, 20273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Expr *numElements, 2028898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor ArrayType::ArraySizeModifier ASM, 20293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned elementTypeQuals, 20303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SourceRange brackets) const { 20313b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert((!numElements || numElements->isTypeDependent() || 20323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall numElements->isValueDependent()) && 2033898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor "Size must be type- or value-dependent!"); 2034898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 20353b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Dependently-sized array types that do not have a specified number 20363b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // of elements will have their sizes deduced from a dependent 20373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // initializer. We do no canonicalization here at all, which is okay 20383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // because they can't be used in most locations. 20393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!numElements) { 20403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *newType 20413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = new (*this, TypeAlignment) 20423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType(*this, elementType, QualType(), 20433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall numElements, ASM, elementTypeQuals, 20443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall brackets); 20453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(newType); 20463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(newType, 0); 2047cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor } 2048cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor 20493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Otherwise, we actually build a new type every time, but we 20503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // also build a canonical type. 20511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20523b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonElementType = getCanonicalType(elementType).split(); 2053898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 20543b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 20553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall llvm::FoldingSetNodeID ID; 20563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType::Profile(ID, *this, 2057200fa53fd420aa8369586f569dbece04930ad6a3John McCall QualType(canonElementType.Ty, 0), 20583b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals, numElements); 20593b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Look for an existing type with these properties. 20613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *canonTy = 20623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos); 20633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If we don't have one, build one. 20653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!canonTy) { 20663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall canonTy = new (*this, TypeAlignment) 2067200fa53fd420aa8369586f569dbece04930ad6a3John McCall DependentSizedArrayType(*this, QualType(canonElementType.Ty, 0), 20683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType(), numElements, ASM, elementTypeQuals, 20693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall brackets); 20703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayTypes.InsertNode(canonTy, insertPos); 20713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(canonTy); 20723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 20733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Apply qualifiers from the element type to the array. 20753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon = getQualifiedType(QualType(canonTy,0), 2076200fa53fd420aa8369586f569dbece04930ad6a3John McCall canonElementType.Quals); 20773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If we didn't need extra canonicalization for the element type, 20793b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // then just use that as our result. 2080200fa53fd420aa8369586f569dbece04930ad6a3John McCall if (QualType(canonElementType.Ty, 0) == elementType) 20813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return canon; 20823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Otherwise, we need to build a type which follows the spelling 20843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // of the element type. 20853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *sugaredType 20863b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = new (*this, TypeAlignment) 20873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType(*this, elementType, canon, numElements, 20883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals, brackets); 20893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(sugaredType); 20903b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(sugaredType, 0); 20913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall} 20923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getIncompleteArrayType(QualType elementType, 2094c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman ArrayType::ArraySizeModifier ASM, 20953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned elementTypeQuals) const { 2096c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman llvm::FoldingSetNodeID ID; 20973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals); 2098c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 20993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 21003b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (IncompleteArrayType *iat = 21013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos)) 21023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(iat, 0); 2103c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2104c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // If the element type isn't canonical, this won't be a canonical type 21053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // either, so fill in the canonical type field. We also have to pull 21063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // qualifiers off the element type. 21073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon; 2108c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 21093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) { 21103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(elementType).split(); 2111200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0), 21123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals); 2113200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getQualifiedType(canon, canonSplit.Quals); 2114c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2115c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // Get the new insert position for the node we care about. 21163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType *existing = 21173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos); 21183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(!existing && "Shouldn't be in the map!"); (void) existing; 21192bd24ba6d10f8c811c8e2a57c8397e07082ba497Ted Kremenek } 2120c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 21213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType *newType = new (*this, TypeAlignment) 21223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType(elementType, canon, ASM, elementTypeQuals); 2123c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 21243b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.InsertNode(newType, insertPos); 21253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(newType); 21263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(newType, 0); 2127fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff} 2128fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff 212973322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// getVectorType - Return the unique reference to a vector type of 213073322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type. 213182287d19ded35248c4ce6a425ce74116a13ce44eJohn ThompsonQualType ASTContext::getVectorType(QualType vecType, unsigned NumElts, 21324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad VectorType::VectorKind VecKind) const { 21333b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(vecType->isBuiltinType()); 21341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Check if we've already instantiated a vector of this type. 21365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 2137e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind); 2138788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 21395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 21405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 21415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(VTP, 0); 21425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 21435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the element type isn't canonical, this won't be a canonical type either, 21445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 21455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 2146255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor if (!vecType.isCanonical()) { 2147231da7eb3dd13007e5e40fffe48998e5ef284e06Bob Wilson Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind); 21481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 21505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2151c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 21525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 21536b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall VectorType *New = new (*this, TypeAlignment) 2154e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType(vecType, NumElts, Canonical, VecKind); 21555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VectorTypes.InsertNode(New, InsertPos); 21565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 21575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 21585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 21595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2160213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman/// getExtVectorType - Return the unique reference to an extended vector type of 216173322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type. 21624ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 21634ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const { 21644ac01401b1ec602a1f58c217544d3dcb5fcbd7f1Douglas Gregor assert(vecType->isBuiltinType() || vecType->isDependentType()); 21651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 216673322924127c873c13101b705dd823f5539ffa5fSteve Naroff // Check if we've already instantiated a vector of this type. 216773322924127c873c13101b705dd823f5539ffa5fSteve Naroff llvm::FoldingSetNodeID ID; 2168788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner VectorType::Profile(ID, vecType, NumElts, Type::ExtVector, 2169e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::GenericVector); 217073322924127c873c13101b705dd823f5539ffa5fSteve Naroff void *InsertPos = 0; 217173322924127c873c13101b705dd823f5539ffa5fSteve Naroff if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 217273322924127c873c13101b705dd823f5539ffa5fSteve Naroff return QualType(VTP, 0); 217373322924127c873c13101b705dd823f5539ffa5fSteve Naroff 217473322924127c873c13101b705dd823f5539ffa5fSteve Naroff // If the element type isn't canonical, this won't be a canonical type either, 217573322924127c873c13101b705dd823f5539ffa5fSteve Naroff // so fill in the canonical type field. 217673322924127c873c13101b705dd823f5539ffa5fSteve Naroff QualType Canonical; 2177467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!vecType.isCanonical()) { 2178213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman Canonical = getExtVectorType(getCanonicalType(vecType), NumElts); 21791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 218073322924127c873c13101b705dd823f5539ffa5fSteve Naroff // Get the new insert position for the node we care about. 218173322924127c873c13101b705dd823f5539ffa5fSteve Naroff VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2182c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 218373322924127c873c13101b705dd823f5539ffa5fSteve Naroff } 21846b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ExtVectorType *New = new (*this, TypeAlignment) 21856b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ExtVectorType(vecType, NumElts, Canonical); 218673322924127c873c13101b705dd823f5539ffa5fSteve Naroff VectorTypes.InsertNode(New, InsertPos); 218773322924127c873c13101b705dd823f5539ffa5fSteve Naroff Types.push_back(New); 218873322924127c873c13101b705dd823f5539ffa5fSteve Naroff return QualType(New, 0); 218973322924127c873c13101b705dd823f5539ffa5fSteve Naroff} 219073322924127c873c13101b705dd823f5539ffa5fSteve Naroff 21914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 21924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentSizedExtVectorType(QualType vecType, 21934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Expr *SizeExpr, 21944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceLocation AttrLoc) const { 21952ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor llvm::FoldingSetNodeID ID; 21961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType), 21972ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SizeExpr); 21981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21992ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor void *InsertPos = 0; 22002ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorType *Canon 22012ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 22022ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorType *New; 22032ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor if (Canon) { 22042ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor // We already have a canonical version of this array type; use it as 22052ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor // the canonical type for a newly-built type. 22066b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 22076b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0), 22086b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall SizeExpr, AttrLoc); 22092ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } else { 22102ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType CanonVecTy = getCanonicalType(vecType); 22112ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor if (CanonVecTy == vecType) { 22126b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 22136b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr, 22146b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall AttrLoc); 2215789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2216789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentSizedExtVectorType *CanonCheck 2217789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2218789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken"); 2219789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CanonCheck; 22202ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorTypes.InsertNode(New, InsertPos); 22212ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } else { 22222ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr, 22232ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SourceLocation()); 22246b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 22256b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc); 22262ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } 22272ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } 22281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22299cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor Types.push_back(New); 22309cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor return QualType(New, 0); 22319cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor} 22329cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor 223372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'. 22345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 22354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 22364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionNoProtoType(QualType ResultTy, 22374ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FunctionType::ExtInfo &Info) const { 2238cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv DefaultCC = Info.getCC(); 2239cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2240cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CC_X86StdCall : DefaultCC; 22415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique functions, to guarantee there is only one function of a particular 22425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 22435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 2244264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionNoProtoType::Profile(ID, ResultTy, Info); 22451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 22471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionNoProtoType *FT = 224872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 22495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FT, 0); 22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 2252ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor if (!ResultTy.isCanonical() || 225304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall getCanonicalCallConv(CallConv) != CallConv) { 2254264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Canonical = 2255264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola getFunctionNoProtoType(getCanonicalType(ResultTy), 2256264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Info.withCallingConv(getCanonicalCallConv(CallConv))); 22571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 225972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoType *NewIP = 226072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2261c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 22625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 22631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2264cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionProtoType::ExtInfo newInfo = Info.withCallingConv(CallConv); 22656b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall FunctionNoProtoType *New = new (*this, TypeAlignment) 2266cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionNoProtoType(ResultTy, Canonical, newInfo); 22675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 226872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.InsertNode(New, InsertPos); 22695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 22705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 22715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFunctionType - Return a normal function type with a typed argument 22735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// list. isVariadic indicates whether the argument list includes '...'. 22744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 22754ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionType(QualType ResultTy, 22764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const QualType *ArgArray, unsigned NumArgs, 22774ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FunctionProtoType::ExtProtoInfo &EPI) const { 22785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique functions, to guarantee there is only one function of a particular 22795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 22805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 22818026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl FunctionProtoType::Profile(ID, ResultTy, ArgArray, NumArgs, EPI, *this); 22825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 22841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionProtoType *FTP = 228572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 22865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FTP, 0); 2287465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2288465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl // Determine whether the type being created is already canonical or not. 2289eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith bool isCanonical = 2290eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith EPI.ExceptionSpecType == EST_None && ResultTy.isCanonical() && 2291eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith !EPI.HasTrailingReturn; 22925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs && isCanonical; ++i) 229354e14c4db764c0636160d26c5bbf491637c83a76John McCall if (!ArgArray[i].isCanonicalAsParam()) 22945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer isCanonical = false; 22955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2296cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv DefaultCC = EPI.ExtInfo.getCC(); 2297cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2298cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CC_X86StdCall : DefaultCC; 2299e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 23005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this type isn't canonical, get the canonical version of it. 2301465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl // The exception spec is not part of the canonical type. 23025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 230304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) { 23045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 16> CanonicalArgs; 23055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer CanonicalArgs.reserve(NumArgs); 23065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs; ++i) 230754e14c4db764c0636160d26c5bbf491637c83a76John McCall CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i])); 2308465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2309e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI; 2310eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith CanonicalEPI.HasTrailingReturn = false; 23118b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl CanonicalEPI.ExceptionSpecType = EST_None; 23128b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl CanonicalEPI.NumExceptions = 0; 2313e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall CanonicalEPI.ExtInfo 2314e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall = CanonicalEPI.ExtInfo.withCallingConv(getCanonicalCallConv(CallConv)); 2315e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 2316f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getFunctionType(getCanonicalType(ResultTy), 2317beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad CanonicalArgs.data(), NumArgs, 2318e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall CanonicalEPI); 2319465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 23205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 232172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoType *NewIP = 232272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2323c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 23245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2325465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2326f85e193739c953358c865005855253af4f68a497John McCall // FunctionProtoType objects are allocated with extra bytes after 2327f85e193739c953358c865005855253af4f68a497John McCall // them for three variable size arrays at the end: 2328f85e193739c953358c865005855253af4f68a497John McCall // - parameter types 2329f85e193739c953358c865005855253af4f68a497John McCall // - exception types 2330f85e193739c953358c865005855253af4f68a497John McCall // - consumed-arguments flags 2331f85e193739c953358c865005855253af4f68a497John McCall // Instead of the exception types, there could be a noexcept 2332f85e193739c953358c865005855253af4f68a497John McCall // expression. 2333e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall size_t Size = sizeof(FunctionProtoType) + 233460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl NumArgs * sizeof(QualType); 233560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (EPI.ExceptionSpecType == EST_Dynamic) 233660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Size += EPI.NumExceptions * sizeof(QualType); 233760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) { 23388026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl Size += sizeof(Expr*); 2339e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith } else if (EPI.ExceptionSpecType == EST_Uninstantiated) { 234013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith Size += 2 * sizeof(FunctionDecl*); 234160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 2342f85e193739c953358c865005855253af4f68a497John McCall if (EPI.ConsumedArguments) 2343f85e193739c953358c865005855253af4f68a497John McCall Size += NumArgs * sizeof(bool); 2344f85e193739c953358c865005855253af4f68a497John McCall 2345e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment); 2346cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionProtoType::ExtProtoInfo newEPI = EPI; 2347cfe9af250f466e7e38becea4428990448ae07737Roman Divacky newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv); 23488026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl new (FTP) FunctionProtoType(ResultTy, ArgArray, NumArgs, Canonical, newEPI); 23495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(FTP); 235072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.InsertNode(FTP, InsertPos); 23515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FTP, 0); 23525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 23535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 23543cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#ifndef NDEBUG 23553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallstatic bool NeedsInjectedClassNameType(const RecordDecl *D) { 23563cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!isa<CXXRecordDecl>(D)) return false; 23573cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const CXXRecordDecl *RD = cast<CXXRecordDecl>(D); 23583cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (isa<ClassTemplatePartialSpecializationDecl>(RD)) 23593cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return true; 23603cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (RD->getDescribedClassTemplate() && 23613cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall !isa<ClassTemplateSpecializationDecl>(RD)) 23623cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return true; 23633cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return false; 23643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 23653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif 23663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 23673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// getInjectedClassNameType - Return the unique reference to the 23683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// injected class name type for the specified templated declaration. 23693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl, 23704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType TST) const { 23713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(NeedsInjectedClassNameType(Decl)); 23723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (Decl->TypeForDecl) { 23733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 2374ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) { 23753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(PrevDecl->TypeForDecl && "previous declaration has no type"); 23763cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Decl->TypeForDecl = PrevDecl->TypeForDecl; 23773cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 23783cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } else { 2379f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Type *newType = 238031f17ecbef57b5679c017c375db330546b7b5145John McCall new (*this, TypeAlignment) InjectedClassNameType(Decl, TST); 2381f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2382f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 23833cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } 23843cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return QualType(Decl->TypeForDecl, 0); 23853cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 23863cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 23872ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// getTypeDeclType - Return the unique reference to the type for the 23882ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// specified type declaration. 23894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const { 23901e6759e9e33dcaa73ce14c8a908ac9f87ac16463Argyrios Kyrtzidis assert(Decl && "Passed null for Decl param"); 2391becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!Decl->TypeForDecl && "TypeForDecl present in slow case"); 23921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2393162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (const TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Decl)) 23942ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor return getTypedefType(Typedef); 2395becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall 2396becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!isa<TemplateTypeParmDecl>(Decl) && 2397becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "Template type parameter types are always available."); 2398becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall 239919c8576b7328f4dc2d07682f5da552875c1912efJohn McCall if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) { 2400ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor assert(!Record->getPreviousDecl() && 2401becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "struct/union has previous declaration"); 2402becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!NeedsInjectedClassNameType(Record)); 2403400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return getRecordType(Record); 240419c8576b7328f4dc2d07682f5da552875c1912efJohn McCall } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) { 2405ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor assert(!Enum->getPreviousDecl() && 2406becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "enum has previous declaration"); 2407400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return getEnumType(Enum); 240819c8576b7328f4dc2d07682f5da552875c1912efJohn McCall } else if (const UnresolvedUsingTypenameDecl *Using = 2409ed97649e9574b9d854fa4d6109c9333ae0993554John McCall dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) { 2410f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using); 2411f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2412f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 24139fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump } else 2414becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall llvm_unreachable("TypeDecl without a type?"); 241549aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis 241649aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis return QualType(Decl->TypeForDecl, 0); 24172ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor} 24182ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor 24195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTypedefType - Return the unique reference to the type for the 2420162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// specified typedef name decl. 24219763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType 2422162e1c1b487352434552147967c3dd296ebee2f7Richard SmithASTContext::getTypedefType(const TypedefNameDecl *Decl, 2423162e1c1b487352434552147967c3dd296ebee2f7Richard Smith QualType Canonical) const { 24245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 24251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24269763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis if (Canonical.isNull()) 24279763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Canonical = getCanonicalType(Decl->getUnderlyingType()); 2428f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall TypedefType *newType = new(*this, TypeAlignment) 24296b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypedefType(Type::Typedef, Decl, Canonical); 2430f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2431f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2432f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 24335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 24345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 24354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRecordType(const RecordDecl *Decl) const { 2436400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2437400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2438ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (const RecordDecl *PrevDecl = Decl->getPreviousDecl()) 2439400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (PrevDecl->TypeForDecl) 2440400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2441400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2442f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall RecordType *newType = new (*this, TypeAlignment) RecordType(Decl); 2443f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2444f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2445f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 2446400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis} 2447400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 24484ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getEnumType(const EnumDecl *Decl) const { 2449400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2450400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2451ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (const EnumDecl *PrevDecl = Decl->getPreviousDecl()) 2452400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (PrevDecl->TypeForDecl) 2453400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2454400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2455f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall EnumType *newType = new (*this, TypeAlignment) EnumType(Decl); 2456f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2457f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2458f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 2459400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis} 2460400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 24619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType ASTContext::getAttributedType(AttributedType::Kind attrKind, 24629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType modifiedType, 24639d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType equivalentType) { 24649d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall llvm::FoldingSetNodeID id; 24659d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType::Profile(id, attrKind, modifiedType, equivalentType); 24669d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24679d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall void *insertPos = 0; 24689d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos); 24699d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (type) return QualType(type, 0); 24709d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24719d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType canon = getCanonicalType(equivalentType); 24729d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall type = new (*this, TypeAlignment) 24739d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType(canon, attrKind, modifiedType, equivalentType); 24749d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24759d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall Types.push_back(type); 24769d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedTypes.InsertNode(type, insertPos); 24779d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24789d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return QualType(type, 0); 24799d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 24809d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24819d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 248249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/// \brief Retrieve a substitution-result type. 248349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType 248449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm, 24854ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType Replacement) const { 2486467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(Replacement.isCanonical() 248749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall && "replacement types must always be canonical"); 248849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 248949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall llvm::FoldingSetNodeID ID; 249049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType::Profile(ID, Parm, Replacement); 249149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall void *InsertPos = 0; 249249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType *SubstParm 249349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 249449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 249549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall if (!SubstParm) { 249649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstParm = new (*this, TypeAlignment) 249749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType(Parm, Replacement); 249849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall Types.push_back(SubstParm); 249949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 250049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall } 250149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 250249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return QualType(SubstParm, 0); 250349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 250449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 2505c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor/// \brief Retrieve a 2506c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType ASTContext::getSubstTemplateTypeParmPackType( 2507c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const TemplateTypeParmType *Parm, 2508c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const TemplateArgument &ArgPack) { 2509c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifndef NDEBUG 2510c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(), 2511c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor PEnd = ArgPack.pack_end(); 2512c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor P != PEnd; ++P) { 2513c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type"); 2514c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor assert(P->getAsType().isCanonical() && "Pack contains non-canonical type"); 2515c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2516c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#endif 2517c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2518c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor llvm::FoldingSetNodeID ID; 2519c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack); 2520c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor void *InsertPos = 0; 2521c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (SubstTemplateTypeParmPackType *SubstParm 2522c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos)) 2523c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return QualType(SubstParm, 0); 2524c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2525c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor QualType Canon; 2526c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (!Parm->isCanonicalUnqualified()) { 2527c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Canon = getCanonicalType(QualType(Parm, 0)); 2528c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon), 2529c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor ArgPack); 2530c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos); 2531c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2532c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2533c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackType *SubstParm 2534c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon, 2535c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor ArgPack); 2536c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Types.push_back(SubstParm); 2537c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 2538c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return QualType(SubstParm, 0); 2539c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 2540c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2541fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor/// \brief Retrieve the template type parameter type for a template 25421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parameter or parameter pack with the given depth, index, and (optionally) 254376e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson/// name. 25441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index, 254576e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson bool ParameterPack, 25464fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl) const { 2547fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor llvm::FoldingSetNodeID ID; 25484fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl); 2549fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor void *InsertPos = 0; 25501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateTypeParmType *TypeParm 2551fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2552fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2553fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor if (TypeParm) 2554fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return QualType(TypeParm, 0); 25551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25564fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth if (TTPDecl) { 255776e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack); 25584fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon); 2559789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2560789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor TemplateTypeParmType *TypeCheck 2561789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2562789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!TypeCheck && "Template type parameter canonical type broken"); 2563789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)TypeCheck; 256476e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson } else 25656b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeParm = new (*this, TypeAlignment) 25666b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TemplateTypeParmType(Depth, Index, ParameterPack); 2567fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2568fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor Types.push_back(TypeParm); 2569fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos); 2570fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2571fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return QualType(TypeParm, 0); 2572fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor} 2573fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 25743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallTypeSourceInfo * 25753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallASTContext::getTemplateSpecializationTypeInfo(TemplateName Name, 25763cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall SourceLocation NameLoc, 25773cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const TemplateArgumentListInfo &Args, 25783e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 25797c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Name.getAsDependentTemplateName() && 25807c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 25813e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType TST = getTemplateSpecializationType(Name, Args, Underlying); 25823cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 25833cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeSourceInfo *DI = CreateTypeSourceInfo(TST); 25843cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TemplateSpecializationTypeLoc TL 25853cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc()); 258655d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara TL.setTemplateKeywordLoc(SourceLocation()); 25873cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setTemplateNameLoc(NameLoc); 25883cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setLAngleLoc(Args.getLAngleLoc()); 25893cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setRAngleLoc(Args.getRAngleLoc()); 25903cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 25913cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setArgLocInfo(i, Args[i].getLocInfo()); 25923cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return DI; 25933cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 25943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 25951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 25967532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorASTContext::getTemplateSpecializationType(TemplateName Template, 2597d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args, 25983e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 25997c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 26007c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 26017c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 2602d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned NumArgs = Args.size(); 2603d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 26045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> ArgVec; 2605833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ArgVec.reserve(NumArgs); 2606833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0; i != NumArgs; ++i) 2607833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ArgVec.push_back(Args[i].getArgument()); 2608833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 260931f17ecbef57b5679c017c375db330546b7b5145John McCall return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs, 26103e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Underlying); 2611833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2612833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2613b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#ifndef NDEBUG 2614b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregorstatic bool hasAnyPackExpansions(const TemplateArgument *Args, 2615b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor unsigned NumArgs) { 2616b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 2617b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor if (Args[I].isPackExpansion()) 2618b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor return true; 2619b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor 2620b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor return true; 2621b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor} 2622b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#endif 2623b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor 2624833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType 2625833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallASTContext::getTemplateSpecializationType(TemplateName Template, 26267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor const TemplateArgument *Args, 26277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor unsigned NumArgs, 26283e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 26297c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 26307c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 26310f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor // Look through qualified template names. 26320f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 26330f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor Template = TemplateName(QTN->getTemplateDecl()); 26347c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 2635b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor bool IsTypeAlias = 26363e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Template.getAsTemplateDecl() && 26373e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl()); 26383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType CanonType; 26393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!Underlying.isNull()) 26403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith CanonType = getCanonicalType(Underlying); 26413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else { 2642b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor // We can get here with an alias template when the specialization contains 2643b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor // a pack expansion that does not match up with a parameter pack. 2644b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor assert((!IsTypeAlias || hasAnyPackExpansions(Args, NumArgs)) && 2645b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor "Caller must compute aliased type"); 2646b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor IsTypeAlias = false; 26473e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith CanonType = getCanonicalTemplateSpecializationType(Template, Args, 26483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NumArgs); 26493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 2650fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor 26511275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // Allocate the (non-canonical) template specialization type, but don't 26521275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // try to unique it: these types typically have location information that 26531275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // we don't unique and don't want to lose. 26543e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith void *Mem = Allocate(sizeof(TemplateSpecializationType) + 26553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith sizeof(TemplateArgument) * NumArgs + 2656b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor (IsTypeAlias? sizeof(QualType) : 0), 26576b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeAlignment); 26581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateSpecializationType *Spec 2659b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, CanonType, 2660b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor IsTypeAlias ? Underlying : QualType()); 26611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 266255f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor Types.push_back(Spec); 26631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(Spec, 0); 266455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor} 266555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor 26661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 26679763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisASTContext::getCanonicalTemplateSpecializationType(TemplateName Template, 26689763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis const TemplateArgument *Args, 26694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned NumArgs) const { 26707c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 26717c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 26723e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 26730f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor // Look through qualified template names. 26740f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 26750f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor Template = TemplateName(QTN->getTemplateDecl()); 26767c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 26779763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Build the canonical template specialization type. 26789763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateName CanonTemplate = getCanonicalTemplateName(Template); 26795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> CanonArgs; 26809763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.reserve(NumArgs); 26819763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis for (unsigned I = 0; I != NumArgs; ++I) 26829763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.push_back(getCanonicalTemplateArgument(Args[I])); 26839763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 26849763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Determine whether this canonical template specialization type already 26859763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // exists. 26869763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis llvm::FoldingSetNodeID ID; 26879763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationType::Profile(ID, CanonTemplate, 26889763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.data(), NumArgs, *this); 26899763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 26909763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis void *InsertPos = 0; 26919763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationType *Spec 26929763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 26939763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 26949763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis if (!Spec) { 26959763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Allocate a new canonical template specialization type. 26969763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis void *Mem = Allocate((sizeof(TemplateSpecializationType) + 26979763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis sizeof(TemplateArgument) * NumArgs), 26989763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TypeAlignment); 26999763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Spec = new (Mem) TemplateSpecializationType(CanonTemplate, 27009763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.data(), NumArgs, 27013e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType(), QualType()); 27029763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Types.push_back(Spec); 27039763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationTypes.InsertNode(Spec, InsertPos); 27049763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis } 27059763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 27069763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis assert(Spec->isDependentType() && 27079763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis "Non-dependent template-id type must have a canonical type"); 27089763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis return QualType(Spec, 0); 27099763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis} 27109763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 27119763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType 2712465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword, 2713465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara NestedNameSpecifier *NNS, 27144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType NamedType) const { 2715e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor llvm::FoldingSetNodeID ID; 2716465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType::Profile(ID, Keyword, NNS, NamedType); 2717e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2718e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor void *InsertPos = 0; 2719465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2720e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor if (T) 2721e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor return QualType(T, 0); 2722e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2723789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor QualType Canon = NamedType; 2724789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor if (!Canon.isCanonical()) { 2725789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor Canon = getCanonicalType(NamedType); 2726465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2727465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara assert(!CheckT && "Elaborated canonical type broken"); 2728789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckT; 2729789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor } 2730789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2731465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara T = new (*this) ElaboratedType(Keyword, NNS, NamedType, Canon); 2732e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor Types.push_back(T); 2733465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedTypes.InsertNode(T, InsertPos); 2734e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor return QualType(T, 0); 2735e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor} 2736e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2737075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType 27384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getParenType(QualType InnerType) const { 2739075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara llvm::FoldingSetNodeID ID; 2740075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType::Profile(ID, InnerType); 2741075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2742075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara void *InsertPos = 0; 2743075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2744075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (T) 2745075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(T, 0); 2746075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2747075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType Canon = InnerType; 2748075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (!Canon.isCanonical()) { 2749075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Canon = getCanonicalType(InnerType); 2750075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2751075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara assert(!CheckT && "Paren canonical type broken"); 2752075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara (void)CheckT; 2753075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara } 2754075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2755075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara T = new (*this) ParenType(InnerType, Canon); 2756075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Types.push_back(T); 2757075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenTypes.InsertNode(T, InsertPos); 2758075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(T, 0); 2759075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 2760075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 27614a2023f5014e82389d5980d307b89c545dbbac81Douglas GregorQualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword, 27624a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 27634a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor const IdentifierInfo *Name, 27644ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType Canon) const { 2765d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor assert(NNS->isDependent() && "nested-name-specifier must be dependent"); 2766d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2767d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor if (Canon.isNull()) { 2768d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 27694a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor ElaboratedTypeKeyword CanonKeyword = Keyword; 27704a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor if (Keyword == ETK_None) 27714a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor CanonKeyword = ETK_Typename; 27724a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor 27734a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor if (CanonNNS != NNS || CanonKeyword != Keyword) 27744a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor Canon = getDependentNameType(CanonKeyword, CanonNNS, Name); 2775d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 2776d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2777d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor llvm::FoldingSetNodeID ID; 27784a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor DependentNameType::Profile(ID, Keyword, NNS, Name); 2779d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2780d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor void *InsertPos = 0; 27814714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameType *T 27824714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos); 2783d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor if (T) 2784d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return QualType(T, 0); 2785d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 27864a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor T = new (*this) DependentNameType(Keyword, NNS, Name, Canon); 2787d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor Types.push_back(T); 27884714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameTypes.InsertNode(T, InsertPos); 27891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 2790d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor} 2791d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 27921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 279333500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType( 279433500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword Keyword, 27954a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 279633500955d731c73717af52088b7fc0e7a85681e7John McCall const IdentifierInfo *Name, 27974ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const TemplateArgumentListInfo &Args) const { 279833500955d731c73717af52088b7fc0e7a85681e7John McCall // TODO: avoid this copy 27995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> ArgCopy; 280033500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, E = Args.size(); I != E; ++I) 280133500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.push_back(Args[I].getArgument()); 280233500955d731c73717af52088b7fc0e7a85681e7John McCall return getDependentTemplateSpecializationType(Keyword, NNS, Name, 280333500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.size(), 280433500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.data()); 280533500955d731c73717af52088b7fc0e7a85681e7John McCall} 280633500955d731c73717af52088b7fc0e7a85681e7John McCall 280733500955d731c73717af52088b7fc0e7a85681e7John McCallQualType 280833500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType( 280933500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword Keyword, 281033500955d731c73717af52088b7fc0e7a85681e7John McCall NestedNameSpecifier *NNS, 281133500955d731c73717af52088b7fc0e7a85681e7John McCall const IdentifierInfo *Name, 281233500955d731c73717af52088b7fc0e7a85681e7John McCall unsigned NumArgs, 28134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const TemplateArgument *Args) const { 2814aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor assert((!NNS || NNS->isDependent()) && 2815aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor "nested-name-specifier must be dependent"); 28161734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 2817789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor llvm::FoldingSetNodeID ID; 281833500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS, 281933500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, Args); 2820789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2821789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor void *InsertPos = 0; 282233500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationType *T 282333500955d731c73717af52088b7fc0e7a85681e7John McCall = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 2824789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor if (T) 2825789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor return QualType(T, 0); 2826789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 282733500955d731c73717af52088b7fc0e7a85681e7John McCall NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 282833500955d731c73717af52088b7fc0e7a85681e7John McCall 282933500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword CanonKeyword = Keyword; 283033500955d731c73717af52088b7fc0e7a85681e7John McCall if (Keyword == ETK_None) CanonKeyword = ETK_Typename; 28311734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 283233500955d731c73717af52088b7fc0e7a85681e7John McCall bool AnyNonCanonArgs = false; 28335f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> CanonArgs(NumArgs); 283433500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0; I != NumArgs; ++I) { 283533500955d731c73717af52088b7fc0e7a85681e7John McCall CanonArgs[I] = getCanonicalTemplateArgument(Args[I]); 283633500955d731c73717af52088b7fc0e7a85681e7John McCall if (!CanonArgs[I].structurallyEquals(Args[I])) 283733500955d731c73717af52088b7fc0e7a85681e7John McCall AnyNonCanonArgs = true; 2838789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor } 28391734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 284033500955d731c73717af52088b7fc0e7a85681e7John McCall QualType Canon; 284133500955d731c73717af52088b7fc0e7a85681e7John McCall if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) { 284233500955d731c73717af52088b7fc0e7a85681e7John McCall Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS, 284333500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, 284433500955d731c73717af52088b7fc0e7a85681e7John McCall CanonArgs.data()); 284533500955d731c73717af52088b7fc0e7a85681e7John McCall 284633500955d731c73717af52088b7fc0e7a85681e7John McCall // Find the insert position again. 284733500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 284833500955d731c73717af52088b7fc0e7a85681e7John McCall } 284933500955d731c73717af52088b7fc0e7a85681e7John McCall 285033500955d731c73717af52088b7fc0e7a85681e7John McCall void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) + 285133500955d731c73717af52088b7fc0e7a85681e7John McCall sizeof(TemplateArgument) * NumArgs), 285233500955d731c73717af52088b7fc0e7a85681e7John McCall TypeAlignment); 2853ef99001908e799c388f1363b1e607dad5f5b57d3John McCall T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS, 285433500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, Args, Canon); 28551734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor Types.push_back(T); 285633500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypes.InsertNode(T, InsertPos); 28571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 28581734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor} 28591734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 2860cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas GregorQualType ASTContext::getPackExpansionType(QualType Pattern, 2861cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 28627536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor llvm::FoldingSetNodeID ID; 2863cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor PackExpansionType::Profile(ID, Pattern, NumExpansions); 28647536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 28657536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor assert(Pattern->containsUnexpandedParameterPack() && 28667536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor "Pack expansions must expand one or more parameter packs"); 28677536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor void *InsertPos = 0; 28687536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionType *T 28697536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 28707536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (T) 28717536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return QualType(T, 0); 28727536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 28737536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor QualType Canon; 28747536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (!Pattern.isCanonical()) { 2875cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions); 28767536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 28777536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor // Find the insert position again. 28787536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 28797536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor } 28807536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 2881cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor T = new (*this) PackExpansionType(Pattern, Canon, NumExpansions); 28827536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor Types.push_back(T); 28837536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypes.InsertNode(T, InsertPos); 28847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return QualType(T, 0); 28857536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 28867536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 288788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// CmpProtocolNames - Comparison predicate for sorting protocols 288888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// alphabetically. 288988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattnerstatic bool CmpProtocolNames(const ObjCProtocolDecl *LHS, 289088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner const ObjCProtocolDecl *RHS) { 28912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS->getDeclName() < RHS->getDeclName(); 289288cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner} 289388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2894c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallstatic bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols, 289554e14c4db764c0636160d26c5bbf491637c83a76John McCall unsigned NumProtocols) { 289654e14c4db764c0636160d26c5bbf491637c83a76John McCall if (NumProtocols == 0) return true; 289754e14c4db764c0636160d26c5bbf491637c83a76John McCall 289861cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor if (Protocols[0]->getCanonicalDecl() != Protocols[0]) 289961cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor return false; 290061cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor 290154e14c4db764c0636160d26c5bbf491637c83a76John McCall for (unsigned i = 1; i != NumProtocols; ++i) 290261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor if (!CmpProtocolNames(Protocols[i-1], Protocols[i]) || 290361cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor Protocols[i]->getCanonicalDecl() != Protocols[i]) 290454e14c4db764c0636160d26c5bbf491637c83a76John McCall return false; 290554e14c4db764c0636160d26c5bbf491637c83a76John McCall return true; 290654e14c4db764c0636160d26c5bbf491637c83a76John McCall} 290754e14c4db764c0636160d26c5bbf491637c83a76John McCall 290854e14c4db764c0636160d26c5bbf491637c83a76John McCallstatic void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols, 290988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner unsigned &NumProtocols) { 291088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols; 29111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 291288cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner // Sort protocols, keyed by name. 291388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames); 291488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 291561cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor // Canonicalize. 291661cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor for (unsigned I = 0, N = NumProtocols; I != N; ++I) 291761cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor Protocols[I] = Protocols[I]->getCanonicalDecl(); 291861cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor 291988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner // Remove duplicates. 292088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner ProtocolsEnd = std::unique(Protocols, ProtocolsEnd); 292188cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner NumProtocols = ProtocolsEnd-Protocols; 292288cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner} 292388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2924c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType ASTContext::getObjCObjectType(QualType BaseType, 2925c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCProtocolDecl * const *Protocols, 29264ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned NumProtocols) const { 2927c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // If the base type is an interface and there aren't any protocols 2928c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // to add, then the interface type will do just fine. 2929c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!NumProtocols && isa<ObjCInterfaceType>(BaseType)) 2930c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return BaseType; 2931d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff 2932c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Look in the folding set for an existing type. 2933c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall llvm::FoldingSetNodeID ID; 2934c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypeImpl::Profile(ID, BaseType, Protocols, NumProtocols); 2935d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff void *InsertPos = 0; 2936c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos)) 2937c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(QT, 0); 2938d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff 2939c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Build the canonical type, which has the canonical base type and 2940c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // a sorted-and-uniqued list of protocols. 294154e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Canonical; 2942c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall bool ProtocolsSorted = areSortedAndUniqued(Protocols, NumProtocols); 2943c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ProtocolsSorted || !BaseType.isCanonical()) { 2944c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ProtocolsSorted) { 29455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols, 29460237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer Protocols + NumProtocols); 294754e14c4db764c0636160d26c5bbf491637c83a76John McCall unsigned UniqueCount = NumProtocols; 294854e14c4db764c0636160d26c5bbf491637c83a76John McCall 294954e14c4db764c0636160d26c5bbf491637c83a76John McCall SortAndUniqueProtocols(&Sorted[0], UniqueCount); 2950c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectType(getCanonicalType(BaseType), 2951c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall &Sorted[0], UniqueCount); 295254e14c4db764c0636160d26c5bbf491637c83a76John McCall } else { 2953c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectType(getCanonicalType(BaseType), 2954c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Protocols, NumProtocols); 295554e14c4db764c0636160d26c5bbf491637c83a76John McCall } 295654e14c4db764c0636160d26c5bbf491637c83a76John McCall 295754e14c4db764c0636160d26c5bbf491637c83a76John McCall // Regenerate InsertPos. 2958c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos); 295954e14c4db764c0636160d26c5bbf491637c83a76John McCall } 296054e14c4db764c0636160d26c5bbf491637c83a76John McCall 2961c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall unsigned Size = sizeof(ObjCObjectTypeImpl); 2962c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Size += NumProtocols * sizeof(ObjCProtocolDecl *); 2963fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor void *Mem = Allocate(Size, TypeAlignment); 2964c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypeImpl *T = 2965c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall new (Mem) ObjCObjectTypeImpl(Canonical, BaseType, Protocols, NumProtocols); 29661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2967c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Types.push_back(T); 2968c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypes.InsertNode(T, InsertPos); 2969c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(T, 0); 2970d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff} 297188cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2972c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for 2973c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// the given object type. 29744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const { 29754b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian llvm::FoldingSetNodeID ID; 2976c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerType::Profile(ID, ObjectT); 29771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29784b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian void *InsertPos = 0; 2979c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ObjCObjectPointerType *QT = 2980c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 29814b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian return QualType(QT, 0); 29821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2983c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Find the canonical object type. 298454e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Canonical; 2985c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ObjectT.isCanonical()) { 2986c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT)); 298754e14c4db764c0636160d26c5bbf491637c83a76John McCall 2988c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Regenerate InsertPos. 2989c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 299054e14c4db764c0636160d26c5bbf491637c83a76John McCall } 299154e14c4db764c0636160d26c5bbf491637c83a76John McCall 2992c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // No match. 2993c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment); 2994c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerType *QType = 2995c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall new (Mem) ObjCObjectPointerType(Canonical, ObjectT); 299624fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 299724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis Types.push_back(QType); 2998c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.InsertNode(QType, InsertPos); 299924fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis return QualType(QType, 0); 300024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 300124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 3002deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// getObjCInterfaceType - Return the unique reference to the type for the 3003deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// specified ObjC interface decl. The list of protocols is optional. 30040af550115df1f57f17a4f125ff0e8b34820c65d1Douglas GregorQualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl, 30050af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor ObjCInterfaceDecl *PrevDecl) const { 3006deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (Decl->TypeForDecl) 3007deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor return QualType(Decl->TypeForDecl, 0); 300874c730ad1f6818b676b0bad46d806a9176950328Sebastian Redl 30090af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor if (PrevDecl) { 30100af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl"); 30110af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor Decl->TypeForDecl = PrevDecl->TypeForDecl; 30120af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor return QualType(PrevDecl->TypeForDecl, 0); 30130af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor } 30140af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor 30158d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor // Prefer the definition, if there is one. 30168d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor if (const ObjCInterfaceDecl *Def = Decl->getDefinition()) 30178d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor Decl = Def; 30188d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor 3019deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment); 3020deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ObjCInterfaceType *T = new (Mem) ObjCInterfaceType(Decl); 3021deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Decl->TypeForDecl = T; 3022deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Types.push_back(T); 3023deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor return QualType(T, 0); 3024c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 3025c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 302672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique 302772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// TypeOfExprType AST's (since expression's are never shared). For example, 30289752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// multiple declarations that refer to "typeof(x)" all contain different 30291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// DeclRefExpr's. This doesn't effect the type checker, since it operates 30309752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique). 30314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfExprType(Expr *tofExpr) const { 3032dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor TypeOfExprType *toe; 3033b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor if (tofExpr->isTypeDependent()) { 3034b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor llvm::FoldingSetNodeID ID; 3035b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprType::Profile(ID, *this, tofExpr); 30361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3037b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor void *InsertPos = 0; 3038b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprType *Canon 3039b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos); 3040b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor if (Canon) { 3041b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // We already have a "canonical" version of an identical, dependent 3042b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // typeof(expr) type. Use that as our canonical type. 30436b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, 3044b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor QualType((TypeOfExprType*)Canon, 0)); 30453060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 3046b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // Build a new, canonical typeof(expr) type. 30476b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Canon 30486b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr); 3049b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprTypes.InsertNode(Canon, InsertPos); 3050b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor toe = Canon; 3051b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor } 3052b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor } else { 3053dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor QualType Canonical = getCanonicalType(tofExpr->getType()); 30546b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical); 3055dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor } 30569752f25748d954df99087d741ea35db37ff16beaSteve Naroff Types.push_back(toe); 30579752f25748d954df99087d741ea35db37ff16beaSteve Naroff return QualType(toe, 0); 3058d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff} 3059d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff 30609752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// getTypeOfType - Unlike many "get<Type>" functions, we don't unique 30619752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// TypeOfType AST's. The only motivation to unique these nodes would be 30629752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be 30631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates 30649752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique). 30654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfType(QualType tofType) const { 3066f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner QualType Canonical = getCanonicalType(tofType); 30676b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical); 30689752f25748d954df99087d741ea35db37ff16beaSteve Naroff Types.push_back(tot); 30699752f25748d954df99087d741ea35db37ff16beaSteve Naroff return QualType(tot, 0); 3070d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff} 3071d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff 307260a9a2a404a4cf259d39133383e922aa00ca9043Anders Carlsson 3073395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// getDecltypeType - Unlike many "get<Type>" functions, we don't unique 3074395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// DecltypeType AST's. The only motivation to unique these nodes would be 3075395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be 30761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates 307739e02032b01874a0d02ba85a4cd3922adda81376David Blaikie/// on canonical types (which are always unique). 3078f8af98286022f72157d84951b48fde5fb369ab29Douglas GregorQualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const { 3079dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor DecltypeType *dt; 3080561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 3081561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // C++0x [temp.type]p2: 3082561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // If an expression e involves a template parameter, decltype(e) denotes a 3083561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // unique dependent type. Two such decltype-specifiers refer to the same 3084561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // type only if their expressions are equivalent (14.5.6.1). 3085561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (e->isInstantiationDependent()) { 30869d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor llvm::FoldingSetNodeID ID; 30879d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeType::Profile(ID, *this, e); 30881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30899d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor void *InsertPos = 0; 30909d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeType *Canon 30919d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos); 30929d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor if (Canon) { 30939d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // We already have a "canonical" version of an equivalent, dependent 30949d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // decltype type. Use that as our canonical type. 30956b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall dt = new (*this, TypeAlignment) DecltypeType(e, DependentTy, 30969d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor QualType((DecltypeType*)Canon, 0)); 30973060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 30989d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // Build a new, canonical typeof(expr) type. 30996b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e); 31009d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeTypes.InsertNode(Canon, InsertPos); 31019d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor dt = Canon; 31029d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor } 31039d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor } else { 3104f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType, 3105f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor getCanonicalType(UnderlyingType)); 3106dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor } 3107395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson Types.push_back(dt); 3108395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson return QualType(dt, 0); 3109395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson} 3110395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 3111ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// getUnaryTransformationType - We don't unique these, since the memory 3112ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// savings are minimal and these are rare. 3113ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTContext::getUnaryTransformType(QualType BaseType, 3114ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType UnderlyingType, 3115ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt UnaryTransformType::UTTKind Kind) 3116ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt const { 3117ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt UnaryTransformType *Ty = 311869d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType, 311969d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor Kind, 312069d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor UnderlyingType->isDependentType() ? 312112fc4b0624706b474fa10308631fa8daf92f340fPeter Collingbourne QualType() : getCanonicalType(UnderlyingType)); 3122ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt Types.push_back(Ty); 3123ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return QualType(Ty, 0); 3124ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 3125ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 3126483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith/// getAutoType - We only unique auto types after they've been deduced. 312734b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTContext::getAutoType(QualType DeducedType) const { 3128483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith void *InsertPos = 0; 3129483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (!DeducedType.isNull()) { 3130483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith // Look in the folding set for an existing type. 3131483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith llvm::FoldingSetNodeID ID; 3132483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoType::Profile(ID, DeducedType); 3133483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos)) 3134483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith return QualType(AT, 0); 3135483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith } 3136483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith 3137483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType); 3138483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith Types.push_back(AT); 3139483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (InsertPos) 3140483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoTypes.InsertNode(AT, InsertPos); 3141483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith return QualType(AT, 0); 314234b41d939a1328f484511c6002ba2456db879a29Richard Smith} 314334b41d939a1328f484511c6002ba2456db879a29Richard Smith 3144b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// getAtomicType - Return the uniqued reference to the atomic type for 3145b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// the given value type. 3146b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanQualType ASTContext::getAtomicType(QualType T) const { 3147b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Unique pointers, to guarantee there is only one pointer of a particular 3148b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // structure. 3149b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman llvm::FoldingSetNodeID ID; 3150b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType::Profile(ID, T); 3151b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3152b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman void *InsertPos = 0; 3153b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos)) 3154b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return QualType(AT, 0); 3155b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3156b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // If the atomic value type isn't canonical, this won't be a canonical type 3157b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // either, so fill in the canonical type field. 3158b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType Canonical; 3159b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (!T.isCanonical()) { 3160b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Canonical = getAtomicType(getCanonicalType(T)); 3161b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3162b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Get the new insert position for the node we care about. 3163b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos); 3164b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 3165b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 3166b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType *New = new (*this, TypeAlignment) AtomicType(T, Canonical); 3167b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Types.push_back(New); 3168b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicTypes.InsertNode(New, InsertPos); 3169b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return QualType(New, 0); 3170b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman} 3171b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3172ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoDeductType - Get type pattern for deducing against 'auto'. 3173ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoDeductType() const { 3174ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith if (AutoDeductTy.isNull()) 3175ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith AutoDeductTy = getAutoType(QualType()); 3176ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith assert(!AutoDeductTy.isNull() && "can't build 'auto' pattern"); 3177ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith return AutoDeductTy; 3178ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 3179ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 3180ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'. 3181ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoRRefDeductType() const { 3182ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith if (AutoRRefDeductTy.isNull()) 3183ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType()); 3184ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern"); 3185ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith return AutoRRefDeductTy; 3186ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 3187ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 31885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTagDeclType - Return the unique reference to the type for the 31895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified TagDecl (struct/union/class/enum) decl. 31904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTagDeclType(const TagDecl *Decl) const { 3191d778f88d32b96a74c9edb7342c81357606a7cdc0Ted Kremenek assert (Decl); 3192e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump // FIXME: What is the design on getTagDeclType when it requires casting 3193e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump // away const? mutable? 3194e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump return getTypeDeclType(const_cast<TagDecl*>(Decl)); 31955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 31965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 31971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result 31981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and 31991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// needs to agree with the definition in <stddef.h>. 3200a3ccda58913cc1a4b8564e349448b12acc462da7Anders CarlssonCanQualType ASTContext::getSizeType() const { 3201bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return getFromTargetType(Target->getSizeType()); 32025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 32035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 320429e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5). 320529e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getIntMaxType() const { 320629e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg return getFromTargetType(Target->getIntMaxType()); 320729e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg} 320829e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg 320929e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5). 321029e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getUIntMaxType() const { 321129e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg return getFromTargetType(Target->getUIntMaxType()); 321229e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg} 321329e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg 321464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getSignedWCharType - Return the type of "signed wchar_t". 321564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension. 321664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getSignedWCharType() const { 321764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // FIXME: derive from "Target" ? 321864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis return WCharTy; 321964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis} 322064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 322164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getUnsignedWCharType - Return the type of "unsigned wchar_t". 322264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension. 322364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getUnsignedWCharType() const { 322464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // FIXME: derive from "Target" ? 322564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis return UnsignedIntTy; 322664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis} 322764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 322829e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17) 32298b9023ba35a86838789e2c9034a6128728c547aaChris Lattner/// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9). 32308b9023ba35a86838789e2c9034a6128728c547aaChris LattnerQualType ASTContext::getPointerDiffType() const { 3231bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return getFromTargetType(Target->getPtrDiffType(0)); 32328b9023ba35a86838789e2c9034a6128728c547aaChris Lattner} 32338b9023ba35a86838789e2c9034a6128728c547aaChris Lattner 3234e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===// 3235e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner// Type Operators 3236e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===// 3237e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 32384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCanQualType ASTContext::getCanonicalParamType(QualType T) const { 323954e14c4db764c0636160d26c5bbf491637c83a76John McCall // Push qualifiers into arrays, and then discard any remaining 324054e14c4db764c0636160d26c5bbf491637c83a76John McCall // qualifiers. 324154e14c4db764c0636160d26c5bbf491637c83a76John McCall T = getCanonicalType(T); 3242745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian T = getVariableArrayDecayedType(T); 324354e14c4db764c0636160d26c5bbf491637c83a76John McCall const Type *Ty = T.getTypePtr(); 324454e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Result; 324554e14c4db764c0636160d26c5bbf491637c83a76John McCall if (isa<ArrayType>(Ty)) { 324654e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = getArrayDecayedType(QualType(Ty,0)); 324754e14c4db764c0636160d26c5bbf491637c83a76John McCall } else if (isa<FunctionType>(Ty)) { 324854e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = getPointerType(QualType(Ty, 0)); 324954e14c4db764c0636160d26c5bbf491637c83a76John McCall } else { 325054e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = QualType(Ty, 0); 325154e14c4db764c0636160d26c5bbf491637c83a76John McCall } 325254e14c4db764c0636160d26c5bbf491637c83a76John McCall 325354e14c4db764c0636160d26c5bbf491637c83a76John McCall return CanQualType::CreateUnsafe(Result); 325454e14c4db764c0636160d26c5bbf491637c83a76John McCall} 325554e14c4db764c0636160d26c5bbf491637c83a76John McCall 325662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCallQualType ASTContext::getUnqualifiedArrayType(QualType type, 325762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall Qualifiers &quals) { 325862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall SplitQualType splitType = type.getSplitUnqualifiedType(); 325962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 326062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // FIXME: getSplitUnqualifiedType() actually walks all the way to 326162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // the unqualified desugared type and then drops it on the floor. 326262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // We then have to strip that sugar back off with 326362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // getUnqualifiedDesugaredType(), which is silly. 326462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall const ArrayType *AT = 3265200fa53fd420aa8369586f569dbece04930ad6a3John McCall dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType()); 326662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 326762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // If we don't have an array, just use the results in splitType. 32689dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (!AT) { 3269200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals = splitType.Quals; 3270200fa53fd420aa8369586f569dbece04930ad6a3John McCall return QualType(splitType.Ty, 0); 327128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 327228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 327362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // Otherwise, recurse on the array's element type. 327462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall QualType elementType = AT->getElementType(); 327562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall QualType unqualElementType = getUnqualifiedArrayType(elementType, quals); 327662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 327762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // If that didn't change the element type, AT has no qualifiers, so we 327862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // can just use the results in splitType. 327962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall if (elementType == unqualElementType) { 328062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall assert(quals.empty()); // from the recursive call 3281200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals = splitType.Quals; 3282200fa53fd420aa8369586f569dbece04930ad6a3John McCall return QualType(splitType.Ty, 0); 328362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall } 328462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 328562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // Otherwise, add in the qualifiers from the outermost type, then 328662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // build the type back up. 3287200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals.addConsistentQualifiers(splitType.Quals); 328828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 32899dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 329062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getConstantArrayType(unqualElementType, CAT->getSize(), 329128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth CAT->getSizeModifier(), 0); 329228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 329328e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 32949dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 329562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0); 329628e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 329728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 32989dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(AT)) { 329962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getVariableArrayType(unqualElementType, 33003fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall VAT->getSizeExpr(), 33019dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getSizeModifier(), 33029dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getIndexTypeCVRQualifiers(), 33039dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getBracketsRange()); 33049dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor } 33059dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor 33069dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(AT); 330762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(), 330828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth DSAT->getSizeModifier(), 0, 330928e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth SourceRange()); 331028e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth} 331128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 33125a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types that 33135a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// may be similar (C++ 4.4), replaces T1 and T2 with the type that 33145a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// they point to and return true. If T1 and T2 aren't pointer types 33155a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// or pointer-to-member types, or if they are not similar at this 33165a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// level, returns false and leaves T1 and T2 unchanged. Top-level 33175a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// qualifiers on T1 and T2 are ignored. This function will typically 33185a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// be called in a loop that successively "unwraps" pointer and 33195a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// pointer-to-member types to compare them at each level. 33205a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregorbool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) { 33215a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const PointerType *T1PtrType = T1->getAs<PointerType>(), 33225a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2PtrType = T2->getAs<PointerType>(); 33235a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1PtrType && T2PtrType) { 33245a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1PtrType->getPointeeType(); 33255a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2PtrType->getPointeeType(); 33265a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 33275a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33285a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33295a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(), 33305a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2MPType = T2->getAs<MemberPointerType>(); 33315a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1MPType && T2MPType && 33325a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0), 33335a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor QualType(T2MPType->getClass(), 0))) { 33345a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1MPType->getPointeeType(); 33355a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2MPType->getPointeeType(); 33365a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 33375a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33385a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33394e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1) { 33405a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const ObjCObjectPointerType *T1OPType = T1->getAs<ObjCObjectPointerType>(), 33415a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2OPType = T2->getAs<ObjCObjectPointerType>(); 33425a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1OPType && T2OPType) { 33435a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1OPType->getPointeeType(); 33445a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2OPType->getPointeeType(); 33455a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 33465a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33475a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33485a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33495a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor // FIXME: Block pointers, too? 33505a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33515a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return false; 33525a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor} 33535a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameInfo 33554ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getNameForTemplate(TemplateName Name, 33564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceLocation NameLoc) const { 3357146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall switch (Name.getKind()) { 3358146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::QualifiedTemplate: 3359146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::Template: 33602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: CHECKME: what about DNLoc? 3361146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(), 3362146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 33632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 3364146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::OverloadedTemplate: { 3365146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate(); 3366146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall // DNInfo work in progress: CHECKME: what about DNLoc? 3367146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc); 3368146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3369146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3370146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::DependentTemplate: { 3371146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 33722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName DName; 337380ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall if (DTN->isIdentifier()) { 33742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DName = DeclarationNames.getIdentifier(DTN->getIdentifier()); 33752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(DName, NameLoc); 337680ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } else { 33772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DName = DeclarationNames.getCXXOperatorName(DTN->getOperator()); 33782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: FIXME: source locations? 33792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameLoc DNLoc; 33802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DNLoc.CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding(); 33812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DNLoc.CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding(); 33822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(DName, NameLoc, DNLoc); 338380ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } 338480ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } 338580ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall 3386146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 3387146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 3388146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 3389146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(subst->getParameter()->getDeclName(), 3390146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 3391146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3392146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3393146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParmPack: { 3394146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmPackStorage *subst 3395146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParmPack(); 3396146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(subst->getParameterPack()->getDeclName(), 3397146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 3398146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3399146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3400146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3401146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("bad template name kind!"); 340280ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall} 340380ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall 34044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const { 3405146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall switch (Name.getKind()) { 3406146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::QualifiedTemplate: 3407146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::Template: { 3408146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateDecl *Template = Name.getAsTemplateDecl(); 34093e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTemplateParmDecl *TTP 3410146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = dyn_cast<TemplateTemplateParmDecl>(Template)) 34113e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Template = getCanonicalTemplateTemplateParmDecl(TTP); 34123e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 34133e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // The canonical template name is the canonical template declaration. 341497fbaa2a38804268a024f1a104b43fcf8b4411b0Argyrios Kyrtzidis return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl())); 34153e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 341625a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor 3417146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::OverloadedTemplate: 3418146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("cannot canonicalize overloaded template"); 3419146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3420146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::DependentTemplate: { 3421146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 3422146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall assert(DTN && "Non-dependent template names must refer to template decls."); 3423146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DTN->CanonicalTemplateName; 3424146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3425146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3426146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 3427146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 3428146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 3429146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return getCanonicalTemplateName(subst->getReplacement()); 34301aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 34311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3432146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParmPack: { 3433146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmPackStorage *subst 3434146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParmPack(); 3435146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateTemplateParmDecl *canonParameter 3436146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack()); 3437146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateArgument canonArgPack 3438146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = getCanonicalTemplateArgument(subst->getArgumentPack()); 3439146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack); 3440146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3441146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3442146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3443146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("bad template name!"); 344425a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor} 344525a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor 3446db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregorbool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) { 3447db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor X = getCanonicalTemplateName(X); 3448db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor Y = getCanonicalTemplateName(Y); 3449db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor return X.getAsVoidPointer() == Y.getAsVoidPointer(); 3450db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor} 3451db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor 34521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument 34534ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const { 34541275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor switch (Arg.getKind()) { 34551275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Null: 34561275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor return Arg; 34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34581275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Expression: 34591275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor return Arg; 34601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3461d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor case TemplateArgument::Declaration: { 3462d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor if (Decl *D = Arg.getAsDecl()) 3463d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor return TemplateArgument(D->getCanonicalDecl()); 3464d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor return TemplateArgument((Decl*)0); 3465d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor } 34661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3467788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 3468788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate())); 3469a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 3470a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 3471a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgument(getCanonicalTemplateName( 3472a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg.getAsTemplateOrTemplatePattern()), 34732be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor Arg.getNumTemplateExpansions()); 3474a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 34751275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Integral: 3476855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer return TemplateArgument(Arg, getCanonicalType(Arg.getIntegralType())); 34771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34781275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Type: 3479833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TemplateArgument(getCanonicalType(Arg.getAsType())); 34801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34811275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Pack: { 348287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor if (Arg.pack_size() == 0) 348387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor return Arg; 348487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 3485910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *CanonArgs 3486910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = new (*this) TemplateArgument[Arg.pack_size()]; 34871275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor unsigned Idx = 0; 34881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 34891275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor AEnd = Arg.pack_end(); 34901275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor A != AEnd; (void)++A, ++Idx) 34911275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor CanonArgs[Idx] = getCanonicalTemplateArgument(*A); 34921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3493910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return TemplateArgument(CanonArgs, Arg.pack_size()); 34941275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor } 34951275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor } 34961275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor 34971275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // Silence GCC warning 3498b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unhandled template argument kind"); 34991275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor} 35001275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor 3501d57959af02b4af695276f4204443afe6e5d86bd8Douglas GregorNestedNameSpecifier * 35024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const { 35031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!NNS) 3504d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return 0; 3505d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3506d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor switch (NNS->getKind()) { 3507d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Identifier: 3508d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // Canonicalize the prefix but keep the identifier the same. 35091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return NestedNameSpecifier::Create(*this, 3510d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor getCanonicalNestedNameSpecifier(NNS->getPrefix()), 3511d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor NNS->getAsIdentifier()); 3512d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3513d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Namespace: 3514d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // A namespace is canonical; build a nested-name-specifier with 3515d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // this namespace and no prefix. 351614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(*this, 0, 351714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespace()->getOriginalNamespace()); 351814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 351914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor case NestedNameSpecifier::NamespaceAlias: 352014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor // A namespace is canonical; build a nested-name-specifier with 352114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor // this namespace and no prefix. 352214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(*this, 0, 352314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespaceAlias()->getNamespace() 352414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor ->getOriginalNamespace()); 3525d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3526d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::TypeSpec: 3527d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: { 3528d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor QualType T = getCanonicalType(QualType(NNS->getAsType(), 0)); 3529264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor 3530264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // If we have some kind of dependent-named type (e.g., "typename T::type"), 3531264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // break it apart into its prefix and identifier, then reconsititute those 3532264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // as the canonical nested-name-specifier. This is required to canonicalize 3533264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // a dependent nested-name-specifier involving typedefs of dependent-name 3534264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // types, e.g., 3535264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // typedef typename T::type T1; 3536264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // typedef typename T1::type T2; 353716412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman if (const DependentNameType *DNT = T->getAs<DependentNameType>()) 353816412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman return NestedNameSpecifier::Create(*this, DNT->getQualifier(), 3539264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor const_cast<IdentifierInfo *>(DNT->getIdentifier())); 3540264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor 354116412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // Otherwise, just canonicalize the type, and force it to be a TypeSpec. 354216412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // FIXME: Why are TypeSpec and TypeSpecWithTemplate distinct in the 354316412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // first place? 35443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return NestedNameSpecifier::Create(*this, 0, false, 35453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall const_cast<Type*>(T.getTypePtr())); 3546d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 3547d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3548d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Global: 3549d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // The global specifier is canonical and unique. 3550d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return NNS; 3551d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 3552d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 35537530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid NestedNameSpecifier::Kind!"); 3554d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor} 3555d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3556c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner 35574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadconst ArrayType *ASTContext::getAsArrayType(QualType T) const { 3558c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Handle the non-qualified case efficiently. 3559a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor if (!T.hasLocalQualifiers()) { 3560c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Handle the common positive case fast. 3561c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ArrayType *AT = dyn_cast<ArrayType>(T)) 3562c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return AT; 3563c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner } 35641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Handle the common negative case fast. 35663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!isa<ArrayType>(T.getCanonicalType())) 3567c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return 0; 35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Apply any qualifiers from the array type to the element type. This 3570c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // implements C99 6.7.3p8: "If the specification of an array type includes 3571c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // any type qualifiers, the element type is so qualified, not the array type." 35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3573c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If we get here, we either have type qualifiers on the type, or we have 3574c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // sugar such as a typedef in the way. If we have type qualifiers on the type 357550d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor // we must propagate them down into the element type. 35760953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 35773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType split = T.getSplitDesugaredType(); 3578200fa53fd420aa8369586f569dbece04930ad6a3John McCall Qualifiers qs = split.Quals; 35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3580c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If we have a simple case, just return now. 3581200fa53fd420aa8369586f569dbece04930ad6a3John McCall const ArrayType *ATy = dyn_cast<ArrayType>(split.Ty); 35823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (ATy == 0 || qs.empty()) 3583c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return ATy; 35841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3585c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Otherwise, we have an array and we have qualifiers on it. Push the 3586c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // qualifiers into the array element type and return a new array type. 35873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs); 35881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3589c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy)) 3590c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(), 3591c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner CAT->getSizeModifier(), 35920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall CAT->getIndexTypeCVRQualifiers())); 3593c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy)) 3594c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return cast<ArrayType>(getIncompleteArrayType(NewEltTy, 3595c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner IAT->getSizeModifier(), 35960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall IAT->getIndexTypeCVRQualifiers())); 3597898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 35981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const DependentSizedArrayType *DSAT 3599898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor = dyn_cast<DependentSizedArrayType>(ATy)) 3600898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return cast<ArrayType>( 36011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDependentSizedArrayType(NewEltTy, 36023fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall DSAT->getSizeExpr(), 3603898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor DSAT->getSizeModifier(), 36040953e767ff7817f97b3ab20896b229891eeff45bJohn McCall DSAT->getIndexTypeCVRQualifiers(), 36057e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor DSAT->getBracketsRange())); 36061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3607c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner const VariableArrayType *VAT = cast<VariableArrayType>(ATy); 36087e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor return cast<ArrayType>(getVariableArrayType(NewEltTy, 36093fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall VAT->getSizeExpr(), 3610c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner VAT->getSizeModifier(), 36110953e767ff7817f97b3ab20896b229891eeff45bJohn McCall VAT->getIndexTypeCVRQualifiers(), 36127e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor VAT->getBracketsRange())); 361377c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner} 361477c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner 3615ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getAdjustedParameterType(QualType T) const { 361679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // C99 6.7.5.3p7: 361779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // A declaration of a parameter as "array of type" shall be 361879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // adjusted to "qualified pointer to type", where the type 361979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // qualifiers (if any) are those specified within the [ and ] of 362079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // the array type derivation. 362179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor if (T->isArrayType()) 362279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return getArrayDecayedType(T); 362379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 362479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // C99 6.7.5.3p8: 362579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // A declaration of a parameter as "function returning type" 362679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // shall be adjusted to "pointer to function returning type", as 362779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // in 6.3.2.1. 362879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor if (T->isFunctionType()) 362979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return getPointerType(T); 363079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 363179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return T; 363279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor} 363379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 3634ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getSignatureParameterType(QualType T) const { 363579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor T = getVariableArrayDecayedType(T); 363679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor T = getAdjustedParameterType(T); 363779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return T.getUnqualifiedType(); 363879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor} 363979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 3640e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// getArrayDecayedType - Return the properly qualified result of decaying the 3641e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// specified array type to a pointer. This operation is non-trivial when 3642e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// handling typedefs etc. The canonical type of "T" must be an array type, 3643e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// this returns a pointer to a properly qualified element of the array. 3644e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// 3645e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// See C99 6.7.5.3p7 and C99 6.3.2.1p3. 36464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getArrayDecayedType(QualType Ty) const { 3647c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Get the element type with 'getAsArrayType' so that we don't lose any 3648c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // typedefs in the element type of the array. This also handles propagation 3649c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // of type qualifiers from the array type into the element type if present 3650c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // (C99 6.7.3p8). 3651c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner const ArrayType *PrettyArrayType = getAsArrayType(Ty); 3652c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner assert(PrettyArrayType && "Not an array type!"); 36531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3654c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner QualType PtrTy = getPointerType(PrettyArrayType->getElementType()); 3655e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 3656e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner // int x[restrict 4] -> int *restrict 36570953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers()); 3658e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner} 3659e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 36603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(const ArrayType *array) const { 36613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return getBaseElementType(array->getElementType()); 36625e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor} 36635e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor 36643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(QualType type) const { 36653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Qualifiers qs; 36663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall while (true) { 36673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType split = type.getSplitDesugaredType(); 3668200fa53fd420aa8369586f569dbece04930ad6a3John McCall const ArrayType *array = split.Ty->getAsArrayTypeUnsafe(); 36693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!array) break; 36701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall type = array->getElementType(); 3672200fa53fd420aa8369586f569dbece04930ad6a3John McCall qs.addConsistentQualifiers(split.Quals); 36733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 36741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return getQualifiedType(type, qs); 36766183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson} 36776183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson 36780de78998e7bda473b408437053e48661b510d453Fariborz Jahanian/// getConstantArrayElementCount - Returns number of constant array elements. 36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpuint64_t 36800de78998e7bda473b408437053e48661b510d453Fariborz JahanianASTContext::getConstantArrayElementCount(const ConstantArrayType *CA) const { 36810de78998e7bda473b408437053e48661b510d453Fariborz Jahanian uint64_t ElementCount = 1; 36820de78998e7bda473b408437053e48661b510d453Fariborz Jahanian do { 36830de78998e7bda473b408437053e48661b510d453Fariborz Jahanian ElementCount *= CA->getSize().getZExtValue(); 36840de78998e7bda473b408437053e48661b510d453Fariborz Jahanian CA = dyn_cast<ConstantArrayType>(CA->getElementType()); 36850de78998e7bda473b408437053e48661b510d453Fariborz Jahanian } while (CA); 36860de78998e7bda473b408437053e48661b510d453Fariborz Jahanian return ElementCount; 36870de78998e7bda473b408437053e48661b510d453Fariborz Jahanian} 36880de78998e7bda473b408437053e48661b510d453Fariborz Jahanian 36895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFloatingRank - Return a relative rank for floating point types. 36905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// This routine will assert if passed a built-in type that isn't a float. 3691a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattnerstatic FloatingRank getFloatingRank(QualType T) { 3692183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType *CT = T->getAs<ComplexType>()) 36935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return getFloatingRank(CT->getElementType()); 3694a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner 3695183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type"); 3696183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall switch (T->getAs<BuiltinType>()->getKind()) { 3697b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("getFloatingRank(): not a floating type"); 3698aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: return HalfRank; 36995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Float: return FloatRank; 37005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Double: return DoubleRank; 37015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongDouble: return LongDoubleRank; 37025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 37035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 37045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 37051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getFloatingTypeOfSizeWithinDomain - Returns a real floating 37061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// point or a complex type (based on typeDomain/typeSize). 3707716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeDomain' is a real floating point or complex type. 3708716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeSize' is a real floating point or complex type. 37091361b11066239ea15764a2a844405352d87296b3Chris LattnerQualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size, 37101361b11066239ea15764a2a844405352d87296b3Chris Lattner QualType Domain) const { 37111361b11066239ea15764a2a844405352d87296b3Chris Lattner FloatingRank EltRank = getFloatingRank(Size); 37121361b11066239ea15764a2a844405352d87296b3Chris Lattner if (Domain->isComplexType()) { 37131361b11066239ea15764a2a844405352d87296b3Chris Lattner switch (EltRank) { 3714561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie case HalfRank: llvm_unreachable("Complex half is not supported"); 3715f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case FloatRank: return FloatComplexTy; 3716f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case DoubleRank: return DoubleComplexTy; 3717f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case LongDoubleRank: return LongDoubleComplexTy; 3718f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff } 3719f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff } 37201361b11066239ea15764a2a844405352d87296b3Chris Lattner 37211361b11066239ea15764a2a844405352d87296b3Chris Lattner assert(Domain->isRealFloatingType() && "Unknown domain!"); 37221361b11066239ea15764a2a844405352d87296b3Chris Lattner switch (EltRank) { 3723561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie case HalfRank: llvm_unreachable("Half ranks are not valid here"); 37241361b11066239ea15764a2a844405352d87296b3Chris Lattner case FloatRank: return FloatTy; 37251361b11066239ea15764a2a844405352d87296b3Chris Lattner case DoubleRank: return DoubleTy; 37261361b11066239ea15764a2a844405352d87296b3Chris Lattner case LongDoubleRank: return LongDoubleTy; 37275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3728561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie llvm_unreachable("getFloatingRank(): illegal value for rank"); 37295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 37305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 37317cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// getFloatingTypeOrder - Compare the rank of the two specified floating 37327cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// point types, ignoring the domain of the type (i.e. 'double' == 37337cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If 37341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1. 37354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const { 3736a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner FloatingRank LHSR = getFloatingRank(LHS); 3737a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner FloatingRank RHSR = getFloatingRank(RHS); 37381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3739a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner if (LHSR == RHSR) 3740fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return 0; 3741a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner if (LHSR > RHSR) 3742fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return 1; 3743fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return -1; 37445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 37455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3746f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This 3747f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// routine will assert if passed a built-in type that isn't an integer or enum, 3748f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// or if it is not canonicalized. 3749f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallunsigned ASTContext::getIntegerRank(const Type *T) const { 3750467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(T->isCanonicalUnqualified() && "T should be canonicalized"); 3751f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 3752f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner switch (cast<BuiltinType>(T)->getKind()) { 3753b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("getIntegerRank(): not a built-in integer"); 37547cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Bool: 3755f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 1 + (getIntWidth(BoolTy) << 3); 37567cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Char_S: 37577cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Char_U: 37587cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::SChar: 37597cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UChar: 3760f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 2 + (getIntWidth(CharTy) << 3); 37617cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Short: 37627cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UShort: 3763f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 3 + (getIntWidth(ShortTy) << 3); 37647cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Int: 37657cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UInt: 3766f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 4 + (getIntWidth(IntTy) << 3); 37677cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Long: 37687cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::ULong: 3769f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 5 + (getIntWidth(LongTy) << 3); 37707cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::LongLong: 37717cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::ULongLong: 3772f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 6 + (getIntWidth(LongLongTy) << 3); 37732df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::Int128: 37742df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::UInt128: 37752df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner return 7 + (getIntWidth(Int128Ty) << 3); 3776f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner } 3777f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner} 3778f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner 377904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \brief Whether this is a promotable bitfield reference according 378004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions). 378104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// 378204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \returns the type this bit-field will promote to, or NULL if no 378304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// promotion occurs. 37844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::isPromotableBitField(Expr *E) const { 3785ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor if (E->isTypeDependent() || E->isValueDependent()) 3786ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor return QualType(); 3787ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor 378804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman FieldDecl *Field = E->getBitField(); 378904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (!Field) 379004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return QualType(); 379104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 379204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman QualType FT = Field->getType(); 379304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 3794a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith uint64_t BitWidth = Field->getBitWidthValue(*this); 379504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman uint64_t IntSize = getTypeSize(IntTy); 379604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // GCC extension compatibility: if the bit-field size is less than or equal 379704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // to the size of int, it gets promoted no matter what its type is. 379804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // For instance, unsigned long bf : 4 gets promoted to signed int. 379904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (BitWidth < IntSize) 380004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return IntTy; 380104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 380204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (BitWidth == IntSize) 380304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy; 380404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 380504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // Types bigger than int are not subject to promotions, and therefore act 380604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // like the base type. 380704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // FIXME: This doesn't quite match what gcc does, but what gcc does here 380804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // is ridiculous. 380904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return QualType(); 381004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman} 381104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 3812a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// getPromotedIntegerType - Returns the type that Promotable will 3813a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable 3814a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// integer type. 38154ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPromotedIntegerType(QualType Promotable) const { 3816a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(!Promotable.isNull()); 3817a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(Promotable->isPromotableIntegerType()); 3818842aef8d942a880eeb9535d40de31a86838264cbJohn McCall if (const EnumType *ET = Promotable->getAs<EnumType>()) 3819842aef8d942a880eeb9535d40de31a86838264cbJohn McCall return ET->getDecl()->getPromotionType(); 382068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman 382168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (const BuiltinType *BT = Promotable->getAs<BuiltinType>()) { 382268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t 382368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // (3.9.1) can be converted to a prvalue of the first of the following 382468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // types that can represent all the values of its underlying type: 382568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // int, unsigned int, long int, unsigned long int, long long int, or 382668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // unsigned long long int [...] 382768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // FIXME: Is there some better way to compute this? 382868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (BT->getKind() == BuiltinType::WChar_S || 382968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::WChar_U || 383068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::Char16 || 383168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::Char32) { 383268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S; 383368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman uint64_t FromSize = getTypeSize(BT); 383468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy, 383568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman LongLongTy, UnsignedLongLongTy }; 383668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman for (size_t Idx = 0; Idx < llvm::array_lengthof(PromoteTypes); ++Idx) { 383768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman uint64_t ToSize = getTypeSize(PromoteTypes[Idx]); 383868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (FromSize < ToSize || 383968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman (FromSize == ToSize && 384068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) 384168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman return PromoteTypes[Idx]; 384268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 384368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman llvm_unreachable("char type should fit into long long"); 384468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 384568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 384668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman 384768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // At this point, we should have a signed or unsigned integer type. 3848a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman if (Promotable->isSignedIntegerType()) 3849a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman return IntTy; 3850a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman uint64_t PromotableSize = getTypeSize(Promotable); 3851a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman uint64_t IntSize = getTypeSize(IntTy); 3852a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize); 3853a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy; 3854a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman} 3855a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman 385631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// \brief Recurses in pointer/array types until it finds an objc retainable 385731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// type and returns its ownership. 385831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios KyrtzidisQualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const { 385931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis while (!T.isNull()) { 386031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis if (T.getObjCLifetime() != Qualifiers::OCL_None) 386131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis return T.getObjCLifetime(); 386231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis if (T->isArrayType()) 386331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis T = getBaseElementType(T); 386431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else if (const PointerType *PT = T->getAs<PointerType>()) 386531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis T = PT->getPointeeType(); 386631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 386728445f0b62f6aed851ff87ce64d9b19200d3211fArgyrios Kyrtzidis T = RT->getPointeeType(); 386831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else 386931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis break; 387031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis } 387131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis 387231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis return Qualifiers::OCL_None; 387331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis} 387431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis 38751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getIntegerTypeOrder - Returns the highest ranked integer type: 38767cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If 38771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1. 38784ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const { 3879f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *LHSC = getCanonicalType(LHS).getTypePtr(); 3880f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *RHSC = getCanonicalType(RHS).getTypePtr(); 38817cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSC == RHSC) return 0; 38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3883f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner bool LHSUnsigned = LHSC->isUnsignedIntegerType(); 3884f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner bool RHSUnsigned = RHSC->isUnsignedIntegerType(); 38851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38867cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner unsigned LHSRank = getIntegerRank(LHSC); 38877cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner unsigned RHSRank = getIntegerRank(RHSC); 38881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38897cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSUnsigned == RHSUnsigned) { // Both signed or both unsigned. 38907cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSRank == RHSRank) return 0; 38917cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return LHSRank > RHSRank ? 1 : -1; 38927cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner } 38931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38947cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // Otherwise, the LHS is signed and the RHS is unsigned or visa versa. 38957cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSUnsigned) { 38967cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the unsigned [LHS] type is larger, return it. 38977cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSRank >= RHSRank) 38987cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return 1; 38991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39007cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the signed type can represent all values of the unsigned type, it 39017cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // wins. Because we are dealing with 2's complement and types that are 39021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // powers of two larger than each other, this is always safe. 39037cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return -1; 39047cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner } 39057cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner 39067cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the unsigned [RHS] type is larger, return it. 39077cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (RHSRank >= LHSRank) 39087cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return -1; 39091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39107cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the signed type can represent all values of the unsigned type, it 39117cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // wins. Because we are dealing with 2's complement and types that are 39121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // powers of two larger than each other, this is always safe. 39137cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return 1; 39145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 391571993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson 391679cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlssonstatic RecordDecl * 3917ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, 3918ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, IdentifierInfo *Id) { 3919ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation Loc; 39204e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Ctx.getLangOpts().CPlusPlus) 3921ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 392279cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson else 3923ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 392479cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson} 3925ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara 39261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// getCFConstantStringType - Return the type used for constant CFStrings. 39274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getCFConstantStringType() const { 392871993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson if (!CFConstantStringTypeDecl) { 39291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CFConstantStringTypeDecl = 3930ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara CreateRecordDecl(*this, TTK_Struct, TUDecl, 393179cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("NSConstantString")); 39325cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall CFConstantStringTypeDecl->startDefinition(); 393379cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson 3934f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson QualType FieldTypes[4]; 39351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393671993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // const int *isa; 39370953e767ff7817f97b3ab20896b229891eeff45bJohn McCall FieldTypes[0] = getPointerType(IntTy.withConst()); 3938f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson // int flags; 3939f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson FieldTypes[1] = IntTy; 394071993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // const char *str; 39410953e767ff7817f97b3ab20896b229891eeff45bJohn McCall FieldTypes[2] = getPointerType(CharTy.withConst()); 394271993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // long length; 39431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldTypes[3] = LongTy; 39441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 394544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Create fields 394644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor for (unsigned i = 0; i < 4; ++i) { 39471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl, 3948ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 394944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor SourceLocation(), 0, 3950a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 39511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*BitWidth=*/0, 39527a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 3953ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 39542888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 395517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis CFConstantStringTypeDecl->addDecl(Field); 395644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 395744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 3958838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor CFConstantStringTypeDecl->completeDefinition(); 395971993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson } 39601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 396171993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson return getTagDeclType(CFConstantStringTypeDecl); 39628467583c2704e7a9691ea56939a029015f0ade0aGabor Greif} 3963b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson 3964319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregorvoid ASTContext::setCFConstantStringType(QualType T) { 39656217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *Rec = T->getAs<RecordType>(); 3966319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor assert(Rec && "Invalid CFConstantStringType"); 3967319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor CFConstantStringTypeDecl = Rec->getDecl(); 3968319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor} 3969319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor 39704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorType() const { 3971adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump if (BlockDescriptorType) 3972adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump return getTagDeclType(BlockDescriptorType); 3973adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3974adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump RecordDecl *T; 3975adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump // FIXME: Needs the FlagAppleBlock bit. 3976ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 397779cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("__block_descriptor")); 39785cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall T->startDefinition(); 3979adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3980adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump QualType FieldTypes[] = { 3981adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump UnsignedLongTy, 3982adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump UnsignedLongTy, 3983adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump }; 3984adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3985adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump const char *FieldNames[] = { 3986adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump "reserved", 3987083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "Size" 3988adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump }; 3989adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3990adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump for (size_t i = 0; i < 2; ++i) { 3991ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 3992adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump SourceLocation(), 3993adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump &Idents.get(FieldNames[i]), 3994a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 3995adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump /*BitWidth=*/0, 39967a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 3997ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 39982888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 3999adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump T->addDecl(Field); 4000adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump } 4001adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4002838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 4003adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4004adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump BlockDescriptorType = T; 4005adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4006adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump return getTagDeclType(BlockDescriptorType); 4007adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump} 4008adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 40094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorExtendedType() const { 4010083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump if (BlockDescriptorExtendedType) 4011083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump return getTagDeclType(BlockDescriptorExtendedType); 4012083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4013083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump RecordDecl *T; 4014083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump // FIXME: Needs the FlagAppleBlock bit. 4015ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 401679cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("__block_descriptor_withcopydispose")); 40175cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall T->startDefinition(); 4018083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4019083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump QualType FieldTypes[] = { 4020083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump UnsignedLongTy, 4021083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump UnsignedLongTy, 4022083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump getPointerType(VoidPtrTy), 4023083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump getPointerType(VoidPtrTy) 4024083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump }; 4025083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4026083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump const char *FieldNames[] = { 4027083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "reserved", 4028083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "Size", 4029083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "CopyFuncPtr", 4030083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "DestroyFuncPtr" 4031083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump }; 4032083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4033083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump for (size_t i = 0; i < 4; ++i) { 4034ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 4035083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump SourceLocation(), 4036083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump &Idents.get(FieldNames[i]), 4037a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 4038083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump /*BitWidth=*/0, 40397a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 4040ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 40412888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 4042083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump T->addDecl(Field); 4043083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump } 4044083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4045838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 4046083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4047083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump BlockDescriptorExtendedType = T; 4048083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4049083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump return getTagDeclType(BlockDescriptorExtendedType); 4050083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump} 4051083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 40524ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::BlockRequiresCopying(QualType Ty) const { 4053f85e193739c953358c865005855253af4f68a497John McCall if (Ty->isObjCRetainableType()) 4054af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return true; 40554e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 4056e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian if (const RecordType *RT = Ty->getAs<RecordType>()) { 4057e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 4058ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt return RD->hasConstCopyConstructor(); 4059e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian 4060e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian } 4061e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian } 4062af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return false; 4063af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump} 4064af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 40654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 40665f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerASTContext::BuildByRefType(StringRef DeclName, QualType Ty) const { 4067af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // type = struct __Block_byref_1_X { 4068ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // void *__isa; 4069af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // struct __Block_byref_1_X *__forwarding; 4070ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // unsigned int __flags; 4071ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // unsigned int __size; 4072a7e6845660f91ec611427e1db842780e1ec12bdbEli Friedman // void *__copy_helper; // as needed 4073a7e6845660f91ec611427e1db842780e1ec12bdbEli Friedman // void *__destroy_help // as needed 4074af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // int X; 4075ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // } * 4076ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump 4077af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump bool HasCopyAndDispose = BlockRequiresCopying(Ty); 4078af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4079af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // FIXME: Move up 4080f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<36> Name; 4081f5942a44880be26878592eb052b737579349411eBenjamin Kramer llvm::raw_svector_ostream(Name) << "__Block_byref_" << 4082f5942a44880be26878592eb052b737579349411eBenjamin Kramer ++UniqueBlockByRefTypeID << '_' << DeclName; 4083af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump RecordDecl *T; 4084ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, &Idents.get(Name.str())); 4085af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump T->startDefinition(); 4086af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump QualType Int32Ty = IntTy; 4087af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump assert(getIntWidth(IntTy) == 32 && "non-32bit int not supported"); 4088af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump QualType FieldTypes[] = { 4089af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4090af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(getTagDeclType(T)), 4091af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Int32Ty, 4092af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Int32Ty, 4093af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4094af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4095af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Ty 4096af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump }; 4097af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 40985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FieldNames[] = { 4099af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__isa", 4100af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__forwarding", 4101af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__flags", 4102af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__size", 4103af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__copy_helper", 4104af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__destroy_helper", 4105af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump DeclName, 4106af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump }; 4107af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4108af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump for (size_t i = 0; i < 7; ++i) { 4109af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump if (!HasCopyAndDispose && i >=4 && i <= 5) 4110af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump continue; 4111af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 4112ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 4113af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump &Idents.get(FieldNames[i]), 4114a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 41157a614d8380297fcd2bc23986241905d97222948cRichard Smith /*BitWidth=*/0, /*Mutable=*/false, 4116ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 41172888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 4118af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump T->addDecl(Field); 4119af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump } 4120af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4121838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 4122af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4123af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return getPointerType(getTagDeclType(T)); 4124ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump} 4125ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump 4126e97179c675b341927807c718be215c8d1aab8acbDouglas GregorTypedefDecl *ASTContext::getObjCInstanceTypeDecl() { 4127e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor if (!ObjCInstanceTypeDecl) 4128e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor ObjCInstanceTypeDecl = TypedefDecl::Create(*this, 4129e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor getTranslationUnitDecl(), 4130e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor SourceLocation(), 4131e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor SourceLocation(), 4132e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor &Idents.get("instancetype"), 4133e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor getTrivialTypeSourceInfo(getObjCIdType())); 4134e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor return ObjCInstanceTypeDecl; 4135e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor} 4136e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor 4137e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// This returns true if a type has been typedefed to BOOL: 4138e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// typedef <type> BOOL; 41392d99833e8c956775f2183601cd120b65b569c867Chris Lattnerstatic bool isTypeTypedefedAsBOOL(QualType T) { 4140e8c49533521c40643653f943d47229e62d277f88Anders Carlsson if (const TypedefType *TT = dyn_cast<TypedefType>(T)) 4141bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner if (IdentifierInfo *II = TT->getDecl()->getIdentifier()) 4142bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner return II->isStr("BOOL"); 41431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 414485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson return false; 414585f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson} 414685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson 4147a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingTypeSize returns size of type for objective-c encoding 414833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// purpose. 41494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const { 4150f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (!type->isIncompleteArrayType() && type->isIncompleteType()) 4151f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return CharUnits::Zero(); 4152f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4153199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits sz = getTypeSizeInChars(type); 41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 415533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Make all integer and enum types at least as large as an int 41562ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (sz.isPositive() && type->isIntegralOrEnumerationType()) 4157199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck sz = std::max(sz, getTypeSizeInChars(IntTy)); 415833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Treat arrays as pointers, since that's how they're passed in. 415933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian else if (type->isArrayType()) 4160199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck sz = getTypeSizeInChars(VoidPtrTy); 4161aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck return sz; 4162199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck} 4163199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck 4164199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstatic inline 4165199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstd::string charUnitsToString(const CharUnits &CU) { 4166199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck return llvm::itostr(CU.getQuantity()); 416733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 416833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 41696b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// getObjCEncodingForBlock - Return the encoded type for this block 41705e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall/// declaration. 41716b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallstd::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const { 41726b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall std::string S; 41736b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 41745e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall const BlockDecl *Decl = Expr->getBlockDecl(); 41755e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType BlockTy = 41765e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Expr->getType()->getAs<BlockPointerType>()->getPointeeType(); 41775e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Encode result type. 4178c71a4915ca216847599d03cab4ed1c5086b0eb43John McCall getObjCEncodingForType(BlockTy->getAs<FunctionType>()->getResultType(), S); 41795e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Compute size of all parameters. 41805e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Start with computing size of a pointer in number of bytes. 41815e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // FIXME: There might(should) be a better way of doing this computation! 41825e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall SourceLocation Loc; 4183199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 4184199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ParmOffset = PtrSize; 41856f46c2653c1545cc3fef0c0df996d18160160ce8Fariborz Jahanian for (BlockDecl::param_const_iterator PI = Decl->param_begin(), 41865e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall E = Decl->param_end(); PI != E; ++PI) { 41875e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType PType = (*PI)->getType(); 4188aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck CharUnits sz = getObjCEncodingTypeSize(PType); 4189075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian if (sz.isZero()) 4190075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian continue; 4191199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck assert (sz.isPositive() && "BlockExpr - Incomplete param type"); 41925e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmOffset += sz; 41935e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 41945e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Size of the argument frame 4195199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 41965e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Block pointer and offset. 41975e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall S += "@?0"; 41985e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall 41995e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Argument types. 42005e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmOffset = PtrSize; 42015e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E = 42025e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Decl->param_end(); PI != E; ++PI) { 42035e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmVarDecl *PVDecl = *PI; 42045e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType PType = PVDecl->getOriginalType(); 42055e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall if (const ArrayType *AT = 42065e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 42075e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Use array's original type only if it has known number of 42085389f48b24937ad7b4093307128b3cbf25235654David Chisnall // elements. 42095389f48b24937ad7b4093307128b3cbf25235654David Chisnall if (!isa<ConstantArrayType>(AT)) 42105389f48b24937ad7b4093307128b3cbf25235654David Chisnall PType = PVDecl->getType(); 42115389f48b24937ad7b4093307128b3cbf25235654David Chisnall } else if (PType->isFunctionType()) 42125389f48b24937ad7b4093307128b3cbf25235654David Chisnall PType = PVDecl->getType(); 42135389f48b24937ad7b4093307128b3cbf25235654David Chisnall getObjCEncodingForType(PType, S); 42145389f48b24937ad7b4093307128b3cbf25235654David Chisnall S += charUnitsToString(ParmOffset); 42155389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset += getObjCEncodingTypeSize(PType); 42165389f48b24937ad7b4093307128b3cbf25235654David Chisnall } 42176b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 42186b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall return S; 42195389f48b24937ad7b4093307128b3cbf25235654David Chisnall} 42205389f48b24937ad7b4093307128b3cbf25235654David Chisnall 4221f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl, 42225389f48b24937ad7b4093307128b3cbf25235654David Chisnall std::string& S) { 42235389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Encode result type. 42245389f48b24937ad7b4093307128b3cbf25235654David Chisnall getObjCEncodingForType(Decl->getResultType(), S); 42255389f48b24937ad7b4093307128b3cbf25235654David Chisnall CharUnits ParmOffset; 42265389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Compute size of all parameters. 42275389f48b24937ad7b4093307128b3cbf25235654David Chisnall for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 42285389f48b24937ad7b4093307128b3cbf25235654David Chisnall E = Decl->param_end(); PI != E; ++PI) { 42295389f48b24937ad7b4093307128b3cbf25235654David Chisnall QualType PType = (*PI)->getType(); 42305389f48b24937ad7b4093307128b3cbf25235654David Chisnall CharUnits sz = getObjCEncodingTypeSize(PType); 4231f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (sz.isZero()) 42327e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian continue; 42337e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian 42345389f48b24937ad7b4093307128b3cbf25235654David Chisnall assert (sz.isPositive() && 4235f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor "getObjCEncodingForFunctionDecl - Incomplete param type"); 42365389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset += sz; 42375389f48b24937ad7b4093307128b3cbf25235654David Chisnall } 42385389f48b24937ad7b4093307128b3cbf25235654David Chisnall S += charUnitsToString(ParmOffset); 42395389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset = CharUnits::Zero(); 42405389f48b24937ad7b4093307128b3cbf25235654David Chisnall 42415389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Argument types. 42425389f48b24937ad7b4093307128b3cbf25235654David Chisnall for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 42435389f48b24937ad7b4093307128b3cbf25235654David Chisnall E = Decl->param_end(); PI != E; ++PI) { 42445389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmVarDecl *PVDecl = *PI; 42455389f48b24937ad7b4093307128b3cbf25235654David Chisnall QualType PType = PVDecl->getOriginalType(); 42465389f48b24937ad7b4093307128b3cbf25235654David Chisnall if (const ArrayType *AT = 42475389f48b24937ad7b4093307128b3cbf25235654David Chisnall dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 42485389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Use array's original type only if it has known number of 42495e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // elements. 42505e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall if (!isa<ConstantArrayType>(AT)) 42515e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall PType = PVDecl->getType(); 42525e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } else if (PType->isFunctionType()) 42535e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall PType = PVDecl->getType(); 42545e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall getObjCEncodingForType(PType, S); 4255199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 4256aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck ParmOffset += getObjCEncodingTypeSize(PType); 42575e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 4258f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4259f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return false; 42605e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall} 42615e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall 4262dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// getObjCEncodingForMethodParameter - Return the encoded type for a single 4263dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// method parameter or return type. If Extended, include class names and 4264dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// block object types. 4265dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilsonvoid ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, 4266dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson QualType T, std::string& S, 4267dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool Extended) const { 4268dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode type qualifer, 'in', 'inout', etc. for the parameter. 4269dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeQualifier(QT, S); 4270dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode parameter type. 4271dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(T, S, true, true, 0, 4272dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson true /*OutermostType*/, 4273dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /*EncodingProperty*/, 4274dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /*StructField*/, 4275dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Extended /*EncodeBlockParameters*/, 4276dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Extended /*EncodeClassNames*/); 4277dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson} 4278dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson 4279a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingForMethodDecl - Return the encoded type for this method 428033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// declaration. 4281f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, 4282dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson std::string& S, 4283dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool Extended) const { 4284c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: This is not very efficient. 4285dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode return type. 4286dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(), 4287dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Decl->getResultType(), S, Extended); 428833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Compute size of all parameters. 428933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Start with computing size of a pointer in number of bytes. 429033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // FIXME: There might(should) be a better way of doing this computation! 429133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian SourceLocation Loc; 4292199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 429333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // The first two arguments (self and _cmd) are pointers; account for 429433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // their size. 4295199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ParmOffset = 2 * PtrSize; 4296491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(), 42977732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian E = Decl->sel_param_end(); PI != E; ++PI) { 429889951a86b594513c2a013532ed45d197413b1087Chris Lattner QualType PType = (*PI)->getType(); 4299aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck CharUnits sz = getObjCEncodingTypeSize(PType); 4300f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (sz.isZero()) 43017e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian continue; 43027e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian 4303199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck assert (sz.isPositive() && 4304199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck "getObjCEncodingForMethodDecl - Incomplete param type"); 430533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian ParmOffset += sz; 430633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian } 4307199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 430833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian S += "@0:"; 4309199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(PtrSize); 43101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 431133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Argument types. 431233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian ParmOffset = 2 * PtrSize; 4313491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(), 43147732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian E = Decl->sel_param_end(); PI != E; ++PI) { 4315491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis const ParmVarDecl *PVDecl = *PI; 43161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType PType = PVDecl->getOriginalType(); 43174306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian if (const ArrayType *AT = 4318ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 4319ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff // Use array's original type only if it has known number of 4320ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff // elements. 4321bb3fde337fb712c0e6da8790d431621be4793048Steve Naroff if (!isa<ConstantArrayType>(AT)) 4322ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff PType = PVDecl->getType(); 4323ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff } else if (PType->isFunctionType()) 4324ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff PType = PVDecl->getType(); 4325dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(), 4326dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson PType, S, Extended); 4327199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 4328aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck ParmOffset += getObjCEncodingTypeSize(PType); 432933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian } 4330f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4331f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return false; 433233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 433333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 4334c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// getObjCEncodingForPropertyDecl - Return the encoded type for this 433583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// property declaration. If non-NULL, Container must be either an 4336c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be 4337c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// NULL when getting encodings for protocol properties. 43381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Property attributes are stored as a comma-delimited C string. The simple 43391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// attributes readonly and bycopy are encoded as single characters. The 43401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parametrized attributes, getter=name, setter=name, and ivar=name, are 43411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// encoded as single characters, followed by an identifier. Property types 43421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// are also encoded as a parametrized attribute. The characters used to encode 434383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// these attributes are defined by the following enumeration: 434483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @code 434583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// enum PropertyAttributes { 434683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyReadOnly = 'R', // property is read-only. 434783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyBycopy = 'C', // property is a copy of the value last assigned 434883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyByref = '&', // property is a reference to the value last assigned 434983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyDynamic = 'D', // property is dynamic 435083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyGetter = 'G', // followed by getter selector name 435183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertySetter = 'S', // followed by setter selector name 435283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyInstanceVariable = 'V' // followed by instance variable name 43530d4cb85130d91da61c45aecb9fd31c7097a7cfccBob Wilson/// kPropertyType = 'T' // followed by old-style type encoding. 435483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyWeak = 'W' // 'weak' property 435583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyStrong = 'P' // property GC'able 435683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyNonAtomic = 'N' // property non-atomic 435783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// }; 435883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @endcode 43591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, 4360c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar const Decl *Container, 43614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad std::string& S) const { 4362c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // Collect information from the property implementation decl(s). 4363c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar bool Dynamic = false; 4364c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar ObjCPropertyImplDecl *SynthesizePID = 0; 4365c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4366c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: Duplicated code due to poor abstraction. 4367c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (Container) { 43681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ObjCCategoryImplDecl *CID = 4369c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar dyn_cast<ObjCCategoryImplDecl>(Container)) { 4370c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar for (ObjCCategoryImplDecl::propimpl_iterator 437117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i = CID->propimpl_begin(), e = CID->propimpl_end(); 4372653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor i != e; ++i) { 4373581deb3da481053c4993c7600f97acf7768caac5David Blaikie ObjCPropertyImplDecl *PID = *i; 4374c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyDecl() == PD) { 4375c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4376c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar Dynamic = true; 4377c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4378c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar SynthesizePID = PID; 4379c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4380c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4381c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4382c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 438361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container); 4384c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar for (ObjCCategoryImplDecl::propimpl_iterator 438517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i = OID->propimpl_begin(), e = OID->propimpl_end(); 4386653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor i != e; ++i) { 4387581deb3da481053c4993c7600f97acf7768caac5David Blaikie ObjCPropertyImplDecl *PID = *i; 4388c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyDecl() == PD) { 4389c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4390c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar Dynamic = true; 4391c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4392c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar SynthesizePID = PID; 4393c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4394c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 43951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4396c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4397c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4398c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4399c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: This is not very efficient. 4400c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S = "T"; 4401c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4402c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // Encode result type. 4403090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian // GCC has some special rules regarding encoding of properties which 4404090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian // closely resembles encoding of ivars. 44051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0, 4406090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian true /* outermost type */, 4407090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian true /* encoding for property */); 4408c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4409c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->isReadOnly()) { 4410c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",R"; 4411c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4412c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar switch (PD->getSetterKind()) { 4413c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar case ObjCPropertyDecl::Assign: break; 4414c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar case ObjCPropertyDecl::Copy: S += ",C"; break; 44151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case ObjCPropertyDecl::Retain: S += ",&"; break; 44163a02b44e3948f7762dbfba94b7961281ca29d022Fariborz Jahanian case ObjCPropertyDecl::Weak: S += ",W"; break; 4417c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4418c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4419c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4420c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // It really isn't clear at all what this means, since properties 4421c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // are "dynamic by default". 4422c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (Dynamic) 4423c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",D"; 4424c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4425090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic) 4426090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian S += ",N"; 44271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4428c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) { 4429c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",G"; 4430077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S += PD->getGetterName().getAsString(); 4431c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4432c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4433c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) { 4434c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",S"; 4435077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S += PD->getSetterName().getAsString(); 4436c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4437c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4438c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (SynthesizePID) { 4439c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl(); 4440c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",V"; 444139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner S += OID->getNameAsString(); 4442c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4443c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4444c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: OBJCGC: weak & strong 4445c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar} 4446c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4447a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// getLegacyIntegralTypeEncoding - 44481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Another legacy compatibility encoding: 32-bit longs are encoded as 44491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 'l' or 'L' , but not always. For typedefs, we need to use 4450a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 'i' or 'I' instead if encoding a struct field, or a pointer! 4451a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 4452a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanianvoid ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const { 44538e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump if (isa<TypedefType>(PointeeTy.getTypePtr())) { 4454183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) { 44554ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32) 4456a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian PointeeTy = UnsignedIntTy; 44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 44584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32) 4459a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian PointeeTy = IntTy; 4460a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4461a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4462a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian} 4463a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian 44647d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanianvoid ASTContext::getObjCEncodingForType(QualType T, std::string& S, 44654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FieldDecl *Field) const { 446682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // We follow the behavior of gcc, expanding structures which are 446782a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // directly pointed to, and expanding embedded structures. Note that 446882a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // these rules are sufficient to prevent recursive encoding of the 446982a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // same type. 44701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(T, S, true, true, Field, 44715b8c7d9fb620ba3a71e996d61e7b9bdf763b5c09Fariborz Jahanian true /* outermost type */); 447282a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar} 447382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar 447464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnallstatic char ObjCEncodingForPrimitiveKind(const ASTContext *C, QualType T) { 447564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall switch (T->getAs<BuiltinType>()->getKind()) { 4476b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unhandled builtin type kind"); 447764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Void: return 'v'; 447864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Bool: return 'B'; 447964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Char_U: 448064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UChar: return 'C'; 448164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UShort: return 'S'; 448264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UInt: return 'I'; 448364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::ULong: 44844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad return C->getIntWidth(T) == 32 ? 'L' : 'Q'; 448564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UInt128: return 'T'; 448664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::ULongLong: return 'Q'; 448764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Char_S: 448864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::SChar: return 'c'; 448964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Short: return 's'; 44903f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 44913f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 449264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Int: return 'i'; 449364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Long: 44944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad return C->getIntWidth(T) == 32 ? 'l' : 'q'; 449564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::LongLong: return 'q'; 449664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Int128: return 't'; 449764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Float: return 'f'; 449864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Double: return 'd'; 44993a0be84b2aed8563150cdbd976a98838afa261ebDaniel Dunbar case BuiltinType::LongDouble: return 'D'; 450064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall } 450164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall} 450264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall 45035471bc85b69912e3b448de004498a80c0de32296Douglas Gregorstatic char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) { 45045471bc85b69912e3b448de004498a80c0de32296Douglas Gregor EnumDecl *Enum = ET->getDecl(); 45055471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 45065471bc85b69912e3b448de004498a80c0de32296Douglas Gregor // The encoding of an non-fixed enum type is always 'i', regardless of size. 45075471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (!Enum->isFixed()) 45085471bc85b69912e3b448de004498a80c0de32296Douglas Gregor return 'i'; 45095471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 45105471bc85b69912e3b448de004498a80c0de32296Douglas Gregor // The encoding of a fixed enum type matches its fixed underlying type. 45115471bc85b69912e3b448de004498a80c0de32296Douglas Gregor return ObjCEncodingForPrimitiveKind(C, Enum->getIntegerType()); 45125471bc85b69912e3b448de004498a80c0de32296Douglas Gregor} 45135471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 45144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic void EncodeBitField(const ASTContext *Ctx, std::string& S, 451564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall QualType T, const FieldDecl *FD) { 4516a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl"); 45178b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian S += 'b'; 451864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // The NeXT runtime encodes bit fields as b followed by the number of bits. 451964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // The GNU runtime requires more information; bitfields are encoded as b, 452064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // then the offset (in bits) of the first element, then the type of the 452164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // bitfield, then the size in bits. For example, in this structure: 452264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // 452364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // struct 452464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // { 452564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // int integer; 452664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // int flags:2; 452764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // }; 452864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // On a 32-bit system, the encoding for flags would be b2 for the NeXT 452964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // runtime, but b32i2 for the GNU runtime. The reason for this extra 453064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // information is not especially sensible, but we're stuck with it for 453164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // compatibility with GCC, although providing it breaks anything that 453264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // actually uses runtime introspection and wants to work on both runtimes... 4533260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (Ctx->getLangOpts().ObjCRuntime.isGNUFamily()) { 453464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall const RecordDecl *RD = FD->getParent(); 453564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD); 453682905749d5c8d8b4edec11de754a73349cb96603Eli Friedman S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex())); 45375471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (const EnumType *ET = T->getAs<EnumType>()) 45385471bc85b69912e3b448de004498a80c0de32296Douglas Gregor S += ObjCEncodingForEnumType(Ctx, ET); 4539c7ff82c2040f45eaad2eddea0e4461dddc972cd1David Chisnall else 45404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad S += ObjCEncodingForPrimitiveKind(Ctx, T); 454164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall } 4542a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith S += llvm::utostr(FD->getBitWidthValue(*Ctx)); 45438b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian} 45448b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian 454501eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar// FIXME: Use SmallString for accumulating string. 454682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbarvoid ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, 454782a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar bool ExpandPointedToStructures, 454882a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar bool ExpandStructures, 4549153bfe5795e2c1a5a738e73d3784964e082237fcDaniel Dunbar const FieldDecl *FD, 4550090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian bool OutermostType, 45512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis bool EncodingProperty, 4552dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool StructField, 4553dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool EncodeBlockParameters, 4554dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool EncodeClassNames) const { 455564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall if (T->getAs<BuiltinType>()) { 4556ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (FD && FD->isBitField()) 455764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall return EncodeBitField(this, S, T, FD); 455864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall S += ObjCEncodingForPrimitiveKind(this, T); 4559ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4560ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 45611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4562183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType *CT = T->getAs<ComplexType>()) { 4563c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson S += 'j'; 45641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false, 4565c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson false); 4566ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4567ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 456860bce3ef20a4c9684e3825cdd739fefb9810327dFariborz Jahanian 4569aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian // encoding for pointer or r3eference types. 4570aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian QualType PointeeTy; 45716217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = T->getAs<PointerType>()) { 45728d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian if (PT->isObjCSelType()) { 45738d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian S += ':'; 45748d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian return; 45758d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian } 4576aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian PointeeTy = PT->getPointeeType(); 4577aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian } 4578aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 4579aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian PointeeTy = RT->getPointeeType(); 4580aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian if (!PointeeTy.isNull()) { 4581a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian bool isReadOnly = false; 4582a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // For historical/compatibility reasons, the read-only qualifier of the 4583a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // pointee gets emitted _before_ the '^'. The read-only qualifier of 4584a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // the pointer itself gets ignored, _unless_ we are looking at a typedef! 45851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Also, do not emit the 'r' for anything but the outermost type! 45868e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump if (isa<TypedefType>(T.getTypePtr())) { 4587a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (OutermostType && T.isConstQualified()) { 4588a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian isReadOnly = true; 4589a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian S += 'r'; 4590a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 45919fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump } else if (OutermostType) { 4592a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian QualType P = PointeeTy; 45936217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek while (P->getAs<PointerType>()) 45946217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek P = P->getAs<PointerType>()->getPointeeType(); 4595a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (P.isConstQualified()) { 4596a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian isReadOnly = true; 4597a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian S += 'r'; 4598a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4599a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4600a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (isReadOnly) { 4601a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // Another legacy compatibility encoding. Some ObjC qualifier and type 4602a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // combinations need to be rearranged. 4603a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // Rewrite "in const" from "nr" to "rn" 46045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (StringRef(S).endswith("nr")) 46050237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer S.replace(S.end()-2, S.end(), "rn"); 4606a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 46071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 460885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson if (PointeeTy->isCharType()) { 460985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson // char pointer types should be encoded as '*' unless it is a 461085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson // type that has been typedef'd to 'BOOL'. 4611e8c49533521c40643653f943d47229e62d277f88Anders Carlsson if (!isTypeTypedefedAsBOOL(PointeeTy)) { 461285f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson S += '*'; 461385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson return; 461485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson } 46156217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) { 46169533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // GCC binary compat: Need to convert "struct objc_class *" to "#". 46179533a7fdb8397421f3be52e879442460a87389f6Steve Naroff if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) { 46189533a7fdb8397421f3be52e879442460a87389f6Steve Naroff S += '#'; 46199533a7fdb8397421f3be52e879442460a87389f6Steve Naroff return; 46209533a7fdb8397421f3be52e879442460a87389f6Steve Naroff } 46219533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // GCC binary compat: Need to convert "struct objc_object *" to "@". 46229533a7fdb8397421f3be52e879442460a87389f6Steve Naroff if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) { 46239533a7fdb8397421f3be52e879442460a87389f6Steve Naroff S += '@'; 46249533a7fdb8397421f3be52e879442460a87389f6Steve Naroff return; 46259533a7fdb8397421f3be52e879442460a87389f6Steve Naroff } 46269533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // fall through... 462785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson } 462885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson S += '^'; 4629a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian getLegacyIntegralTypeEncoding(PointeeTy); 4630a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian 46311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures, 463243822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian NULL); 4633ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4634ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4635aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian 4636ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (const ArrayType *AT = 4637ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // Ignore type qualifiers etc. 4638ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) { 46392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (isa<IncompleteArrayType>(AT) && !StructField) { 4640559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson // Incomplete arrays are encoded as a pointer to the array element. 4641559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '^'; 4642559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson 46431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(AT->getElementType(), S, 4644559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson false, ExpandStructures, FD); 4645559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } else { 4646559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '['; 46471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 46492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (getTypeSize(CAT->getElementType()) == 0) 46502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '0'; 46512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis else 46522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += llvm::utostr(CAT->getSize().getZExtValue()); 46532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 4654559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson //Variable length arrays are encoded as a regular array with 0 elements. 46552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) && 46562636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis "Unknown array type!"); 4657559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '0'; 4658559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } 46591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(AT->getElementType(), S, 4661559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson false, ExpandStructures, FD); 4662559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += ']'; 4663559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } 4664ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4665ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4667183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (T->getAs<FunctionType>()) { 4668c0a87b7db06643178ad2cbce0767548c139ea387Anders Carlsson S += '?'; 4669ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4670ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46726217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RTy = T->getAs<RecordType>()) { 467382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar RecordDecl *RDecl = RTy->getDecl(); 4674d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar S += RDecl->isUnion() ? '(' : '{'; 4675502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar // Anonymous structures print as '?' 4676502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar if (const IdentifierInfo *II = RDecl->getIdentifier()) { 4677502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar S += II->getName(); 46786fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian if (ClassTemplateSpecializationDecl *Spec 46796fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) { 46806fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 46816fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian std::string TemplateArgsStr 46826fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian = TemplateSpecializationType::PrintTemplateArgumentList( 4683910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.data(), 4684910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.size(), 468530c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor (*this).getPrintingPolicy()); 46866fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian 46876fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian S += TemplateArgsStr; 46886fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian } 4689502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar } else { 4690502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar S += '?'; 4691502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar } 46920d504c1da852e58ff802545c823ecff3b6c654b8Daniel Dunbar if (ExpandStructures) { 46937d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian S += '='; 46942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->isUnion()) { 46952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForStructureImpl(RDecl, S, FD); 46962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 46972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RDecl->field_begin(), 46982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldEnd = RDecl->field_end(); 46992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis Field != FieldEnd; ++Field) { 47002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 47012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 47022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += Field->getNameAsString(); 47032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 47042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // Special case bit-fields. 47072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (Field->isBitField()) { 47082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(Field->getType(), S, false, true, 4709581deb3da481053c4993c7600f97acf7768caac5David Blaikie *Field); 47102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 47112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis QualType qt = Field->getType(); 47122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getLegacyIntegralTypeEncoding(qt); 47132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(qt, S, false, true, 47142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FD, /*OutermostType*/false, 47152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*EncodingProperty*/false, 47162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*StructField*/true); 47172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 4718d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar } 47197d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian } 47206de88a873a4cbe06d72602eef57d68006730a80bFariborz Jahanian } 4721d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar S += RDecl->isUnion() ? ')' : '}'; 4722ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4723ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4724e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 47255471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (const EnumType *ET = T->getAs<EnumType>()) { 47268b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian if (FD && FD->isBitField()) 472764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall EncodeBitField(this, S, T, FD); 47288b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian else 47295471bc85b69912e3b448de004498a80c0de32296Douglas Gregor S += ObjCEncodingForEnumType(this, ET); 4730ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4731ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4733dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) { 473421a98b188857d690aa4510c52ac4317ffa0908a8Steve Naroff S += "@?"; // Unlike a pointer-to-function, which is "^?". 4735dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (EncodeBlockParameters) { 4736dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson const FunctionType *FT = BT->getPointeeType()->getAs<FunctionType>(); 4737dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson 4738dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += '<'; 4739dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block return type 4740dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(FT->getResultType(), S, 4741dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandPointedToStructures, ExpandStructures, 4742dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson FD, 4743dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* OutermostType */, 4744dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodingProperty, 4745dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* StructField */, 4746dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeBlockParameters, 4747dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeClassNames); 4748dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block self 4749dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += "@?"; 4750dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block parameters 4751dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) { 4752dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson for (FunctionProtoType::arg_type_iterator I = FPT->arg_type_begin(), 4753dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson E = FPT->arg_type_end(); I && (I != E); ++I) { 4754dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(*I, S, 4755dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandPointedToStructures, 4756dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandStructures, 4757dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson FD, 4758dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* OutermostType */, 4759dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodingProperty, 4760dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* StructField */, 4761dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeBlockParameters, 4762dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeClassNames); 4763dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4764dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4765dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += '>'; 4766dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4767ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4768ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4770c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Ignore protocol qualifiers when mangling at this level. 4771c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *OT = T->getAs<ObjCObjectType>()) 4772c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall T = OT->getBaseType(); 4773c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 47740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (const ObjCInterfaceType *OIT = T->getAs<ObjCInterfaceType>()) { 477543822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian // @encode(class_name) 47760953e767ff7817f97b3ab20896b229891eeff45bJohn McCall ObjCInterfaceDecl *OI = OIT->getDecl(); 477743822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '{'; 477843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian const IdentifierInfo *II = OI->getIdentifier(); 477943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += II->getName(); 478043822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '='; 4781db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose SmallVector<const ObjCIvarDecl*, 32> Ivars; 47822c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian DeepCollectObjCIvars(OI, true, Ivars); 47832c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian for (unsigned i = 0, e = Ivars.size(); i != e; ++i) { 4784db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose const FieldDecl *Field = cast<FieldDecl>(Ivars[i]); 47852c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (Field->isBitField()) 47862c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field); 478743822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian else 47882c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD); 478943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian } 479043822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '}'; 4791ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 479243822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian } 47931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4794183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ObjCObjectPointerType *OPT = T->getAs<ObjCObjectPointerType>()) { 479514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (OPT->isObjCIdType()) { 479614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '@'; 479714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4798ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 480027d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) { 480127d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // FIXME: Consider if we need to output qualifiers for 'Class<p>'. 480227d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // Since this is a binary compatibility issue, need to consult with runtime 480327d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // folks. Fortunately, this is a *very* obsure construct. 480414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '#'; 480514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4806ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 48071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4808ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (OPT->isObjCQualifiedIdType()) { 48091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(getObjCIdType(), S, 481014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ExpandPointedToStructures, 481114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ExpandStructures, FD); 4812dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (FD || EncodingProperty || EncodeClassNames) { 481314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff // Note that we do extended encoding of protocol qualifer list 481414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff // Only when doing ivar or property encoding. 481514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '"'; 481667ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 481767ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff E = OPT->qual_end(); I != E; ++I) { 481814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '<'; 481914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += (*I)->getNameAsString(); 482014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '>'; 482114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 482214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '"'; 482314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 482414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4825ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 48261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4827ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner QualType PointeeTy = OPT->getPointeeType(); 4828ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (!EncodingProperty && 4829ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner isa<TypedefType>(PointeeTy.getTypePtr())) { 4830ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // Another historical/compatibility reason. 48311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // We encode the underlying type which comes out as 4832ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // {...}; 4833ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '^'; 48341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PointeeTy, S, 48351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump false, ExpandPointedToStructures, 4836ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner NULL); 483714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 483814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 4839ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner 4840ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '@'; 4841dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (OPT->getInterfaceDecl() && 4842dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson (FD || EncodingProperty || EncodeClassNames)) { 4843ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '"'; 484427d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff S += OPT->getInterfaceDecl()->getIdentifier()->getName(); 484567ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 484667ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff E = OPT->qual_end(); I != E; ++I) { 4847ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '<'; 4848ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += (*I)->getNameAsString(); 4849ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '>'; 48501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4851ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '"'; 4852ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4853ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4854ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 48551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4856532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall // gcc just blithely ignores member pointers. 4857532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall // TODO: maybe there should be a mangling for these 4858532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall if (T->getAs<MemberPointerType>()) 4859532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall return; 4860e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 4861e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian if (T->isVectorType()) { 4862e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // This matches gcc's encoding, even though technically it is 4863e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // insufficient. 4864e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // FIXME. We should do a better job than gcc. 4865e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian return; 4866e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian } 4867e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 4868b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("@encode for type not implemented!"); 486985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson} 487085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson 48712636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidisvoid ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl, 48722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::string &S, 48732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis const FieldDecl *FD, 48742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis bool includeVBases) const { 48752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(RDecl && "Expected non-null RecordDecl"); 48762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(!RDecl->isUnion() && "Should not be called for unions"); 48772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->getDefinition()) 48782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis return; 48792636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl); 48812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets; 48822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis const ASTRecordLayout &layout = getASTRecordLayout(RDecl); 48832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48842636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec) { 48852636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (CXXRecordDecl::base_class_iterator 48862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BI = CXXRec->bases_begin(), 48872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BE = CXXRec->bases_end(); BI != BE; ++BI) { 48882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!BI->isVirtual()) { 48892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4890829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis if (base->isEmpty()) 4891829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis continue; 4892d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer uint64_t offs = toBits(layout.getBaseClassOffset(base)); 48932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 48942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, base)); 48952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis unsigned i = 0; 49002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RDecl->field_begin(), 49012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldEnd = RDecl->field_end(); 49022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis Field != FieldEnd; ++Field, ++i) { 49032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = layout.getFieldOffset(i); 49042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 4905581deb3da481053c4993c7600f97acf7768caac5David Blaikie std::make_pair(offs, *Field)); 49062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec && includeVBases) { 49092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (CXXRecordDecl::base_class_iterator 49102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BI = CXXRec->vbases_begin(), 49112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BE = CXXRec->vbases_end(); BI != BE; ++BI) { 49122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4913829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis if (base->isEmpty()) 4914829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis continue; 4915d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer uint64_t offs = toBits(layout.getVBaseClassOffset(base)); 491619aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end()) 491719aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(), 491819aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis std::make_pair(offs, base)); 49192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CharUnits size; 49232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec) { 49242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis size = includeVBases ? layout.getSize() : layout.getNonVirtualSize(); 49252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 49262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis size = layout.getSize(); 49272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t CurOffs = 0; 49302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::multimap<uint64_t, NamedDecl *>::iterator 49312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurLayObj = FieldOrBaseOffsets.begin(); 49322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 493358db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor if (CXXRec && CXXRec->isDynamicClass() && 493458db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) { 49352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 49362636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += "\"_vptr$"; 49372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::string recname = CXXRec->getNameAsString(); 49382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (recname.empty()) recname = "?"; 49392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += recname; 49402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 49412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += "^^?"; 49432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += getTypeSize(VoidPtrTy); 49442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->hasFlexibleArrayMember()) { 49472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // Mark the end of the structure. 49482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = toBits(size); 49492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 49502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, (NamedDecl*)0)); 49512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) { 49542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(CurOffs <= CurLayObj->first); 49552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49562636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CurOffs < CurLayObj->first) { 49572636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t padding = CurLayObj->first - CurOffs; 49582636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // FIXME: There doesn't seem to be a way to indicate in the encoding that 49592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // packing/alignment of members is different that normal, in which case 49602636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // the encoding will be out-of-sync with the real layout. 49612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // If the runtime switches to just consider the size of types without 49622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // taking into account alignment, we could make padding explicit in the 49632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // encoding (e.g. using arrays of chars). The encoding strings would be 49642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // longer then though. 49652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += padding; 49662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis NamedDecl *dcl = CurLayObj->second; 49692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (dcl == 0) 49702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis break; // reached end of structure. 49712636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) { 49732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // We expand the bases without their virtual bases since those are going 49742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // in the initial structure. Note that this differs from gcc which 49752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // expands virtual bases each time one is encountered in the hierarchy, 49762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // making the encoding type bigger than it really is. 49772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false); 4978829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis assert(!base->isEmpty()); 4979829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize()); 49802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 49812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldDecl *field = cast<FieldDecl>(dcl); 49822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 49832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 49842636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += field->getNameAsString(); 49852636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 49862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (field->isBitField()) { 49892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis EncodeBitField(this, S, field->getType(), field); 4990a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith CurOffs += field->getBitWidthValue(*this); 49912636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 49922636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis QualType qt = field->getType(); 49932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getLegacyIntegralTypeEncoding(qt); 49942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(qt, S, false, true, FD, 49952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*OutermostType*/false, 49962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*EncodingProperty*/false, 49972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*StructField*/true); 49982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += getTypeSize(field->getType()); 49992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 50002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 50012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 50022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis} 50032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 50041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, 5005ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian std::string& S) const { 5006ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_In) 5007ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'n'; 5008ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Inout) 5009ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'N'; 5010ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Out) 5011ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'o'; 5012ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Bycopy) 5013ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'O'; 5014ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Byref) 5015ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'R'; 5016ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Oneway) 5017ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'V'; 5018ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian} 5019ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian 50204dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas GregorTypedefDecl *ASTContext::getObjCIdDecl() const { 50214dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor if (!ObjCIdDecl) { 50224dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0); 50234dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor T = getObjCObjectPointerType(T); 50244dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T); 50254dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 50264dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor getTranslationUnitDecl(), 50274dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor SourceLocation(), SourceLocation(), 50284dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor &Idents.get("id"), IdInfo); 50294dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor } 50304dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor 50314dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor return ObjCIdDecl; 50327e219e47de26346885d667131977bd9ca2d7662aSteve Naroff} 50337e219e47de26346885d667131977bd9ca2d7662aSteve Naroff 50347a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas GregorTypedefDecl *ASTContext::getObjCSelDecl() const { 50357a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor if (!ObjCSelDecl) { 50367a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor QualType SelT = getPointerType(ObjCBuiltinSelTy); 50377a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor TypeSourceInfo *SelInfo = getTrivialTypeSourceInfo(SelT); 50387a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor ObjCSelDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 50397a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor getTranslationUnitDecl(), 50407a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor SourceLocation(), SourceLocation(), 50417a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor &Idents.get("SEL"), SelInfo); 50427a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor } 50437a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor return ObjCSelDecl; 5044b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 5045b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 504679d6726921897811232554ed94c5d77b5b7b3fc0Douglas GregorTypedefDecl *ASTContext::getObjCClassDecl() const { 504779d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor if (!ObjCClassDecl) { 504879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor QualType T = getObjCObjectType(ObjCBuiltinClassTy, 0, 0); 504979d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor T = getObjCObjectPointerType(T); 505079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor TypeSourceInfo *ClassInfo = getTrivialTypeSourceInfo(T); 505179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor ObjCClassDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 505279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor getTranslationUnitDecl(), 505379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor SourceLocation(), SourceLocation(), 505479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor &Idents.get("Class"), ClassInfo); 505579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor } 505679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor 505779d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor return ObjCClassDecl; 5058a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor} 5059a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 5060a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas GregorObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const { 5061a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor if (!ObjCProtocolClassDecl) { 5062a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor ObjCProtocolClassDecl 5063a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(), 5064a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor SourceLocation(), 5065a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor &Idents.get("Protocol"), 5066a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor /*PrevDecl=*/0, 5067a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor SourceLocation(), true); 5068a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor } 5069a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 5070a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor return ObjCProtocolClassDecl; 50718baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson} 50728baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson 5073c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===// 5074c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge// __builtin_va_list Construction Functions 5075c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===// 5076c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5077c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateCharPtrBuiltinVaListDecl(const ASTContext *Context) { 5078c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef char* __builtin_va_list; 5079c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType CharPtrType = Context->getPointerType(Context->CharTy); 5080c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5081c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(CharPtrType); 5082c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5083c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypeDecl 5084c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5085c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5086c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5087c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5088c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5089c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypeDecl; 5090c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5091c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5092c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) { 5093c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef void* __builtin_va_list; 5094c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VoidPtrType = Context->getPointerType(Context->VoidTy); 5095c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5096c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VoidPtrType); 5097c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5098c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypeDecl 5099c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5100c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5101c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5102c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5103c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5104c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypeDecl; 5105c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5106c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5107c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePowerABIBuiltinVaListDecl(const ASTContext *Context) { 5108c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef struct __va_list_tag { 5109c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge RecordDecl *VaListTagDecl; 5110c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5111c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct, 5112c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5113c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag")); 5114c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->startDefinition(); 5115c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5116c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const size_t NumFields = 5; 5117c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType FieldTypes[NumFields]; 5118c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const char *FieldNames[NumFields]; 5119c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5120c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned char gpr; 5121c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[0] = Context->UnsignedCharTy; 5122c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[0] = "gpr"; 5123c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5124c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned char fpr; 5125c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[1] = Context->UnsignedCharTy; 5126c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[1] = "fpr"; 5127c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5128c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned short reserved; 5129c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[2] = Context->UnsignedShortTy; 5130c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[2] = "reserved"; 5131c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5132c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* overflow_arg_area; 5133c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[3] = Context->getPointerType(Context->VoidTy); 5134c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[3] = "overflow_arg_area"; 5135c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5136c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* reg_save_area; 5137c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[4] = Context->getPointerType(Context->VoidTy); 5138c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[4] = "reg_save_area"; 5139c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5140c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // Create fields 5141c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge for (unsigned i = 0; i < NumFields; ++i) { 5142c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldDecl *Field = FieldDecl::Create(*Context, VaListTagDecl, 5143c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5144c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5145c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get(FieldNames[i]), 5146c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[i], /*TInfo=*/0, 5147c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*BitWidth=*/0, 5148c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*Mutable=*/false, 5149c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge ICIS_NoInit); 5150c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Field->setAccess(AS_public); 5151c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->addDecl(Field); 5152c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5153c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->completeDefinition(); 5154c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagType = Context->getRecordType(VaListTagDecl); 5155fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge Context->VaListTagTy = VaListTagType; 5156c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5157c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // } __va_list_tag; 5158c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTagTypedefDecl 5159c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5160c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5161c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5162c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag"), 5163c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(VaListTagType)); 5164c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagTypedefType = 5165c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTypedefType(VaListTagTypedefDecl); 5166c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5167c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef __va_list_tag __builtin_va_list[1]; 5168c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1); 5169c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagArrayType 5170c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(VaListTagTypedefType, 5171c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal, 0); 5172c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5173c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VaListTagArrayType); 5174c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5175c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5176c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5177c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5178c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5179c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5180c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5181c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5182c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5183c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5184c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl * 5185c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeCreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context) { 5186c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef struct __va_list_tag { 5187c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge RecordDecl *VaListTagDecl; 5188c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct, 5189c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5190c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag")); 5191c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->startDefinition(); 5192c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5193c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const size_t NumFields = 4; 5194c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType FieldTypes[NumFields]; 5195c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const char *FieldNames[NumFields]; 5196c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5197c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned gp_offset; 5198c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[0] = Context->UnsignedIntTy; 5199c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[0] = "gp_offset"; 5200c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5201c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned fp_offset; 5202c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[1] = Context->UnsignedIntTy; 5203c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[1] = "fp_offset"; 5204c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5205c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* overflow_arg_area; 5206c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[2] = Context->getPointerType(Context->VoidTy); 5207c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[2] = "overflow_arg_area"; 5208c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5209c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* reg_save_area; 5210c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[3] = Context->getPointerType(Context->VoidTy); 5211c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[3] = "reg_save_area"; 5212c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5213c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // Create fields 5214c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge for (unsigned i = 0; i < NumFields; ++i) { 5215c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context), 5216c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl, 5217c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5218c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5219c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get(FieldNames[i]), 5220c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[i], /*TInfo=*/0, 5221c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*BitWidth=*/0, 5222c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*Mutable=*/false, 5223c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge ICIS_NoInit); 5224c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Field->setAccess(AS_public); 5225c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->addDecl(Field); 5226c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5227c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->completeDefinition(); 5228c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagType = Context->getRecordType(VaListTagDecl); 5229fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge Context->VaListTagTy = VaListTagType; 5230c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5231c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // } __va_list_tag; 5232c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTagTypedefDecl 5233c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5234c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5235c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5236c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag"), 5237c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(VaListTagType)); 5238c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagTypedefType = 5239c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTypedefType(VaListTagTypedefDecl); 5240c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5241c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef __va_list_tag __builtin_va_list[1]; 5242c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1); 5243c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagArrayType 5244c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(VaListTagTypedefType, 5245c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal,0); 5246c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5247c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VaListTagArrayType); 5248c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5249c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5250c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5251c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5252c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5253c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5254c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5255c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5256c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5257c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5258c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context) { 5259c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef int __builtin_va_list[4]; 5260c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 4); 5261c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType IntArrayType 5262c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(Context->IntTy, 5263c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal, 0); 5264c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5265c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5266c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5267c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5268c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5269c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(IntArrayType)); 5270c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5271c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5272c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5273c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5274c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVaListDecl(const ASTContext *Context, 5275c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TargetInfo::BuiltinVaListKind Kind) { 5276c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge switch (Kind) { 5277c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::CharPtrBuiltinVaList: 5278c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateCharPtrBuiltinVaListDecl(Context); 5279c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::VoidPtrBuiltinVaList: 5280c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateVoidPtrBuiltinVaListDecl(Context); 5281c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::PowerABIBuiltinVaList: 5282c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreatePowerABIBuiltinVaListDecl(Context); 5283c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::X86_64ABIBuiltinVaList: 5284c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateX86_64ABIBuiltinVaListDecl(Context); 5285c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::PNaClABIBuiltinVaList: 5286c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreatePNaClABIBuiltinVaListDecl(Context); 5287c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5288c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5289c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm_unreachable("Unhandled __builtin_va_list type kind"); 5290c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5291c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5292c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeTypedefDecl *ASTContext::getBuiltinVaListDecl() const { 5293c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge if (!BuiltinVaListDecl) 5294c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge BuiltinVaListDecl = CreateVaListDecl(this, Target->getBuiltinVaListKind()); 5295c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5296c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return BuiltinVaListDecl; 5297c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5298c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5299fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador IngeQualType ASTContext::getVaListTagType() const { 5300fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // Force the creation of VaListTagTy by building the __builtin_va_list 5301fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // declaration. 5302fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge if (VaListTagTy.isNull()) 5303fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge (void) getBuiltinVaListDecl(); 5304fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 5305fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge return VaListTagTy; 5306fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge} 5307fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 5308a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) { 53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(ObjCConstantStringType.isNull() && 53102198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff "'NSConstantString' type already set!"); 53111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5312a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCConstantStringType = getObjCInterfaceType(Decl); 53132198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff} 53142198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff 53150bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// \brief Retrieve the template name that corresponds to a non-empty 53160bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// lookup. 53174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 53184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin, 53194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad UnresolvedSetIterator End) const { 53200bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall unsigned size = End - Begin; 53210bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall assert(size > 1 && "set is not overloaded!"); 53227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53230bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall void *memory = Allocate(sizeof(OverloadedTemplateStorage) + 53240bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall size * sizeof(FunctionTemplateDecl*)); 53250bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size); 53260bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall 53270bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall NamedDecl **Storage = OT->getStorage(); 5328eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetIterator I = Begin; I != End; ++I) { 53290bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall NamedDecl *D = *I; 53300bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall assert(isa<FunctionTemplateDecl>(D) || 53310bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall (isa<UsingShadowDecl>(D) && 53320bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall isa<FunctionTemplateDecl>(D->getUnderlyingDecl()))); 53330bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall *Storage++ = D; 53347532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } 53357532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53360bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall return TemplateName(OT); 53377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor} 53387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 5339d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// \brief Retrieve the template name that represents a qualified 5340d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// template name such as \c std::vector. 53414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 53424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS, 53434ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool TemplateKeyword, 53444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad TemplateDecl *Template) const { 53450f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor assert(NNS && "Missing nested-name-specifier in qualified template name"); 53460f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor 5347789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor // FIXME: Canonicalization? 5348d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor llvm::FoldingSetNodeID ID; 5349d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template); 53501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5351d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor void *InsertPos = 0; 5352d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateName *QTN = 53530bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5354d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor if (!QTN) { 5355d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QTN = new (*this,4) QualifiedTemplateName(NNS, TemplateKeyword, Template); 5356d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateNames.InsertNode(QTN, InsertPos); 5357d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor } 53581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5359d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor return TemplateName(QTN); 5360d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor} 5361d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor 53627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Retrieve the template name that represents a dependent 53637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name such as \c MetaFun::template apply. 53644ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 53654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 53664ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const IdentifierInfo *Name) const { 53671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((!NNS || NNS->isDependent()) && 53683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor "Nested name specifier must be dependent"); 53697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor llvm::FoldingSetNodeID ID; 53717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateName::Profile(ID, NNS, Name); 53727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53737532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor void *InsertPos = 0; 53747532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateName *QTN = 53757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 53767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53777532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor if (QTN) 53787532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor return TemplateName(QTN); 53797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 53817532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor if (CanonNNS == NNS) { 53827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Name); 53837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } else { 53847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor TemplateName Canon = getDependentTemplateName(CanonNNS, Name); 53857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Name, Canon); 5386789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *CheckQTN = 5387789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5388789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CheckQTN && "Dependent type name canonicalization broken"); 5389789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckQTN; 53907532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } 53917532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53927532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateNames.InsertNode(QTN, InsertPos); 53937532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor return TemplateName(QTN); 53947532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor} 53957532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 5396ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// \brief Retrieve the template name that represents a dependent 5397ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// template name such as \c MetaFun::template operator+. 5398ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5399ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 54004ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad OverloadedOperatorKind Operator) const { 5401ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor assert((!NNS || NNS->isDependent()) && 5402ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor "Nested name specifier must be dependent"); 5403ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5404ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor llvm::FoldingSetNodeID ID; 5405ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateName::Profile(ID, NNS, Operator); 5406ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5407ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor void *InsertPos = 0; 5408789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *QTN 5409789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5410ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5411ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (QTN) 5412ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return TemplateName(QTN); 5413ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5414ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 5415ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (CanonNNS == NNS) { 5416ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Operator); 5417ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } else { 5418ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName Canon = getDependentTemplateName(CanonNNS, Operator); 5419ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Operator, Canon); 5420789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 5421789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *CheckQTN 5422789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5423789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CheckQTN && "Dependent template name canonicalization broken"); 5424789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckQTN; 5425ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } 5426ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5427ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateNames.InsertNode(QTN, InsertPos); 5428ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return TemplateName(QTN); 5429ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5430ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 54311aee05d08b2184acadeb36de300e216390780d6cDouglas GregorTemplateName 5432146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param, 5433146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateName replacement) const { 5434146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm::FoldingSetNodeID ID; 5435146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage::Profile(ID, param, replacement); 5436146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5437146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall void *insertPos = 0; 5438146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 5439146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos); 5440146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5441146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall if (!subst) { 5442146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement); 5443146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParms.InsertNode(subst, insertPos); 5444146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 5445146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5446146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return TemplateName(subst); 5447146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall} 5448146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5449146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallTemplateName 54501aee05d08b2184acadeb36de300e216390780d6cDouglas GregorASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param, 54511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor const TemplateArgument &ArgPack) const { 54521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ASTContext &Self = const_cast<ASTContext &>(*this); 54531aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor llvm::FoldingSetNodeID ID; 54541aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack); 54551aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54561aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor void *InsertPos = 0; 54571aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage *Subst 54581aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos); 54591aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54601aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!Subst) { 5461146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param, 54621aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ArgPack.pack_size(), 54631aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ArgPack.pack_begin()); 54641aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos); 54651aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 54661aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54671aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(Subst); 54681aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor} 54691aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 5470b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor/// getFromTargetType - Given one of the integer types provided by 5471d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// TargetInfo, produce the corresponding type. The unsigned @p Type 5472d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// is actually a value of type @c TargetInfo::IntType. 5473e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallCanQualType ASTContext::getFromTargetType(unsigned Type) const { 5474b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor switch (Type) { 5475e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall case TargetInfo::NoInt: return CanQualType(); 5476b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedShort: return ShortTy; 5477b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedShort: return UnsignedShortTy; 5478b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedInt: return IntTy; 5479b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedInt: return UnsignedIntTy; 5480b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedLong: return LongTy; 5481b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedLong: return UnsignedLongTy; 5482b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedLongLong: return LongLongTy; 5483b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy; 5484b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor } 5485b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor 5486b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unhandled TargetInfo::IntType value"); 5487b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor} 5488b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek 5489b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===// 5490b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek// Type Predicates. 5491b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===// 5492b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek 54934fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's 54944fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// garbage collection attribute. 54954fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// 5496ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCallQualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const { 54974e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().getGC() == LangOptions::NonGC) 5498ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return Qualifiers::GCNone; 5499ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall 55004e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie assert(getLangOpts().ObjC1); 5501ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall Qualifiers::GC GCAttrs = Ty.getObjCGCAttr(); 5502ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall 5503ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // Default behaviour under objective-C's gc is for ObjC pointers 5504ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // (or pointers to them) be treated as though they were declared 5505ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // as __strong. 5506ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall if (GCAttrs == Qualifiers::GCNone) { 5507ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType()) 5508ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return Qualifiers::Strong; 5509ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall else if (Ty->isPointerType()) 5510ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType()); 5511ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall } else { 5512ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // It's not valid to set GC attributes on anything that isn't a 5513ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // pointer. 5514ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#ifndef NDEBUG 5515ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall QualType CT = Ty->getCanonicalTypeInternal(); 5516ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall while (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 5517ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall CT = AT->getElementType(); 5518ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall assert(CT->isAnyPointerType() || CT->isBlockPointerType()); 5519ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#endif 55204fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian } 5521b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner return GCAttrs; 55224fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian} 55234fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian 55246ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===// 55256ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner// Type Compatibility Testing 55266ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===// 5527770951b5bb6028a8d326ddb4a13cef7d4a128162Chris Lattner 55281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// areCompatVectorTypes - Return true if the two specified vector types are 55296ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner/// compatible. 55306ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattnerstatic bool areCompatVectorTypes(const VectorType *LHS, 55316ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner const VectorType *RHS) { 5532467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified()); 55336ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return LHS->getElementType() == RHS->getElementType() && 553461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner LHS->getNumElements() == RHS->getNumElements(); 55356ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner} 55366ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner 5537255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregorbool ASTContext::areCompatibleVectorTypes(QualType FirstVec, 5538255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor QualType SecondVec) { 5539255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor assert(FirstVec->isVectorType() && "FirstVec should be a vector type"); 5540255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor assert(SecondVec->isVectorType() && "SecondVec should be a vector type"); 5541255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5542255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor if (hasSameUnqualifiedType(FirstVec, SecondVec)) 5543255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return true; 5544255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5545f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson // Treat Neon vector types and most AltiVec vector types as if they are the 5546f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson // equivalent GCC vector types. 5547255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor const VectorType *First = FirstVec->getAs<VectorType>(); 5548255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor const VectorType *Second = SecondVec->getAs<VectorType>(); 5549f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson if (First->getNumElements() == Second->getNumElements() && 5550255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor hasSameType(First->getElementType(), Second->getElementType()) && 5551f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson First->getVectorKind() != VectorType::AltiVecPixel && 5552f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson First->getVectorKind() != VectorType::AltiVecBool && 5553f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson Second->getVectorKind() != VectorType::AltiVecPixel && 5554f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson Second->getVectorKind() != VectorType::AltiVecBool) 5555255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return true; 5556255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5557255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return false; 5558255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor} 5559255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 55604084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===// 55614084c306635b70f37029dca938444e6013f08684Steve Naroff// ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's. 55624084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===// 55634084c306635b70f37029dca938444e6013f08684Steve Naroff 55644084c306635b70f37029dca938444e6013f08684Steve Naroff/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the 55654084c306635b70f37029dca938444e6013f08684Steve Naroff/// inheritance hierarchy of 'rProto'. 55664ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool 55674ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, 55684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad ObjCProtocolDecl *rProto) const { 55693fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor if (declaresSameEntity(lProto, rProto)) 557014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return true; 55714084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(), 55724084c306635b70f37029dca938444e6013f08684Steve Naroff E = rProto->protocol_end(); PI != E; ++PI) 55734084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lProto, *PI)) 55744084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 55754084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 55764084c306635b70f37029dca938444e6013f08684Steve Naroff} 557714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 55784084c306635b70f37029dca938444e6013f08684Steve Naroff/// QualifiedIdConformsQualifiedId - compare id<p,...> with id<p1,...> 55794084c306635b70f37029dca938444e6013f08684Steve Naroff/// return true if lhs's protocols conform to rhs's protocol; false 55804084c306635b70f37029dca938444e6013f08684Steve Naroff/// otherwise. 55814084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) { 55824084c306635b70f37029dca938444e6013f08684Steve Naroff if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType()) 55834084c306635b70f37029dca938444e6013f08684Steve Naroff return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false); 55844084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 55854084c306635b70f37029dca938444e6013f08684Steve Naroff} 55864084c306635b70f37029dca938444e6013f08684Steve Naroff 5587a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian/// ObjCQualifiedClassTypesAreCompatible - compare Class<p,...> and 5588a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian/// Class<p1, ...>. 5589a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanianbool ASTContext::ObjCQualifiedClassTypesAreCompatible(QualType lhs, 5590a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian QualType rhs) { 5591a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian const ObjCObjectPointerType *lhsQID = lhs->getAs<ObjCObjectPointerType>(); 5592a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 5593a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian assert ((lhsQID && rhsOPT) && "ObjCQualifiedClassTypesAreCompatible"); 5594a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5595a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 5596a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian E = lhsQID->qual_end(); I != E; ++I) { 5597a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian bool match = false; 5598a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian ObjCProtocolDecl *lhsProto = *I; 5599a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 5600a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian E = rhsOPT->qual_end(); J != E; ++J) { 5601a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian ObjCProtocolDecl *rhsProto = *J; 5602a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) { 5603a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian match = true; 5604a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian break; 5605a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5606a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5607a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (!match) 5608a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return false; 5609a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5610a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return true; 5611a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian} 5612a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 56134084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an 56144084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIDType. 56154084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, 56164084c306635b70f37029dca938444e6013f08684Steve Naroff bool compare) { 56174084c306635b70f37029dca938444e6013f08684Steve Naroff // Allow id<P..> and an 'id' or void* type in all cases. 56181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (lhs->isVoidPointerType() || 56194084c306635b70f37029dca938444e6013f08684Steve Naroff lhs->isObjCIdType() || lhs->isObjCClassType()) 56204084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 56211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (rhs->isVoidPointerType() || 56224084c306635b70f37029dca938444e6013f08684Steve Naroff rhs->isObjCIdType() || rhs->isObjCClassType()) 56234084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 56244084c306635b70f37029dca938444e6013f08684Steve Naroff 56254084c306635b70f37029dca938444e6013f08684Steve Naroff if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) { 5626183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 56271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56284084c306635b70f37029dca938444e6013f08684Steve Naroff if (!rhsOPT) return false; 56291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56304084c306635b70f37029dca938444e6013f08684Steve Naroff if (rhsOPT->qual_empty()) { 56311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the RHS is a unqualified interface pointer "NSString*", 56324084c306635b70f37029dca938444e6013f08684Steve Naroff // make sure we check the class hierarchy. 56334084c306635b70f37029dca938444e6013f08684Steve Naroff if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 56344084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56354084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56364084c306635b70f37029dca938444e6013f08684Steve Naroff // when comparing an id<P> on lhs with a static type on rhs, 56374084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 56384084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 56390fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian if (!rhsID->ClassImplementsProtocol(*I, true)) 56404084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 56414084c306635b70f37029dca938444e6013f08684Steve Naroff } 56424084c306635b70f37029dca938444e6013f08684Steve Naroff } 56434084c306635b70f37029dca938444e6013f08684Steve Naroff // If there are no qualifiers and no interface, we have an 'id'. 56444084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 56454084c306635b70f37029dca938444e6013f08684Steve Naroff } 56461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Both the right and left sides have qualifiers. 56474084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56484084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56494084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *lhsProto = *I; 56504084c306635b70f37029dca938444e6013f08684Steve Naroff bool match = false; 5651de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff 5652de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // when comparing an id<P> on lhs with a static type on rhs, 5653de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // see if static class implements all of id's protocols, directly or 5654de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // through its super class and categories. 56554084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 56564084c306635b70f37029dca938444e6013f08684Steve Naroff E = rhsOPT->qual_end(); J != E; ++J) { 56574084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *rhsProto = *J; 56584084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 56594084c306635b70f37029dca938444e6013f08684Steve Naroff (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 56604084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 56618f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff break; 56628f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff } 5663de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 56641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the RHS is a qualified interface pointer "NSString<P>*", 56654084c306635b70f37029dca938444e6013f08684Steve Naroff // make sure we check the class hierarchy. 56664084c306635b70f37029dca938444e6013f08684Steve Naroff if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 56674084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56684084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56694084c306635b70f37029dca938444e6013f08684Steve Naroff // when comparing an id<P> on lhs with a static type on rhs, 56704084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 56714084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 56720fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian if (rhsID->ClassImplementsProtocol(*I, true)) { 56734084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 56744084c306635b70f37029dca938444e6013f08684Steve Naroff break; 56754084c306635b70f37029dca938444e6013f08684Steve Naroff } 56764084c306635b70f37029dca938444e6013f08684Steve Naroff } 56774084c306635b70f37029dca938444e6013f08684Steve Naroff } 56784084c306635b70f37029dca938444e6013f08684Steve Naroff if (!match) 5679de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff return false; 5680de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 56811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5682de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff return true; 5683de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 56841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56854084c306635b70f37029dca938444e6013f08684Steve Naroff const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType(); 56864084c306635b70f37029dca938444e6013f08684Steve Naroff assert(rhsQID && "One of the LHS/RHS should be id<x>"); 56874084c306635b70f37029dca938444e6013f08684Steve Naroff 56881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ObjCObjectPointerType *lhsOPT = 56894084c306635b70f37029dca938444e6013f08684Steve Naroff lhs->getAsObjCInterfacePointerType()) { 5690de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // If both the right and left sides have qualifiers. 56914084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(), 56924084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsOPT->qual_end(); I != E; ++I) { 56934084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *lhsProto = *I; 56944084c306635b70f37029dca938444e6013f08684Steve Naroff bool match = false; 56954084c306635b70f37029dca938444e6013f08684Steve Naroff 5696de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // when comparing an id<P> on rhs with a static type on lhs, 56974084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 56984084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 5699de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // First, lhs protocols in the qualifier list must be found, direct 5700de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // or indirect in rhs's qualifier list or it is a mismatch. 57014084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 57024084c306635b70f37029dca938444e6013f08684Steve Naroff E = rhsQID->qual_end(); J != E; ++J) { 57034084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *rhsProto = *J; 57044084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 57054084c306635b70f37029dca938444e6013f08684Steve Naroff (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 57064084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 57074084c306635b70f37029dca938444e6013f08684Steve Naroff break; 57084084c306635b70f37029dca938444e6013f08684Steve Naroff } 57094084c306635b70f37029dca938444e6013f08684Steve Naroff } 57104084c306635b70f37029dca938444e6013f08684Steve Naroff if (!match) 57114084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 57124084c306635b70f37029dca938444e6013f08684Steve Naroff } 5713de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian 5714de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // Static class's protocols, or its super class or category protocols 5715de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // must be found, direct or indirect in rhs's qualifier list or it is a mismatch. 5716de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) { 5717de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5718de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian CollectInheritedProtocols(lhsID, LHSInheritedProtocols); 5719de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // This is rather dubious but matches gcc's behavior. If lhs has 5720de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // no type qualifier and its class has no static protocol(s) 5721de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // assume that it is mismatch. 5722de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty()) 5723de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian return false; 5724de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5725de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian LHSInheritedProtocols.begin(), 5726de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian E = LHSInheritedProtocols.end(); I != E; ++I) { 5727de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian bool match = false; 5728de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian ObjCProtocolDecl *lhsProto = (*I); 5729de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 5730de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian E = rhsQID->qual_end(); J != E; ++J) { 5731de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian ObjCProtocolDecl *rhsProto = *J; 5732de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 5733de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 5734de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian match = true; 5735de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian break; 5736de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5737de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5738de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (!match) 5739de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian return false; 5740de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5741de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 57424084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 57434084c306635b70f37029dca938444e6013f08684Steve Naroff } 57444084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 57454084c306635b70f37029dca938444e6013f08684Steve Naroff} 57464084c306635b70f37029dca938444e6013f08684Steve Naroff 57474084c306635b70f37029dca938444e6013f08684Steve Naroff/// canAssignObjCInterfaces - Return true if the two interface types are 57484084c306635b70f37029dca938444e6013f08684Steve Naroff/// compatible for assignment from RHS to LHS. This handles validation of any 57494084c306635b70f37029dca938444e6013f08684Steve Naroff/// protocol qualifiers on the LHS or RHS. 57504084c306635b70f37029dca938444e6013f08684Steve Naroff/// 57514084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, 57524084c306635b70f37029dca938444e6013f08684Steve Naroff const ObjCObjectPointerType *RHSOPT) { 5753c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5754c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5755c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 57564084c306635b70f37029dca938444e6013f08684Steve Naroff // If either type represents the built-in 'id' or 'Class' types, return true. 5757c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->isObjCUnqualifiedIdOrClass() || 5758c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHS->isObjCUnqualifiedIdOrClass()) 57594084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 57604084c306635b70f37029dca938444e6013f08684Steve Naroff 5761c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) 57621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 57631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType(RHSOPT,0), 57644084c306635b70f37029dca938444e6013f08684Steve Naroff false); 5765a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5766a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) 5767a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return ObjCQualifiedClassTypesAreCompatible(QualType(LHSOPT,0), 5768a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian QualType(RHSOPT,0)); 5769a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5770c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // If we have 2 user-defined types, fall into that path. 5771c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->getInterface() && RHS->getInterface()) 57724084c306635b70f37029dca938444e6013f08684Steve Naroff return canAssignObjCInterfaces(LHS, RHS); 57731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57744084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 577514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff} 577614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 5777132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// canAssignObjCInterfacesInBlockPointer - This routine is specifically written 5778fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// for providing type-safety for objective-c pointers used to pass/return 5779132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// arguments in block literals. When passed as arguments, passing 'A*' where 5780132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is 5781132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// not OK. For the return type, the opposite is not OK. 5782132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::canAssignObjCInterfacesInBlockPointer( 5783132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCObjectPointerType *LHSOPT, 5784a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian const ObjCObjectPointerType *RHSOPT, 5785a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian bool BlockReturnType) { 5786a98344869c278295f38e106583906377520079b8Fariborz Jahanian if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType()) 5787132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return true; 5788132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5789132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHSOPT->isObjCBuiltinType()) { 5790132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType(); 5791132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5792132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5793a98344869c278295f38e106583906377520079b8Fariborz Jahanian if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) 5794132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 5795132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian QualType(RHSOPT,0), 5796132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian false); 5797132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5798132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType(); 5799132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType(); 5800132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS && RHS) { // We have 2 user-defined types. 5801132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS != RHS) { 5802132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS->getDecl()->isSuperClassOf(RHS->getDecl())) 5803a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian return BlockReturnType; 5804132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (RHS->getDecl()->isSuperClassOf(LHS->getDecl())) 5805a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian return !BlockReturnType; 5806132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5807132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian else 5808132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return true; 5809132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5810132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return false; 5811132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian} 5812132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5813e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// getIntersectionOfProtocols - This routine finds the intersection of set 5814e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// of protocols inherited from two distinct objective-c pointer objects. 5815e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// It is used to build composite qualifier list of the composite type of 5816e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// the conditional expression involving two objective-c pointer objects. 5817e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianstatic 5818e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid getIntersectionOfProtocols(ASTContext &Context, 5819e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian const ObjCObjectPointerType *LHSOPT, 5820e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian const ObjCObjectPointerType *RHSOPT, 58215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) { 5822e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5823c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5824c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5825c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(LHS->getInterface() && "LHS must have an interface base"); 5826c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(RHS->getInterface() && "RHS must have an interface base"); 5827e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5828e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet; 5829e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian unsigned LHSNumProtocols = LHS->getNumProtocols(); 5830e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (LHSNumProtocols > 0) 5831e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end()); 5832e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian else { 5833432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5834c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Context.CollectInheritedProtocols(LHS->getInterface(), 5835c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHSInheritedProtocols); 5836e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian InheritedProtocolSet.insert(LHSInheritedProtocols.begin(), 5837e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian LHSInheritedProtocols.end()); 5838e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 5839e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5840e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian unsigned RHSNumProtocols = RHS->getNumProtocols(); 5841e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (RHSNumProtocols > 0) { 5842cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman ObjCProtocolDecl **RHSProtocols = 5843cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman const_cast<ObjCProtocolDecl **>(RHS->qual_begin()); 5844e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (unsigned i = 0; i < RHSNumProtocols; ++i) 5845e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (InheritedProtocolSet.count(RHSProtocols[i])) 5846e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian IntersectionOfProtocols.push_back(RHSProtocols[i]); 58473060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 5848432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols; 5849c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Context.CollectInheritedProtocols(RHS->getInterface(), 5850c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHSInheritedProtocols); 5851432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5852432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian RHSInheritedProtocols.begin(), 5853432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian E = RHSInheritedProtocols.end(); I != E; ++I) 5854432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian if (InheritedProtocolSet.count((*I))) 5855432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian IntersectionOfProtocols.push_back((*I)); 5856e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 5857e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian} 5858e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5859db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// areCommonBaseCompatible - Returns common base class of the two classes if 5860db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// one found. Note that this is O'2 algorithm. But it will be called as the 5861db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// last type comparison in a ?-exp of ObjC pointer types before a 5862db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// warning is issued. So, its invokation is extremely rare. 5863db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz JahanianQualType ASTContext::areCommonBaseCompatible( 5864c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectPointerType *Lptr, 5865c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectPointerType *Rptr) { 5866c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *LHS = Lptr->getObjectType(); 5867c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *RHS = Rptr->getObjectType(); 5868c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCInterfaceDecl* LDecl = LHS->getInterface(); 5869c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCInterfaceDecl* RDecl = RHS->getInterface(); 587060ef308e51c71b760d7f598c1b763ceb7b768148Douglas Gregor if (!LDecl || !RDecl || (declaresSameEntity(LDecl, RDecl))) 5871db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian return QualType(); 5872db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 58737c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian do { 5874c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHS = cast<ObjCInterfaceType>(getObjCInterfaceType(LDecl)); 5875e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (canAssignObjCInterfaces(LHS, RHS)) { 58765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl *, 8> Protocols; 5877c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall getIntersectionOfProtocols(*this, Lptr, Rptr, Protocols); 5878c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 5879c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall QualType Result = QualType(LHS, 0); 5880c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!Protocols.empty()) 5881c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = getObjCObjectType(Result, Protocols.data(), Protocols.size()); 5882c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = getObjCObjectPointerType(Result); 5883c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Result; 5884e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 58857c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian } while ((LDecl = LDecl->getSuperClass())); 5886db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 5887db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian return QualType(); 5888db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian} 5889db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 5890c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallbool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS, 5891c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *RHS) { 5892c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(LHS->getInterface() && "LHS is not an interface type"); 5893c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(RHS->getInterface() && "RHS is not an interface type"); 5894c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 58956ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // Verify that the base decls are compatible: the RHS must be a subclass of 58966ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // the LHS. 5897c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!LHS->getInterface()->isSuperClassOf(RHS->getInterface())) 58986ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return false; 58991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59006ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // RHS must have a superset of the protocols in the LHS. If the LHS is not 59016ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // protocol qualified at all, then we are good. 5902c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff if (LHS->getNumProtocols() == 0) 59036ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return true; 59041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5905b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // Okay, we know the LHS has protocol qualifiers. If the RHS doesn't, 5906b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // more detailed analysis is required. 5907b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (RHS->getNumProtocols() == 0) { 5908b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // OK, if LHS is a superclass of RHS *and* 5909b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // this superclass is assignment compatible with LHS. 5910b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // false otherwise. 5911627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian bool IsSuperClass = 5912627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian LHS->getInterface()->isSuperClassOf(RHS->getInterface()); 5913627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian if (IsSuperClass) { 5914b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // OK if conversion of LHS to SuperClass results in narrowing of types 5915b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // ; i.e., SuperClass may implement at least one of the protocols 5916b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok. 5917b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // But not SuperObj<P1,P2,P3> = lhs<P1,P2>. 5918b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols; 5919627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols); 5920b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // If super class has no protocols, it is not a match. 5921b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (SuperClassInheritedProtocols.empty()) 5922b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5923b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian 5924b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5925b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian LHSPE = LHS->qual_end(); 5926b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian LHSPI != LHSPE; LHSPI++) { 5927b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian bool SuperImplementsProtocol = false; 5928b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian ObjCProtocolDecl *LHSProto = (*LHSPI); 5929b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian 5930b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5931b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian SuperClassInheritedProtocols.begin(), 5932b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian E = SuperClassInheritedProtocols.end(); I != E; ++I) { 5933b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian ObjCProtocolDecl *SuperClassProto = (*I); 5934b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) { 5935b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian SuperImplementsProtocol = true; 5936b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian break; 5937b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5938b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5939b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (!SuperImplementsProtocol) 5940b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5941b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5942b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return true; 5943b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5944b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5945b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 59461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5947c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5948c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHSPE = LHS->qual_end(); 594991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff LHSPI != LHSPE; LHSPI++) { 595091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff bool RHSImplementsProtocol = false; 595191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff 595291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // If the RHS doesn't implement the protocol on the left, the types 595391b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // are incompatible. 5954c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator RHSPI = RHS->qual_begin(), 5955c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHSPE = RHS->qual_end(); 59568f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff RHSPI != RHSPE; RHSPI++) { 59578f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) { 595891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff RHSImplementsProtocol = true; 59598f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff break; 59608f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff } 596191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff } 596291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // FIXME: For better diagnostics, consider passing back the protocol name. 596391b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff if (!RHSImplementsProtocol) 596491b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff return false; 596591b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff } 596691b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // The RHS implements all protocols listed on the LHS. 596791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff return true; 59686ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner} 59696ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner 5970389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroffbool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) { 5971389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff // get the "pointed to" types 5972183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>(); 5973183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>(); 59741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 597514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (!LHSOPT || !RHSOPT) 5976389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff return false; 597714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 597814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return canAssignObjCInterfaces(LHSOPT, RHSOPT) || 597914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff canAssignObjCInterfaces(RHSOPT, LHSOPT); 5980389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff} 5981389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff 5982569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorbool ASTContext::canBindObjCObjectType(QualType To, QualType From) { 5983569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor return canAssignObjCInterfaces( 5984569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor getObjCObjectPointerType(To)->getAs<ObjCObjectPointerType>(), 5985569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor getObjCObjectPointerType(From)->getAs<ObjCObjectPointerType>()); 5986569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 5987569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 59881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible, 5989ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// both shall have the identically qualified version of a compatible type. 59901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// C99 6.2.7p1: Two types have compatible types if their types are the 5991ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// same. See 6.7.[2,3,5] for additional rules. 5992447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregorbool ASTContext::typesAreCompatible(QualType LHS, QualType RHS, 5993447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool CompareUnqualified) { 59944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 59950e709abafbd939326850501f795cc7a92c88a354Douglas Gregor return hasSameType(LHS, RHS); 59960e709abafbd939326850501f795cc7a92c88a354Douglas Gregor 5997447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull(); 59983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman} 59993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6000c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanianbool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) { 600182378391dfc3b2fc22f63dbf1552bd9aed39dc42Fariborz Jahanian return typesAreCompatible(LHS, RHS); 6002c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian} 6003c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian 6004132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) { 6005132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return !mergeTypes(LHS, RHS, true).isNull(); 6006132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian} 6007132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 60084846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeTransparentUnionType - if T is a transparent union type and a member 60094846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// of T is compatible with SubType, return the merged type, else return 60104846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// QualType() 60114846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType, 60124846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool OfBlockPointer, 60134846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool Unqualified) { 60144846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (const RecordType *UT = T->getAsUnionType()) { 60154846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne RecordDecl *UD = UT->getDecl(); 60164846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (UD->hasAttr<TransparentUnionAttr>()) { 60174846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne for (RecordDecl::field_iterator it = UD->field_begin(), 60184846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne itend = UD->field_end(); it != itend; ++it) { 6019f91d7572ee7fa6f2926c8e7e816039a1154a59f8Peter Collingbourne QualType ET = it->getType().getUnqualifiedType(); 60204846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified); 60214846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!MT.isNull()) 60224846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return MT; 60234846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 60244846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 60254846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 60264846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60274846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return QualType(); 60284846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne} 60294846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60304846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeFunctionArgumentTypes - merge two types which appear as function 60314846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// argument types 60324846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeFunctionArgumentTypes(QualType lhs, QualType rhs, 60334846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool OfBlockPointer, 60344846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool Unqualified) { 60354846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // GNU extension: two types are compatible if they appear as a function 60364846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // argument, one of the types is a transparent union type and the other 60374846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // type is compatible with a union member 60384846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer, 60394846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 60404846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!lmerge.isNull()) 60414846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return lmerge; 60424846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60434846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer, 60444846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 60454846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!rmerge.isNull()) 60464846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return rmerge; 60474846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60484846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified); 60494846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne} 60504846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 6051132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs, 6052447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool OfBlockPointer, 6053447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool Unqualified) { 6054183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *lbase = lhs->getAs<FunctionType>(); 6055183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *rbase = rhs->getAs<FunctionType>(); 605672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase); 605772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase); 60583d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman bool allLTypes = true; 60593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman bool allRTypes = true; 60603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 60613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check return type 6062132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian QualType retType; 6063d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian if (OfBlockPointer) { 6064d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian QualType RHS = rbase->getResultType(); 6065d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian QualType LHS = lbase->getResultType(); 6066d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian bool UnqualifiedResult = Unqualified; 6067d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian if (!UnqualifiedResult) 6068d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers()); 6069a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true); 6070d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian } 6071132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian else 60728cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall retType = mergeTypes(lbase->getResultType(), rbase->getResultType(), false, 60738cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall Unqualified); 60743d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (retType.isNull()) return QualType(); 6075447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6076447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) 6077447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor retType = retType.getUnqualifiedType(); 6078447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6079447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor CanQualType LRetType = getCanonicalType(lbase->getResultType()); 6080447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor CanQualType RRetType = getCanonicalType(rbase->getResultType()); 6081447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6082447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LRetType = LRetType.getUnqualifiedType(); 6083447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RRetType = RRetType.getUnqualifiedType(); 6084447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6085447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6086447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (getCanonicalType(retType) != LRetType) 608761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allLTypes = false; 6088447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (getCanonicalType(retType) != RRetType) 608961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allRTypes = false; 60908cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 60916a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // FIXME: double check this 60926a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // FIXME: should we error if lbase->getRegParmAttr() != 0 && 60936a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // rbase->getRegParmAttr() != 0 && 60946a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // lbase->getRegParmAttr() != rbase->getRegParmAttr()? 6095264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo(); 6096264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo(); 60978cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 60988cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall // Compatible functions must have compatible calling conventions 60998cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall if (!isSameCallConv(lbaseInfo.getCC(), rbaseInfo.getCC())) 61008cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return QualType(); 61018cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 61028cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall // Regparm is part of the calling convention. 6103a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm()) 6104a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman return QualType(); 61058cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm()) 61068cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return QualType(); 61078cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 6108f85e193739c953358c865005855253af4f68a497John McCall if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult()) 6109f85e193739c953358c865005855253af4f68a497John McCall return QualType(); 6110f85e193739c953358c865005855253af4f68a497John McCall 611153c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian // functypes which return are preferred over those that do not. 611253c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian if (lbaseInfo.getNoReturn() && !rbaseInfo.getNoReturn()) 61136a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar allLTypes = false; 611453c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian else if (!lbaseInfo.getNoReturn() && rbaseInfo.getNoReturn()) 61156a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar allRTypes = false; 611653c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'. 611753c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn(); 61181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6119f85e193739c953358c865005855253af4f68a497John McCall FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn); 6120e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 61213d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto && rproto) { // two C99 style function prototypes 6122465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() && 6123465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl "C++ shouldn't be here"); 61243d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned lproto_nargs = lproto->getNumArgs(); 61253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned rproto_nargs = rproto->getNumArgs(); 61263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Compatible functions must have the same number of arguments 61283d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto_nargs != rproto_nargs) 61293d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 61303d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61313d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Variadic and non-variadic functions aren't compatible 61323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto->isVariadic() != rproto->isVariadic()) 61333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 61343d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61357fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis if (lproto->getTypeQuals() != rproto->getTypeQuals()) 61367fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis return QualType(); 61377fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis 613878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (LangOpts.ObjCAutoRefCount && 613978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian !FunctionTypesMatchOnNSConsumedAttrs(rproto, lproto)) 614078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return QualType(); 614178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 61423d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check argument compatibility 61435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 10> types; 61443d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman for (unsigned i = 0; i < lproto_nargs; i++) { 61453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType largtype = lproto->getArgType(i).getUnqualifiedType(); 61463d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType rargtype = rproto->getArgType(i).getUnqualifiedType(); 61474846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType argtype = mergeFunctionArgumentTypes(largtype, rargtype, 61484846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne OfBlockPointer, 61494846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 61503d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (argtype.isNull()) return QualType(); 6151447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6152447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) 6153447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor argtype = argtype.getUnqualifiedType(); 6154447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 61553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman types.push_back(argtype); 6156447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6157447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor largtype = largtype.getUnqualifiedType(); 6158447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor rargtype = rargtype.getUnqualifiedType(); 6159447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6160447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 616161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (getCanonicalType(argtype) != getCanonicalType(largtype)) 616261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allLTypes = false; 616361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (getCanonicalType(argtype) != getCanonicalType(rargtype)) 616461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allRTypes = false; 61653d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 616678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 61673d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 61683d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 6169e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6170e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo(); 6171e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = einfo; 6172e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return getFunctionType(retType, types.begin(), types.size(), EPI); 61733d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 61743d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61753d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto) allRTypes = false; 61763d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (rproto) allLTypes = false; 61773d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 617872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *proto = lproto ? lproto : rproto; 61793d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (proto) { 6180465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl assert(!proto->hasExceptionSpec() && "C++ shouldn't be here"); 61813d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (proto->isVariadic()) return QualType(); 61823d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check that the types are compatible with the types that 61833d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // would result from default argument promotions (C99 6.7.5.3p15). 61843d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // The only types actually affected are promotable integer 61853d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // types and floats, which would be passed as a different 61863d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // type depending on whether the prototype is visible. 61873d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned proto_nargs = proto->getNumArgs(); 61883d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman for (unsigned i = 0; i < proto_nargs; ++i) { 61893d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType argTy = proto->getArgType(i); 6190b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor 6191b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor // Look at the promotion type of enum types, since that is the type used 6192b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor // to pass enum values. 6193b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor if (const EnumType *Enum = argTy->getAs<EnumType>()) 6194b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor argTy = Enum->getDecl()->getPromotionType(); 6195b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor 61963d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (argTy->isPromotableIntegerType() || 61973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman getCanonicalType(argTy).getUnqualifiedType() == FloatTy) 61983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 61993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 62003d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 62023d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 6203e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6204e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo(); 6205e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = einfo; 62063d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return getFunctionType(retType, proto->arg_type_begin(), 6207e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall proto->getNumArgs(), EPI); 62083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 62093d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 62113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 62128cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return getFunctionNoProtoType(retType, einfo); 62133d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman} 62143d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6215132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeTypes(QualType LHS, QualType RHS, 6216447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool OfBlockPointer, 6217a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian bool Unqualified, bool BlockReturnType) { 621843d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // C++ [expr]: If an expression initially has the type "reference to T", the 621943d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // type is adjusted to "T" prior to any further analysis, the expression 622043d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // designates the object or function denoted by the reference, and the 62217c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // expression is an lvalue unless the reference is an rvalue reference and 62227c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // the expression is a function call (possibly inside parentheses). 62230e709abafbd939326850501f795cc7a92c88a354Douglas Gregor assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?"); 62240e709abafbd939326850501f795cc7a92c88a354Douglas Gregor assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?"); 6225447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6226447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6227447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHS = LHS.getUnqualifiedType(); 6228447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHS = RHS.getUnqualifiedType(); 6229447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 62300e709abafbd939326850501f795cc7a92c88a354Douglas Gregor 62313d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType LHSCan = getCanonicalType(LHS), 62323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman RHSCan = getCanonicalType(RHS); 62333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6234f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner // If two types are identical, they are compatible. 62353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LHSCan == RHSCan) 62363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 62373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If the qualifiers are different, the types aren't compatible... mostly. 6239a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers LQuals = LHSCan.getLocalQualifiers(); 6240a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers RQuals = RHSCan.getLocalQualifiers(); 62410953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (LQuals != RQuals) { 62420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If any of these qualifiers are different, we have a type 62430953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // mismatch. 62440953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 6245f85e193739c953358c865005855253af4f68a497John McCall LQuals.getAddressSpace() != RQuals.getAddressSpace() || 6246f85e193739c953358c865005855253af4f68a497John McCall LQuals.getObjCLifetime() != RQuals.getObjCLifetime()) 62470953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(); 62480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62490953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Exactly one GC qualifier difference is allowed: __strong is 62500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // okay if the other type has no GC qualifier but is an Objective 62510953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // C object pointer (i.e. implicitly strong by default). We fix 62520953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // this by pretending that the unqualified type was actually 62530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // qualified __strong. 62540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 62550953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 62560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 62570953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62580953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 62590953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(); 62600953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62610953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) { 62620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong)); 62630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62640953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) { 62650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS); 62660953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62673d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 62680953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Okay, qualifiers are equal. 62713d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6272852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman Type::TypeClass LHSClass = LHSCan->getTypeClass(); 6273852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman Type::TypeClass RHSClass = RHSCan->getTypeClass(); 6274f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner 62751adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // We want to consider the two function types to be the same for these 62761adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // comparisons, just force one to the other. 62771adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto; 62781adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto; 62794c721d381fb279899337d120edd4a24d405e56b2Eli Friedman 62804c721d381fb279899337d120edd4a24d405e56b2Eli Friedman // Same as above for arrays 6281a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray) 6282a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner LHSClass = Type::ConstantArray; 6283a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray) 6284a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner RHSClass = Type::ConstantArray; 62851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6286c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // ObjCInterfaces are just specialized ObjCObjects. 6287c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject; 6288c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject; 6289c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 6290213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman // Canonicalize ExtVector -> Vector. 6291213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (LHSClass == Type::ExtVector) LHSClass = Type::Vector; 6292213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (RHSClass == Type::ExtVector) RHSClass = Type::Vector; 62931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 62944e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff // If the canonical type classes don't match. 62954e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff if (LHSClass != RHSClass) { 62961adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // C99 6.7.2.2p4: Each enumerated type shall be compatible with char, 62971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // a signed integer type, or an unsigned integer type. 6298842aef8d942a880eeb9535d40de31a86838264cbJohn McCall // Compatibility is based on the underlying type, not the promotion 6299842aef8d942a880eeb9535d40de31a86838264cbJohn McCall // type. 6300183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const EnumType* ETy = LHS->getAs<EnumType>()) { 6301b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian QualType TINT = ETy->getDecl()->getIntegerType(); 6302b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian if (!TINT.isNull() && hasSameType(TINT, RHSCan.getUnqualifiedType())) 63033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return RHS; 6304bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman } 6305183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const EnumType* ETy = RHS->getAs<EnumType>()) { 6306b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian QualType TINT = ETy->getDecl()->getIntegerType(); 6307b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian if (!TINT.isNull() && hasSameType(TINT, LHSCan.getUnqualifiedType())) 63083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 6309bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman } 6310e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian // allow block pointer type to match an 'id' type. 6311419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (OfBlockPointer && !BlockReturnType) { 6312419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (LHS->isObjCIdType() && RHS->isBlockPointerType()) 6313419636316c04d570c183b4797fc811932c588358Fariborz Jahanian return LHS; 6314419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (RHS->isObjCIdType() && LHS->isBlockPointerType()) 6315419636316c04d570c183b4797fc811932c588358Fariborz Jahanian return RHS; 6316419636316c04d570c183b4797fc811932c588358Fariborz Jahanian } 6317e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian 63183d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 6319ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff } 63203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 63214a74678ed6c3dedac05d02b1ee341f1db869f049Steve Naroff // The canonical type classes match. 63221adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner switch (LHSClass) { 632372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base) 632472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base) 6325ad5e73887052193afda72db8efcb812bd083a4a8John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 632672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 632772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class: 632872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def" 6329b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 633072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 63317c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case Type::LValueReference: 63327c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case Type::RValueReference: 633372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::MemberPointer: 6334b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("C++ should never be in mergeTypes"); 633572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 6336c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCInterface: 633772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::IncompleteArray: 633872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::VariableArray: 633972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::FunctionProto: 634072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::ExtVector: 6341b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Types are eliminated above"); 634272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 63431adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::Pointer: 63443d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman { 63453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Merge two pointer types, while trying to preserve typedef info 63466217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType(); 63476217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType(); 6348447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6349447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSPointee = LHSPointee.getUnqualifiedType(); 6350447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSPointee = RHSPointee.getUnqualifiedType(); 6351447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6352447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false, 6353447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor Unqualified); 63543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (ResultType.isNull()) return QualType(); 635507d258756dc856c6987c394a0972884e6ed46765Eli Friedman if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 635661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 635707d258756dc856c6987c394a0972884e6ed46765Eli Friedman if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 635861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 63593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return getPointerType(ResultType); 63603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 6361c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff case Type::BlockPointer: 6362c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff { 6363c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff // Merge two block pointer types, while trying to preserve typedef info 63646217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType(); 63656217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType(); 6366447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6367447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSPointee = LHSPointee.getUnqualifiedType(); 6368447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSPointee = RHSPointee.getUnqualifiedType(); 6369447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6370447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer, 6371447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor Unqualified); 6372c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (ResultType.isNull()) return QualType(); 6373c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 6374c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return LHS; 6375c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 6376c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return RHS; 6377c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return getBlockPointerType(ResultType); 6378c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff } 6379b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: 6380b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman { 6381b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Merge two pointer types, while trying to preserve typedef info 6382b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType LHSValue = LHS->getAs<AtomicType>()->getValueType(); 6383b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType RHSValue = RHS->getAs<AtomicType>()->getValueType(); 6384b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (Unqualified) { 6385b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman LHSValue = LHSValue.getUnqualifiedType(); 6386b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman RHSValue = RHSValue.getUnqualifiedType(); 6387b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 6388b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType ResultType = mergeTypes(LHSValue, RHSValue, false, 6389b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Unqualified); 6390b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (ResultType.isNull()) return QualType(); 6391b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (getCanonicalType(LHSValue) == getCanonicalType(ResultType)) 6392b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return LHS; 6393b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (getCanonicalType(RHSValue) == getCanonicalType(ResultType)) 6394b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return RHS; 6395b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return getAtomicType(ResultType); 6396b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 63971adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::ConstantArray: 63983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman { 63993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const ConstantArrayType* LCAT = getAsConstantArrayType(LHS); 64003d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const ConstantArrayType* RCAT = getAsConstantArrayType(RHS); 64013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize()) 64023d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 64033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 64043d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType LHSElem = getAsArrayType(LHS)->getElementType(); 64053d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType RHSElem = getAsArrayType(RHS)->getElementType(); 6406447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6407447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSElem = LHSElem.getUnqualifiedType(); 6408447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSElem = RHSElem.getUnqualifiedType(); 6409447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6410447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6411447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified); 64123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (ResultType.isNull()) return QualType(); 641361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 641461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 641561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 641661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 64173bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(), 64183bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman ArrayType::ArraySizeModifier(), 0); 64193bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(), 64203bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman ArrayType::ArraySizeModifier(), 0); 64213d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const VariableArrayType* LVAT = getAsVariableArrayType(LHS); 64223d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const VariableArrayType* RVAT = getAsVariableArrayType(RHS); 642361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 642461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 642561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 642661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 64273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LVAT) { 64283d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // FIXME: This isn't correct! But tricky to implement because 64293d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // the array's size has to be the size of LHS, but the type 64303d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // has to be different. 64313d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 64323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 64333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (RVAT) { 64343d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // FIXME: This isn't correct! But tricky to implement because 64353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // the array's size has to be the size of RHS, but the type 64363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // has to be different. 64373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return RHS; 64383d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 64393bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS; 64403bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS; 64417e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor return getIncompleteArrayType(ResultType, 64427e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor ArrayType::ArraySizeModifier(), 0); 64433d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 64441adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::FunctionNoProto: 6445447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified); 644672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Record: 644772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Enum: 64483d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 64491adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::Builtin: 64503cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner // Only exactly equal builtin types are compatible, which is tested above. 64513d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 645264cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar case Type::Complex: 645364cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar // Distinct complex types are incompatible. 645464cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar return QualType(); 64553cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner case Type::Vector: 64565a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // FIXME: The merged type should be an ExtVector! 64571c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall if (areCompatVectorTypes(LHSCan->getAs<VectorType>(), 64581c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall RHSCan->getAs<VectorType>())) 64593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 646061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return QualType(); 6461c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: { 6462c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Check if the types are assignment compatible. 64635a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // FIXME: This should be type compatibility, e.g. whether 64645a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // "LHS x; RHS x;" at global scope is legal. 6465c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHSIface = LHS->getAs<ObjCObjectType>(); 6466c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHSIface = RHS->getAs<ObjCObjectType>(); 6467c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (canAssignObjCInterfaces(LHSIface, RHSIface)) 64685fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff return LHS; 64695fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff 64703d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 647161490e9a965cfee8a78c12c6802138844f04250dCedric Venet } 647214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff case Type::ObjCObjectPointer: { 6473132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (OfBlockPointer) { 6474132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (canAssignObjCInterfacesInBlockPointer( 6475132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian LHS->getAs<ObjCObjectPointerType>(), 6476a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian RHS->getAs<ObjCObjectPointerType>(), 6477a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian BlockReturnType)) 64787530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return LHS; 6479132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return QualType(); 6480132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 6481183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(), 6482183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall RHS->getAs<ObjCObjectPointerType>())) 648314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return LHS; 648414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 6485bc76dd06eb881c70c9775b74bab8b88cd747f173Steve Naroff return QualType(); 64867530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie } 6487ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff } 648872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 64897530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid Type::Class!"); 6490ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff} 64917192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek 649278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanianbool ASTContext::FunctionTypesMatchOnNSConsumedAttrs( 649378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian const FunctionProtoType *FromFunctionType, 649478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian const FunctionProtoType *ToFunctionType) { 649578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromFunctionType->hasAnyConsumedArgs() != 649678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToFunctionType->hasAnyConsumedArgs()) 649778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return false; 649878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FunctionProtoType::ExtProtoInfo FromEPI = 649978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FromFunctionType->getExtProtoInfo(); 650078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FunctionProtoType::ExtProtoInfo ToEPI = 650178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToFunctionType->getExtProtoInfo(); 650278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromEPI.ConsumedArguments && ToEPI.ConsumedArguments) 650378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs(); 650478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ArgIdx != NumArgs; ++ArgIdx) { 650578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromEPI.ConsumedArguments[ArgIdx] != 650678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToEPI.ConsumedArguments[ArgIdx]) 650778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return false; 650878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian } 650978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return true; 651078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian} 651178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 65122390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 65132390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// 'RHS' attributes and returns the merged version; including for function 65142390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// return types. 65152390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz JahanianQualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) { 65162390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType LHSCan = getCanonicalType(LHS), 65172390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian RHSCan = getCanonicalType(RHS); 65182390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If two types are identical, they are compatible. 65192390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LHSCan == RHSCan) 65202390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 65212390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (RHSCan->isFunctionType()) { 65222390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (!LHSCan->isFunctionType()) 65232390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65242390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType OldReturnType = 65252390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian cast<FunctionType>(RHSCan.getTypePtr())->getResultType(); 65262390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType NewReturnType = 65272390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian cast<FunctionType>(LHSCan.getTypePtr())->getResultType(); 65282390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResReturnType = 65292390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian mergeObjCGCQualifiers(NewReturnType, OldReturnType); 65302390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResReturnType.isNull()) 65312390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65322390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) { 65332390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo(); 65342390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // In either case, use OldReturnType to build the new function type. 65352390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian const FunctionType *F = LHS->getAs<FunctionType>(); 65362390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (const FunctionProtoType *FPT = cast<FunctionProtoType>(F)) { 6537e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 6538e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = getFunctionExtInfo(LHS); 65392390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResultType 65402390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian = getFunctionType(OldReturnType, FPT->arg_type_begin(), 6541e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FPT->getNumArgs(), EPI); 65422390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return ResultType; 65432390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65442390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65452390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65462390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65472390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65482390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If the qualifiers are different, the types can still be merged. 65492390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers LQuals = LHSCan.getLocalQualifiers(); 65502390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers RQuals = RHSCan.getLocalQualifiers(); 65512390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LQuals != RQuals) { 65522390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If any of these qualifiers are different, we have a type mismatch. 65532390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 65542390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian LQuals.getAddressSpace() != RQuals.getAddressSpace()) 65552390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65562390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65572390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // Exactly one GC qualifier difference is allowed: __strong is 65582390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // okay if the other type has no GC qualifier but is an Objective 65592390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // C object pointer (i.e. implicitly strong by default). We fix 65602390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // this by pretending that the unqualified type was actually 65612390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // qualified __strong. 65622390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 65632390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 65642390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 65652390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65662390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 65672390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65682390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65692390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_L == Qualifiers::Strong) 65702390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 65712390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_R == Qualifiers::Strong) 65722390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return RHS; 65732390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65742390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65752390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65762390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) { 65772390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType LHSBaseQT = LHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 65782390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType RHSBaseQT = RHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 65792390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT); 65802390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResQT == LHSBaseQT) 65812390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 65822390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResQT == RHSBaseQT) 65832390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return RHS; 65842390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65852390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65862390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian} 65872390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65885426bf6456a5aeac416a9150de157904d101c819Chris Lattner//===----------------------------------------------------------------------===// 6589ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman// Integer Predicates 6590ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//===----------------------------------------------------------------------===// 659188054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner 65924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getIntWidth(QualType T) const { 6593f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall if (const EnumType *ET = dyn_cast<EnumType>(T)) 659429a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman T = ET->getDecl()->getIntegerType(); 65951274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (T->isBooleanType()) 65961274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor return 1; 6597f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman // For builtin types, just use the standard type sizing method 6598ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return (unsigned)getTypeSize(T); 6599ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman} 6600ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman 6601ad74a758189180b8ab8faea648e4766c3bfd7fcbEli FriedmanQualType ASTContext::getCorrespondingUnsignedType(QualType T) { 6602f60946222721d9ba3c059563935c17b84703187aDouglas Gregor assert(T->hasSignedIntegerRepresentation() && "Unexpected type"); 66036a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 66046a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner // Turn <4 x signed int> -> <4 x unsigned int> 66056a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner if (const VectorType *VTy = T->getAs<VectorType>()) 66066a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()), 6607e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VTy->getNumElements(), VTy->getVectorKind()); 66086a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 66096a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner // For enums, we return the unsigned version of the base type. 66106a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner if (const EnumType *ETy = T->getAs<EnumType>()) 6611ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman T = ETy->getDecl()->getIntegerType(); 66126a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 66136a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner const BuiltinType *BTy = T->getAs<BuiltinType>(); 66146a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner assert(BTy && "Unexpected signed integer type"); 6615ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman switch (BTy->getKind()) { 6616ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Char_S: 6617ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::SChar: 6618ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedCharTy; 6619ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Short: 6620ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedShortTy; 6621ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Int: 6622ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedIntTy; 6623ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Long: 6624ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedLongTy; 6625ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::LongLong: 6626ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedLongLongTy; 66272df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::Int128: 66282df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner return UnsignedInt128Ty; 6629ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman default: 6630b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unexpected signed integer type"); 6631ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman } 6632ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman} 6633ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman 66347b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios KyrtzidisASTMutationListener::~ASTMutationListener() { } 66357b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 663686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 663786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===// 663886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner// Builtin Type Computation 663986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===// 664086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 664186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the 664233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// pointer over the consumed characters. This returns the resultant type. If 664333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// AllowTypeModifiers is false then modifier like * are not parsed, just basic 664433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// types. This allows "v2i*" to be parsed as a pointer to a v2i instead of 664533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// a vector of "i*". 664614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// 664714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// RequiresICE is filled in on return to indicate whether the value is required 664814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// to be an Integer Constant Expression. 66494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, 665086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ASTContext::GetBuiltinTypeError &Error, 665114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner bool &RequiresICE, 665233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner bool AllowTypeModifiers) { 665386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Modifiers. 665486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner int HowLong = 0; 665586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner bool Signed = false, Unsigned = false; 665614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE = false; 6657393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner 665833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // Read the prefixed modifiers first. 665986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner bool Done = false; 666086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (!Done) { 666186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner switch (*Str++) { 66621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump default: Done = true; --Str; break; 6663393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner case 'I': 666414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE = true; 6665393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner break; 666686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'S': 666786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!"); 666886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Signed && "Can't use 'S' modifier multiple times!"); 666986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Signed = true; 667086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 667186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'U': 667286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Signed && "Can't use both 'S' and 'U' modifiers!"); 667386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Unsigned && "Can't use 'S' modifier multiple times!"); 667486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Unsigned = true; 667586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 667686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'L': 667786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong <= 2 && "Can't have LLLL modifier"); 667886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ++HowLong; 667986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 668086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 668186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 668286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 668386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner QualType Type; 66841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 668586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Read the base type. 668686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner switch (*Str++) { 6687b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown builtin type letter!"); 668886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'v': 668986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && 669086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'v'!"); 669186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.VoidTy; 669286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 669386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'f': 669486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && 669586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'f'!"); 669686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.FloatTy; 669786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 669886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'd': 669986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong < 2 && !Signed && !Unsigned && 670086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'd'!"); 670186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (HowLong) 670286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.LongDoubleTy; 670386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 670486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.DoubleTy; 670586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 670686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 's': 670786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && "Bad modifiers used with 's'!"); 670886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Unsigned) 670986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.UnsignedShortTy; 671086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 671186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.ShortTy; 671286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 671386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'i': 671486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (HowLong == 3) 671586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty; 671686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (HowLong == 2) 671786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy; 671886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (HowLong == 1) 671986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy; 672086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 672186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy; 672286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 672386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'c': 672486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && "Bad modifiers used with 'c'!"); 672586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Signed) 672686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.SignedCharTy; 672786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (Unsigned) 672886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.UnsignedCharTy; 672986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 673086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.CharTy; 673186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 673286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'b': // boolean 673386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!"); 673486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.BoolTy; 673586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 673686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'z': // size_t. 673786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!"); 673886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getSizeType(); 673986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 674086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'F': 674186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getCFConstantStringType(); 674286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 6743ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian case 'G': 6744ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian Type = Context.getObjCIdType(); 6745ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian break; 6746ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian case 'H': 6747ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian Type = Context.getObjCSelType(); 6748ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian break; 674986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'a': 675086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getBuiltinVaListType(); 675186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Type.isNull() && "builtin va list type not initialized!"); 675286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 675386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'A': 675486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // This is a "reference" to a va_list; however, what exactly 675586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // this means depends on how va_list is defined. There are two 675686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // different kinds of va_list: ones passed by value, and ones 675786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // passed by reference. An example of a by-value va_list is 675886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // x86, where va_list is a char*. An example of by-ref va_list 675986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // is x86-64, where va_list is a __va_list_tag[1]. For x86, 676086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // we want this argument to be a char*&; for x86-64, we want 676186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // it to be a __va_list_tag*. 676286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getBuiltinVaListType(); 676386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Type.isNull() && "builtin va list type not initialized!"); 676414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner if (Type->isArrayType()) 676586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getArrayDecayedType(Type); 676614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner else 676786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getLValueReferenceType(Type); 676886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 676986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'V': { 677086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner char *End; 677186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner unsigned NumElements = strtoul(Str, &End, 10); 677286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(End != Str && "Missing vector size"); 677386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Str = End; 67741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 677514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ElementType = DecodeTypeFromStr(Str, Context, Error, 677614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE, false); 677714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Can't require vector ICE"); 677833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner 677933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // TODO: No way to make AltiVec vectors in builtins yet. 6780788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner Type = Context.getVectorType(ElementType, NumElements, 6781e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::GenericVector); 678286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 678386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6784b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor case 'E': { 6785b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor char *End; 6786b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6787b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor unsigned NumElements = strtoul(Str, &End, 10); 6788b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor assert(End != Str && "Missing vector size"); 6789b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6790b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor Str = End; 6791b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6792b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE, 6793b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor false); 6794b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor Type = Context.getExtVectorType(ElementType, NumElements); 6795b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor break; 6796b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor } 6797d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor case 'X': { 679814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE, 679914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner false); 680014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Can't require complex ICE"); 6801d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor Type = Context.getComplexType(ElementType); 6802d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor break; 6803cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian } 6804cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian case 'Y' : { 6805cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian Type = Context.getPointerDiffType(); 6806cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian break; 6807cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian } 68089a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner case 'P': 6809c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor Type = Context.getFILEType(); 6810c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor if (Type.isNull()) { 6811f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Error = ASTContext::GE_Missing_stdio; 681286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 681386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6814fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump break; 68159a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner case 'J': 6816f711c41dd9412a8182793259d355c4f6979ed5edMike Stump if (Signed) 6817782fa308a765aeac2acb39c4e697c937ec21185bMike Stump Type = Context.getsigjmp_bufType(); 6818f711c41dd9412a8182793259d355c4f6979ed5edMike Stump else 6819f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Type = Context.getjmp_bufType(); 6820f711c41dd9412a8182793259d355c4f6979ed5edMike Stump 6821fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump if (Type.isNull()) { 6822f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Error = ASTContext::GE_Missing_setjmp; 6823fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump return QualType(); 6824fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump } 6825fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump break; 6826e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola case 'K': 6827e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!"); 6828e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola Type = Context.getucontext_tType(); 6829e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola 6830e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola if (Type.isNull()) { 6831e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola Error = ASTContext::GE_Missing_ucontext; 6832e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola return QualType(); 6833e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola } 6834e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola break; 6835782fa308a765aeac2acb39c4e697c937ec21185bMike Stump } 68361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 683733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // If there are modifiers and if we're allowed to parse them, go for it. 683833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Done = !AllowTypeModifiers; 683986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (!Done) { 6840187ab37a05b8f7015b9f39cc8cd9129a0c6d0b48John McCall switch (char c = *Str++) { 684133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner default: Done = true; --Str; break; 684233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case '*': 684333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case '&': { 684433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // Both pointers and references can have their pointee types 684533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // qualified with an address space. 684633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner char *End; 684733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner unsigned AddrSpace = strtoul(Str, &End, 10); 684833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner if (End != Str && AddrSpace != 0) { 684933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getAddrSpaceQualType(Type, AddrSpace); 685033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Str = End; 685133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner } 685233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner if (c == '*') 685333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getPointerType(Type); 685433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner else 685533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getLValueReferenceType(Type); 685633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 685733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner } 685833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // FIXME: There's no way to have a built-in with an rvalue ref arg. 685933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case 'C': 686033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Type.withConst(); 686133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 686233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case 'D': 686333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getVolatileType(Type); 686433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 686518932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek case 'R': 686618932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek Type = Type.withRestrict(); 686718932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek break; 686886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 686986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6870393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner 687114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert((!RequiresICE || Type->isIntegralOrEnumerationType()) && 6872393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner "Integer constant 'I' type must be an integer"); 68731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 687486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return Type; 687586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner} 687686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 687786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// GetBuiltinType - Return the type for the specified builtin. 687833daae66462e8f51ee153463b32bdefd60c801aaChris LattnerQualType ASTContext::GetBuiltinType(unsigned Id, 687914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner GetBuiltinTypeError &Error, 68804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned *IntegerConstantArgs) const { 688133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner const char *TypeStr = BuiltinInfo.GetTypeString(Id); 68821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 8> ArgTypes; 68841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 688514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner bool RequiresICE = false; 688686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Error = GE_None; 688714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error, 688814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE, true); 688986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Error != GE_None) 689086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 689114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 689214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE"); 689314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 689486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (TypeStr[0] && TypeStr[0] != '.') { 689514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true); 689686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Error != GE_None) 689786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 689886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 689914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner // If this argument is required to be an IntegerConstantExpression and the 690014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner // caller cares, fill in the bitmask we return. 690114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner if (RequiresICE && IntegerConstantArgs) 690214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner *IntegerConstantArgs |= 1 << ArgTypes.size(); 690314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 690486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Do array -> pointer decay. The builtin should use the decayed type. 690586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Ty->isArrayType()) 690686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Ty = getArrayDecayedType(Ty); 69071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 690886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ArgTypes.push_back(Ty); 690986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 691086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 691186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert((TypeStr[0] != '.' || TypeStr[1] == 0) && 691286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "'.' should only occur at end of builtin type list!"); 691386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 691400ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall FunctionType::ExtInfo EI; 691500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true); 691600ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall 691700ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall bool Variadic = (TypeStr[0] == '.'); 691800ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall 691900ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall // We really shouldn't be making a no-proto type here, especially in C++. 692000ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall if (ArgTypes.empty() && Variadic) 692100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall return getFunctionNoProtoType(ResType, EI); 6922ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor 6923e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI; 692400ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall EPI.ExtInfo = EI; 692500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall EPI.Variadic = Variadic; 6926e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6927e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return getFunctionType(ResType, ArgTypes.data(), ArgTypes.size(), EPI); 692886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner} 6929a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman 693090e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) { 693190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage External = GVA_StrongExternal; 693290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 693390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis Linkage L = FD->getLinkage(); 693490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (L) { 693590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case NoLinkage: 693690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case InternalLinkage: 693790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case UniqueExternalLinkage: 693890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_Internal; 693990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 694090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case ExternalLinkage: 694190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (FD->getTemplateSpecializationKind()) { 694290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_Undeclared: 694390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitSpecialization: 694490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis External = GVA_StrongExternal; 694590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis break; 694690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 694790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDefinition: 694890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_ExplicitTemplateInstantiation; 694990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 695090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDeclaration: 695190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ImplicitInstantiation: 695290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis External = GVA_TemplateInstantiation; 695390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis break; 695490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 695590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 695690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 695790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!FD->isInlined()) 695890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return External; 695990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 69604e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().CPlusPlus || FD->hasAttr<GNUInlineAttr>()) { 696190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // GNU or C99 inline semantics. Determine whether this symbol should be 696290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // externally visible. 696390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->isInlineDefinitionExternallyVisible()) 696490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return External; 696590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 696690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // C99 inline semantics, where the symbol is not externally visible. 696790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_C99Inline; 696890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 696990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 697090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // C++0x [temp.explicit]p9: 697190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // [ Note: The intent is that an inline function that is the subject of 697290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // an explicit instantiation declaration will still be implicitly 697390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // instantiated when used so that the body can be considered for 697490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // inlining, but that no out-of-line copy of the inline function would be 697590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // generated in the translation unit. -- end note ] 697690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->getTemplateSpecializationKind() 697790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis == TSK_ExplicitInstantiationDeclaration) 697890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_C99Inline; 697990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 698090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_CXXInline; 698190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 698290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 698390e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) { 698490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // If this is a static data member, compute the kind of template 698590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // specialization. Otherwise, this variable is not part of a 698690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // template. 698790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis TemplateSpecializationKind TSK = TSK_Undeclared; 698890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (VD->isStaticDataMember()) 698990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis TSK = VD->getTemplateSpecializationKind(); 699090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 699190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis Linkage L = VD->getLinkage(); 69924e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (L == ExternalLinkage && getLangOpts().CPlusPlus && 699390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis VD->getType()->getLinkage() == UniqueExternalLinkage) 699490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis L = UniqueExternalLinkage; 699590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 699690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (L) { 699790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case NoLinkage: 699890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case InternalLinkage: 699990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case UniqueExternalLinkage: 700090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_Internal; 700190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 700290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case ExternalLinkage: 700390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (TSK) { 700490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_Undeclared: 700590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitSpecialization: 700690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_StrongExternal; 700790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 700890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDeclaration: 700990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis llvm_unreachable("Variable should not be instantiated"); 701090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Fall through to treat this like any other instantiation. 701190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 701290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDefinition: 701390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_ExplicitTemplateInstantiation; 701490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 701590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ImplicitInstantiation: 701690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_TemplateInstantiation; 701790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 701890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 701990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 70207530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid Linkage!"); 702190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 702290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 70234ac7c0bb39696e92fd220118fedc484c09a69870Argyrios Kyrtzidisbool ASTContext::DeclMustBeEmitted(const Decl *D) { 702490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 702590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!VD->isFileVarDecl()) 702690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 7027144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis } else if (!isa<FunctionDecl>(D)) 702890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 702990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 7030ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis // Weak references don't produce any output by themselves. 7031ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis if (D->hasAttr<WeakRefAttr>()) 7032ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis return false; 7033ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 703490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Aliases and used decls are required. 703590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>()) 703690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 703790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 703890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 703990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Forward declarations aren't required. 704010620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (!FD->doesThisDeclarationHaveABody()) 7041dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky return FD->doesDeclarationForceExternallyVisibleDefinition(); 704290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 704390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Constructors and destructors are required. 704490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>()) 704590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 704690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 704790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // The key function for a class is required. 704890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 704990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const CXXRecordDecl *RD = MD->getParent(); 705090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (MD->isOutOfLine() && RD->isDynamicClass()) { 705190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const CXXMethodDecl *KeyFunc = getKeyFunction(RD); 705290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl()) 705390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 705490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 705590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 705690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 705790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage Linkage = GetGVALinkageForFunction(FD); 705890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 705990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // static, static inline, always_inline, and extern inline functions can 706090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // always be deferred. Normal inline functions can be deferred in C99/C++. 706190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Implicit template instantiations can also be deferred in C++. 706290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (Linkage == GVA_Internal || Linkage == GVA_C99Inline || 70633a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) 706490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 706590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 706690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 706794da1587f7d584fc61df793229d197969f204cd9Douglas Gregor 706890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const VarDecl *VD = cast<VarDecl>(D); 706990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis assert(VD->isFileVarDecl() && "Expected file scoped var"); 707090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 7071ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly) 7072ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis return false; 7073ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 707490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Structs that have non-trivial constructors or destructors are required. 707590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 707690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // FIXME: Handle references. 7077023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // FIXME: Be more selective about which constructors we care about. 707890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const RecordType *RT = VD->getType()->getAs<RecordType>()) { 707990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 7080023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt if (RD->hasDefinition() && !(RD->hasTrivialDefaultConstructor() && 7081023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialCopyConstructor() && 7082023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialMoveConstructor() && 7083023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialDestructor())) 708490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 708590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 708690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 708790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 708890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage L = GetGVALinkageForVariable(VD); 708990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (L == GVA_Internal || L == GVA_TemplateInstantiation) { 709090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!(VD->getInit() && VD->getInit()->HasSideEffects(*this))) 709190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 709290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 709390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 709490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 709590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 7096071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 7097ee743f903858e337434ac0335f147f4de4ecae05Charles DavisCallingConv ASTContext::getDefaultMethodCallConv() { 7098ee743f903858e337434ac0335f147f4de4ecae05Charles Davis // Pass through to the C++ ABI object 7099ee743f903858e337434ac0335f147f4de4ecae05Charles Davis return ABI->getDefaultMethodCallConv(); 7100ee743f903858e337434ac0335f147f4de4ecae05Charles Davis} 7101ee743f903858e337434ac0335f147f4de4ecae05Charles Davis 71024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const { 7103dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson // Pass through to the C++ ABI object 7104dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson return ABI->isNearlyEmpty(RD); 7105dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson} 7106dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson 710714110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *ASTContext::createMangleContext() { 7108bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor switch (Target->getCXXABI()) { 710914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_ARM: 711014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_Itanium: 711114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne return createItaniumMangleContext(*this, getDiagnostics()); 711214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_Microsoft: 711314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne return createMicrosoftMangleContext(*this, getDiagnostics()); 711414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne } 7115b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unsupported ABI"); 711614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne} 711714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne 7118071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI::~CXXABI() {} 7119ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek 7120ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremeneksize_t ASTContext::getSideTableAllocatedMemory() const { 71210c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek return ASTRecordLayouts.getMemorySize() 71220c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(ObjCLayouts) 71230c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(KeyFunctions) 71240c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(ObjCImpls) 71250c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(BlockVarCopyInits) 71260c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(DeclAttrs) 71270c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromStaticDataMember) 71280c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUsingDecl) 71290c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) 71300c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) 71310c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(OverriddenMethods) 71320c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(Types) 7133af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet + llvm::capacity_in_bytes(VariableArrayTypes) 71340d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet + llvm::capacity_in_bytes(ClassScopeSpecializationPattern); 7135ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek} 7136d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek 71379e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorunsigned ASTContext::getLambdaManglingNumber(CXXMethodDecl *CallOperator) { 71389e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor CXXRecordDecl *Lambda = CallOperator->getParent(); 71399e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor return LambdaMangleContexts[Lambda->getDeclContext()] 71409e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor .getManglingNumber(CallOperator); 71419e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor} 71429e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 71439e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 7144d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekvoid ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) { 7145d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek ParamIndices[D] = index; 7146d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek} 7147d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek 7148d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekunsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const { 7149d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek ParameterIndexTable::const_iterator I = ParamIndices.find(D); 7150d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek assert(I != ParamIndices.end() && 7151d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek "ParmIndices lacks entry set by ParmVarDecl"); 7152d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek return I->second; 7153d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek} 7154