ASTContext.cpp revision d8672ef2d343a0dbfe838724fb2d9fb4efea6041
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 59a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri GribenkoRawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const { 60aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (!CommentsLoaded && ExternalSource) { 61aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko ExternalSource->ReadComments(); 62aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko CommentsLoaded = true; 63aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 64aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 65aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko assert(D); 66aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 67c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko // User can not attach documentation to implicit declarations. 68c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko if (D->isImplicit()) 69c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko return NULL; 70c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko 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 81abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko // Find declaration location. 82abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko // For Objective-C declarations we generally don't expect to have multiple 83abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko // declarators, thus use declaration starting location as the "declaration 84abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko // location". 85abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko // For all other declarations multiple declarators are used quite frequently, 86abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko // so we use the location of the identifier as the "declaration location". 87abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko SourceLocation DeclLoc; 88abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko if (isa<ObjCMethodDecl>(D) || isa<ObjCContainerDecl>(D) || 89abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko isa<ObjCPropertyDecl>(D)) 90abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko DeclLoc = D->getLocStart(); 91abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko else 92abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko DeclLoc = D->getLocation(); 93abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko 94aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // If the declaration doesn't map directly to a location in a file, we 95aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // can't find the comment. 96aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLoc.isInvalid() || !DeclLoc.isFileID()) 97aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 98aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 99aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Find the comment that occurs just after this declaration. 100811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko RawComment CommentAtDeclLoc(SourceMgr, SourceRange(DeclLoc)); 101811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko ArrayRef<RawComment *>::iterator Comment 102aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko = std::lower_bound(RawComments.begin(), 103aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawComments.end(), 104811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko &CommentAtDeclLoc, 105aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko BeforeThanCompare<RawComment>(SourceMgr)); 106aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 107aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Decompose the location for the declaration and find the beginning of the 108aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // file buffer. 109aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> DeclLocDecomp = SourceMgr.getDecomposedLoc(DeclLoc); 110aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 111aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // First check whether we have a trailing comment. 112aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Comment != RawComments.end() && 113811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko (*Comment)->isDocumentation() && (*Comment)->isTrailingComment() && 1149c00676f2393335dc60c61faf944d4f8f622fac6Dmitri Gribenko (isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) || isa<VarDecl>(D))) { 115aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> CommentBeginDecomp 116811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getBegin()); 117aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check that Doxygen trailing comment comes after the declaration, starts 118aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // on the same line and in the same file as the declaration. 119aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLocDecomp.first == CommentBeginDecomp.first && 120aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) 121aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko == SourceMgr.getLineNumber(CommentBeginDecomp.first, 122aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko CommentBeginDecomp.second)) { 123811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko return *Comment; 124aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 125aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 126aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 127aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // The comment just after the declaration was not a trailing comment. 128aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Let's look at the previous comment. 129aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Comment == RawComments.begin()) 130aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 131aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko --Comment; 132aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 133aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check that we actually have a non-member Doxygen comment. 134811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko if (!(*Comment)->isDocumentation() || (*Comment)->isTrailingComment()) 135aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 136aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 137aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Decompose the end of the comment. 138aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::pair<FileID, unsigned> CommentEndDecomp 139811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getEnd()); 140aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 141aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // If the comment and the declaration aren't in the same file, then they 142aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // aren't related. 143aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (DeclLocDecomp.first != CommentEndDecomp.first) 144aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 145aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 146aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Get the corresponding buffer. 147aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool Invalid = false; 148aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first, 149aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko &Invalid).data(); 150aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (Invalid) 151aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 152aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 153aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Extract text between the comment and declaration. 154aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko StringRef Text(Buffer + CommentEndDecomp.second, 155aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko DeclLocDecomp.second - CommentEndDecomp.second); 156aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1578bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko // There should be no other declarations or preprocessor directives between 1588bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko // comment and declaration. 159abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko if (Text.find_first_of(",;{}#@") != StringRef::npos) 160aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return NULL; 161aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 162811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko return *Comment; 163aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} 164aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 165aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoconst RawComment *ASTContext::getRawCommentForDecl(const Decl *D) const { 166aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // Check whether we have cached a comment string for this declaration 167aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko // already. 1688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::DenseMap<const Decl *, RawAndParsedComment>::iterator Pos 169aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko = DeclComments.find(D); 1708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Pos != DeclComments.end()) { 1718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RawAndParsedComment C = Pos->second; 1728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C.first; 1738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 174aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 175a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko RawComment *RC = getRawCommentForDeclNoCache(D); 1768376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko // If we found a comment, it should be a documentation comment. 1778376f5934a18b950ac7323d8a38ed231623010faDmitri Gribenko assert(!RC || RC->isDocumentation()); 1789bf997e63d4e4004588b374e702a5e64da5ebb49Dmitri Gribenko DeclComments[D] = 1799bf997e63d4e4004588b374e702a5e64da5ebb49Dmitri Gribenko RawAndParsedComment(RC, static_cast<comments::FullComment *>(NULL)); 180a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (RC) 181a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko RC->setAttached(); 182aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return RC; 183aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} 184aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkocomments::FullComment *ASTContext::getCommentForDecl(const Decl *D) const { 1868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::DenseMap<const Decl *, RawAndParsedComment>::iterator Pos 1878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko = DeclComments.find(D); 1888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const RawComment *RC; 1898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Pos != DeclComments.end()) { 1908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RawAndParsedComment C = Pos->second; 1918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (comments::FullComment *FC = C.second) 1928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return FC; 1938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RC = C.first; 1948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } else 1958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RC = getRawCommentForDecl(D); 1968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (!RC) 1988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return NULL; 1998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const StringRef RawText = RC->getRawText(SourceMgr); 2018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko comments::Lexer L(RC->getSourceRange().getBegin(), comments::CommentOptions(), 2028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko RawText.begin(), RawText.end()); 2038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 204a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko comments::Sema S(getAllocator(), getSourceManager(), getDiagnostics()); 205a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko S.setDecl(D); 206a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko comments::Parser P(L, S, getAllocator(), getSourceManager(), 207a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko getDiagnostics()); 2088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko comments::FullComment *FC = P.parseFullComment(); 2108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko DeclComments[D].second = FC; 2118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return FC; 2128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} 2138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2143e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregorvoid 2153e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID, 2163e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *Parm) { 2173e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Parm->getDepth()); 2183e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Parm->getPosition()); 21961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor ID.AddBoolean(Parm->isParameterPack()); 2203e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2213e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList *Params = Parm->getTemplateParameters(); 2223e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Params->size()); 2233e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor for (TemplateParameterList::const_iterator P = Params->begin(), 2243e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor PEnd = Params->end(); 2253e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor P != PEnd; ++P) { 2263e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 2273e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(0); 2283e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddBoolean(TTP->isParameterPack()); 2293e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor continue; 2303e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 2313e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2323e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 2333e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(1); 23461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor ID.AddBoolean(NTTP->isParameterPack()); 2359e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr()); 2366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 2376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddBoolean(true); 2386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddInteger(NTTP->getNumExpansionTypes()); 2399e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 2409e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman QualType T = NTTP->getExpansionType(I); 2419e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman ID.AddPointer(T.getCanonicalType().getAsOpaquePtr()); 2429e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman } 2436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else 2446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddBoolean(false); 2453e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor continue; 2463e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 2473e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2483e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 2493e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(2); 2503e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Profile(ID, TTP); 2513e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 2523e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor} 2533e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2543e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorTemplateTemplateParmDecl * 2553e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::getCanonicalTemplateTemplateParmDecl( 2564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad TemplateTemplateParmDecl *TTP) const { 2573e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Check if we already have a canonical template template parameter. 2583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor llvm::FoldingSetNodeID ID; 2593e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonicalTemplateTemplateParm::Profile(ID, TTP); 2603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor void *InsertPos = 0; 2613e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonicalTemplateTemplateParm *Canonical 2623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 2633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (Canonical) 2643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor return Canonical->getParam(); 2653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 2663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Build a canonical template parameter list. 2673e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList *Params = TTP->getTemplateParameters(); 2685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> CanonParams; 2693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.reserve(Params->size()); 2703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor for (TemplateParameterList::const_iterator P = Params->begin(), 2713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor PEnd = Params->end(); 2723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor P != PEnd; ++P) { 2733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) 2743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.push_back( 2753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTypeParmDecl::Create(*this, getTranslationUnitDecl(), 276344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation(), 277344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation(), 278344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara TTP->getDepth(), 2793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TTP->getIndex(), 0, false, 2803e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TTP->isParameterPack())); 2813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor else if (NonTypeTemplateParmDecl *NTTP 2826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 2836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T = getCanonicalType(NTTP->getType()); 2846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T); 2856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NonTypeTemplateParmDecl *Param; 2866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 2875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 2> ExpandedTypes; 2885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TypeSourceInfo *, 2> ExpandedTInfos; 2896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 2906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I))); 2916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos.push_back( 2926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor getTrivialTypeSourceInfo(ExpandedTypes.back())); 2936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 2946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 2956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 296ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 297ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 2986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getDepth(), 2996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getPosition(), 0, 3006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T, 3016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TInfo, 3026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.data(), 3036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.size(), 3046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos.data()); 3056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else { 3066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 307ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 308ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 3096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getDepth(), 3106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getPosition(), 0, 3116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T, 3126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->isParameterPack(), 3136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TInfo); 3146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 3156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor CanonParams.push_back(Param); 3166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 3176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else 3183e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.push_back(getCanonicalTemplateTemplateParmDecl( 3193e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor cast<TemplateTemplateParmDecl>(*P))); 3203e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 3213e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 3223e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *CanonTTP 3233e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 3243e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation(), TTP->getDepth(), 32561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor TTP->getPosition(), 32661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor TTP->isParameterPack(), 32761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor 0, 3283e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList::Create(*this, SourceLocation(), 3293e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation(), 3303e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.data(), 3313e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.size(), 3323e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation())); 3333e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 3343e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Get the new insert position for the node we care about. 3353e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 3363e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor assert(Canonical == 0 && "Shouldn't be in the map!"); 3373e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor (void)Canonical; 3383e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 3393e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Create the canonical template template parameter entry. 3403e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP); 3413e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos); 3423e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor return CanonTTP; 3433e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor} 3443e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 345071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *ASTContext::createCXXABI(const TargetInfo &T) { 346ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall if (!LangOpts.CPlusPlus) return 0; 347ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall 34820cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis switch (T.getCXXABI()) { 349ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall case CXXABI_ARM: 350ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall return CreateARMCXXABI(*this); 351ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall case CXXABI_Itanium: 352071cc7deffad608165b1ddd5263e8bf181861520Charles Davis return CreateItaniumCXXABI(*this); 35320cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis case CXXABI_Microsoft: 35420cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis return CreateMicrosoftCXXABI(*this); 35520cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis } 3567530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CXXABI type!"); 357071cc7deffad608165b1ddd5263e8bf181861520Charles Davis} 358071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 359bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorstatic const LangAS::Map *getAddressSpaceMap(const TargetInfo &T, 360207f4d8543529221932af82836016a2ef066c917Peter Collingbourne const LangOptions &LOpts) { 361207f4d8543529221932af82836016a2ef066c917Peter Collingbourne if (LOpts.FakeAddressSpaceMap) { 362207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // The fake address space map must have a distinct entry for each 363207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // language-specific address space. 364207f4d8543529221932af82836016a2ef066c917Peter Collingbourne static const unsigned FakeAddrSpaceMap[] = { 365207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 1, // opencl_global 366207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 2, // opencl_local 3674dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 3, // opencl_constant 3684dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 4, // cuda_device 3694dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 5, // cuda_constant 3704dc34ebf2a0716bf77ba110dab6777a3fc4397ddPeter Collingbourne 6 // cuda_shared 371207f4d8543529221932af82836016a2ef066c917Peter Collingbourne }; 372bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return &FakeAddrSpaceMap; 373207f4d8543529221932af82836016a2ef066c917Peter Collingbourne } else { 374bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return &T.getAddressSpaceMap(); 375207f4d8543529221932af82836016a2ef066c917Peter Collingbourne } 376207f4d8543529221932af82836016a2ef066c917Peter Collingbourne} 377207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 3783e3cd93b2fd9644e970c389e715c13883faf68b6Douglas GregorASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM, 379bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor const TargetInfo *t, 380e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar IdentifierTable &idents, SelectorTable &sels, 3811b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner Builtin::Context &builtins, 382bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned size_reserve, 383bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor bool DelayInitialization) 384bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor : FunctionProtoTypes(this_()), 385bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor TemplateSpecializationTypes(this_()), 386bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor DependentTemplateSpecializationTypes(this_()), 387bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor SubstTemplateTemplateParmPacks(this_()), 388bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor GlobalNestedNameSpecifier(0), 389bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Int128Decl(0), UInt128Decl(0), 390c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge BuiltinVaListDecl(0), 391a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor ObjCIdDecl(0), ObjCSelDecl(0), ObjCClassDecl(0), ObjCProtocolClassDecl(0), 392e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor CFConstantStringTypeDecl(0), ObjCInstanceTypeDecl(0), 393bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor FILEDecl(0), 394e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola jmp_bufDecl(0), sigjmp_bufDecl(0), ucontext_tDecl(0), 395e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola BlockDescriptorType(0), BlockDescriptorExtendedType(0), 396e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola cudaConfigureCallDecl(0), 397e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor NullTypeSourceInfo(QualType()), 398e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor FirstLocalImport(), LastLocalImport(), 399bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor SourceMgr(SM), LangOpts(LOpts), 40030c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor AddrSpaceMap(0), Target(t), PrintingPolicy(LOpts), 401bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Idents(idents), Selectors(sels), 402bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor BuiltinInfo(builtins), 403bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor DeclarationNames(*this), 40430c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor ExternalSource(0), Listener(0), 405aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Comments(SM), CommentsLoaded(false), 406bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor LastSDM(0, 0), 407bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor UniqueBlockByRefTypeID(0) 408bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor{ 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (size_reserve > 0) Types.reserve(size_reserve); 410e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar TUDecl = TranslationUnitDecl::Create(*this); 411bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 412bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor if (!DelayInitialization) { 413bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor assert(t && "No target supplied for ASTContext initialization"); 414bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor InitBuiltinTypes(*t); 415bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor } 416e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar} 417e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar 4185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext::~ASTContext() { 4193478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek // Release the DenseMaps associated with DeclContext objects. 4203478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek // FIXME: Is this the ideal solution? 4213478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek ReleaseDeclContextMaps(); 4227d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 42363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // Call all of the deallocation functions. 42463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor for (unsigned I = 0, N = Deallocations.size(); I != N; ++I) 42563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor Deallocations[I].first(Deallocations[I].second); 4260054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 427dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed 42863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // because they can contain DenseMaps. 42963fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor for (llvm::DenseMap<const ObjCContainerDecl*, 43063fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor const ASTRecordLayout*>::iterator 43163fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) 43263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // Increment in loop to prevent using deallocated memory. 43363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 43463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor R->Destroy(*this); 43563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor 436dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator 437dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) { 438dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek // Increment in loop to prevent using deallocated memory. 439dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 440dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek R->Destroy(*this); 441dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek } 4426320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 4436320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(), 4446320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor AEnd = DeclAttrs.end(); 4456320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor A != AEnd; ++A) 4466320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor A->second->~AttrVec(); 4476320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 448ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor 4490054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) { 4500054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor Deallocations.push_back(std::make_pair(Callback, Data)); 4510054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 4520054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 4531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 4546f42b62b6194f53bcbc349f5d17388e1936535d7Dylan NoblesmithASTContext::setExternalSource(OwningPtr<ExternalASTSource> &Source) { 4552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ExternalSource.reset(Source.take()); 4562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 4572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 4585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ASTContext::PrintStats() const { 459cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "\n*** AST Context Stats:\n"; 460cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << " " << Types.size() << " types total.\n"; 4617c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 462dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned counts[] = { 4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define TYPE(Name, Parent) 0, 464dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent) 465dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def" 466dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor 0 // Extra 467dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor }; 468c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor 4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Types.size(); i != e; ++i) { 4705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Type *T = Types[i]; 471dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor counts[(unsigned)T->getTypeClass()]++; 4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 474dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned Idx = 0; 475dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned TotalBytes = 0; 476dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define TYPE(Name, Parent) \ 477dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor if (counts[Idx]) \ 478cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << " " << counts[Idx] << " " << #Name \ 479cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " types\n"; \ 480dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor TotalBytes += counts[Idx] * sizeof(Name##Type); \ 481dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor ++Idx; 482dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent) 483dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def" 4841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 485cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "Total bytes = " << TotalBytes << "\n"; 486cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 4874923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor // Implicit special member functions. 488cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/" 489cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitDefaultConstructors 490cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit default constructors created\n"; 491cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitCopyConstructorsDeclared << "/" 492cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitCopyConstructors 493cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit copy constructors created\n"; 4944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 495cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitMoveConstructorsDeclared << "/" 496cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitMoveConstructors 497cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit move constructors created\n"; 498cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/" 499cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitCopyAssignmentOperators 500cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit copy assignment operators created\n"; 5014e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 502cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/" 503cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitMoveAssignmentOperators 504cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit move assignment operators created\n"; 505cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitDestructorsDeclared << "/" 506cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitDestructors 507cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit destructors created\n"; 508cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 5092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (ExternalSource.get()) { 510cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "\n"; 5112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ExternalSource->PrintStats(); 5122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 513cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 51463fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor BumpAlloc.PrintStats(); 5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 517772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getInt128Decl() const { 518772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (!Int128Decl) { 519772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(Int128Ty); 520772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor Int128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 521772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor getTranslationUnitDecl(), 522772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 523772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 524772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor &Idents.get("__int128_t"), 525772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TInfo); 526772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 527772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 528772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor return Int128Decl; 529772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor} 530772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 531772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getUInt128Decl() const { 532772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (!UInt128Decl) { 533772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(UnsignedInt128Ty); 534772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor UInt128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 535772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor getTranslationUnitDecl(), 536772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 537772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 538772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor &Idents.get("__uint128_t"), 539772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TInfo); 540772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 541772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 542772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor return UInt128Decl; 543772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor} 5445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 545e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallvoid ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) { 5466b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K); 547e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall R = CanQualType::CreateUnsafe(QualType(Ty, 0)); 5486b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Types.push_back(Ty); 5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 551bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorvoid ASTContext::InitBuiltinTypes(const TargetInfo &Target) { 552bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor assert((!this->Target || this->Target == &Target) && 553bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor "Incorrect target reinitialization"); 5545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(VoidTy.isNull() && "Context reinitialized?"); 5551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 556bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor this->Target = &Target; 557bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 558bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor ABI.reset(createCXXABI(Target)); 559bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor AddrSpaceMap = getAddressSpaceMap(Target, LangOpts); 560bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p19. 5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(VoidTy, BuiltinType::Void); 5631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p2. 5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(BoolTy, BuiltinType::Bool); 5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p3. 56715b91764d08e886391c865c4a444d7b51141c284Eli Friedman if (LangOpts.CharIsSigned) 5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(CharTy, BuiltinType::Char_S); 5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(CharTy, BuiltinType::Char_U); 5715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p4. 5725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(SignedCharTy, BuiltinType::SChar); 5735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(ShortTy, BuiltinType::Short); 5745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(IntTy, BuiltinType::Int); 5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongTy, BuiltinType::Long); 5765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongLongTy, BuiltinType::LongLong); 5771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p6. 5795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedCharTy, BuiltinType::UChar); 5805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedShortTy, BuiltinType::UShort); 5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedIntTy, BuiltinType::UInt); 5825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedLongTy, BuiltinType::ULong); 5835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedLongLongTy, BuiltinType::ULongLong); 5841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p10. 5865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(FloatTy, BuiltinType::Float); 5875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(DoubleTy, BuiltinType::Double); 5885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongDoubleTy, BuiltinType::LongDouble); 58964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 5902df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner // GNU extension, 128-bit integers. 5912df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner InitBuiltinType(Int128Ty, BuiltinType::Int128); 5922df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner InitBuiltinType(UnsignedInt128Ty, BuiltinType::UInt128); 5932df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner 5943f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner if (LangOpts.CPlusPlus) { // C++ 3.9.1p5 595d3d77cd138f8e830f6547b6f83fcd5721ccf5f5dEli Friedman if (TargetInfo::isTypeSigned(Target.getWCharType())) 5963f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner InitBuiltinType(WCharTy, BuiltinType::WChar_S); 5973f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner else // -fshort-wchar makes wchar_t be unsigned. 5983f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner InitBuiltinType(WCharTy, BuiltinType::WChar_U); 5993f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner } else // C99 6003a2503227c3db04a3619735127483263c1075ef7Chris Lattner WCharTy = getFromTargetType(Target.getWCharType()); 60164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 602392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy WIntTy = getFromTargetType(Target.getWIntType()); 603392da48160bd92ceb486792780467cbfdb2d0e8cJames Molloy 604f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 605f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith InitBuiltinType(Char16Ty, BuiltinType::Char16); 606f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith else // C99 607f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char16Ty = getFromTargetType(Target.getChar16Type()); 608f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 609f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 610f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith InitBuiltinType(Char32Ty, BuiltinType::Char32); 611f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith else // C99 612f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char32Ty = getFromTargetType(Target.getChar32Type()); 613f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 614898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // Placeholder type for type-dependent expressions whose type is 615898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // completely unknown. No code should ever check a type against 616898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // DependentTy and users should never see it; however, it is here to 617898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // help diagnose failures to properly check for type-dependent 618898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // expressions. 619898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor InitBuiltinType(DependentTy, BuiltinType::Dependent); 6208e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 6212a984cad5ac3fdceeff2bd99daa7b90979313475John McCall // Placeholder type for functions. 6222a984cad5ac3fdceeff2bd99daa7b90979313475John McCall InitBuiltinType(OverloadTy, BuiltinType::Overload); 6232a984cad5ac3fdceeff2bd99daa7b90979313475John McCall 624864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // Placeholder type for bound members. 625864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall InitBuiltinType(BoundMemberTy, BuiltinType::BoundMember); 626864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 6273c3b7f90a863af43fa63043d396553ecf205351cJohn McCall // Placeholder type for pseudo-objects. 6283c3b7f90a863af43fa63043d396553ecf205351cJohn McCall InitBuiltinType(PseudoObjectTy, BuiltinType::PseudoObject); 6293c3b7f90a863af43fa63043d396553ecf205351cJohn McCall 6301de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall // "any" type; useful for debugger-like clients. 6311de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall InitBuiltinType(UnknownAnyTy, BuiltinType::UnknownAny); 6321de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall 6330ddaeb9b031070ec64afe92d9892875ac44df427John McCall // Placeholder type for unbridged ARC casts. 6340ddaeb9b031070ec64afe92d9892875ac44df427John McCall InitBuiltinType(ARCUnbridgedCastTy, BuiltinType::ARCUnbridgedCast); 6350ddaeb9b031070ec64afe92d9892875ac44df427John McCall 6365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p11. 6375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer FloatComplexTy = getComplexType(FloatTy); 6385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DoubleComplexTy = getComplexType(DoubleTy); 6395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer LongDoubleComplexTy = getComplexType(LongDoubleTy); 6408e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 64113dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian // Builtin types for 'id', 'Class', and 'SEL'. 642de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId); 643de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass); 64413dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel); 645ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 646ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // Builtin type for __objc_yes and __objc_no 64793a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ? 64893a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian SignedCharTy : BoolTy); 649ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 650a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCConstantStringType = QualType(); 6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // void * type 65333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian VoidPtrTy = getPointerType(VoidTy); 6546e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 6556e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // nullptr type (C++0x 2.14.7) 6566e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl InitBuiltinType(NullPtrTy, BuiltinType::NullPtr); 657aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov 658aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov // half type (OpenCL 6.1.1.1) / ARM NEON __fp16 659aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov InitBuiltinType(HalfTy, BuiltinType::Half); 660fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 661fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // Builtin type used to help define __builtin_va_list. 662fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge VaListTagTy = QualType(); 6635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 665d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikieDiagnosticsEngine &ASTContext::getDiagnostics() const { 66678a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis return SourceMgr.getDiagnostics(); 66778a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis} 66878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis 6696320064d0c60fa8683f5623881c9394fd4aa7689Douglas GregorAttrVec& ASTContext::getDeclAttrs(const Decl *D) { 6706320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor AttrVec *&Result = DeclAttrs[D]; 6716320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor if (!Result) { 6726320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor void *Mem = Allocate(sizeof(AttrVec)); 6736320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor Result = new (Mem) AttrVec; 6746320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor } 6756320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 6766320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor return *Result; 6776320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 6786320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 6796320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor/// \brief Erase the attributes corresponding to the given declaration. 6806320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregorvoid ASTContext::eraseDeclAttrs(const Decl *D) { 6816320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D); 6826320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor if (Pos != DeclAttrs.end()) { 6836320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor Pos->second->~AttrVec(); 6846320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor DeclAttrs.erase(Pos); 6856320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor } 6866320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 6876320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 688251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorMemberSpecializationInfo * 689663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas GregorASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) { 6907caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Var->isStaticDataMember() && "Not a static data member"); 691663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos 6927caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor = InstantiatedFromStaticDataMember.find(Var); 6937caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Pos == InstantiatedFromStaticDataMember.end()) 6947caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return 0; 6951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6967caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return Pos->second; 6977caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 6987caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 6991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 700251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, 7019421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis TemplateSpecializationKind TSK, 7029421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis SourceLocation PointOfInstantiation) { 7037caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Inst->isStaticDataMember() && "Not a static data member"); 7047caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Tmpl->isStaticDataMember() && "Not a static data member"); 7057caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(!InstantiatedFromStaticDataMember[Inst] && 7067caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor "Already noted what static data member was instantiated from"); 707251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor InstantiatedFromStaticDataMember[Inst] 7089421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis = new (*this) MemberSpecializationInfo(Tmpl, TSK, PointOfInstantiation); 7097caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 7107caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 711af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetFunctionDecl *ASTContext::getClassScopeSpecializationPattern( 712af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet const FunctionDecl *FD){ 713af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(FD && "Specialization is 0"); 714af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet llvm::DenseMap<const FunctionDecl*, FunctionDecl *>::const_iterator Pos 7150d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet = ClassScopeSpecializationPattern.find(FD); 7160d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet if (Pos == ClassScopeSpecializationPattern.end()) 717af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return 0; 718af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 719af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return Pos->second; 720af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 721af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 722af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichetvoid ASTContext::setClassScopeSpecializationPattern(FunctionDecl *FD, 723af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet FunctionDecl *Pattern) { 724af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(FD && "Specialization is 0"); 725af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(Pattern && "Class scope specialization pattern is 0"); 7260d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet ClassScopeSpecializationPattern[FD] = Pattern; 727af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 728af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 7297ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallNamedDecl * 730ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) { 7317ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos 732ed97649e9574b9d854fa4d6109c9333ae0993554John McCall = InstantiatedFromUsingDecl.find(UUD); 733ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Pos == InstantiatedFromUsingDecl.end()) 7340d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return 0; 7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7360d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return Pos->second; 7370d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 7380d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 7390d8df780aef1acda5962347a32591efc629b6748Anders Carlssonvoid 740ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) { 741ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert((isa<UsingDecl>(Pattern) || 742ed97649e9574b9d854fa4d6109c9333ae0993554John McCall isa<UnresolvedUsingValueDecl>(Pattern) || 743ed97649e9574b9d854fa4d6109c9333ae0993554John McCall isa<UnresolvedUsingTypenameDecl>(Pattern)) && 744ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "pattern decl is not a using decl"); 745ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists"); 746ed97649e9574b9d854fa4d6109c9333ae0993554John McCall InstantiatedFromUsingDecl[Inst] = Pattern; 747ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 748ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 749ed97649e9574b9d854fa4d6109c9333ae0993554John McCallUsingShadowDecl * 750ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) { 751ed97649e9574b9d854fa4d6109c9333ae0993554John McCall llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos 752ed97649e9574b9d854fa4d6109c9333ae0993554John McCall = InstantiatedFromUsingShadowDecl.find(Inst); 753ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Pos == InstantiatedFromUsingShadowDecl.end()) 754ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return 0; 755ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 756ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Pos->second; 757ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 758ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 759ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid 760ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, 761ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingShadowDecl *Pattern) { 762ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists"); 763ed97649e9574b9d854fa4d6109c9333ae0993554John McCall InstantiatedFromUsingShadowDecl[Inst] = Pattern; 7640d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 7650d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 766d8b285fee4471f393da8ee30f552ceacdc362afaAnders CarlssonFieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) { 767d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos 768d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson = InstantiatedFromUnnamedFieldDecl.find(Field); 769d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (Pos == InstantiatedFromUnnamedFieldDecl.end()) 770d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return 0; 7711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 772d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return Pos->second; 773d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson} 774d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 775d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlssonvoid ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, 776d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson FieldDecl *Tmpl) { 777d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed"); 778d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Tmpl->getDeclName() && "Template field decl is not unnamed"); 779d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!InstantiatedFromUnnamedFieldDecl[Inst] && 780d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson "Already noted what unnamed field was instantiated from"); 7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 782d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl; 783d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson} 784d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 78514d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanianbool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD, 78614d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian const FieldDecl *LastFD) const { 78714d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian return (FD->isBitField() && LastFD && !LastFD->isBitField() && 788a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) == 0); 78914d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian} 79014d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian 791340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanianbool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD, 792340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian const FieldDecl *LastFD) const { 793340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian return (FD->isBitField() && LastFD && LastFD->isBitField() && 794a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) == 0 && 795a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this) != 0); 796340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian} 797340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian 7989b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanianbool ASTContext::BitfieldFollowsBitfield(const FieldDecl *FD, 7999b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian const FieldDecl *LastFD) const { 8009b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian return (FD->isBitField() && LastFD && LastFD->isBitField() && 801a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) && 802a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this)); 8039b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian} 8049b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian 805dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::NonBitfieldFollowsBitfield(const FieldDecl *FD, 80652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian const FieldDecl *LastFD) const { 80752bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian return (!FD->isBitField() && LastFD && LastFD->isBitField() && 808a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this)); 80952bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian} 81052bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian 811dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::BitfieldFollowsNonBitfield(const FieldDecl *FD, 81252bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian const FieldDecl *LastFD) const { 81352bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian return (FD->isBitField() && LastFD && !LastFD->isBitField() && 814a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this)); 81552bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian} 81652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian 8177d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator 8187d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const { 8197d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 8207d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor = OverriddenMethods.find(Method); 8217d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor if (Pos == OverriddenMethods.end()) 8227d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return 0; 8237d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 8247d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return Pos->second.begin(); 8257d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 8267d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 8277d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator 8287d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_end(const CXXMethodDecl *Method) const { 8297d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 8307d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor = OverriddenMethods.find(Method); 8317d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor if (Pos == OverriddenMethods.end()) 8327d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return 0; 8337d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 8347d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return Pos->second.end(); 8357d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 8367d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 837c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned 838c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios KyrtzidisASTContext::overridden_methods_size(const CXXMethodDecl *Method) const { 839c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 840c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis = OverriddenMethods.find(Method); 841c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Pos == OverriddenMethods.end()) 842c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return 0; 843c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 844c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return Pos->second.size(); 845c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis} 846c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 8477d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregorvoid ASTContext::addOverriddenMethod(const CXXMethodDecl *Method, 8487d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor const CXXMethodDecl *Overridden) { 8497d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor OverriddenMethods[Method].push_back(Overridden); 8507d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 8517d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 852e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregorvoid ASTContext::addedLocalImportDecl(ImportDecl *Import) { 853e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor assert(!Import->NextLocalImport && "Import declaration already in the chain"); 854e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor assert(!Import->isFromASTFile() && "Non-local import declaration"); 855e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor if (!FirstLocalImport) { 856e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor FirstLocalImport = Import; 857e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport = Import; 858e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor return; 859e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor } 860e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor 861e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport->NextLocalImport = Import; 862e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport = Import; 863e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor} 864e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor 865464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===// 866464175bba1318bef7905122e9fda20cff926df78Chris Lattner// Type Sizing and Analysis 867464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===// 868a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 869b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified 870b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// scalar floating point type. 871b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattnerconst llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const { 872183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const BuiltinType *BT = T->getAs<BuiltinType>(); 873b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner assert(BT && "Not a floating point type!"); 874b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner switch (BT->getKind()) { 875b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Not a floating point type!"); 876aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: return Target->getHalfFormat(); 877bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::Float: return Target->getFloatFormat(); 878bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::Double: return Target->getDoubleFormat(); 879bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::LongDouble: return Target->getLongDoubleFormat(); 880b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner } 881b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner} 882b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner 8838b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck/// getDeclAlign - Return a conservative estimate of the alignment of the 884af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// specified decl. Note that bitfields do not have a valid alignment, so 885af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// this method will assert on them. 8865d484e8cf710207010720589d89602233de61d01Sebastian Redl/// If @p RefAsPointee, references are treated like their underlying type 8875d484e8cf710207010720589d89602233de61d01Sebastian Redl/// (for alignof), else they're treated like pointers (for CodeGen). 8884ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const { 889bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned Align = Target->getCharWidth(); 890dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 8914081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall bool UseAlignAttrOnly = false; 8924081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (unsigned AlignFromAttr = D->getMaxAlignment()) { 8934081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall Align = AlignFromAttr; 8944081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall 8954081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // __attribute__((aligned)) can increase or decrease alignment 8964081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // *except* on a struct or struct member, where it only increases 8974081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // alignment unless 'packed' is also specified. 8984081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // 89982d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne // It is an error for alignas to decrease alignment, so we can 9004081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // ignore that possibility; Sema should diagnose it. 9014081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (isa<FieldDecl>(D)) { 9024081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall UseAlignAttrOnly = D->hasAttr<PackedAttr>() || 9034081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 9044081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } else { 9054081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall UseAlignAttrOnly = true; 9064081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } 9074081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } 90878a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian else if (isa<FieldDecl>(D)) 90978a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian UseAlignAttrOnly = 91078a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian D->hasAttr<PackedAttr>() || 91178a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 912dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 913ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // If we're using the align attribute only, just ignore everything 914ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // else about the declaration and its type. 9154081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (UseAlignAttrOnly) { 916ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // do nothing 917ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 9184081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } else if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 919af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner QualType T = VD->getType(); 9206217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const ReferenceType* RT = T->getAs<ReferenceType>()) { 9215d484e8cf710207010720589d89602233de61d01Sebastian Redl if (RefAsPointee) 9225d484e8cf710207010720589d89602233de61d01Sebastian Redl T = RT->getPointeeType(); 9235d484e8cf710207010720589d89602233de61d01Sebastian Redl else 9245d484e8cf710207010720589d89602233de61d01Sebastian Redl T = getPointerType(RT->getPointeeType()); 9255d484e8cf710207010720589d89602233de61d01Sebastian Redl } 9265d484e8cf710207010720589d89602233de61d01Sebastian Redl if (!T->isIncompleteType() && !T->isFunctionType()) { 9273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Adjust alignments of declarations with array type by the 9283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // large-array alignment on the target. 929bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned MinWidth = Target->getLargeArrayMinWidth(); 9303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall const ArrayType *arrayType; 9313b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (MinWidth && (arrayType = getAsArrayType(T))) { 9323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (isa<VariableArrayType>(arrayType)) 933bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = std::max(Align, Target->getLargeArrayAlign()); 9343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall else if (isa<ConstantArrayType>(arrayType) && 9353b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType))) 936bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = std::max(Align, Target->getLargeArrayAlign()); 9373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 9383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Walk through any array types while we're at it. 9393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall T = getBaseElementType(arrayType); 9406deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola } 9419f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr())); 942dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman } 943ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 944ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Fields can be subject to extra alignment constraints, like if 945ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // the field is packed, the struct is packed, or the struct has a 946ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // a max-field-alignment constraint (#pragma pack). So calculate 947ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // the actual alignment of the field within the struct, and then 948ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // (as we're expected to) constrain that by the alignment of the type. 949ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (const FieldDecl *field = dyn_cast<FieldDecl>(VD)) { 950ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // So calculate the alignment of the field. 951ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall const ASTRecordLayout &layout = getASTRecordLayout(field->getParent()); 952ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 953ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Start with the record's overall alignment. 954dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck unsigned fieldAlign = toBits(layout.getAlignment()); 955ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 956ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Use the GCD of that and the offset within the record. 957ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall uint64_t offset = layout.getFieldOffset(field->getFieldIndex()); 958ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (offset > 0) { 959ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Alignment is always a power of 2, so the GCD will be a power of 2, 960ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // which means we get to do this crazy thing instead of Euclid's. 961ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall uint64_t lowBitOfOffset = offset & (~offset + 1); 962ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (lowBitOfOffset < fieldAlign) 963ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall fieldAlign = static_cast<unsigned>(lowBitOfOffset); 964ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall } 965ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 966ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall Align = std::min(Align, fieldAlign); 96705f62474dd2b0f1cb69adbe0787f2868788aa949Charles Davis } 968af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner } 969dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 970eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(Align); 971af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner} 972b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner 973ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits> 974bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(const Type *T) const { 975ea1471e0e967548c596a71469702f8846dbaf3c0John McCall std::pair<uint64_t, unsigned> Info = getTypeInfo(T); 976eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return std::make_pair(toCharUnitsFromBits(Info.first), 977eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck toCharUnitsFromBits(Info.second)); 978ea1471e0e967548c596a71469702f8846dbaf3c0John McCall} 979ea1471e0e967548c596a71469702f8846dbaf3c0John McCall 980ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits> 981bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(QualType T) const { 982ea1471e0e967548c596a71469702f8846dbaf3c0John McCall return getTypeInfoInChars(T.getTypePtr()); 983ea1471e0e967548c596a71469702f8846dbaf3c0John McCall} 984ea1471e0e967548c596a71469702f8846dbaf3c0John McCall 985bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbarstd::pair<uint64_t, unsigned> ASTContext::getTypeInfo(const Type *T) const { 986bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar TypeInfoMap::iterator it = MemoizedTypeInfo.find(T); 987bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar if (it != MemoizedTypeInfo.end()) 988bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar return it->second; 989bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar 990bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar std::pair<uint64_t, unsigned> Info = getTypeInfoImpl(T); 991bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar MemoizedTypeInfo.insert(std::make_pair(T, Info)); 992bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar return Info; 993bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar} 994bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar 995bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// getTypeInfoImpl - Return the size of the specified type, in bits. This 996bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// method does not work on incomplete types. 9970953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// 9980953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// FIXME: Pointers into different addr spaces could have different sizes and 9990953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// alignment requirements: getPointerInfo should take an AddrSpace, this 10000953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// should take a QualType, &c. 1001d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattnerstd::pair<uint64_t, unsigned> 1002bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel DunbarASTContext::getTypeInfoImpl(const Type *T) const { 10035e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump uint64_t Width=0; 10045e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump unsigned Align=8; 1005a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner switch (T->getTypeClass()) { 100672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base) 100772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base) 100818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor#define NON_CANONICAL_TYPE(Class, Base) 100972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class: 101072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def" 1011d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall llvm_unreachable("Should not see dependent types"); 101272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 10135d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::FunctionNoProto: 10145d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::FunctionProto: 101518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // GCC extension: alignof(function) = 32 bits 101618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 101718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = 32; 101818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 101918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 102072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::IncompleteArray: 1021fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::VariableArray: 102218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 102318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = getTypeAlign(cast<ArrayType>(T)->getElementType()); 102418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 102518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 1026fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::ConstantArray: { 10271d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const ConstantArrayType *CAT = cast<ConstantArrayType>(T); 10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 102998be4943e8dc4f3905629a7102668960873cf863Chris Lattner std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType()); 1030fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara uint64_t Size = CAT->getSize().getZExtValue(); 1031bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar assert((Size == 0 || EltInfo.first <= (uint64_t)(-1)/Size) && 1032bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar "Overflow in array type bit size evaluation"); 1033fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara Width = EltInfo.first*Size; 1034030d8846c7e520330007087e949f621989876e3aChris Lattner Align = EltInfo.second; 1035cd88b4171753dcb2bc0a21d78f1597c796bb8a20Argyrios Kyrtzidis Width = llvm::RoundUpToAlignment(Width, Align); 1036030d8846c7e520330007087e949f621989876e3aChris Lattner break; 10375c09a02a5db85e08a432b6eeced9aa656349710dChristopher Lamb } 1038213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman case Type::ExtVector: 1039030d8846c7e520330007087e949f621989876e3aChris Lattner case Type::Vector: { 10409fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner const VectorType *VT = cast<VectorType>(T); 10419fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType()); 10429fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Width = EltInfo.first*VT->getNumElements(); 10434bd998bbc228915d2b9cae5b67879de48940d05eEli Friedman Align = Width; 10446fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman // If the alignment is not a power of 2, round up to the next power of 2. 10456fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman // This happens for non-power-of-2 length vectors. 10468eefcd353c1d06a10104f69e5079ebab3183f9a3Dan Gohman if (Align & (Align-1)) { 10479fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Align = llvm::NextPowerOf2(Align); 10489fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Width = llvm::RoundUpToAlignment(Width, Align); 10499fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner } 1050f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier // Adjust the alignment based on the target max. 1051f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier uint64_t TargetVectorAlign = Target->getMaxVectorAlign(); 1052f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier if (TargetVectorAlign && TargetVectorAlign < Align) 1053f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier Align = TargetVectorAlign; 1054030d8846c7e520330007087e949f621989876e3aChris Lattner break; 1055030d8846c7e520330007087e949f621989876e3aChris Lattner } 10565d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner 10579e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner case Type::Builtin: 1058a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner switch (cast<BuiltinType>(T)->getKind()) { 1059b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown builtin type!"); 1060d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner case BuiltinType::Void: 106118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // GCC extension: alignof(void) = 8 bits. 106218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 106318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = 8; 106418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 106518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 10666f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Bool: 1067bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getBoolWidth(); 1068bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getBoolAlign(); 10696f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1070692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::Char_S: 1071692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::Char_U: 1072692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UChar: 10736f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::SChar: 1074bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getCharWidth(); 1075bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getCharAlign(); 10766f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 10773f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 10783f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 1079bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getWCharWidth(); 1080bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getWCharAlign(); 108164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis break; 1082f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case BuiltinType::Char16: 1083bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getChar16Width(); 1084bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getChar16Align(); 1085f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith break; 1086f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case BuiltinType::Char32: 1087bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getChar32Width(); 1088bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getChar32Align(); 1089f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith break; 1090692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UShort: 10916f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Short: 1092bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getShortWidth(); 1093bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getShortAlign(); 10946f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1095692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UInt: 10966f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Int: 1097bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getIntWidth(); 1098bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getIntAlign(); 10996f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1100692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::ULong: 11016f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Long: 1102bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongWidth(); 1103bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongAlign(); 11046f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1105692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::ULongLong: 11066f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::LongLong: 1107bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongLongWidth(); 1108bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongLongAlign(); 11096f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1110ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner case BuiltinType::Int128: 1111ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner case BuiltinType::UInt128: 1112ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner Width = 128; 1113ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner Align = 128; // int128_t is 128-bit aligned on all targets. 1114ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner break; 1115aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: 1116aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov Width = Target->getHalfWidth(); 1117aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov Align = Target->getHalfAlign(); 1118aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov break; 11196f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Float: 1120bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getFloatWidth(); 1121bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getFloatAlign(); 11226f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 11236f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Double: 1124bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getDoubleWidth(); 1125bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getDoubleAlign(); 11266f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 11276f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::LongDouble: 1128bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongDoubleWidth(); 1129bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongDoubleAlign(); 11306f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 11316e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl case BuiltinType::NullPtr: 1132bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t) 1133bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); // == sizeof(void*) 11341590d9c0fec4c710c2962e4bb71f76979b5163d3Sebastian Redl break; 1135e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCId: 1136e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCClass: 1137e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCSel: 1138bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); 1139bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); 1140e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian break; 1141a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner } 1142bfef6d7c67831a135d6ab79931f010f750a730adChris Lattner break; 1143d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff case Type::ObjCObjectPointer: 1144bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); 1145bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); 11466f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 1147485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff case Type::BlockPointer: { 1148207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace( 1149207f4d8543529221932af82836016a2ef066c917Peter Collingbourne cast<BlockPointerType>(T)->getPointeeType()); 1150bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1151bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 1152485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff break; 1153485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff } 11545d484e8cf710207010720589d89602233de61d01Sebastian Redl case Type::LValueReference: 11555d484e8cf710207010720589d89602233de61d01Sebastian Redl case Type::RValueReference: { 11565d484e8cf710207010720589d89602233de61d01Sebastian Redl // alignof and sizeof should never enter this code path here, so we go 11575d484e8cf710207010720589d89602233de61d01Sebastian Redl // the pointer route. 1158207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace( 1159207f4d8543529221932af82836016a2ef066c917Peter Collingbourne cast<ReferenceType>(T)->getPointeeType()); 1160bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1161bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 11625d484e8cf710207010720589d89602233de61d01Sebastian Redl break; 11635d484e8cf710207010720589d89602233de61d01Sebastian Redl } 1164f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner case Type::Pointer: { 1165207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType()); 1166bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 1167bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 1168f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner break; 1169f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner } 1170f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl case Type::MemberPointer: { 1171071cc7deffad608165b1ddd5263e8bf181861520Charles Davis const MemberPointerType *MPT = cast<MemberPointerType>(T); 11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<uint64_t, unsigned> PtrDiffInfo = 11731cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson getTypeInfo(getPointerDiffType()); 1174071cc7deffad608165b1ddd5263e8bf181861520Charles Davis Width = PtrDiffInfo.first * ABI->getMemberPointerSize(MPT); 11751cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson Align = PtrDiffInfo.second; 11761cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson break; 1177f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl } 11785d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::Complex: { 11795d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner // Complex types have the same alignment as their elements, but twice the 11805d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner // size. 11811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<uint64_t, unsigned> EltInfo = 118298be4943e8dc4f3905629a7102668960873cf863Chris Lattner getTypeInfo(cast<ComplexType>(T)->getElementType()); 11839e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner Width = EltInfo.first*2; 11845d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner Align = EltInfo.second; 11855d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner break; 11865d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner } 1187c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: 1188c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr()); 118944a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel case Type::ObjCInterface: { 11901d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T); 119144a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl()); 1192dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck Width = toBits(Layout.getSize()); 1193dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck Align = toBits(Layout.getAlignment()); 119444a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel break; 119544a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel } 119672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Record: 119772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Enum: { 11981d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const TagType *TT = cast<TagType>(T); 11991d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar 12001d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar if (TT->getDecl()->isInvalidDecl()) { 120122ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor Width = 8; 120222ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor Align = 8; 12038389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner break; 12048389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner } 12051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12061d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar if (const EnumType *ET = dyn_cast<EnumType>(TT)) 12077176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner return getTypeInfo(ET->getDecl()->getIntegerType()); 12087176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner 12091d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const RecordType *RT = cast<RecordType>(TT); 12107176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl()); 1211dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck Width = toBits(Layout.getSize()); 1212dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck Align = toBits(Layout.getAlignment()); 1213dc0d73e6495404418acf8548875aeaff07791a74Chris Lattner break; 1214a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner } 12157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 12169fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner case Type::SubstTemplateTypeParm: 121749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return getTypeInfo(cast<SubstTemplateTypeParmType>(T)-> 121849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall getReplacementType().getTypePtr()); 121949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 122034b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: { 122134b41d939a1328f484511c6002ba2456db879a29Richard Smith const AutoType *A = cast<AutoType>(T); 122234b41d939a1328f484511c6002ba2456db879a29Richard Smith assert(A->isDeduced() && "Cannot request the size of a dependent type"); 1223dc856aff4428380baa9afb5577ea04f8fb6beb13Matt Beaumont-Gay return getTypeInfo(A->getDeducedType().getTypePtr()); 122434b41d939a1328f484511c6002ba2456db879a29Richard Smith } 122534b41d939a1328f484511c6002ba2456db879a29Richard Smith 1226075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara case Type::Paren: 1227075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr()); 1228075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 122918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::Typedef: { 1230162e1c1b487352434552147967c3dd296ebee2f7Richard Smith const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl(); 1231df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor std::pair<uint64_t, unsigned> Info 1232df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor = getTypeInfo(Typedef->getUnderlyingType().getTypePtr()); 1233c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // If the typedef has an aligned attribute on it, it overrides any computed 1234c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // alignment we have. This violates the GCC documentation (which says that 1235c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // attribute(aligned) can only round up) but matches its implementation. 1236c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner if (unsigned AttrAlign = Typedef->getMaxAlignment()) 1237c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner Align = AttrAlign; 1238c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner else 1239c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner Align = Info.second; 1240df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor Width = Info.first; 12417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor break; 12427176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner } 124318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 124418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::TypeOfExpr: 124518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType() 124618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor .getTypePtr()); 124718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 124818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::TypeOf: 124918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr()); 125018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 1251395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson case Type::Decltype: 1252395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType() 1253395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson .getTypePtr()); 1254395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 1255ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 1256ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType()); 1257ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 1258465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara case Type::Elaborated: 1259465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr()); 12601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall case Type::Attributed: 12629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return getTypeInfo( 12639d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T)->getEquivalentType().getTypePtr()); 12649d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 12653e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith case Type::TemplateSpecialization: { 12661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(getCanonicalType(T) != T && 126718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor "Cannot request the size of a dependent type"); 12683e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T); 12693e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // A type alias template specialization may refer to a typedef with the 12703e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // aligned attribute on it. 12713e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (TST->isTypeAlias()) 12723e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return getTypeInfo(TST->getAliasedType().getTypePtr()); 12733e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else 12743e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return getTypeInfo(getCanonicalType(T)); 12753e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 12763e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 1277b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 12782be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman std::pair<uint64_t, unsigned> Info 12792be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman = getTypeInfo(cast<AtomicType>(T)->getValueType()); 12802be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Width = Info.first; 12812be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Align = Info.second; 12822be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman if (Width != 0 && Width <= Target->getMaxAtomicPromoteWidth() && 12832be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman llvm::isPowerOf2_64(Width)) { 12842be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // We can potentially perform lock-free atomic operations for this 12852be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // type; promote the alignment appropriately. 12862be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // FIXME: We could potentially promote the width here as well... 12872be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // is that worthwhile? (Non-struct atomic types generally have 12882be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // power-of-two size anyway, but structs might not. Requires a bit 12892be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // of implementation work to make sure we zero out the extra bits.) 12902be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Align = static_cast<unsigned>(Width); 12912be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman } 1292b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 1293b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 129418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor } 12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12962be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2"); 12979e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner return std::make_pair(Width, Align); 1298a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner} 1299a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 1300eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck/// toCharUnitsFromBits - Convert a size in bits to a size in characters. 1301eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen DyckCharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const { 1302eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return CharUnits::fromQuantity(BitSize / getCharWidth()); 1303eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck} 1304eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck 1305dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck/// toBits - Convert a size in characters to a size in characters. 1306dd76a9ab9ea675671200f94b18ce95766841952bKen Dyckint64_t ASTContext::toBits(CharUnits CharSize) const { 1307dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck return CharSize.getQuantity() * getCharWidth(); 1308dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck} 1309dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck 1310bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// getTypeSizeInChars - Return the size of the specified type, in characters. 1311bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// This method does not work on incomplete types. 13124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(QualType T) const { 1313eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeSize(T)); 1314bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck} 13154ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(const Type *T) const { 1316eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeSize(T)); 1317bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck} 1318bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck 131916e20cce43385001f33f8e3f90ee345609c805d1Ken Dyck/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in 132086fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck/// characters. This method does not work on incomplete types. 13214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(QualType T) const { 1322eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeAlign(T)); 132386fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck} 13244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(const Type *T) const { 1325eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeAlign(T)); 132686fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck} 132786fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck 132834ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// getPreferredTypeAlign - Return the "preferred" alignment of the specified 132934ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// type for the current target in bits. This can be different than the ABI 133034ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// alignment in cases where it is beneficial for performance to overalign 133134ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// a data type. 13324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getPreferredTypeAlign(const Type *T) const { 133334ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner unsigned ABIAlign = getTypeAlign(T); 13341eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman 13351eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman // Double and long long should be naturally aligned if possible. 1336183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType* CT = T->getAs<ComplexType>()) 13371eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman T = CT->getElementType().getTypePtr(); 13381eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman if (T->isSpecificBuiltinType(BuiltinType::Double) || 1339cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier T->isSpecificBuiltinType(BuiltinType::LongLong) || 1340cde7a1dc68af2eb063a039b5a31c3b7dd92b1aa9Chad Rosier T->isSpecificBuiltinType(BuiltinType::ULongLong)) 13411eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman return std::max(ABIAlign, (unsigned)getTypeSize(T)); 13421eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman 134334ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner return ABIAlign; 134434ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner} 134534ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner 13462c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// DeepCollectObjCIvars - 13472c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// This routine first collects all declared, but not synthesized, ivars in 13482c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// super class and then collects all ivars, including those synthesized for 13492c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// current class. This routine is used for implementation of current class 13502c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// when all ivars, declared and synthesized are known. 13519820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian/// 13522c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanianvoid ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, 13532c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian bool leafClass, 1354db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const { 13552c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass()) 13562c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian DeepCollectObjCIvars(SuperClass, false, Ivars); 13572c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (!leafClass) { 13582c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(), 13592c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian E = OI->ivar_end(); I != E; ++I) 1360581deb3da481053c4993c7600f97acf7768caac5David Blaikie Ivars.push_back(*I); 13613060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 1362bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI); 1363db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv; 1364bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian Iv= Iv->getNextIvar()) 1365bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian Ivars.push_back(Iv); 1366bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian } 13679820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian} 13689820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian 1369e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// CollectInheritedProtocols - Collect all protocols in current class and 1370e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// those inherited by it. 1371e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid ASTContext::CollectInheritedProtocols(const Decl *CDecl, 1372432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) { 1373e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) { 137453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // We can use protocol_iterator here instead of 137553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // all_referenced_protocol_iterator since we are walking all categories. 137653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator P = OI->all_referenced_protocol_begin(), 137753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PE = OI->all_referenced_protocol_end(); P != PE; ++P) { 1378e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 13793fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1380e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1381b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) { 13823fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert((*P)->getCanonicalDecl()); 1383e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1384e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1385b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian } 1386e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 1387e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian // Categories of this Interface. 1388e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (const ObjCCategoryDecl *CDeclChain = OI->getCategoryList(); 1389e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CDeclChain; CDeclChain = CDeclChain->getNextClassCategory()) 1390e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(CDeclChain, Protocols); 1391e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (ObjCInterfaceDecl *SD = OI->getSuperClass()) 1392e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian while (SD) { 1393e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(SD, Protocols); 1394e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian SD = SD->getSuperClass(); 1395e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1396b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) { 139753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = OC->protocol_begin(), 1398e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = OC->protocol_end(); P != PE; ++P) { 1399e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 14003fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1401e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1402e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) 1403e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1404e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1405b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) { 1406e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(), 1407e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = OP->protocol_end(); P != PE; ++P) { 1408e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 14093fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1410e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1411e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) 1412e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1413e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1414e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1415e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian} 1416e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 14174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const { 14183bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian unsigned count = 0; 14193bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // Count ivars declared in class extension. 142080aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian for (const ObjCCategoryDecl *CDecl = OI->getFirstClassExtension(); CDecl; 142180aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian CDecl = CDecl->getNextClassExtension()) 1422b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer count += CDecl->ivar_size(); 1423b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer 14243bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // Count ivar defined in this class's implementation. This 14253bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // includes synthesized ivars. 14263bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) 1427b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer count += ImplDecl->ivar_size(); 1428b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer 14298e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian return count; 14308e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian} 14318e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian 14328deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidisbool ASTContext::isSentinelNullExpr(const Expr *E) { 14338deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (!E) 14348deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return false; 14358deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14368deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis // nullptr_t is always treated as null. 14378deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (E->getType()->isNullPtrType()) return true; 14388deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14398deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (E->getType()->isAnyPointerType() && 14408deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis E->IgnoreParenCasts()->isNullPointerConstant(*this, 14418deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis Expr::NPC_ValueDependentIsNull)) 14428deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return true; 14438deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14448deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis // Unfortunately, __null has type 'int'. 14458deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (isa<GNUNullExpr>(E)) return true; 14468deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14478deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return false; 14488deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis} 14498deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 14508a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists. 14518a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) { 14528a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 14538a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis I = ObjCImpls.find(D); 14548a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis if (I != ObjCImpls.end()) 14558a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return cast<ObjCImplementationDecl>(I->second); 14568a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return 0; 14578a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14588a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists. 14598a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) { 14608a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 14618a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis I = ObjCImpls.find(D); 14628a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis if (I != ObjCImpls.end()) 14638a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return cast<ObjCCategoryImplDecl>(I->second); 14648a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return 0; 14658a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14668a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis 14678a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCInterfaceDecl. 14688a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD, 14698a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImplementationDecl *ImplD) { 14708a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis assert(IFaceD && ImplD && "Passed null params"); 14718a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImpls[IFaceD] = ImplD; 14728a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14738a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCCategoryDecl. 14748a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD, 14758a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCCategoryImplDecl *ImplD) { 14768a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis assert(CatD && ImplD && "Passed null params"); 14778a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImpls[CatD] = ImplD; 14788a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 14798a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis 148087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios KyrtzidisObjCInterfaceDecl *ASTContext::getObjContainingInterface(NamedDecl *ND) const { 148187ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext())) 148287ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return ID; 148387ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ND->getDeclContext())) 148487ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return CD->getClassInterface(); 148587ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(ND->getDeclContext())) 148687ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return IMD->getClassInterface(); 148787ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis 148887ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return 0; 148987ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis} 149087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis 14911ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Get the copy initialization expression of VarDecl,or NULL if 14921ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// none exists. 1493830937bc1100fba7682f7c32c40512085870f50cFariborz JahanianExpr *ASTContext::getBlockVarCopyInits(const VarDecl*VD) { 1494d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD && "Passed null params"); 1495d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD->hasAttr<BlocksAttr>() && 1496d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian "getBlockVarCopyInits - not __block var"); 1497830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian llvm::DenseMap<const VarDecl*, Expr*>::iterator 1498d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian I = BlockVarCopyInits.find(VD); 14991ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian return (I != BlockVarCopyInits.end()) ? cast<Expr>(I->second) : 0; 15001ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian} 15011ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian 15021ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Set the copy inialization expression of a block var decl. 15031ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanianvoid ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) { 15041ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian assert(VD && Init && "Passed null params"); 1505d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD->hasAttr<BlocksAttr>() && 1506d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian "setBlockVarCopyInits - not __block var"); 15071ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian BlockVarCopyInits[VD] = Init; 15081ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian} 15091ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian 1510a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T, 15114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned DataSize) const { 1512109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall if (!DataSize) 1513109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall DataSize = TypeLoc::getFullDataSizeForType(T); 1514109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall else 1515109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall assert(DataSize == TypeLoc::getFullDataSizeForType(T) && 1516a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall "incorrect data size provided to CreateTypeSourceInfo!"); 1517109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall 1518a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *TInfo = 1519a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8); 1520a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall new (TInfo) TypeSourceInfo(T); 1521a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TInfo; 1522b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 1523b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 1524a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T, 15256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SourceLocation L) const { 1526a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = CreateTypeSourceInfo(T); 1527c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L); 1528a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall return DI; 1529a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall} 1530a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall 1531b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout & 15324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const { 1533b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar return getObjCLayout(D, 0); 1534b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar} 1535b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar 1536b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout & 15374ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCImplementationLayout( 15384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const ObjCImplementationDecl *D) const { 1539b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar return getObjCLayout(D->getClassInterface(), D); 1540b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar} 1541b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar 1542a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===// 1543a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner// Type creation/memoization methods 1544a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===// 1545a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 15464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 15473b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const { 15483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned fastQuals = quals.getFastQualifiers(); 15493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall quals.removeFastQualifiers(); 15500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 15510953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Check if we've already instantiated this type. 15520953e767ff7817f97b3ab20896b229891eeff45bJohn McCall llvm::FoldingSetNodeID ID; 15533b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQuals::Profile(ID, baseType, quals); 15543b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 15553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) { 15563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(eq->getQualifiers() == quals); 15573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(eq, fastQuals); 15580953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 15590953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 15603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If the base type is not canonical, make the appropriate canonical type. 15613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon; 15623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!baseType->isCanonicalUnqualified()) { 15633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split(); 1564200fa53fd420aa8369586f569dbece04930ad6a3John McCall canonSplit.Quals.addConsistentQualifiers(quals); 1565200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getExtQualType(canonSplit.Ty, canonSplit.Quals); 15663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 15673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Re-find the insert position. 15683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos); 15693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 15703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 15713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQuals *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals); 15723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQualNodes.InsertNode(eq, insertPos); 15733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(eq, fastQuals); 15740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall} 15750953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 15764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 15774ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const { 1578f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner QualType CanT = getCanonicalType(T); 1579f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner if (CanT.getAddressSpace() == AddressSpace) 1580f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner return T; 1581b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner 15820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If we are composing extended qualifiers together, merge together 15830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // into one ExtQuals node. 15840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Quals; 15850953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *TypeNode = Quals.strip(T); 15861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15870953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If this type already has an address space specified, it cannot get 15880953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // another one. 15890953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Quals.hasAddressSpace() && 15900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall "Type cannot be in multiple addr spaces!"); 15910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Quals.addAddressSpace(AddressSpace); 15921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15930953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getExtQualType(TypeNode, Quals); 1594ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb} 1595ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb 1596b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris LattnerQualType ASTContext::getObjCGCQualType(QualType T, 15974ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Qualifiers::GC GCAttr) const { 1598d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian QualType CanT = getCanonicalType(T); 1599b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner if (CanT.getObjCGCAttr() == GCAttr) 1600d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian return T; 16011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16027f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall if (const PointerType *ptr = T->getAs<PointerType>()) { 16037f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall QualType Pointee = ptr->getPointeeType(); 160458f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff if (Pointee->isAnyPointerType()) { 16054027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian QualType ResultType = getObjCGCQualType(Pointee, GCAttr); 16064027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian return getPointerType(ResultType); 16074027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian } 16084027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian } 16091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16100953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If we are composing extended qualifiers together, merge together 16110953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // into one ExtQuals node. 16120953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Quals; 16130953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *TypeNode = Quals.strip(T); 16141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16150953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If this type already has an ObjCGC specified, it cannot get 16160953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // another one. 16170953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Quals.hasObjCGCAttr() && 16180953e767ff7817f97b3ab20896b229891eeff45bJohn McCall "Type cannot have multiple ObjCGCs!"); 16190953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Quals.addObjCGCAttr(GCAttr); 16201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getExtQualType(TypeNode, Quals); 1622d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian} 1623a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 1624e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCallconst FunctionType *ASTContext::adjustFunctionType(const FunctionType *T, 1625e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FunctionType::ExtInfo Info) { 1626e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall if (T->getExtInfo() == Info) 1627e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall return T; 1628e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 1629e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall QualType Result; 1630e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(T)) { 1631e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall Result = getFunctionNoProtoType(FNPT->getResultType(), Info); 1632e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall } else { 1633e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall const FunctionProtoType *FPT = cast<FunctionProtoType>(T); 1634e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 1635e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall EPI.ExtInfo = Info; 1636e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall Result = getFunctionType(FPT->getResultType(), FPT->arg_type_begin(), 1637e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FPT->getNumArgs(), EPI); 1638e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall } 1639e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 1640e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall return cast<FunctionType>(Result.getTypePtr()); 1641e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall} 1642e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 16435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getComplexType - Return the uniqued reference to the type for a complex 16445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// number with the specified element type. 16454ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getComplexType(QualType T) const { 16465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 16475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 16485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 16495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexType::Profile(ID, T); 16501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 16525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos)) 16535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(CT, 0); 16541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the pointee type isn't canonical, this won't be a canonical type either, 16565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 16575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 1658467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 1659f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getComplexType(getCanonicalType(T)); 16601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 16625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos); 1663c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 16645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16656b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical); 16665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 16675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexTypes.InsertNode(New, InsertPos); 16685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 16695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getPointerType - Return the uniqued reference to the type for a pointer to 16725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the specified type. 16734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPointerType(QualType T) const { 16745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 16755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 16765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 16775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerType::Profile(ID, T); 16781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 16805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 16815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(PT, 0); 16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the pointee type isn't canonical, this won't be a canonical type either, 16845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 16855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 1686467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 1687f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getPointerType(getCanonicalType(T)); 16881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 16905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1691c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 16925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16936b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical); 16945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 16955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerTypes.InsertNode(New, InsertPos); 16965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 16975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getBlockPointerType - Return the uniqued reference to the type for 17005618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff/// a pointer to the specified block. 17014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockPointerType(QualType T) const { 1702296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff assert(T->isFunctionType() && "block of function types only"); 1703296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff // Unique pointers, to guarantee there is only one block of a particular 17045618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // structure. 17055618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff llvm::FoldingSetNodeID ID; 17065618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerType::Profile(ID, T); 17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17085618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff void *InsertPos = 0; 17095618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff if (BlockPointerType *PT = 17105618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 17115618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return QualType(PT, 0); 17121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the block pointee type isn't canonical, this won't be a canonical 17145618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // type either so fill in the canonical type field. 17155618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff QualType Canonical; 1716467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 17175618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Canonical = getBlockPointerType(getCanonicalType(T)); 17181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17195618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // Get the new insert position for the node we care about. 17205618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerType *NewIP = 17215618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1722c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17235618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff } 17246b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall BlockPointerType *New 17256b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) BlockPointerType(T, Canonical); 17265618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Types.push_back(New); 17275618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.InsertNode(New, InsertPos); 17285618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return QualType(New, 0); 17295618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff} 17305618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff 17317c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getLValueReferenceType - Return the uniqued reference to the type for an 17327c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// lvalue reference to the specified type. 17334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 17344ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const { 17359625e44c0252485277a340746ed8ac950686156fDouglas Gregor assert(getCanonicalType(T) != OverloadTy && 17369625e44c0252485277a340746ed8ac950686156fDouglas Gregor "Unresolved overloaded function type"); 17379625e44c0252485277a340746ed8ac950686156fDouglas Gregor 17385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 17395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 17405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 174154e14c4db764c0636160d26c5bbf491637c83a76John McCall ReferenceType::Profile(ID, T, SpelledAsLValue); 17425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 17447c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (LValueReferenceType *RT = 17457c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 17465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(RT, 0); 17477c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 174854e14c4db764c0636160d26c5bbf491637c83a76John McCall const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 174954e14c4db764c0636160d26c5bbf491637c83a76John McCall 17505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the referencee type isn't canonical, this won't be a canonical type 17515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // either, so fill in the canonical type field. 17525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 175354e14c4db764c0636160d26c5bbf491637c83a76John McCall if (!SpelledAsLValue || InnerRef || !T.isCanonical()) { 175454e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 175554e14c4db764c0636160d26c5bbf491637c83a76John McCall Canonical = getLValueReferenceType(getCanonicalType(PointeeType)); 17567c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17577c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // Get the new insert position for the node we care about. 17587c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceType *NewIP = 17597c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1760c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17617c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl } 17627c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17636b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall LValueReferenceType *New 176454e14c4db764c0636160d26c5bbf491637c83a76John McCall = new (*this, TypeAlignment) LValueReferenceType(T, Canonical, 176554e14c4db764c0636160d26c5bbf491637c83a76John McCall SpelledAsLValue); 17667c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl Types.push_back(New); 17677c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.InsertNode(New, InsertPos); 176854e14c4db764c0636160d26c5bbf491637c83a76John McCall 17697c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl return QualType(New, 0); 17707c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl} 17717c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17727c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getRValueReferenceType - Return the uniqued reference to the type for an 17737c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// rvalue reference to the specified type. 17744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRValueReferenceType(QualType T) const { 17757c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // Unique pointers, to guarantee there is only one pointer of a particular 17767c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // structure. 17777c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl llvm::FoldingSetNodeID ID; 177854e14c4db764c0636160d26c5bbf491637c83a76John McCall ReferenceType::Profile(ID, T, false); 17797c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17807c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl void *InsertPos = 0; 17817c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (RValueReferenceType *RT = 17827c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 17837c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl return QualType(RT, 0); 17847c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 178554e14c4db764c0636160d26c5bbf491637c83a76John McCall const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 178654e14c4db764c0636160d26c5bbf491637c83a76John McCall 17877c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // If the referencee type isn't canonical, this won't be a canonical type 17887c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // either, so fill in the canonical type field. 17897c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl QualType Canonical; 179054e14c4db764c0636160d26c5bbf491637c83a76John McCall if (InnerRef || !T.isCanonical()) { 179154e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 179254e14c4db764c0636160d26c5bbf491637c83a76John McCall Canonical = getRValueReferenceType(getCanonicalType(PointeeType)); 17937c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 17945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 17957c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceType *NewIP = 17967c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1797c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 17995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 18006b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall RValueReferenceType *New 18016b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) RValueReferenceType(T, Canonical); 18025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 18037c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.InsertNode(New, InsertPos); 18045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 18055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 18065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1807f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// getMemberPointerType - Return the uniqued reference to the type for a 1808f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// member pointer to the specified type, in the specified class. 18094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const { 1810f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Unique pointers, to guarantee there is only one pointer of a particular 1811f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // structure. 1812f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl llvm::FoldingSetNodeID ID; 1813f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerType::Profile(ID, T, Cls); 1814f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1815f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl void *InsertPos = 0; 1816f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl if (MemberPointerType *PT = 1817f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 1818f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl return QualType(PT, 0); 1819f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1820f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // If the pointee or class type isn't canonical, this won't be a canonical 1821f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // type either, so fill in the canonical type field. 1822f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl QualType Canonical; 182387c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) { 1824f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls)); 1825f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1826f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Get the new insert position for the node we care about. 1827f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerType *NewIP = 1828f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1829c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1830f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl } 18316b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall MemberPointerType *New 18326b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical); 1833f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl Types.push_back(New); 1834f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.InsertNode(New, InsertPos); 1835f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl return QualType(New, 0); 1836f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl} 1837f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 18381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getConstantArrayType - Return the unique reference to the type for an 1839fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff/// array of the specified element type. 18401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getConstantArrayType(QualType EltTy, 184138aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner const llvm::APInt &ArySizeIn, 1842c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff ArrayType::ArraySizeModifier ASM, 184363e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara unsigned IndexTypeQuals) const { 1844923d56d436f750bc1f29db50e641078725558a1bSebastian Redl assert((EltTy->isDependentType() || 1845923d56d436f750bc1f29db50e641078725558a1bSebastian Redl EltTy->isIncompleteType() || EltTy->isConstantSizeType()) && 1846587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman "Constant array of VLAs is illegal!"); 1847587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman 184838aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner // Convert the array size into a canonical width matching the pointer size for 184938aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner // the target. 185038aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner llvm::APInt ArySize(ArySizeIn); 18519f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad ArySize = 1852bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor ArySize.zextOrTrunc(Target->getPointerWidth(getTargetAddressSpace(EltTy))); 18531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 185563e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, IndexTypeQuals); 18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 18581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ConstantArrayType *ATP = 18597192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos)) 18605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(ATP, 0); 18611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If the element type isn't canonical or has qualifiers, this won't 18633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // be a canonical type either, so fill in the canonical type field. 18643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType Canon; 18653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 18663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(EltTy).split(); 1867200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize, 186863e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ASM, IndexTypeQuals); 1869200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getQualifiedType(Canon, canonSplit.Quals); 18703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 18715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 18721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ConstantArrayType *NewIP = 18737192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos); 1874c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 18755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18776b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ConstantArrayType *New = new(*this,TypeAlignment) 187863e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ConstantArrayType(EltTy, Canon, ArySize, ASM, IndexTypeQuals); 18797192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.InsertNode(New, InsertPos); 18805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 18815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 18825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 18835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1884ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// getVariableArrayDecayedType - Turns the given type, which may be 1885ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// variably-modified, into the corresponding type with all the known 1886ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// sizes replaced with [*]. 1887ce8890371fcdb983ae487c87fa40606a34896ff7John McCallQualType ASTContext::getVariableArrayDecayedType(QualType type) const { 1888ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Vastly most common case. 1889ce8890371fcdb983ae487c87fa40606a34896ff7John McCall if (!type->isVariablyModifiedType()) return type; 1890ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1891ce8890371fcdb983ae487c87fa40606a34896ff7John McCall QualType result; 1892ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1893ce8890371fcdb983ae487c87fa40606a34896ff7John McCall SplitQualType split = type.getSplitDesugaredType(); 1894200fa53fd420aa8369586f569dbece04930ad6a3John McCall const Type *ty = split.Ty; 1895ce8890371fcdb983ae487c87fa40606a34896ff7John McCall switch (ty->getTypeClass()) { 1896ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define TYPE(Class, Base) 1897ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define ABSTRACT_TYPE(Class, Base) 1898ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 1899ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#include "clang/AST/TypeNodes.def" 1900ce8890371fcdb983ae487c87fa40606a34896ff7John McCall llvm_unreachable("didn't desugar past all non-canonical types?"); 1901ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1902ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types should never be variably-modified. 1903ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Builtin: 1904ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Complex: 1905ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Vector: 1906ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ExtVector: 1907ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentSizedExtVector: 1908ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCObject: 1909ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCInterface: 1910ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCObjectPointer: 1911ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Record: 1912ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Enum: 1913ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::UnresolvedUsing: 1914ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TypeOfExpr: 1915ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TypeOf: 1916ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Decltype: 1917ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 1918ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentName: 1919ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::InjectedClassName: 1920ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TemplateSpecialization: 1921ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentTemplateSpecialization: 1922ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TemplateTypeParm: 1923ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::SubstTemplateTypeParmPack: 192434b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: 1925ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::PackExpansion: 1926ce8890371fcdb983ae487c87fa40606a34896ff7John McCall llvm_unreachable("type should never be variably-modified"); 1927ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1928ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types can be variably-modified but should never need to 1929ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // further decay. 1930ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::FunctionNoProto: 1931ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::FunctionProto: 1932ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::BlockPointer: 1933ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::MemberPointer: 1934ce8890371fcdb983ae487c87fa40606a34896ff7John McCall return type; 1935ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1936ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types can be variably-modified. All these modifications 1937ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // preserve structure except as noted by comments. 1938ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // TODO: if we ever care about optimizing VLAs, there are no-op 1939ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // optimizations available here. 1940ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Pointer: 1941ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getPointerType(getVariableArrayDecayedType( 1942ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cast<PointerType>(ty)->getPointeeType())); 1943ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1944ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1945ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::LValueReference: { 1946ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const LValueReferenceType *lv = cast<LValueReferenceType>(ty); 1947ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getLValueReferenceType( 1948ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(lv->getPointeeType()), 1949ce8890371fcdb983ae487c87fa40606a34896ff7John McCall lv->isSpelledAsLValue()); 1950ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1951745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1952ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1953ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::RValueReference: { 1954ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const RValueReferenceType *lv = cast<RValueReferenceType>(ty); 1955ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getRValueReferenceType( 1956ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(lv->getPointeeType())); 1957ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1958745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1959745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1960b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 1961b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman const AtomicType *at = cast<AtomicType>(ty); 1962b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman result = getAtomicType(getVariableArrayDecayedType(at->getValueType())); 1963b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman break; 1964b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 1965b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 1966ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ConstantArray: { 1967ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const ConstantArrayType *cat = cast<ConstantArrayType>(ty); 1968ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getConstantArrayType( 1969ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(cat->getElementType()), 1970ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getSize(), 1971ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getSizeModifier(), 1972ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getIndexTypeCVRQualifiers()); 1973ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1974745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1975745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1976ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentSizedArray: { 1977ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const DependentSizedArrayType *dat = cast<DependentSizedArrayType>(ty); 1978ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getDependentSizedArrayType( 1979ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(dat->getElementType()), 1980ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getSizeExpr(), 1981ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getSizeModifier(), 1982ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getIndexTypeCVRQualifiers(), 1983ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getBracketsRange()); 1984ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1985ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1986ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1987ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Turn incomplete types into [*] types. 1988ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::IncompleteArray: { 1989ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const IncompleteArrayType *iat = cast<IncompleteArrayType>(ty); 1990ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getVariableArrayType( 1991ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(iat->getElementType()), 1992ce8890371fcdb983ae487c87fa40606a34896ff7John McCall /*size*/ 0, 1993ce8890371fcdb983ae487c87fa40606a34896ff7John McCall ArrayType::Normal, 1994ce8890371fcdb983ae487c87fa40606a34896ff7John McCall iat->getIndexTypeCVRQualifiers(), 1995ce8890371fcdb983ae487c87fa40606a34896ff7John McCall SourceRange()); 1996ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1997ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1998ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1999ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Turn VLA types into [*] types. 2000ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::VariableArray: { 2001ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const VariableArrayType *vat = cast<VariableArrayType>(ty); 2002ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getVariableArrayType( 2003ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(vat->getElementType()), 2004ce8890371fcdb983ae487c87fa40606a34896ff7John McCall /*size*/ 0, 2005ce8890371fcdb983ae487c87fa40606a34896ff7John McCall ArrayType::Star, 2006ce8890371fcdb983ae487c87fa40606a34896ff7John McCall vat->getIndexTypeCVRQualifiers(), 2007ce8890371fcdb983ae487c87fa40606a34896ff7John McCall vat->getBracketsRange()); 2008ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 2009ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 2010ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 2011ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 2012ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Apply the top-level qualifiers from the original. 2013200fa53fd420aa8369586f569dbece04930ad6a3John McCall return getQualifiedType(result, split.Quals); 2014ce8890371fcdb983ae487c87fa40606a34896ff7John McCall} 2015745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 2016bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// getVariableArrayType - Returns a non-unique reference to the type for a 2017bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// variable array of the specified element type. 20187e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas GregorQualType ASTContext::getVariableArrayType(QualType EltTy, 20197e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor Expr *NumElts, 2020c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff ArrayType::ArraySizeModifier ASM, 202163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara unsigned IndexTypeQuals, 20224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceRange Brackets) const { 2023c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // Since we don't unique expressions, it isn't possible to unique VLA's 2024c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // that have an expression provided for their size. 20253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType Canon; 2026715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor 20273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Be sure to pull qualifiers off the element type. 20283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 20293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(EltTy).split(); 2030200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM, 203163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara IndexTypeQuals, Brackets); 2032200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getQualifiedType(Canon, canonSplit.Quals); 2033715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor } 2034715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor 20356b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall VariableArrayType *New = new(*this, TypeAlignment) 203663e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets); 2037c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2038c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman VariableArrayTypes.push_back(New); 2039c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman Types.push_back(New); 2040c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman return QualType(New, 0); 2041c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman} 2042c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2043898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// getDependentSizedArrayType - Returns a non-unique reference to 2044898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// the type for a dependently-sized array of the specified element 204504d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor/// type. 20463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getDependentSizedArrayType(QualType elementType, 20473b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Expr *numElements, 2048898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor ArrayType::ArraySizeModifier ASM, 20493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned elementTypeQuals, 20503b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SourceRange brackets) const { 20513b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert((!numElements || numElements->isTypeDependent() || 20523b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall numElements->isValueDependent()) && 2053898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor "Size must be type- or value-dependent!"); 2054898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 20553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Dependently-sized array types that do not have a specified number 20563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // of elements will have their sizes deduced from a dependent 20573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // initializer. We do no canonicalization here at all, which is okay 20583b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // because they can't be used in most locations. 20593b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!numElements) { 20603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *newType 20613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = new (*this, TypeAlignment) 20623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType(*this, elementType, QualType(), 20633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall numElements, ASM, elementTypeQuals, 20643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall brackets); 20653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(newType); 20663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(newType, 0); 2067cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor } 2068cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor 20693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Otherwise, we actually build a new type every time, but we 20703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // also build a canonical type. 20711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonElementType = getCanonicalType(elementType).split(); 2073898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 20743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 20753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall llvm::FoldingSetNodeID ID; 20763b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType::Profile(ID, *this, 2077200fa53fd420aa8369586f569dbece04930ad6a3John McCall QualType(canonElementType.Ty, 0), 20783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals, numElements); 20793b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Look for an existing type with these properties. 20813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *canonTy = 20823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos); 20833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If we don't have one, build one. 20853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!canonTy) { 20863b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall canonTy = new (*this, TypeAlignment) 2087200fa53fd420aa8369586f569dbece04930ad6a3John McCall DependentSizedArrayType(*this, QualType(canonElementType.Ty, 0), 20883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType(), numElements, ASM, elementTypeQuals, 20893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall brackets); 20903b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayTypes.InsertNode(canonTy, insertPos); 20913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(canonTy); 20923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 20933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20943b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Apply qualifiers from the element type to the array. 20953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon = getQualifiedType(QualType(canonTy,0), 2096200fa53fd420aa8369586f569dbece04930ad6a3John McCall canonElementType.Quals); 20973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 20983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If we didn't need extra canonicalization for the element type, 20993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // then just use that as our result. 2100200fa53fd420aa8369586f569dbece04930ad6a3John McCall if (QualType(canonElementType.Ty, 0) == elementType) 21013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return canon; 21023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 21033b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Otherwise, we need to build a type which follows the spelling 21043b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // of the element type. 21053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *sugaredType 21063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = new (*this, TypeAlignment) 21073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType(*this, elementType, canon, numElements, 21083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals, brackets); 21093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(sugaredType); 21103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(sugaredType, 0); 21113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall} 21123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 21133b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getIncompleteArrayType(QualType elementType, 2114c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman ArrayType::ArraySizeModifier ASM, 21153b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned elementTypeQuals) const { 2116c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman llvm::FoldingSetNodeID ID; 21173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals); 2118c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 21193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 21203b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (IncompleteArrayType *iat = 21213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos)) 21223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(iat, 0); 2123c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2124c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // If the element type isn't canonical, this won't be a canonical type 21253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // either, so fill in the canonical type field. We also have to pull 21263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // qualifiers off the element type. 21273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon; 2128c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 21293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) { 21303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(elementType).split(); 2131200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0), 21323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals); 2133200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getQualifiedType(canon, canonSplit.Quals); 2134c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 2135c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // Get the new insert position for the node we care about. 21363b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType *existing = 21373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos); 21383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(!existing && "Shouldn't be in the map!"); (void) existing; 21392bd24ba6d10f8c811c8e2a57c8397e07082ba497Ted Kremenek } 2140c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 21413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType *newType = new (*this, TypeAlignment) 21423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType(elementType, canon, ASM, elementTypeQuals); 2143c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 21443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.InsertNode(newType, insertPos); 21453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(newType); 21463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(newType, 0); 2147fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff} 2148fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff 214973322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// getVectorType - Return the unique reference to a vector type of 215073322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type. 215182287d19ded35248c4ce6a425ce74116a13ce44eJohn ThompsonQualType ASTContext::getVectorType(QualType vecType, unsigned NumElts, 21524ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad VectorType::VectorKind VecKind) const { 21533b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(vecType->isBuiltinType()); 21541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Check if we've already instantiated a vector of this type. 21565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 2157e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind); 2158788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 21595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 21605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 21615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(VTP, 0); 21625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 21635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the element type isn't canonical, this won't be a canonical type either, 21645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 21655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 2166255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor if (!vecType.isCanonical()) { 2167231da7eb3dd13007e5e40fffe48998e5ef284e06Bob Wilson Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind); 21681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 21705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2171c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 21725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 21736b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall VectorType *New = new (*this, TypeAlignment) 2174e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType(vecType, NumElts, Canonical, VecKind); 21755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VectorTypes.InsertNode(New, InsertPos); 21765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 21775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 21785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 21795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2180213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman/// getExtVectorType - Return the unique reference to an extended vector type of 218173322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type. 21824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 21834ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const { 21844ac01401b1ec602a1f58c217544d3dcb5fcbd7f1Douglas Gregor assert(vecType->isBuiltinType() || vecType->isDependentType()); 21851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 218673322924127c873c13101b705dd823f5539ffa5fSteve Naroff // Check if we've already instantiated a vector of this type. 218773322924127c873c13101b705dd823f5539ffa5fSteve Naroff llvm::FoldingSetNodeID ID; 2188788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner VectorType::Profile(ID, vecType, NumElts, Type::ExtVector, 2189e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::GenericVector); 219073322924127c873c13101b705dd823f5539ffa5fSteve Naroff void *InsertPos = 0; 219173322924127c873c13101b705dd823f5539ffa5fSteve Naroff if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 219273322924127c873c13101b705dd823f5539ffa5fSteve Naroff return QualType(VTP, 0); 219373322924127c873c13101b705dd823f5539ffa5fSteve Naroff 219473322924127c873c13101b705dd823f5539ffa5fSteve Naroff // If the element type isn't canonical, this won't be a canonical type either, 219573322924127c873c13101b705dd823f5539ffa5fSteve Naroff // so fill in the canonical type field. 219673322924127c873c13101b705dd823f5539ffa5fSteve Naroff QualType Canonical; 2197467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!vecType.isCanonical()) { 2198213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman Canonical = getExtVectorType(getCanonicalType(vecType), NumElts); 21991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 220073322924127c873c13101b705dd823f5539ffa5fSteve Naroff // Get the new insert position for the node we care about. 220173322924127c873c13101b705dd823f5539ffa5fSteve Naroff VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2202c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 220373322924127c873c13101b705dd823f5539ffa5fSteve Naroff } 22046b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ExtVectorType *New = new (*this, TypeAlignment) 22056b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ExtVectorType(vecType, NumElts, Canonical); 220673322924127c873c13101b705dd823f5539ffa5fSteve Naroff VectorTypes.InsertNode(New, InsertPos); 220773322924127c873c13101b705dd823f5539ffa5fSteve Naroff Types.push_back(New); 220873322924127c873c13101b705dd823f5539ffa5fSteve Naroff return QualType(New, 0); 220973322924127c873c13101b705dd823f5539ffa5fSteve Naroff} 221073322924127c873c13101b705dd823f5539ffa5fSteve Naroff 22114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 22124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentSizedExtVectorType(QualType vecType, 22134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Expr *SizeExpr, 22144ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceLocation AttrLoc) const { 22152ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor llvm::FoldingSetNodeID ID; 22161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType), 22172ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SizeExpr); 22181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22192ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor void *InsertPos = 0; 22202ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorType *Canon 22212ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 22222ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorType *New; 22232ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor if (Canon) { 22242ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor // We already have a canonical version of this array type; use it as 22252ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor // the canonical type for a newly-built type. 22266b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 22276b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0), 22286b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall SizeExpr, AttrLoc); 22292ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } else { 22302ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType CanonVecTy = getCanonicalType(vecType); 22312ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor if (CanonVecTy == vecType) { 22326b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 22336b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr, 22346b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall AttrLoc); 2235789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2236789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentSizedExtVectorType *CanonCheck 2237789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2238789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken"); 2239789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CanonCheck; 22402ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorTypes.InsertNode(New, InsertPos); 22412ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } else { 22422ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr, 22432ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SourceLocation()); 22446b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 22456b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc); 22462ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } 22472ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } 22481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22499cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor Types.push_back(New); 22509cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor return QualType(New, 0); 22519cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor} 22529cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor 225372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'. 22545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 22554ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 22564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionNoProtoType(QualType ResultTy, 22574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FunctionType::ExtInfo &Info) const { 2258cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv DefaultCC = Info.getCC(); 2259cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2260cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CC_X86StdCall : DefaultCC; 22615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique functions, to guarantee there is only one function of a particular 22625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 22635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 2264264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionNoProtoType::Profile(ID, ResultTy, Info); 22651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 22671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionNoProtoType *FT = 226872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 22695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FT, 0); 22701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 2272ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor if (!ResultTy.isCanonical() || 227304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall getCanonicalCallConv(CallConv) != CallConv) { 2274264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Canonical = 2275264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola getFunctionNoProtoType(getCanonicalType(ResultTy), 2276264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Info.withCallingConv(getCanonicalCallConv(CallConv))); 22771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 227972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoType *NewIP = 228072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2281c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 22825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 22831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2284cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionProtoType::ExtInfo newInfo = Info.withCallingConv(CallConv); 22856b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall FunctionNoProtoType *New = new (*this, TypeAlignment) 2286cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionNoProtoType(ResultTy, Canonical, newInfo); 22875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 228872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.InsertNode(New, InsertPos); 22895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 22905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 22915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFunctionType - Return a normal function type with a typed argument 22935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// list. isVariadic indicates whether the argument list includes '...'. 22944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 22954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionType(QualType ResultTy, 22964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const QualType *ArgArray, unsigned NumArgs, 22974ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FunctionProtoType::ExtProtoInfo &EPI) const { 22985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique functions, to guarantee there is only one function of a particular 22995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 23005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 23018026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl FunctionProtoType::Profile(ID, ResultTy, ArgArray, NumArgs, EPI, *this); 23025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 23035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 23041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionProtoType *FTP = 230572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 23065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FTP, 0); 2307465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2308465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl // Determine whether the type being created is already canonical or not. 2309eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith bool isCanonical = 2310eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith EPI.ExceptionSpecType == EST_None && ResultTy.isCanonical() && 2311eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith !EPI.HasTrailingReturn; 23125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs && isCanonical; ++i) 231354e14c4db764c0636160d26c5bbf491637c83a76John McCall if (!ArgArray[i].isCanonicalAsParam()) 23145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer isCanonical = false; 23155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2316cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv DefaultCC = EPI.ExtInfo.getCC(); 2317cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2318cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CC_X86StdCall : DefaultCC; 2319e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 23205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this type isn't canonical, get the canonical version of it. 2321465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl // The exception spec is not part of the canonical type. 23225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 232304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) { 23245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 16> CanonicalArgs; 23255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer CanonicalArgs.reserve(NumArgs); 23265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs; ++i) 232754e14c4db764c0636160d26c5bbf491637c83a76John McCall CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i])); 2328465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2329e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI; 2330eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith CanonicalEPI.HasTrailingReturn = false; 23318b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl CanonicalEPI.ExceptionSpecType = EST_None; 23328b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl CanonicalEPI.NumExceptions = 0; 2333e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall CanonicalEPI.ExtInfo 2334e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall = CanonicalEPI.ExtInfo.withCallingConv(getCanonicalCallConv(CallConv)); 2335e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 2336f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getFunctionType(getCanonicalType(ResultTy), 2337beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad CanonicalArgs.data(), NumArgs, 2338e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall CanonicalEPI); 2339465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 23405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 234172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoType *NewIP = 234272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2343c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 23445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2345465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2346f85e193739c953358c865005855253af4f68a497John McCall // FunctionProtoType objects are allocated with extra bytes after 2347f85e193739c953358c865005855253af4f68a497John McCall // them for three variable size arrays at the end: 2348f85e193739c953358c865005855253af4f68a497John McCall // - parameter types 2349f85e193739c953358c865005855253af4f68a497John McCall // - exception types 2350f85e193739c953358c865005855253af4f68a497John McCall // - consumed-arguments flags 2351f85e193739c953358c865005855253af4f68a497John McCall // Instead of the exception types, there could be a noexcept 2352f85e193739c953358c865005855253af4f68a497John McCall // expression. 2353e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall size_t Size = sizeof(FunctionProtoType) + 235460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl NumArgs * sizeof(QualType); 235560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (EPI.ExceptionSpecType == EST_Dynamic) 235660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Size += EPI.NumExceptions * sizeof(QualType); 235760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) { 23588026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl Size += sizeof(Expr*); 2359e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith } else if (EPI.ExceptionSpecType == EST_Uninstantiated) { 236013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith Size += 2 * sizeof(FunctionDecl*); 236160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 2362f85e193739c953358c865005855253af4f68a497John McCall if (EPI.ConsumedArguments) 2363f85e193739c953358c865005855253af4f68a497John McCall Size += NumArgs * sizeof(bool); 2364f85e193739c953358c865005855253af4f68a497John McCall 2365e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment); 2366cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionProtoType::ExtProtoInfo newEPI = EPI; 2367cfe9af250f466e7e38becea4428990448ae07737Roman Divacky newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv); 23688026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl new (FTP) FunctionProtoType(ResultTy, ArgArray, NumArgs, Canonical, newEPI); 23695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(FTP); 237072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.InsertNode(FTP, InsertPos); 23715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FTP, 0); 23725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 23735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 23743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#ifndef NDEBUG 23753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallstatic bool NeedsInjectedClassNameType(const RecordDecl *D) { 23763cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!isa<CXXRecordDecl>(D)) return false; 23773cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const CXXRecordDecl *RD = cast<CXXRecordDecl>(D); 23783cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (isa<ClassTemplatePartialSpecializationDecl>(RD)) 23793cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return true; 23803cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (RD->getDescribedClassTemplate() && 23813cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall !isa<ClassTemplateSpecializationDecl>(RD)) 23823cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return true; 23833cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return false; 23843cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 23853cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif 23863cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 23873cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// getInjectedClassNameType - Return the unique reference to the 23883cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// injected class name type for the specified templated declaration. 23893cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl, 23904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType TST) const { 23913cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(NeedsInjectedClassNameType(Decl)); 23923cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (Decl->TypeForDecl) { 23933cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 2394ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) { 23953cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(PrevDecl->TypeForDecl && "previous declaration has no type"); 23963cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Decl->TypeForDecl = PrevDecl->TypeForDecl; 23973cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 23983cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } else { 2399f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Type *newType = 240031f17ecbef57b5679c017c375db330546b7b5145John McCall new (*this, TypeAlignment) InjectedClassNameType(Decl, TST); 2401f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2402f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 24033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } 24043cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return QualType(Decl->TypeForDecl, 0); 24053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 24063cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 24072ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// getTypeDeclType - Return the unique reference to the type for the 24082ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// specified type declaration. 24094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const { 24101e6759e9e33dcaa73ce14c8a908ac9f87ac16463Argyrios Kyrtzidis assert(Decl && "Passed null for Decl param"); 2411becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!Decl->TypeForDecl && "TypeForDecl present in slow case"); 24121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2413162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (const TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Decl)) 24142ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor return getTypedefType(Typedef); 2415becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall 2416becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!isa<TemplateTypeParmDecl>(Decl) && 2417becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "Template type parameter types are always available."); 2418becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall 241919c8576b7328f4dc2d07682f5da552875c1912efJohn McCall if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) { 2420ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor assert(!Record->getPreviousDecl() && 2421becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "struct/union has previous declaration"); 2422becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!NeedsInjectedClassNameType(Record)); 2423400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return getRecordType(Record); 242419c8576b7328f4dc2d07682f5da552875c1912efJohn McCall } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) { 2425ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor assert(!Enum->getPreviousDecl() && 2426becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "enum has previous declaration"); 2427400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return getEnumType(Enum); 242819c8576b7328f4dc2d07682f5da552875c1912efJohn McCall } else if (const UnresolvedUsingTypenameDecl *Using = 2429ed97649e9574b9d854fa4d6109c9333ae0993554John McCall dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) { 2430f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using); 2431f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2432f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 24339fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump } else 2434becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall llvm_unreachable("TypeDecl without a type?"); 243549aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis 243649aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis return QualType(Decl->TypeForDecl, 0); 24372ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor} 24382ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor 24395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTypedefType - Return the unique reference to the type for the 2440162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// specified typedef name decl. 24419763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType 2442162e1c1b487352434552147967c3dd296ebee2f7Richard SmithASTContext::getTypedefType(const TypedefNameDecl *Decl, 2443162e1c1b487352434552147967c3dd296ebee2f7Richard Smith QualType Canonical) const { 24445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 24451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24469763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis if (Canonical.isNull()) 24479763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Canonical = getCanonicalType(Decl->getUnderlyingType()); 2448f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall TypedefType *newType = new(*this, TypeAlignment) 24496b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypedefType(Type::Typedef, Decl, Canonical); 2450f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2451f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2452f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 24535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 24545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 24554ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRecordType(const RecordDecl *Decl) const { 2456400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2457400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2458ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (const RecordDecl *PrevDecl = Decl->getPreviousDecl()) 2459400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (PrevDecl->TypeForDecl) 2460400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2461400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2462f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall RecordType *newType = new (*this, TypeAlignment) RecordType(Decl); 2463f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2464f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2465f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 2466400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis} 2467400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 24684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getEnumType(const EnumDecl *Decl) const { 2469400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2470400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2471ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (const EnumDecl *PrevDecl = Decl->getPreviousDecl()) 2472400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (PrevDecl->TypeForDecl) 2473400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2474400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2475f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall EnumType *newType = new (*this, TypeAlignment) EnumType(Decl); 2476f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2477f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2478f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 2479400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis} 2480400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 24819d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType ASTContext::getAttributedType(AttributedType::Kind attrKind, 24829d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType modifiedType, 24839d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType equivalentType) { 24849d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall llvm::FoldingSetNodeID id; 24859d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType::Profile(id, attrKind, modifiedType, equivalentType); 24869d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24879d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall void *insertPos = 0; 24889d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos); 24899d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (type) return QualType(type, 0); 24909d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24919d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType canon = getCanonicalType(equivalentType); 24929d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall type = new (*this, TypeAlignment) 24939d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType(canon, attrKind, modifiedType, equivalentType); 24949d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24959d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall Types.push_back(type); 24969d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedTypes.InsertNode(type, insertPos); 24979d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 24989d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return QualType(type, 0); 24999d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 25009d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 25019d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 250249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/// \brief Retrieve a substitution-result type. 250349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType 250449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm, 25054ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType Replacement) const { 2506467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(Replacement.isCanonical() 250749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall && "replacement types must always be canonical"); 250849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 250949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall llvm::FoldingSetNodeID ID; 251049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType::Profile(ID, Parm, Replacement); 251149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall void *InsertPos = 0; 251249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType *SubstParm 251349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 251449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 251549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall if (!SubstParm) { 251649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstParm = new (*this, TypeAlignment) 251749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType(Parm, Replacement); 251849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall Types.push_back(SubstParm); 251949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 252049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall } 252149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 252249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return QualType(SubstParm, 0); 252349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 252449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 2525c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor/// \brief Retrieve a 2526c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType ASTContext::getSubstTemplateTypeParmPackType( 2527c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const TemplateTypeParmType *Parm, 2528c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const TemplateArgument &ArgPack) { 2529c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifndef NDEBUG 2530c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(), 2531c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor PEnd = ArgPack.pack_end(); 2532c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor P != PEnd; ++P) { 2533c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type"); 2534c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor assert(P->getAsType().isCanonical() && "Pack contains non-canonical type"); 2535c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2536c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#endif 2537c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2538c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor llvm::FoldingSetNodeID ID; 2539c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack); 2540c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor void *InsertPos = 0; 2541c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (SubstTemplateTypeParmPackType *SubstParm 2542c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos)) 2543c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return QualType(SubstParm, 0); 2544c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2545c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor QualType Canon; 2546c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (!Parm->isCanonicalUnqualified()) { 2547c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Canon = getCanonicalType(QualType(Parm, 0)); 2548c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon), 2549c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor ArgPack); 2550c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos); 2551c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2552c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2553c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackType *SubstParm 2554c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon, 2555c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor ArgPack); 2556c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Types.push_back(SubstParm); 2557c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 2558c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return QualType(SubstParm, 0); 2559c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 2560c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2561fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor/// \brief Retrieve the template type parameter type for a template 25621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parameter or parameter pack with the given depth, index, and (optionally) 256376e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson/// name. 25641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index, 256576e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson bool ParameterPack, 25664fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl) const { 2567fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor llvm::FoldingSetNodeID ID; 25684fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl); 2569fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor void *InsertPos = 0; 25701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateTypeParmType *TypeParm 2571fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2572fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2573fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor if (TypeParm) 2574fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return QualType(TypeParm, 0); 25751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25764fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth if (TTPDecl) { 257776e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack); 25784fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon); 2579789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2580789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor TemplateTypeParmType *TypeCheck 2581789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2582789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!TypeCheck && "Template type parameter canonical type broken"); 2583789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)TypeCheck; 258476e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson } else 25856b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeParm = new (*this, TypeAlignment) 25866b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TemplateTypeParmType(Depth, Index, ParameterPack); 2587fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2588fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor Types.push_back(TypeParm); 2589fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos); 2590fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2591fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return QualType(TypeParm, 0); 2592fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor} 2593fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 25943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallTypeSourceInfo * 25953cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallASTContext::getTemplateSpecializationTypeInfo(TemplateName Name, 25963cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall SourceLocation NameLoc, 25973cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const TemplateArgumentListInfo &Args, 25983e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 25997c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Name.getAsDependentTemplateName() && 26007c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 26013e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType TST = getTemplateSpecializationType(Name, Args, Underlying); 26023cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 26033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeSourceInfo *DI = CreateTypeSourceInfo(TST); 26043cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TemplateSpecializationTypeLoc TL 26053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc()); 260655d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara TL.setTemplateKeywordLoc(SourceLocation()); 26073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setTemplateNameLoc(NameLoc); 26083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setLAngleLoc(Args.getLAngleLoc()); 26093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setRAngleLoc(Args.getRAngleLoc()); 26103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 26113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setArgLocInfo(i, Args[i].getLocInfo()); 26123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return DI; 26133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 26143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 26151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 26167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorASTContext::getTemplateSpecializationType(TemplateName Template, 2617d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args, 26183e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 26197c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 26207c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 26217c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 2622d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned NumArgs = Args.size(); 2623d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 26245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> ArgVec; 2625833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ArgVec.reserve(NumArgs); 2626833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0; i != NumArgs; ++i) 2627833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ArgVec.push_back(Args[i].getArgument()); 2628833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 262931f17ecbef57b5679c017c375db330546b7b5145John McCall return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs, 26303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Underlying); 2631833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2632833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2633b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#ifndef NDEBUG 2634b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregorstatic bool hasAnyPackExpansions(const TemplateArgument *Args, 2635b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor unsigned NumArgs) { 2636b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 2637b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor if (Args[I].isPackExpansion()) 2638b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor return true; 2639b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor 2640b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor return true; 2641b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor} 2642b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#endif 2643b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor 2644833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType 2645833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallASTContext::getTemplateSpecializationType(TemplateName Template, 26467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor const TemplateArgument *Args, 26477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor unsigned NumArgs, 26483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 26497c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 26507c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 26510f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor // Look through qualified template names. 26520f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 26530f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor Template = TemplateName(QTN->getTemplateDecl()); 26547c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 2655b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor bool IsTypeAlias = 26563e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Template.getAsTemplateDecl() && 26573e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl()); 26583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType CanonType; 26593e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!Underlying.isNull()) 26603e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith CanonType = getCanonicalType(Underlying); 26613e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else { 2662b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor // We can get here with an alias template when the specialization contains 2663b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor // a pack expansion that does not match up with a parameter pack. 2664b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor assert((!IsTypeAlias || hasAnyPackExpansions(Args, NumArgs)) && 2665b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor "Caller must compute aliased type"); 2666b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor IsTypeAlias = false; 26673e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith CanonType = getCanonicalTemplateSpecializationType(Template, Args, 26683e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NumArgs); 26693e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 2670fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor 26711275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // Allocate the (non-canonical) template specialization type, but don't 26721275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // try to unique it: these types typically have location information that 26731275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // we don't unique and don't want to lose. 26743e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith void *Mem = Allocate(sizeof(TemplateSpecializationType) + 26753e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith sizeof(TemplateArgument) * NumArgs + 2676b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor (IsTypeAlias? sizeof(QualType) : 0), 26776b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeAlignment); 26781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateSpecializationType *Spec 2679b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, CanonType, 2680b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor IsTypeAlias ? Underlying : QualType()); 26811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 268255f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor Types.push_back(Spec); 26831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(Spec, 0); 268455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor} 268555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor 26861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 26879763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisASTContext::getCanonicalTemplateSpecializationType(TemplateName Template, 26889763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis const TemplateArgument *Args, 26894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned NumArgs) const { 26907c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 26917c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 26923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 26930f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor // Look through qualified template names. 26940f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 26950f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor Template = TemplateName(QTN->getTemplateDecl()); 26967c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 26979763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Build the canonical template specialization type. 26989763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateName CanonTemplate = getCanonicalTemplateName(Template); 26995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> CanonArgs; 27009763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.reserve(NumArgs); 27019763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis for (unsigned I = 0; I != NumArgs; ++I) 27029763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.push_back(getCanonicalTemplateArgument(Args[I])); 27039763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 27049763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Determine whether this canonical template specialization type already 27059763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // exists. 27069763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis llvm::FoldingSetNodeID ID; 27079763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationType::Profile(ID, CanonTemplate, 27089763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.data(), NumArgs, *this); 27099763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 27109763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis void *InsertPos = 0; 27119763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationType *Spec 27129763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 27139763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 27149763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis if (!Spec) { 27159763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Allocate a new canonical template specialization type. 27169763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis void *Mem = Allocate((sizeof(TemplateSpecializationType) + 27179763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis sizeof(TemplateArgument) * NumArgs), 27189763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TypeAlignment); 27199763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Spec = new (Mem) TemplateSpecializationType(CanonTemplate, 27209763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.data(), NumArgs, 27213e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType(), QualType()); 27229763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Types.push_back(Spec); 27239763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationTypes.InsertNode(Spec, InsertPos); 27249763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis } 27259763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 27269763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis assert(Spec->isDependentType() && 27279763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis "Non-dependent template-id type must have a canonical type"); 27289763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis return QualType(Spec, 0); 27299763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis} 27309763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 27319763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType 2732465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword, 2733465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara NestedNameSpecifier *NNS, 27344ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType NamedType) const { 2735e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor llvm::FoldingSetNodeID ID; 2736465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType::Profile(ID, Keyword, NNS, NamedType); 2737e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2738e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor void *InsertPos = 0; 2739465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2740e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor if (T) 2741e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor return QualType(T, 0); 2742e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2743789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor QualType Canon = NamedType; 2744789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor if (!Canon.isCanonical()) { 2745789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor Canon = getCanonicalType(NamedType); 2746465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2747465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara assert(!CheckT && "Elaborated canonical type broken"); 2748789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckT; 2749789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor } 2750789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2751465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara T = new (*this) ElaboratedType(Keyword, NNS, NamedType, Canon); 2752e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor Types.push_back(T); 2753465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedTypes.InsertNode(T, InsertPos); 2754e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor return QualType(T, 0); 2755e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor} 2756e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2757075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType 27584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getParenType(QualType InnerType) const { 2759075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara llvm::FoldingSetNodeID ID; 2760075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType::Profile(ID, InnerType); 2761075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2762075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara void *InsertPos = 0; 2763075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2764075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (T) 2765075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(T, 0); 2766075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2767075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType Canon = InnerType; 2768075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (!Canon.isCanonical()) { 2769075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Canon = getCanonicalType(InnerType); 2770075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2771075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara assert(!CheckT && "Paren canonical type broken"); 2772075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara (void)CheckT; 2773075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara } 2774075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2775075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara T = new (*this) ParenType(InnerType, Canon); 2776075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Types.push_back(T); 2777075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenTypes.InsertNode(T, InsertPos); 2778075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(T, 0); 2779075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 2780075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 27814a2023f5014e82389d5980d307b89c545dbbac81Douglas GregorQualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword, 27824a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 27834a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor const IdentifierInfo *Name, 27844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType Canon) const { 2785d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor assert(NNS->isDependent() && "nested-name-specifier must be dependent"); 2786d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2787d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor if (Canon.isNull()) { 2788d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 27894a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor ElaboratedTypeKeyword CanonKeyword = Keyword; 27904a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor if (Keyword == ETK_None) 27914a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor CanonKeyword = ETK_Typename; 27924a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor 27934a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor if (CanonNNS != NNS || CanonKeyword != Keyword) 27944a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor Canon = getDependentNameType(CanonKeyword, CanonNNS, Name); 2795d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 2796d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2797d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor llvm::FoldingSetNodeID ID; 27984a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor DependentNameType::Profile(ID, Keyword, NNS, Name); 2799d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2800d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor void *InsertPos = 0; 28014714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameType *T 28024714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos); 2803d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor if (T) 2804d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return QualType(T, 0); 2805d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 28064a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor T = new (*this) DependentNameType(Keyword, NNS, Name, Canon); 2807d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor Types.push_back(T); 28084714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameTypes.InsertNode(T, InsertPos); 28091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 2810d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor} 2811d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 28121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 281333500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType( 281433500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword Keyword, 28154a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 281633500955d731c73717af52088b7fc0e7a85681e7John McCall const IdentifierInfo *Name, 28174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const TemplateArgumentListInfo &Args) const { 281833500955d731c73717af52088b7fc0e7a85681e7John McCall // TODO: avoid this copy 28195f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> ArgCopy; 282033500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, E = Args.size(); I != E; ++I) 282133500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.push_back(Args[I].getArgument()); 282233500955d731c73717af52088b7fc0e7a85681e7John McCall return getDependentTemplateSpecializationType(Keyword, NNS, Name, 282333500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.size(), 282433500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.data()); 282533500955d731c73717af52088b7fc0e7a85681e7John McCall} 282633500955d731c73717af52088b7fc0e7a85681e7John McCall 282733500955d731c73717af52088b7fc0e7a85681e7John McCallQualType 282833500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType( 282933500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword Keyword, 283033500955d731c73717af52088b7fc0e7a85681e7John McCall NestedNameSpecifier *NNS, 283133500955d731c73717af52088b7fc0e7a85681e7John McCall const IdentifierInfo *Name, 283233500955d731c73717af52088b7fc0e7a85681e7John McCall unsigned NumArgs, 28334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const TemplateArgument *Args) const { 2834aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor assert((!NNS || NNS->isDependent()) && 2835aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor "nested-name-specifier must be dependent"); 28361734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 2837789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor llvm::FoldingSetNodeID ID; 283833500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS, 283933500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, Args); 2840789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2841789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor void *InsertPos = 0; 284233500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationType *T 284333500955d731c73717af52088b7fc0e7a85681e7John McCall = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 2844789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor if (T) 2845789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor return QualType(T, 0); 2846789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 284733500955d731c73717af52088b7fc0e7a85681e7John McCall NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 284833500955d731c73717af52088b7fc0e7a85681e7John McCall 284933500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword CanonKeyword = Keyword; 285033500955d731c73717af52088b7fc0e7a85681e7John McCall if (Keyword == ETK_None) CanonKeyword = ETK_Typename; 28511734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 285233500955d731c73717af52088b7fc0e7a85681e7John McCall bool AnyNonCanonArgs = false; 28535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> CanonArgs(NumArgs); 285433500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0; I != NumArgs; ++I) { 285533500955d731c73717af52088b7fc0e7a85681e7John McCall CanonArgs[I] = getCanonicalTemplateArgument(Args[I]); 285633500955d731c73717af52088b7fc0e7a85681e7John McCall if (!CanonArgs[I].structurallyEquals(Args[I])) 285733500955d731c73717af52088b7fc0e7a85681e7John McCall AnyNonCanonArgs = true; 2858789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor } 28591734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 286033500955d731c73717af52088b7fc0e7a85681e7John McCall QualType Canon; 286133500955d731c73717af52088b7fc0e7a85681e7John McCall if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) { 286233500955d731c73717af52088b7fc0e7a85681e7John McCall Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS, 286333500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, 286433500955d731c73717af52088b7fc0e7a85681e7John McCall CanonArgs.data()); 286533500955d731c73717af52088b7fc0e7a85681e7John McCall 286633500955d731c73717af52088b7fc0e7a85681e7John McCall // Find the insert position again. 286733500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 286833500955d731c73717af52088b7fc0e7a85681e7John McCall } 286933500955d731c73717af52088b7fc0e7a85681e7John McCall 287033500955d731c73717af52088b7fc0e7a85681e7John McCall void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) + 287133500955d731c73717af52088b7fc0e7a85681e7John McCall sizeof(TemplateArgument) * NumArgs), 287233500955d731c73717af52088b7fc0e7a85681e7John McCall TypeAlignment); 2873ef99001908e799c388f1363b1e607dad5f5b57d3John McCall T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS, 287433500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, Args, Canon); 28751734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor Types.push_back(T); 287633500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypes.InsertNode(T, InsertPos); 28771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 28781734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor} 28791734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 2880cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas GregorQualType ASTContext::getPackExpansionType(QualType Pattern, 2881cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 28827536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor llvm::FoldingSetNodeID ID; 2883cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor PackExpansionType::Profile(ID, Pattern, NumExpansions); 28847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 28857536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor assert(Pattern->containsUnexpandedParameterPack() && 28867536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor "Pack expansions must expand one or more parameter packs"); 28877536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor void *InsertPos = 0; 28887536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionType *T 28897536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 28907536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (T) 28917536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return QualType(T, 0); 28927536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 28937536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor QualType Canon; 28947536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (!Pattern.isCanonical()) { 2895d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith Canon = getCanonicalType(Pattern); 2896d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith // The canonical type might not contain an unexpanded parameter pack, if it 2897d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith // contains an alias template specialization which ignores one of its 2898d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith // parameters. 2899d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith if (Canon->containsUnexpandedParameterPack()) { 2900d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions); 2901d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith 2902d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith // Find the insert position again, in case we inserted an element into 2903d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith // PackExpansionTypes and invalidated our insert position. 2904d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 2905d8672ef2d343a0dbfe838724fb2d9fb4efea6041Richard Smith } 29067536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor } 29077536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 2908cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor T = new (*this) PackExpansionType(Pattern, Canon, NumExpansions); 29097536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor Types.push_back(T); 29107536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypes.InsertNode(T, InsertPos); 29117536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return QualType(T, 0); 29127536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 29137536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 291488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// CmpProtocolNames - Comparison predicate for sorting protocols 291588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// alphabetically. 291688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattnerstatic bool CmpProtocolNames(const ObjCProtocolDecl *LHS, 291788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner const ObjCProtocolDecl *RHS) { 29182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS->getDeclName() < RHS->getDeclName(); 291988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner} 292088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2921c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallstatic bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols, 292254e14c4db764c0636160d26c5bbf491637c83a76John McCall unsigned NumProtocols) { 292354e14c4db764c0636160d26c5bbf491637c83a76John McCall if (NumProtocols == 0) return true; 292454e14c4db764c0636160d26c5bbf491637c83a76John McCall 292561cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor if (Protocols[0]->getCanonicalDecl() != Protocols[0]) 292661cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor return false; 292761cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor 292854e14c4db764c0636160d26c5bbf491637c83a76John McCall for (unsigned i = 1; i != NumProtocols; ++i) 292961cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor if (!CmpProtocolNames(Protocols[i-1], Protocols[i]) || 293061cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor Protocols[i]->getCanonicalDecl() != Protocols[i]) 293154e14c4db764c0636160d26c5bbf491637c83a76John McCall return false; 293254e14c4db764c0636160d26c5bbf491637c83a76John McCall return true; 293354e14c4db764c0636160d26c5bbf491637c83a76John McCall} 293454e14c4db764c0636160d26c5bbf491637c83a76John McCall 293554e14c4db764c0636160d26c5bbf491637c83a76John McCallstatic void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols, 293688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner unsigned &NumProtocols) { 293788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols; 29381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 293988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner // Sort protocols, keyed by name. 294088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames); 294188cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 294261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor // Canonicalize. 294361cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor for (unsigned I = 0, N = NumProtocols; I != N; ++I) 294461cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor Protocols[I] = Protocols[I]->getCanonicalDecl(); 294561cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor 294688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner // Remove duplicates. 294788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner ProtocolsEnd = std::unique(Protocols, ProtocolsEnd); 294888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner NumProtocols = ProtocolsEnd-Protocols; 294988cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner} 295088cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2951c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType ASTContext::getObjCObjectType(QualType BaseType, 2952c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCProtocolDecl * const *Protocols, 29534ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned NumProtocols) const { 2954c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // If the base type is an interface and there aren't any protocols 2955c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // to add, then the interface type will do just fine. 2956c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!NumProtocols && isa<ObjCInterfaceType>(BaseType)) 2957c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return BaseType; 2958d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff 2959c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Look in the folding set for an existing type. 2960c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall llvm::FoldingSetNodeID ID; 2961c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypeImpl::Profile(ID, BaseType, Protocols, NumProtocols); 2962d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff void *InsertPos = 0; 2963c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos)) 2964c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(QT, 0); 2965d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff 2966c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Build the canonical type, which has the canonical base type and 2967c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // a sorted-and-uniqued list of protocols. 296854e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Canonical; 2969c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall bool ProtocolsSorted = areSortedAndUniqued(Protocols, NumProtocols); 2970c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ProtocolsSorted || !BaseType.isCanonical()) { 2971c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ProtocolsSorted) { 29725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols, 29730237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer Protocols + NumProtocols); 297454e14c4db764c0636160d26c5bbf491637c83a76John McCall unsigned UniqueCount = NumProtocols; 297554e14c4db764c0636160d26c5bbf491637c83a76John McCall 297654e14c4db764c0636160d26c5bbf491637c83a76John McCall SortAndUniqueProtocols(&Sorted[0], UniqueCount); 2977c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectType(getCanonicalType(BaseType), 2978c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall &Sorted[0], UniqueCount); 297954e14c4db764c0636160d26c5bbf491637c83a76John McCall } else { 2980c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectType(getCanonicalType(BaseType), 2981c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Protocols, NumProtocols); 298254e14c4db764c0636160d26c5bbf491637c83a76John McCall } 298354e14c4db764c0636160d26c5bbf491637c83a76John McCall 298454e14c4db764c0636160d26c5bbf491637c83a76John McCall // Regenerate InsertPos. 2985c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos); 298654e14c4db764c0636160d26c5bbf491637c83a76John McCall } 298754e14c4db764c0636160d26c5bbf491637c83a76John McCall 2988c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall unsigned Size = sizeof(ObjCObjectTypeImpl); 2989c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Size += NumProtocols * sizeof(ObjCProtocolDecl *); 2990fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor void *Mem = Allocate(Size, TypeAlignment); 2991c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypeImpl *T = 2992c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall new (Mem) ObjCObjectTypeImpl(Canonical, BaseType, Protocols, NumProtocols); 29931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2994c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Types.push_back(T); 2995c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypes.InsertNode(T, InsertPos); 2996c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(T, 0); 2997d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff} 299888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2999c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for 3000c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// the given object type. 30014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const { 30024b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian llvm::FoldingSetNodeID ID; 3003c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerType::Profile(ID, ObjectT); 30041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30054b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian void *InsertPos = 0; 3006c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ObjCObjectPointerType *QT = 3007c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 30084b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian return QualType(QT, 0); 30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3010c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Find the canonical object type. 301154e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Canonical; 3012c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ObjectT.isCanonical()) { 3013c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT)); 301454e14c4db764c0636160d26c5bbf491637c83a76John McCall 3015c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Regenerate InsertPos. 3016c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 301754e14c4db764c0636160d26c5bbf491637c83a76John McCall } 301854e14c4db764c0636160d26c5bbf491637c83a76John McCall 3019c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // No match. 3020c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment); 3021c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerType *QType = 3022c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall new (Mem) ObjCObjectPointerType(Canonical, ObjectT); 302324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 302424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis Types.push_back(QType); 3025c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.InsertNode(QType, InsertPos); 302624fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis return QualType(QType, 0); 302724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 302824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 3029deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// getObjCInterfaceType - Return the unique reference to the type for the 3030deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// specified ObjC interface decl. The list of protocols is optional. 30310af550115df1f57f17a4f125ff0e8b34820c65d1Douglas GregorQualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl, 30320af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor ObjCInterfaceDecl *PrevDecl) const { 3033deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (Decl->TypeForDecl) 3034deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor return QualType(Decl->TypeForDecl, 0); 303574c730ad1f6818b676b0bad46d806a9176950328Sebastian Redl 30360af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor if (PrevDecl) { 30370af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl"); 30380af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor Decl->TypeForDecl = PrevDecl->TypeForDecl; 30390af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor return QualType(PrevDecl->TypeForDecl, 0); 30400af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor } 30410af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor 30428d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor // Prefer the definition, if there is one. 30438d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor if (const ObjCInterfaceDecl *Def = Decl->getDefinition()) 30448d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor Decl = Def; 30458d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor 3046deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment); 3047deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ObjCInterfaceType *T = new (Mem) ObjCInterfaceType(Decl); 3048deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Decl->TypeForDecl = T; 3049deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Types.push_back(T); 3050deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor return QualType(T, 0); 3051c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 3052c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 305372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique 305472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// TypeOfExprType AST's (since expression's are never shared). For example, 30559752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// multiple declarations that refer to "typeof(x)" all contain different 30561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// DeclRefExpr's. This doesn't effect the type checker, since it operates 30579752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique). 30584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfExprType(Expr *tofExpr) const { 3059dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor TypeOfExprType *toe; 3060b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor if (tofExpr->isTypeDependent()) { 3061b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor llvm::FoldingSetNodeID ID; 3062b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprType::Profile(ID, *this, tofExpr); 30631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3064b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor void *InsertPos = 0; 3065b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprType *Canon 3066b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos); 3067b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor if (Canon) { 3068b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // We already have a "canonical" version of an identical, dependent 3069b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // typeof(expr) type. Use that as our canonical type. 30706b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, 3071b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor QualType((TypeOfExprType*)Canon, 0)); 30723060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 3073b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // Build a new, canonical typeof(expr) type. 30746b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Canon 30756b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr); 3076b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprTypes.InsertNode(Canon, InsertPos); 3077b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor toe = Canon; 3078b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor } 3079b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor } else { 3080dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor QualType Canonical = getCanonicalType(tofExpr->getType()); 30816b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical); 3082dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor } 30839752f25748d954df99087d741ea35db37ff16beaSteve Naroff Types.push_back(toe); 30849752f25748d954df99087d741ea35db37ff16beaSteve Naroff return QualType(toe, 0); 3085d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff} 3086d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff 30879752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// getTypeOfType - Unlike many "get<Type>" functions, we don't unique 30889752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// TypeOfType AST's. The only motivation to unique these nodes would be 30899752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be 30901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates 30919752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique). 30924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfType(QualType tofType) const { 3093f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner QualType Canonical = getCanonicalType(tofType); 30946b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical); 30959752f25748d954df99087d741ea35db37ff16beaSteve Naroff Types.push_back(tot); 30969752f25748d954df99087d741ea35db37ff16beaSteve Naroff return QualType(tot, 0); 3097d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff} 3098d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff 309960a9a2a404a4cf259d39133383e922aa00ca9043Anders Carlsson 3100395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// getDecltypeType - Unlike many "get<Type>" functions, we don't unique 3101395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// DecltypeType AST's. The only motivation to unique these nodes would be 3102395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be 31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates 310439e02032b01874a0d02ba85a4cd3922adda81376David Blaikie/// on canonical types (which are always unique). 3105f8af98286022f72157d84951b48fde5fb369ab29Douglas GregorQualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const { 3106dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor DecltypeType *dt; 3107561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 3108561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // C++0x [temp.type]p2: 3109561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // If an expression e involves a template parameter, decltype(e) denotes a 3110561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // unique dependent type. Two such decltype-specifiers refer to the same 3111561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // type only if their expressions are equivalent (14.5.6.1). 3112561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (e->isInstantiationDependent()) { 31139d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor llvm::FoldingSetNodeID ID; 31149d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeType::Profile(ID, *this, e); 31151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31169d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor void *InsertPos = 0; 31179d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeType *Canon 31189d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos); 31199d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor if (Canon) { 31209d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // We already have a "canonical" version of an equivalent, dependent 31219d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // decltype type. Use that as our canonical type. 31226b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall dt = new (*this, TypeAlignment) DecltypeType(e, DependentTy, 31239d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor QualType((DecltypeType*)Canon, 0)); 31243060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 31259d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // Build a new, canonical typeof(expr) type. 31266b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e); 31279d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeTypes.InsertNode(Canon, InsertPos); 31289d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor dt = Canon; 31299d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor } 31309d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor } else { 3131f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType, 3132f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor getCanonicalType(UnderlyingType)); 3133dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor } 3134395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson Types.push_back(dt); 3135395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson return QualType(dt, 0); 3136395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson} 3137395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 3138ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// getUnaryTransformationType - We don't unique these, since the memory 3139ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// savings are minimal and these are rare. 3140ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTContext::getUnaryTransformType(QualType BaseType, 3141ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType UnderlyingType, 3142ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt UnaryTransformType::UTTKind Kind) 3143ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt const { 3144ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt UnaryTransformType *Ty = 314569d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType, 314669d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor Kind, 314769d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor UnderlyingType->isDependentType() ? 314812fc4b0624706b474fa10308631fa8daf92f340fPeter Collingbourne QualType() : getCanonicalType(UnderlyingType)); 3149ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt Types.push_back(Ty); 3150ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return QualType(Ty, 0); 3151ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 3152ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 3153483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith/// getAutoType - We only unique auto types after they've been deduced. 315434b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTContext::getAutoType(QualType DeducedType) const { 3155483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith void *InsertPos = 0; 3156483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (!DeducedType.isNull()) { 3157483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith // Look in the folding set for an existing type. 3158483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith llvm::FoldingSetNodeID ID; 3159483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoType::Profile(ID, DeducedType); 3160483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos)) 3161483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith return QualType(AT, 0); 3162483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith } 3163483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith 3164483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType); 3165483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith Types.push_back(AT); 3166483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (InsertPos) 3167483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoTypes.InsertNode(AT, InsertPos); 3168483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith return QualType(AT, 0); 316934b41d939a1328f484511c6002ba2456db879a29Richard Smith} 317034b41d939a1328f484511c6002ba2456db879a29Richard Smith 3171b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// getAtomicType - Return the uniqued reference to the atomic type for 3172b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// the given value type. 3173b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanQualType ASTContext::getAtomicType(QualType T) const { 3174b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Unique pointers, to guarantee there is only one pointer of a particular 3175b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // structure. 3176b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman llvm::FoldingSetNodeID ID; 3177b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType::Profile(ID, T); 3178b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3179b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman void *InsertPos = 0; 3180b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos)) 3181b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return QualType(AT, 0); 3182b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3183b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // If the atomic value type isn't canonical, this won't be a canonical type 3184b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // either, so fill in the canonical type field. 3185b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType Canonical; 3186b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (!T.isCanonical()) { 3187b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Canonical = getAtomicType(getCanonicalType(T)); 3188b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3189b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Get the new insert position for the node we care about. 3190b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos); 3191b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 3192b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 3193b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType *New = new (*this, TypeAlignment) AtomicType(T, Canonical); 3194b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Types.push_back(New); 3195b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicTypes.InsertNode(New, InsertPos); 3196b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return QualType(New, 0); 3197b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman} 3198b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3199ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoDeductType - Get type pattern for deducing against 'auto'. 3200ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoDeductType() const { 3201ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith if (AutoDeductTy.isNull()) 3202ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith AutoDeductTy = getAutoType(QualType()); 3203ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith assert(!AutoDeductTy.isNull() && "can't build 'auto' pattern"); 3204ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith return AutoDeductTy; 3205ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 3206ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 3207ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'. 3208ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoRRefDeductType() const { 3209ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith if (AutoRRefDeductTy.isNull()) 3210ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType()); 3211ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern"); 3212ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith return AutoRRefDeductTy; 3213ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 3214ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 32155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTagDeclType - Return the unique reference to the type for the 32165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified TagDecl (struct/union/class/enum) decl. 32174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTagDeclType(const TagDecl *Decl) const { 3218d778f88d32b96a74c9edb7342c81357606a7cdc0Ted Kremenek assert (Decl); 3219e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump // FIXME: What is the design on getTagDeclType when it requires casting 3220e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump // away const? mutable? 3221e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump return getTypeDeclType(const_cast<TagDecl*>(Decl)); 32225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 32235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 32241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result 32251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and 32261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// needs to agree with the definition in <stddef.h>. 3227a3ccda58913cc1a4b8564e349448b12acc462da7Anders CarlssonCanQualType ASTContext::getSizeType() const { 3228bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return getFromTargetType(Target->getSizeType()); 32295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 32305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 323129e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5). 323229e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getIntMaxType() const { 323329e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg return getFromTargetType(Target->getIntMaxType()); 323429e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg} 323529e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg 323629e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5). 323729e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getUIntMaxType() const { 323829e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg return getFromTargetType(Target->getUIntMaxType()); 323929e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg} 324029e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg 324164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getSignedWCharType - Return the type of "signed wchar_t". 324264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension. 324364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getSignedWCharType() const { 324464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // FIXME: derive from "Target" ? 324564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis return WCharTy; 324664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis} 324764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 324864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getUnsignedWCharType - Return the type of "unsigned wchar_t". 324964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension. 325064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getUnsignedWCharType() const { 325164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // FIXME: derive from "Target" ? 325264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis return UnsignedIntTy; 325364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis} 325464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 325529e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17) 32568b9023ba35a86838789e2c9034a6128728c547aaChris Lattner/// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9). 32578b9023ba35a86838789e2c9034a6128728c547aaChris LattnerQualType ASTContext::getPointerDiffType() const { 3258bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return getFromTargetType(Target->getPtrDiffType(0)); 32598b9023ba35a86838789e2c9034a6128728c547aaChris Lattner} 32608b9023ba35a86838789e2c9034a6128728c547aaChris Lattner 3261e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===// 3262e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner// Type Operators 3263e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===// 3264e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 32654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCanQualType ASTContext::getCanonicalParamType(QualType T) const { 326654e14c4db764c0636160d26c5bbf491637c83a76John McCall // Push qualifiers into arrays, and then discard any remaining 326754e14c4db764c0636160d26c5bbf491637c83a76John McCall // qualifiers. 326854e14c4db764c0636160d26c5bbf491637c83a76John McCall T = getCanonicalType(T); 3269745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian T = getVariableArrayDecayedType(T); 327054e14c4db764c0636160d26c5bbf491637c83a76John McCall const Type *Ty = T.getTypePtr(); 327154e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Result; 327254e14c4db764c0636160d26c5bbf491637c83a76John McCall if (isa<ArrayType>(Ty)) { 327354e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = getArrayDecayedType(QualType(Ty,0)); 327454e14c4db764c0636160d26c5bbf491637c83a76John McCall } else if (isa<FunctionType>(Ty)) { 327554e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = getPointerType(QualType(Ty, 0)); 327654e14c4db764c0636160d26c5bbf491637c83a76John McCall } else { 327754e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = QualType(Ty, 0); 327854e14c4db764c0636160d26c5bbf491637c83a76John McCall } 327954e14c4db764c0636160d26c5bbf491637c83a76John McCall 328054e14c4db764c0636160d26c5bbf491637c83a76John McCall return CanQualType::CreateUnsafe(Result); 328154e14c4db764c0636160d26c5bbf491637c83a76John McCall} 328254e14c4db764c0636160d26c5bbf491637c83a76John McCall 328362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCallQualType ASTContext::getUnqualifiedArrayType(QualType type, 328462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall Qualifiers &quals) { 328562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall SplitQualType splitType = type.getSplitUnqualifiedType(); 328662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 328762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // FIXME: getSplitUnqualifiedType() actually walks all the way to 328862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // the unqualified desugared type and then drops it on the floor. 328962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // We then have to strip that sugar back off with 329062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // getUnqualifiedDesugaredType(), which is silly. 329162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall const ArrayType *AT = 3292200fa53fd420aa8369586f569dbece04930ad6a3John McCall dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType()); 329362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 329462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // If we don't have an array, just use the results in splitType. 32959dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (!AT) { 3296200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals = splitType.Quals; 3297200fa53fd420aa8369586f569dbece04930ad6a3John McCall return QualType(splitType.Ty, 0); 329828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 329928e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 330062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // Otherwise, recurse on the array's element type. 330162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall QualType elementType = AT->getElementType(); 330262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall QualType unqualElementType = getUnqualifiedArrayType(elementType, quals); 330362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 330462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // If that didn't change the element type, AT has no qualifiers, so we 330562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // can just use the results in splitType. 330662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall if (elementType == unqualElementType) { 330762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall assert(quals.empty()); // from the recursive call 3308200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals = splitType.Quals; 3309200fa53fd420aa8369586f569dbece04930ad6a3John McCall return QualType(splitType.Ty, 0); 331062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall } 331162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 331262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // Otherwise, add in the qualifiers from the outermost type, then 331362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // build the type back up. 3314200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals.addConsistentQualifiers(splitType.Quals); 331528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 33169dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 331762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getConstantArrayType(unqualElementType, CAT->getSize(), 331828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth CAT->getSizeModifier(), 0); 331928e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 332028e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 33219dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 332262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0); 332328e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 332428e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 33259dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(AT)) { 332662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getVariableArrayType(unqualElementType, 33273fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall VAT->getSizeExpr(), 33289dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getSizeModifier(), 33299dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getIndexTypeCVRQualifiers(), 33309dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getBracketsRange()); 33319dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor } 33329dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor 33339dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(AT); 333462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(), 333528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth DSAT->getSizeModifier(), 0, 333628e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth SourceRange()); 333728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth} 333828e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 33395a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types that 33405a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// may be similar (C++ 4.4), replaces T1 and T2 with the type that 33415a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// they point to and return true. If T1 and T2 aren't pointer types 33425a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// or pointer-to-member types, or if they are not similar at this 33435a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// level, returns false and leaves T1 and T2 unchanged. Top-level 33445a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// qualifiers on T1 and T2 are ignored. This function will typically 33455a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// be called in a loop that successively "unwraps" pointer and 33465a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// pointer-to-member types to compare them at each level. 33475a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregorbool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) { 33485a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const PointerType *T1PtrType = T1->getAs<PointerType>(), 33495a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2PtrType = T2->getAs<PointerType>(); 33505a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1PtrType && T2PtrType) { 33515a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1PtrType->getPointeeType(); 33525a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2PtrType->getPointeeType(); 33535a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 33545a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33555a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33565a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(), 33575a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2MPType = T2->getAs<MemberPointerType>(); 33585a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1MPType && T2MPType && 33595a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0), 33605a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor QualType(T2MPType->getClass(), 0))) { 33615a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1MPType->getPointeeType(); 33625a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2MPType->getPointeeType(); 33635a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 33645a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33655a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1) { 33675a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const ObjCObjectPointerType *T1OPType = T1->getAs<ObjCObjectPointerType>(), 33685a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2OPType = T2->getAs<ObjCObjectPointerType>(); 33695a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1OPType && T2OPType) { 33705a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1OPType->getPointeeType(); 33715a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2OPType->getPointeeType(); 33725a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 33735a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33745a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 33755a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33765a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor // FIXME: Block pointers, too? 33775a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33785a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return false; 33795a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor} 33805a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 33814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameInfo 33824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getNameForTemplate(TemplateName Name, 33834ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceLocation NameLoc) const { 3384146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall switch (Name.getKind()) { 3385146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::QualifiedTemplate: 3386146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::Template: 33872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: CHECKME: what about DNLoc? 3388146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(), 3389146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 33902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 3391146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::OverloadedTemplate: { 3392146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate(); 3393146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall // DNInfo work in progress: CHECKME: what about DNLoc? 3394146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc); 3395146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3396146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3397146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::DependentTemplate: { 3398146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 33992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName DName; 340080ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall if (DTN->isIdentifier()) { 34012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DName = DeclarationNames.getIdentifier(DTN->getIdentifier()); 34022577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(DName, NameLoc); 340380ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } else { 34042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DName = DeclarationNames.getCXXOperatorName(DTN->getOperator()); 34052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: FIXME: source locations? 34062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameLoc DNLoc; 34072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DNLoc.CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding(); 34082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DNLoc.CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding(); 34092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(DName, NameLoc, DNLoc); 341080ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } 341180ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } 341280ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall 3413146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 3414146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 3415146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 3416146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(subst->getParameter()->getDeclName(), 3417146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 3418146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3419146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3420146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParmPack: { 3421146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmPackStorage *subst 3422146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParmPack(); 3423146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(subst->getParameterPack()->getDeclName(), 3424146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 3425146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3426146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3427146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3428146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("bad template name kind!"); 342980ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall} 343080ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall 34314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const { 3432146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall switch (Name.getKind()) { 3433146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::QualifiedTemplate: 3434146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::Template: { 3435146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateDecl *Template = Name.getAsTemplateDecl(); 34363e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTemplateParmDecl *TTP 3437146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = dyn_cast<TemplateTemplateParmDecl>(Template)) 34383e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Template = getCanonicalTemplateTemplateParmDecl(TTP); 34393e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 34403e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // The canonical template name is the canonical template declaration. 344197fbaa2a38804268a024f1a104b43fcf8b4411b0Argyrios Kyrtzidis return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl())); 34423e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 344325a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor 3444146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::OverloadedTemplate: 3445146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("cannot canonicalize overloaded template"); 3446146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3447146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::DependentTemplate: { 3448146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 3449146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall assert(DTN && "Non-dependent template names must refer to template decls."); 3450146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DTN->CanonicalTemplateName; 3451146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3452146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3453146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 3454146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 3455146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 3456146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return getCanonicalTemplateName(subst->getReplacement()); 34571aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3459146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParmPack: { 3460146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmPackStorage *subst 3461146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParmPack(); 3462146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateTemplateParmDecl *canonParameter 3463146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack()); 3464146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateArgument canonArgPack 3465146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = getCanonicalTemplateArgument(subst->getArgumentPack()); 3466146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack); 3467146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3468146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3469146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3470146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("bad template name!"); 347125a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor} 347225a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor 3473db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregorbool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) { 3474db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor X = getCanonicalTemplateName(X); 3475db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor Y = getCanonicalTemplateName(Y); 3476db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor return X.getAsVoidPointer() == Y.getAsVoidPointer(); 3477db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor} 3478db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor 34791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument 34804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const { 34811275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor switch (Arg.getKind()) { 34821275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Null: 34831275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor return Arg; 34841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34851275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Expression: 34861275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor return Arg; 34871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3488d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor case TemplateArgument::Declaration: { 3489d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor if (Decl *D = Arg.getAsDecl()) 3490d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor return TemplateArgument(D->getCanonicalDecl()); 3491d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor return TemplateArgument((Decl*)0); 3492d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor } 34931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3494788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 3495788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate())); 3496a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 3497a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 3498a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgument(getCanonicalTemplateName( 3499a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg.getAsTemplateOrTemplatePattern()), 35002be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor Arg.getNumTemplateExpansions()); 3501a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 35021275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Integral: 3503855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer return TemplateArgument(Arg, getCanonicalType(Arg.getIntegralType())); 35041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35051275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Type: 3506833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TemplateArgument(getCanonicalType(Arg.getAsType())); 35071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35081275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Pack: { 350987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor if (Arg.pack_size() == 0) 351087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor return Arg; 351187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 3512910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *CanonArgs 3513910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = new (*this) TemplateArgument[Arg.pack_size()]; 35141275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor unsigned Idx = 0; 35151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 35161275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor AEnd = Arg.pack_end(); 35171275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor A != AEnd; (void)++A, ++Idx) 35181275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor CanonArgs[Idx] = getCanonicalTemplateArgument(*A); 35191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3520910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return TemplateArgument(CanonArgs, Arg.pack_size()); 35211275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor } 35221275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor } 35231275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor 35241275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // Silence GCC warning 3525b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unhandled template argument kind"); 35261275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor} 35271275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor 3528d57959af02b4af695276f4204443afe6e5d86bd8Douglas GregorNestedNameSpecifier * 35294ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const { 35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!NNS) 3531d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return 0; 3532d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3533d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor switch (NNS->getKind()) { 3534d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Identifier: 3535d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // Canonicalize the prefix but keep the identifier the same. 35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return NestedNameSpecifier::Create(*this, 3537d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor getCanonicalNestedNameSpecifier(NNS->getPrefix()), 3538d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor NNS->getAsIdentifier()); 3539d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3540d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Namespace: 3541d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // A namespace is canonical; build a nested-name-specifier with 3542d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // this namespace and no prefix. 354314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(*this, 0, 354414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespace()->getOriginalNamespace()); 354514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 354614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor case NestedNameSpecifier::NamespaceAlias: 354714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor // A namespace is canonical; build a nested-name-specifier with 354814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor // this namespace and no prefix. 354914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(*this, 0, 355014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespaceAlias()->getNamespace() 355114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor ->getOriginalNamespace()); 3552d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3553d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::TypeSpec: 3554d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: { 3555d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor QualType T = getCanonicalType(QualType(NNS->getAsType(), 0)); 3556264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor 3557264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // If we have some kind of dependent-named type (e.g., "typename T::type"), 3558264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // break it apart into its prefix and identifier, then reconsititute those 3559264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // as the canonical nested-name-specifier. This is required to canonicalize 3560264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // a dependent nested-name-specifier involving typedefs of dependent-name 3561264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // types, e.g., 3562264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // typedef typename T::type T1; 3563264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // typedef typename T1::type T2; 356416412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman if (const DependentNameType *DNT = T->getAs<DependentNameType>()) 356516412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman return NestedNameSpecifier::Create(*this, DNT->getQualifier(), 3566264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor const_cast<IdentifierInfo *>(DNT->getIdentifier())); 3567264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor 356816412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // Otherwise, just canonicalize the type, and force it to be a TypeSpec. 356916412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // FIXME: Why are TypeSpec and TypeSpecWithTemplate distinct in the 357016412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // first place? 35713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return NestedNameSpecifier::Create(*this, 0, false, 35723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall const_cast<Type*>(T.getTypePtr())); 3573d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 3574d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3575d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Global: 3576d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // The global specifier is canonical and unique. 3577d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return NNS; 3578d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 3579d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 35807530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid NestedNameSpecifier::Kind!"); 3581d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor} 3582d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3583c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner 35844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadconst ArrayType *ASTContext::getAsArrayType(QualType T) const { 3585c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Handle the non-qualified case efficiently. 3586a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor if (!T.hasLocalQualifiers()) { 3587c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Handle the common positive case fast. 3588c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ArrayType *AT = dyn_cast<ArrayType>(T)) 3589c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return AT; 3590c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner } 35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Handle the common negative case fast. 35933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!isa<ArrayType>(T.getCanonicalType())) 3594c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return 0; 35951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Apply any qualifiers from the array type to the element type. This 3597c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // implements C99 6.7.3p8: "If the specification of an array type includes 3598c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // any type qualifiers, the element type is so qualified, not the array type." 35991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3600c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If we get here, we either have type qualifiers on the type, or we have 3601c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // sugar such as a typedef in the way. If we have type qualifiers on the type 360250d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor // we must propagate them down into the element type. 36030953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 36043b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType split = T.getSplitDesugaredType(); 3605200fa53fd420aa8369586f569dbece04930ad6a3John McCall Qualifiers qs = split.Quals; 36061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3607c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If we have a simple case, just return now. 3608200fa53fd420aa8369586f569dbece04930ad6a3John McCall const ArrayType *ATy = dyn_cast<ArrayType>(split.Ty); 36093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (ATy == 0 || qs.empty()) 3610c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return ATy; 36111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3612c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Otherwise, we have an array and we have qualifiers on it. Push the 3613c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // qualifiers into the array element type and return a new array type. 36143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs); 36151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3616c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy)) 3617c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(), 3618c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner CAT->getSizeModifier(), 36190953e767ff7817f97b3ab20896b229891eeff45bJohn McCall CAT->getIndexTypeCVRQualifiers())); 3620c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy)) 3621c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return cast<ArrayType>(getIncompleteArrayType(NewEltTy, 3622c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner IAT->getSizeModifier(), 36230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall IAT->getIndexTypeCVRQualifiers())); 3624898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 36251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const DependentSizedArrayType *DSAT 3626898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor = dyn_cast<DependentSizedArrayType>(ATy)) 3627898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return cast<ArrayType>( 36281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDependentSizedArrayType(NewEltTy, 36293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall DSAT->getSizeExpr(), 3630898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor DSAT->getSizeModifier(), 36310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall DSAT->getIndexTypeCVRQualifiers(), 36327e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor DSAT->getBracketsRange())); 36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3634c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner const VariableArrayType *VAT = cast<VariableArrayType>(ATy); 36357e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor return cast<ArrayType>(getVariableArrayType(NewEltTy, 36363fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall VAT->getSizeExpr(), 3637c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner VAT->getSizeModifier(), 36380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall VAT->getIndexTypeCVRQualifiers(), 36397e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor VAT->getBracketsRange())); 364077c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner} 364177c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner 3642ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getAdjustedParameterType(QualType T) const { 364379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // C99 6.7.5.3p7: 364479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // A declaration of a parameter as "array of type" shall be 364579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // adjusted to "qualified pointer to type", where the type 364679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // qualifiers (if any) are those specified within the [ and ] of 364779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // the array type derivation. 364879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor if (T->isArrayType()) 364979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return getArrayDecayedType(T); 365079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 365179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // C99 6.7.5.3p8: 365279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // A declaration of a parameter as "function returning type" 365379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // shall be adjusted to "pointer to function returning type", as 365479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // in 6.3.2.1. 365579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor if (T->isFunctionType()) 365679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return getPointerType(T); 365779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 365879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return T; 365979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor} 366079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 3661ad9689f3531c49e4bff467d9469993606800068cAbramo BagnaraQualType ASTContext::getSignatureParameterType(QualType T) const { 366279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor T = getVariableArrayDecayedType(T); 366379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor T = getAdjustedParameterType(T); 366479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return T.getUnqualifiedType(); 366579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor} 366679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 3667e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// getArrayDecayedType - Return the properly qualified result of decaying the 3668e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// specified array type to a pointer. This operation is non-trivial when 3669e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// handling typedefs etc. The canonical type of "T" must be an array type, 3670e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// this returns a pointer to a properly qualified element of the array. 3671e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// 3672e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// See C99 6.7.5.3p7 and C99 6.3.2.1p3. 36734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getArrayDecayedType(QualType Ty) const { 3674c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Get the element type with 'getAsArrayType' so that we don't lose any 3675c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // typedefs in the element type of the array. This also handles propagation 3676c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // of type qualifiers from the array type into the element type if present 3677c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // (C99 6.7.3p8). 3678c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner const ArrayType *PrettyArrayType = getAsArrayType(Ty); 3679c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner assert(PrettyArrayType && "Not an array type!"); 36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3681c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner QualType PtrTy = getPointerType(PrettyArrayType->getElementType()); 3682e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 3683e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner // int x[restrict 4] -> int *restrict 36840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers()); 3685e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner} 3686e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 36873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(const ArrayType *array) const { 36883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return getBaseElementType(array->getElementType()); 36895e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor} 36905e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor 36913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(QualType type) const { 36923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Qualifiers qs; 36933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall while (true) { 36943b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType split = type.getSplitDesugaredType(); 3695200fa53fd420aa8369586f569dbece04930ad6a3John McCall const ArrayType *array = split.Ty->getAsArrayTypeUnsafe(); 36963b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!array) break; 36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall type = array->getElementType(); 3699200fa53fd420aa8369586f569dbece04930ad6a3John McCall qs.addConsistentQualifiers(split.Quals); 37003b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 37011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return getQualifiedType(type, qs); 37036183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson} 37046183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson 37050de78998e7bda473b408437053e48661b510d453Fariborz Jahanian/// getConstantArrayElementCount - Returns number of constant array elements. 37061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpuint64_t 37070de78998e7bda473b408437053e48661b510d453Fariborz JahanianASTContext::getConstantArrayElementCount(const ConstantArrayType *CA) const { 37080de78998e7bda473b408437053e48661b510d453Fariborz Jahanian uint64_t ElementCount = 1; 37090de78998e7bda473b408437053e48661b510d453Fariborz Jahanian do { 37100de78998e7bda473b408437053e48661b510d453Fariborz Jahanian ElementCount *= CA->getSize().getZExtValue(); 37110de78998e7bda473b408437053e48661b510d453Fariborz Jahanian CA = dyn_cast<ConstantArrayType>(CA->getElementType()); 37120de78998e7bda473b408437053e48661b510d453Fariborz Jahanian } while (CA); 37130de78998e7bda473b408437053e48661b510d453Fariborz Jahanian return ElementCount; 37140de78998e7bda473b408437053e48661b510d453Fariborz Jahanian} 37150de78998e7bda473b408437053e48661b510d453Fariborz Jahanian 37165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFloatingRank - Return a relative rank for floating point types. 37175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// This routine will assert if passed a built-in type that isn't a float. 3718a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattnerstatic FloatingRank getFloatingRank(QualType T) { 3719183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType *CT = T->getAs<ComplexType>()) 37205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return getFloatingRank(CT->getElementType()); 3721a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner 3722183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type"); 3723183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall switch (T->getAs<BuiltinType>()->getKind()) { 3724b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("getFloatingRank(): not a floating type"); 3725aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: return HalfRank; 37265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Float: return FloatRank; 37275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Double: return DoubleRank; 37285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongDouble: return LongDoubleRank; 37295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 37305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 37315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 37321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getFloatingTypeOfSizeWithinDomain - Returns a real floating 37331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// point or a complex type (based on typeDomain/typeSize). 3734716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeDomain' is a real floating point or complex type. 3735716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeSize' is a real floating point or complex type. 37361361b11066239ea15764a2a844405352d87296b3Chris LattnerQualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size, 37371361b11066239ea15764a2a844405352d87296b3Chris Lattner QualType Domain) const { 37381361b11066239ea15764a2a844405352d87296b3Chris Lattner FloatingRank EltRank = getFloatingRank(Size); 37391361b11066239ea15764a2a844405352d87296b3Chris Lattner if (Domain->isComplexType()) { 37401361b11066239ea15764a2a844405352d87296b3Chris Lattner switch (EltRank) { 3741561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie case HalfRank: llvm_unreachable("Complex half is not supported"); 3742f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case FloatRank: return FloatComplexTy; 3743f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case DoubleRank: return DoubleComplexTy; 3744f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case LongDoubleRank: return LongDoubleComplexTy; 3745f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff } 3746f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff } 37471361b11066239ea15764a2a844405352d87296b3Chris Lattner 37481361b11066239ea15764a2a844405352d87296b3Chris Lattner assert(Domain->isRealFloatingType() && "Unknown domain!"); 37491361b11066239ea15764a2a844405352d87296b3Chris Lattner switch (EltRank) { 3750561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie case HalfRank: llvm_unreachable("Half ranks are not valid here"); 37511361b11066239ea15764a2a844405352d87296b3Chris Lattner case FloatRank: return FloatTy; 37521361b11066239ea15764a2a844405352d87296b3Chris Lattner case DoubleRank: return DoubleTy; 37531361b11066239ea15764a2a844405352d87296b3Chris Lattner case LongDoubleRank: return LongDoubleTy; 37545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3755561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie llvm_unreachable("getFloatingRank(): illegal value for rank"); 37565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 37575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 37587cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// getFloatingTypeOrder - Compare the rank of the two specified floating 37597cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// point types, ignoring the domain of the type (i.e. 'double' == 37607cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If 37611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1. 37624ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const { 3763a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner FloatingRank LHSR = getFloatingRank(LHS); 3764a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner FloatingRank RHSR = getFloatingRank(RHS); 37651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3766a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner if (LHSR == RHSR) 3767fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return 0; 3768a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner if (LHSR > RHSR) 3769fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return 1; 3770fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return -1; 37715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 37725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3773f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This 3774f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// routine will assert if passed a built-in type that isn't an integer or enum, 3775f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// or if it is not canonicalized. 3776f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallunsigned ASTContext::getIntegerRank(const Type *T) const { 3777467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(T->isCanonicalUnqualified() && "T should be canonicalized"); 3778f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 3779f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner switch (cast<BuiltinType>(T)->getKind()) { 3780b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("getIntegerRank(): not a built-in integer"); 37817cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Bool: 3782f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 1 + (getIntWidth(BoolTy) << 3); 37837cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Char_S: 37847cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Char_U: 37857cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::SChar: 37867cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UChar: 3787f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 2 + (getIntWidth(CharTy) << 3); 37887cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Short: 37897cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UShort: 3790f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 3 + (getIntWidth(ShortTy) << 3); 37917cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Int: 37927cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UInt: 3793f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 4 + (getIntWidth(IntTy) << 3); 37947cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Long: 37957cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::ULong: 3796f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 5 + (getIntWidth(LongTy) << 3); 37977cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::LongLong: 37987cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::ULongLong: 3799f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 6 + (getIntWidth(LongLongTy) << 3); 38002df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::Int128: 38012df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::UInt128: 38022df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner return 7 + (getIntWidth(Int128Ty) << 3); 3803f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner } 3804f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner} 3805f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner 380604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \brief Whether this is a promotable bitfield reference according 380704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions). 380804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// 380904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \returns the type this bit-field will promote to, or NULL if no 381004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// promotion occurs. 38114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::isPromotableBitField(Expr *E) const { 3812ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor if (E->isTypeDependent() || E->isValueDependent()) 3813ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor return QualType(); 3814ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor 381504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman FieldDecl *Field = E->getBitField(); 381604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (!Field) 381704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return QualType(); 381804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 381904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman QualType FT = Field->getType(); 382004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 3821a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith uint64_t BitWidth = Field->getBitWidthValue(*this); 382204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman uint64_t IntSize = getTypeSize(IntTy); 382304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // GCC extension compatibility: if the bit-field size is less than or equal 382404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // to the size of int, it gets promoted no matter what its type is. 382504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // For instance, unsigned long bf : 4 gets promoted to signed int. 382604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (BitWidth < IntSize) 382704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return IntTy; 382804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 382904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (BitWidth == IntSize) 383004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy; 383104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 383204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // Types bigger than int are not subject to promotions, and therefore act 383304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // like the base type. 383404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // FIXME: This doesn't quite match what gcc does, but what gcc does here 383504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // is ridiculous. 383604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return QualType(); 383704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman} 383804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 3839a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// getPromotedIntegerType - Returns the type that Promotable will 3840a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable 3841a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// integer type. 38424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPromotedIntegerType(QualType Promotable) const { 3843a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(!Promotable.isNull()); 3844a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(Promotable->isPromotableIntegerType()); 3845842aef8d942a880eeb9535d40de31a86838264cbJohn McCall if (const EnumType *ET = Promotable->getAs<EnumType>()) 3846842aef8d942a880eeb9535d40de31a86838264cbJohn McCall return ET->getDecl()->getPromotionType(); 384768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman 384868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (const BuiltinType *BT = Promotable->getAs<BuiltinType>()) { 384968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t 385068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // (3.9.1) can be converted to a prvalue of the first of the following 385168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // types that can represent all the values of its underlying type: 385268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // int, unsigned int, long int, unsigned long int, long long int, or 385368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // unsigned long long int [...] 385468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // FIXME: Is there some better way to compute this? 385568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (BT->getKind() == BuiltinType::WChar_S || 385668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::WChar_U || 385768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::Char16 || 385868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::Char32) { 385968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S; 386068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman uint64_t FromSize = getTypeSize(BT); 386168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy, 386268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman LongLongTy, UnsignedLongLongTy }; 386368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman for (size_t Idx = 0; Idx < llvm::array_lengthof(PromoteTypes); ++Idx) { 386468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman uint64_t ToSize = getTypeSize(PromoteTypes[Idx]); 386568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (FromSize < ToSize || 386668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman (FromSize == ToSize && 386768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) 386868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman return PromoteTypes[Idx]; 386968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 387068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman llvm_unreachable("char type should fit into long long"); 387168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 387268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 387368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman 387468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // At this point, we should have a signed or unsigned integer type. 3875a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman if (Promotable->isSignedIntegerType()) 3876a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman return IntTy; 3877a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman uint64_t PromotableSize = getTypeSize(Promotable); 3878a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman uint64_t IntSize = getTypeSize(IntTy); 3879a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize); 3880a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy; 3881a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman} 3882a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman 388331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// \brief Recurses in pointer/array types until it finds an objc retainable 388431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// type and returns its ownership. 388531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios KyrtzidisQualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const { 388631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis while (!T.isNull()) { 388731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis if (T.getObjCLifetime() != Qualifiers::OCL_None) 388831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis return T.getObjCLifetime(); 388931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis if (T->isArrayType()) 389031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis T = getBaseElementType(T); 389131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else if (const PointerType *PT = T->getAs<PointerType>()) 389231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis T = PT->getPointeeType(); 389331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 389428445f0b62f6aed851ff87ce64d9b19200d3211fArgyrios Kyrtzidis T = RT->getPointeeType(); 389531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else 389631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis break; 389731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis } 389831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis 389931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis return Qualifiers::OCL_None; 390031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis} 390131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis 39021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getIntegerTypeOrder - Returns the highest ranked integer type: 39037cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If 39041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1. 39054ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const { 3906f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *LHSC = getCanonicalType(LHS).getTypePtr(); 3907f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *RHSC = getCanonicalType(RHS).getTypePtr(); 39087cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSC == RHSC) return 0; 39091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3910f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner bool LHSUnsigned = LHSC->isUnsignedIntegerType(); 3911f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner bool RHSUnsigned = RHSC->isUnsignedIntegerType(); 39121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39137cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner unsigned LHSRank = getIntegerRank(LHSC); 39147cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner unsigned RHSRank = getIntegerRank(RHSC); 39151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39167cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSUnsigned == RHSUnsigned) { // Both signed or both unsigned. 39177cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSRank == RHSRank) return 0; 39187cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return LHSRank > RHSRank ? 1 : -1; 39197cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner } 39201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39217cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // Otherwise, the LHS is signed and the RHS is unsigned or visa versa. 39227cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSUnsigned) { 39237cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the unsigned [LHS] type is larger, return it. 39247cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSRank >= RHSRank) 39257cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return 1; 39261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39277cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the signed type can represent all values of the unsigned type, it 39287cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // wins. Because we are dealing with 2's complement and types that are 39291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // powers of two larger than each other, this is always safe. 39307cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return -1; 39317cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner } 39327cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner 39337cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the unsigned [RHS] type is larger, return it. 39347cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (RHSRank >= LHSRank) 39357cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return -1; 39361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39377cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the signed type can represent all values of the unsigned type, it 39387cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // wins. Because we are dealing with 2's complement and types that are 39391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // powers of two larger than each other, this is always safe. 39407cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return 1; 39415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 394271993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson 394379cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlssonstatic RecordDecl * 3944ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, 3945ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, IdentifierInfo *Id) { 3946ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation Loc; 39474e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Ctx.getLangOpts().CPlusPlus) 3948ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 394979cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson else 3950ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 395179cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson} 3952ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara 39531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// getCFConstantStringType - Return the type used for constant CFStrings. 39544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getCFConstantStringType() const { 395571993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson if (!CFConstantStringTypeDecl) { 39561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CFConstantStringTypeDecl = 3957ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara CreateRecordDecl(*this, TTK_Struct, TUDecl, 395879cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("NSConstantString")); 39595cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall CFConstantStringTypeDecl->startDefinition(); 396079cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson 3961f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson QualType FieldTypes[4]; 39621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 396371993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // const int *isa; 39640953e767ff7817f97b3ab20896b229891eeff45bJohn McCall FieldTypes[0] = getPointerType(IntTy.withConst()); 3965f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson // int flags; 3966f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson FieldTypes[1] = IntTy; 396771993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // const char *str; 39680953e767ff7817f97b3ab20896b229891eeff45bJohn McCall FieldTypes[2] = getPointerType(CharTy.withConst()); 396971993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // long length; 39701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldTypes[3] = LongTy; 39711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 397244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Create fields 397344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor for (unsigned i = 0; i < 4; ++i) { 39741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl, 3975ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 397644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor SourceLocation(), 0, 3977a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 39781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*BitWidth=*/0, 39797a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 3980ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 39812888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 398217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis CFConstantStringTypeDecl->addDecl(Field); 398344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 398444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 3985838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor CFConstantStringTypeDecl->completeDefinition(); 398671993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson } 39871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 398871993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson return getTagDeclType(CFConstantStringTypeDecl); 39898467583c2704e7a9691ea56939a029015f0ade0aGabor Greif} 3990b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson 3991319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregorvoid ASTContext::setCFConstantStringType(QualType T) { 39926217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *Rec = T->getAs<RecordType>(); 3993319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor assert(Rec && "Invalid CFConstantStringType"); 3994319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor CFConstantStringTypeDecl = Rec->getDecl(); 3995319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor} 3996319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor 39974ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorType() const { 3998adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump if (BlockDescriptorType) 3999adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump return getTagDeclType(BlockDescriptorType); 4000adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4001adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump RecordDecl *T; 4002adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump // FIXME: Needs the FlagAppleBlock bit. 4003ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 400479cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("__block_descriptor")); 40055cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall T->startDefinition(); 4006adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4007adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump QualType FieldTypes[] = { 4008adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump UnsignedLongTy, 4009adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump UnsignedLongTy, 4010adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump }; 4011adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4012adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump const char *FieldNames[] = { 4013adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump "reserved", 4014083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "Size" 4015adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump }; 4016adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4017adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump for (size_t i = 0; i < 2; ++i) { 4018ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 4019adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump SourceLocation(), 4020adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump &Idents.get(FieldNames[i]), 4021a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 4022adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump /*BitWidth=*/0, 40237a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 4024ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 40252888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 4026adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump T->addDecl(Field); 4027adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump } 4028adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4029838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 4030adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4031adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump BlockDescriptorType = T; 4032adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 4033adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump return getTagDeclType(BlockDescriptorType); 4034adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump} 4035adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 40364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorExtendedType() const { 4037083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump if (BlockDescriptorExtendedType) 4038083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump return getTagDeclType(BlockDescriptorExtendedType); 4039083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4040083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump RecordDecl *T; 4041083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump // FIXME: Needs the FlagAppleBlock bit. 4042ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 404379cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("__block_descriptor_withcopydispose")); 40445cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall T->startDefinition(); 4045083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4046083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump QualType FieldTypes[] = { 4047083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump UnsignedLongTy, 4048083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump UnsignedLongTy, 4049083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump getPointerType(VoidPtrTy), 4050083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump getPointerType(VoidPtrTy) 4051083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump }; 4052083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4053083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump const char *FieldNames[] = { 4054083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "reserved", 4055083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "Size", 4056083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "CopyFuncPtr", 4057083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "DestroyFuncPtr" 4058083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump }; 4059083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4060083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump for (size_t i = 0; i < 4; ++i) { 4061ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 4062083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump SourceLocation(), 4063083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump &Idents.get(FieldNames[i]), 4064a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 4065083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump /*BitWidth=*/0, 40667a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 4067ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 40682888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 4069083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump T->addDecl(Field); 4070083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump } 4071083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4072838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 4073083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4074083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump BlockDescriptorExtendedType = T; 4075083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 4076083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump return getTagDeclType(BlockDescriptorExtendedType); 4077083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump} 4078083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 40794ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::BlockRequiresCopying(QualType Ty) const { 4080f85e193739c953358c865005855253af4f68a497John McCall if (Ty->isObjCRetainableType()) 4081af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return true; 40824e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 4083e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian if (const RecordType *RT = Ty->getAs<RecordType>()) { 4084e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 4085ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt return RD->hasConstCopyConstructor(); 4086e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian 4087e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian } 4088e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian } 4089af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return false; 4090af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump} 4091af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 40924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 40935f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerASTContext::BuildByRefType(StringRef DeclName, QualType Ty) const { 4094af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // type = struct __Block_byref_1_X { 4095ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // void *__isa; 4096af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // struct __Block_byref_1_X *__forwarding; 4097ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // unsigned int __flags; 4098ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // unsigned int __size; 4099a7e6845660f91ec611427e1db842780e1ec12bdbEli Friedman // void *__copy_helper; // as needed 4100a7e6845660f91ec611427e1db842780e1ec12bdbEli Friedman // void *__destroy_help // as needed 4101af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // int X; 4102ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // } * 4103ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump 4104af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump bool HasCopyAndDispose = BlockRequiresCopying(Ty); 4105af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4106af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // FIXME: Move up 4107f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<36> Name; 4108f5942a44880be26878592eb052b737579349411eBenjamin Kramer llvm::raw_svector_ostream(Name) << "__Block_byref_" << 4109f5942a44880be26878592eb052b737579349411eBenjamin Kramer ++UniqueBlockByRefTypeID << '_' << DeclName; 4110af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump RecordDecl *T; 4111ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, &Idents.get(Name.str())); 4112af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump T->startDefinition(); 4113af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump QualType Int32Ty = IntTy; 4114af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump assert(getIntWidth(IntTy) == 32 && "non-32bit int not supported"); 4115af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump QualType FieldTypes[] = { 4116af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4117af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(getTagDeclType(T)), 4118af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Int32Ty, 4119af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Int32Ty, 4120af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4121af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 4122af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Ty 4123af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump }; 4124af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 41255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FieldNames[] = { 4126af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__isa", 4127af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__forwarding", 4128af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__flags", 4129af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__size", 4130af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__copy_helper", 4131af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__destroy_helper", 4132af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump DeclName, 4133af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump }; 4134af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4135af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump for (size_t i = 0; i < 7; ++i) { 4136af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump if (!HasCopyAndDispose && i >=4 && i <= 5) 4137af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump continue; 4138af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 4139ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 4140af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump &Idents.get(FieldNames[i]), 4141a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 41427a614d8380297fcd2bc23986241905d97222948cRichard Smith /*BitWidth=*/0, /*Mutable=*/false, 4143ca5233044ef679840d1ad1c46a36b16e2ee8a6e1Richard Smith ICIS_NoInit); 41442888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 4145af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump T->addDecl(Field); 4146af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump } 4147af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4148838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 4149af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 4150af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return getPointerType(getTagDeclType(T)); 4151ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump} 4152ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump 4153e97179c675b341927807c718be215c8d1aab8acbDouglas GregorTypedefDecl *ASTContext::getObjCInstanceTypeDecl() { 4154e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor if (!ObjCInstanceTypeDecl) 4155e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor ObjCInstanceTypeDecl = TypedefDecl::Create(*this, 4156e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor getTranslationUnitDecl(), 4157e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor SourceLocation(), 4158e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor SourceLocation(), 4159e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor &Idents.get("instancetype"), 4160e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor getTrivialTypeSourceInfo(getObjCIdType())); 4161e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor return ObjCInstanceTypeDecl; 4162e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor} 4163e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor 4164e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// This returns true if a type has been typedefed to BOOL: 4165e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// typedef <type> BOOL; 41662d99833e8c956775f2183601cd120b65b569c867Chris Lattnerstatic bool isTypeTypedefedAsBOOL(QualType T) { 4167e8c49533521c40643653f943d47229e62d277f88Anders Carlsson if (const TypedefType *TT = dyn_cast<TypedefType>(T)) 4168bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner if (IdentifierInfo *II = TT->getDecl()->getIdentifier()) 4169bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner return II->isStr("BOOL"); 41701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 417185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson return false; 417285f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson} 417385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson 4174a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingTypeSize returns size of type for objective-c encoding 417533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// purpose. 41764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const { 4177f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (!type->isIncompleteArrayType() && type->isIncompleteType()) 4178f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return CharUnits::Zero(); 4179f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4180199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits sz = getTypeSizeInChars(type); 41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 418233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Make all integer and enum types at least as large as an int 41832ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (sz.isPositive() && type->isIntegralOrEnumerationType()) 4184199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck sz = std::max(sz, getTypeSizeInChars(IntTy)); 418533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Treat arrays as pointers, since that's how they're passed in. 418633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian else if (type->isArrayType()) 4187199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck sz = getTypeSizeInChars(VoidPtrTy); 4188aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck return sz; 4189199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck} 4190199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck 4191199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstatic inline 4192199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstd::string charUnitsToString(const CharUnits &CU) { 4193199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck return llvm::itostr(CU.getQuantity()); 419433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 419533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 41966b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// getObjCEncodingForBlock - Return the encoded type for this block 41975e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall/// declaration. 41986b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallstd::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const { 41996b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall std::string S; 42006b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 42015e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall const BlockDecl *Decl = Expr->getBlockDecl(); 42025e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType BlockTy = 42035e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Expr->getType()->getAs<BlockPointerType>()->getPointeeType(); 42045e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Encode result type. 4205c71a4915ca216847599d03cab4ed1c5086b0eb43John McCall getObjCEncodingForType(BlockTy->getAs<FunctionType>()->getResultType(), S); 42065e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Compute size of all parameters. 42075e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Start with computing size of a pointer in number of bytes. 42085e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // FIXME: There might(should) be a better way of doing this computation! 42095e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall SourceLocation Loc; 4210199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 4211199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ParmOffset = PtrSize; 42126f46c2653c1545cc3fef0c0df996d18160160ce8Fariborz Jahanian for (BlockDecl::param_const_iterator PI = Decl->param_begin(), 42135e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall E = Decl->param_end(); PI != E; ++PI) { 42145e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType PType = (*PI)->getType(); 4215aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck CharUnits sz = getObjCEncodingTypeSize(PType); 4216075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian if (sz.isZero()) 4217075a54354dc6e3644b12206e5127855091783fd6Fariborz Jahanian continue; 4218199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck assert (sz.isPositive() && "BlockExpr - Incomplete param type"); 42195e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmOffset += sz; 42205e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 42215e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Size of the argument frame 4222199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 42235e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Block pointer and offset. 42245e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall S += "@?0"; 42255e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall 42265e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Argument types. 42275e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmOffset = PtrSize; 42285e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E = 42295e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Decl->param_end(); PI != E; ++PI) { 42305e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmVarDecl *PVDecl = *PI; 42315e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType PType = PVDecl->getOriginalType(); 42325e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall if (const ArrayType *AT = 42335e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 42345e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Use array's original type only if it has known number of 42355389f48b24937ad7b4093307128b3cbf25235654David Chisnall // elements. 42365389f48b24937ad7b4093307128b3cbf25235654David Chisnall if (!isa<ConstantArrayType>(AT)) 42375389f48b24937ad7b4093307128b3cbf25235654David Chisnall PType = PVDecl->getType(); 42385389f48b24937ad7b4093307128b3cbf25235654David Chisnall } else if (PType->isFunctionType()) 42395389f48b24937ad7b4093307128b3cbf25235654David Chisnall PType = PVDecl->getType(); 42405389f48b24937ad7b4093307128b3cbf25235654David Chisnall getObjCEncodingForType(PType, S); 42415389f48b24937ad7b4093307128b3cbf25235654David Chisnall S += charUnitsToString(ParmOffset); 42425389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset += getObjCEncodingTypeSize(PType); 42435389f48b24937ad7b4093307128b3cbf25235654David Chisnall } 42446b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 42456b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall return S; 42465389f48b24937ad7b4093307128b3cbf25235654David Chisnall} 42475389f48b24937ad7b4093307128b3cbf25235654David Chisnall 4248f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl, 42495389f48b24937ad7b4093307128b3cbf25235654David Chisnall std::string& S) { 42505389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Encode result type. 42515389f48b24937ad7b4093307128b3cbf25235654David Chisnall getObjCEncodingForType(Decl->getResultType(), S); 42525389f48b24937ad7b4093307128b3cbf25235654David Chisnall CharUnits ParmOffset; 42535389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Compute size of all parameters. 42545389f48b24937ad7b4093307128b3cbf25235654David Chisnall for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 42555389f48b24937ad7b4093307128b3cbf25235654David Chisnall E = Decl->param_end(); PI != E; ++PI) { 42565389f48b24937ad7b4093307128b3cbf25235654David Chisnall QualType PType = (*PI)->getType(); 42575389f48b24937ad7b4093307128b3cbf25235654David Chisnall CharUnits sz = getObjCEncodingTypeSize(PType); 4258f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (sz.isZero()) 42597e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian continue; 42607e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian 42615389f48b24937ad7b4093307128b3cbf25235654David Chisnall assert (sz.isPositive() && 4262f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor "getObjCEncodingForFunctionDecl - Incomplete param type"); 42635389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset += sz; 42645389f48b24937ad7b4093307128b3cbf25235654David Chisnall } 42655389f48b24937ad7b4093307128b3cbf25235654David Chisnall S += charUnitsToString(ParmOffset); 42665389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset = CharUnits::Zero(); 42675389f48b24937ad7b4093307128b3cbf25235654David Chisnall 42685389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Argument types. 42695389f48b24937ad7b4093307128b3cbf25235654David Chisnall for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 42705389f48b24937ad7b4093307128b3cbf25235654David Chisnall E = Decl->param_end(); PI != E; ++PI) { 42715389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmVarDecl *PVDecl = *PI; 42725389f48b24937ad7b4093307128b3cbf25235654David Chisnall QualType PType = PVDecl->getOriginalType(); 42735389f48b24937ad7b4093307128b3cbf25235654David Chisnall if (const ArrayType *AT = 42745389f48b24937ad7b4093307128b3cbf25235654David Chisnall dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 42755389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Use array's original type only if it has known number of 42765e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // elements. 42775e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall if (!isa<ConstantArrayType>(AT)) 42785e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall PType = PVDecl->getType(); 42795e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } else if (PType->isFunctionType()) 42805e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall PType = PVDecl->getType(); 42815e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall getObjCEncodingForType(PType, S); 4282199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 4283aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck ParmOffset += getObjCEncodingTypeSize(PType); 42845e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 4285f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4286f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return false; 42875e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall} 42885e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall 4289dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// getObjCEncodingForMethodParameter - Return the encoded type for a single 4290dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// method parameter or return type. If Extended, include class names and 4291dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// block object types. 4292dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilsonvoid ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, 4293dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson QualType T, std::string& S, 4294dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool Extended) const { 4295dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode type qualifer, 'in', 'inout', etc. for the parameter. 4296dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeQualifier(QT, S); 4297dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode parameter type. 4298dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(T, S, true, true, 0, 4299dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson true /*OutermostType*/, 4300dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /*EncodingProperty*/, 4301dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /*StructField*/, 4302dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Extended /*EncodeBlockParameters*/, 4303dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Extended /*EncodeClassNames*/); 4304dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson} 4305dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson 4306a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingForMethodDecl - Return the encoded type for this method 430733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// declaration. 4308f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, 4309dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson std::string& S, 4310dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool Extended) const { 4311c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: This is not very efficient. 4312dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode return type. 4313dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(), 4314dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Decl->getResultType(), S, Extended); 431533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Compute size of all parameters. 431633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Start with computing size of a pointer in number of bytes. 431733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // FIXME: There might(should) be a better way of doing this computation! 431833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian SourceLocation Loc; 4319199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 432033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // The first two arguments (self and _cmd) are pointers; account for 432133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // their size. 4322199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ParmOffset = 2 * PtrSize; 4323491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(), 43247732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian E = Decl->sel_param_end(); PI != E; ++PI) { 432589951a86b594513c2a013532ed45d197413b1087Chris Lattner QualType PType = (*PI)->getType(); 4326aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck CharUnits sz = getObjCEncodingTypeSize(PType); 4327f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (sz.isZero()) 43287e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian continue; 43297e68ba5660a9b2b854df4ae7a556e6b91d738c6cFariborz Jahanian 4330199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck assert (sz.isPositive() && 4331199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck "getObjCEncodingForMethodDecl - Incomplete param type"); 433233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian ParmOffset += sz; 433333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian } 4334199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 433533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian S += "@0:"; 4336199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(PtrSize); 43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 433833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Argument types. 433933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian ParmOffset = 2 * PtrSize; 4340491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(), 43417732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian E = Decl->sel_param_end(); PI != E; ++PI) { 4342491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis const ParmVarDecl *PVDecl = *PI; 43431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType PType = PVDecl->getOriginalType(); 43444306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian if (const ArrayType *AT = 4345ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 4346ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff // Use array's original type only if it has known number of 4347ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff // elements. 4348bb3fde337fb712c0e6da8790d431621be4793048Steve Naroff if (!isa<ConstantArrayType>(AT)) 4349ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff PType = PVDecl->getType(); 4350ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff } else if (PType->isFunctionType()) 4351ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff PType = PVDecl->getType(); 4352dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(), 4353dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson PType, S, Extended); 4354199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 4355aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck ParmOffset += getObjCEncodingTypeSize(PType); 435633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian } 4357f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4358f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return false; 435933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 436033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 4361c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// getObjCEncodingForPropertyDecl - Return the encoded type for this 436283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// property declaration. If non-NULL, Container must be either an 4363c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be 4364c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// NULL when getting encodings for protocol properties. 43651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Property attributes are stored as a comma-delimited C string. The simple 43661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// attributes readonly and bycopy are encoded as single characters. The 43671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parametrized attributes, getter=name, setter=name, and ivar=name, are 43681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// encoded as single characters, followed by an identifier. Property types 43691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// are also encoded as a parametrized attribute. The characters used to encode 437083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// these attributes are defined by the following enumeration: 437183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @code 437283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// enum PropertyAttributes { 437383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyReadOnly = 'R', // property is read-only. 437483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyBycopy = 'C', // property is a copy of the value last assigned 437583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyByref = '&', // property is a reference to the value last assigned 437683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyDynamic = 'D', // property is dynamic 437783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyGetter = 'G', // followed by getter selector name 437883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertySetter = 'S', // followed by setter selector name 437983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyInstanceVariable = 'V' // followed by instance variable name 43800d4cb85130d91da61c45aecb9fd31c7097a7cfccBob Wilson/// kPropertyType = 'T' // followed by old-style type encoding. 438183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyWeak = 'W' // 'weak' property 438283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyStrong = 'P' // property GC'able 438383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyNonAtomic = 'N' // property non-atomic 438483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// }; 438583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @endcode 43861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, 4387c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar const Decl *Container, 43884ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad std::string& S) const { 4389c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // Collect information from the property implementation decl(s). 4390c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar bool Dynamic = false; 4391c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar ObjCPropertyImplDecl *SynthesizePID = 0; 4392c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4393c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: Duplicated code due to poor abstraction. 4394c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (Container) { 43951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ObjCCategoryImplDecl *CID = 4396c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar dyn_cast<ObjCCategoryImplDecl>(Container)) { 4397c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar for (ObjCCategoryImplDecl::propimpl_iterator 439817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i = CID->propimpl_begin(), e = CID->propimpl_end(); 4399653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor i != e; ++i) { 4400581deb3da481053c4993c7600f97acf7768caac5David Blaikie ObjCPropertyImplDecl *PID = *i; 4401c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyDecl() == PD) { 4402c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4403c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar Dynamic = true; 4404c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4405c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar SynthesizePID = PID; 4406c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4407c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4408c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4409c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 441061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container); 4411c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar for (ObjCCategoryImplDecl::propimpl_iterator 441217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i = OID->propimpl_begin(), e = OID->propimpl_end(); 4413653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor i != e; ++i) { 4414581deb3da481053c4993c7600f97acf7768caac5David Blaikie ObjCPropertyImplDecl *PID = *i; 4415c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyDecl() == PD) { 4416c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4417c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar Dynamic = true; 4418c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4419c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar SynthesizePID = PID; 4420c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4421c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 44221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4423c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4424c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4425c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4426c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: This is not very efficient. 4427c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S = "T"; 4428c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4429c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // Encode result type. 4430090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian // GCC has some special rules regarding encoding of properties which 4431090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian // closely resembles encoding of ivars. 44321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0, 4433090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian true /* outermost type */, 4434090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian true /* encoding for property */); 4435c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4436c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->isReadOnly()) { 4437c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",R"; 4438c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4439c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar switch (PD->getSetterKind()) { 4440c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar case ObjCPropertyDecl::Assign: break; 4441c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar case ObjCPropertyDecl::Copy: S += ",C"; break; 44421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case ObjCPropertyDecl::Retain: S += ",&"; break; 44433a02b44e3948f7762dbfba94b7961281ca29d022Fariborz Jahanian case ObjCPropertyDecl::Weak: S += ",W"; break; 4444c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4445c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4446c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4447c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // It really isn't clear at all what this means, since properties 4448c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // are "dynamic by default". 4449c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (Dynamic) 4450c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",D"; 4451c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4452090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic) 4453090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian S += ",N"; 44541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4455c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) { 4456c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",G"; 4457077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S += PD->getGetterName().getAsString(); 4458c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4459c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4460c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) { 4461c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",S"; 4462077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S += PD->getSetterName().getAsString(); 4463c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4464c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4465c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (SynthesizePID) { 4466c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl(); 4467c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",V"; 446839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner S += OID->getNameAsString(); 4469c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4470c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4471c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: OBJCGC: weak & strong 4472c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar} 4473c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4474a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// getLegacyIntegralTypeEncoding - 44751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Another legacy compatibility encoding: 32-bit longs are encoded as 44761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 'l' or 'L' , but not always. For typedefs, we need to use 4477a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 'i' or 'I' instead if encoding a struct field, or a pointer! 4478a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 4479a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanianvoid ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const { 44808e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump if (isa<TypedefType>(PointeeTy.getTypePtr())) { 4481183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) { 44824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32) 4483a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian PointeeTy = UnsignedIntTy; 44841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 44854ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32) 4486a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian PointeeTy = IntTy; 4487a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4488a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4489a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian} 4490a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian 44917d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanianvoid ASTContext::getObjCEncodingForType(QualType T, std::string& S, 44924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FieldDecl *Field) const { 449382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // We follow the behavior of gcc, expanding structures which are 449482a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // directly pointed to, and expanding embedded structures. Note that 449582a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // these rules are sufficient to prevent recursive encoding of the 449682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // same type. 44971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(T, S, true, true, Field, 44985b8c7d9fb620ba3a71e996d61e7b9bdf763b5c09Fariborz Jahanian true /* outermost type */); 449982a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar} 450082a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar 450164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnallstatic char ObjCEncodingForPrimitiveKind(const ASTContext *C, QualType T) { 450264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall switch (T->getAs<BuiltinType>()->getKind()) { 4503b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unhandled builtin type kind"); 450464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Void: return 'v'; 450564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Bool: return 'B'; 450664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Char_U: 450764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UChar: return 'C'; 450864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UShort: return 'S'; 450964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UInt: return 'I'; 451064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::ULong: 45114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad return C->getIntWidth(T) == 32 ? 'L' : 'Q'; 451264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UInt128: return 'T'; 451364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::ULongLong: return 'Q'; 451464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Char_S: 451564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::SChar: return 'c'; 451664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Short: return 's'; 45173f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 45183f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 451964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Int: return 'i'; 452064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Long: 45214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad return C->getIntWidth(T) == 32 ? 'l' : 'q'; 452264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::LongLong: return 'q'; 452364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Int128: return 't'; 452464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Float: return 'f'; 452564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Double: return 'd'; 45263a0be84b2aed8563150cdbd976a98838afa261ebDaniel Dunbar case BuiltinType::LongDouble: return 'D'; 452764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall } 452864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall} 452964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall 45305471bc85b69912e3b448de004498a80c0de32296Douglas Gregorstatic char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) { 45315471bc85b69912e3b448de004498a80c0de32296Douglas Gregor EnumDecl *Enum = ET->getDecl(); 45325471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 45335471bc85b69912e3b448de004498a80c0de32296Douglas Gregor // The encoding of an non-fixed enum type is always 'i', regardless of size. 45345471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (!Enum->isFixed()) 45355471bc85b69912e3b448de004498a80c0de32296Douglas Gregor return 'i'; 45365471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 45375471bc85b69912e3b448de004498a80c0de32296Douglas Gregor // The encoding of a fixed enum type matches its fixed underlying type. 45385471bc85b69912e3b448de004498a80c0de32296Douglas Gregor return ObjCEncodingForPrimitiveKind(C, Enum->getIntegerType()); 45395471bc85b69912e3b448de004498a80c0de32296Douglas Gregor} 45405471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 45414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic void EncodeBitField(const ASTContext *Ctx, std::string& S, 454264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall QualType T, const FieldDecl *FD) { 4543a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl"); 45448b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian S += 'b'; 454564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // The NeXT runtime encodes bit fields as b followed by the number of bits. 454664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // The GNU runtime requires more information; bitfields are encoded as b, 454764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // then the offset (in bits) of the first element, then the type of the 454864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // bitfield, then the size in bits. For example, in this structure: 454964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // 455064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // struct 455164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // { 455264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // int integer; 455364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // int flags:2; 455464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // }; 455564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // On a 32-bit system, the encoding for flags would be b2 for the NeXT 455664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // runtime, but b32i2 for the GNU runtime. The reason for this extra 455764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // information is not especially sensible, but we're stuck with it for 455864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // compatibility with GCC, although providing it breaks anything that 455964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // actually uses runtime introspection and wants to work on both runtimes... 4560260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (Ctx->getLangOpts().ObjCRuntime.isGNUFamily()) { 456164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall const RecordDecl *RD = FD->getParent(); 456264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD); 456382905749d5c8d8b4edec11de754a73349cb96603Eli Friedman S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex())); 45645471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (const EnumType *ET = T->getAs<EnumType>()) 45655471bc85b69912e3b448de004498a80c0de32296Douglas Gregor S += ObjCEncodingForEnumType(Ctx, ET); 4566c7ff82c2040f45eaad2eddea0e4461dddc972cd1David Chisnall else 45674ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad S += ObjCEncodingForPrimitiveKind(Ctx, T); 456864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall } 4569a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith S += llvm::utostr(FD->getBitWidthValue(*Ctx)); 45708b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian} 45718b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian 457201eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar// FIXME: Use SmallString for accumulating string. 457382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbarvoid ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, 457482a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar bool ExpandPointedToStructures, 457582a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar bool ExpandStructures, 4576153bfe5795e2c1a5a738e73d3784964e082237fcDaniel Dunbar const FieldDecl *FD, 4577090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian bool OutermostType, 45782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis bool EncodingProperty, 4579dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool StructField, 4580dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool EncodeBlockParameters, 4581dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool EncodeClassNames) const { 458264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall if (T->getAs<BuiltinType>()) { 4583ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (FD && FD->isBitField()) 458464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall return EncodeBitField(this, S, T, FD); 458564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall S += ObjCEncodingForPrimitiveKind(this, T); 4586ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4587ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 45881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4589183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType *CT = T->getAs<ComplexType>()) { 4590c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson S += 'j'; 45911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false, 4592c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson false); 4593ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4594ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 459560bce3ef20a4c9684e3825cdd739fefb9810327dFariborz Jahanian 4596aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian // encoding for pointer or r3eference types. 4597aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian QualType PointeeTy; 45986217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = T->getAs<PointerType>()) { 45998d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian if (PT->isObjCSelType()) { 46008d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian S += ':'; 46018d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian return; 46028d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian } 4603aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian PointeeTy = PT->getPointeeType(); 4604aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian } 4605aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 4606aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian PointeeTy = RT->getPointeeType(); 4607aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian if (!PointeeTy.isNull()) { 4608a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian bool isReadOnly = false; 4609a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // For historical/compatibility reasons, the read-only qualifier of the 4610a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // pointee gets emitted _before_ the '^'. The read-only qualifier of 4611a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // the pointer itself gets ignored, _unless_ we are looking at a typedef! 46121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Also, do not emit the 'r' for anything but the outermost type! 46138e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump if (isa<TypedefType>(T.getTypePtr())) { 4614a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (OutermostType && T.isConstQualified()) { 4615a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian isReadOnly = true; 4616a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian S += 'r'; 4617a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 46189fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump } else if (OutermostType) { 4619a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian QualType P = PointeeTy; 46206217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek while (P->getAs<PointerType>()) 46216217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek P = P->getAs<PointerType>()->getPointeeType(); 4622a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (P.isConstQualified()) { 4623a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian isReadOnly = true; 4624a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian S += 'r'; 4625a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4626a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4627a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (isReadOnly) { 4628a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // Another legacy compatibility encoding. Some ObjC qualifier and type 4629a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // combinations need to be rearranged. 4630a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // Rewrite "in const" from "nr" to "rn" 46315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (StringRef(S).endswith("nr")) 46320237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer S.replace(S.end()-2, S.end(), "rn"); 4633a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 46341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 463585f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson if (PointeeTy->isCharType()) { 463685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson // char pointer types should be encoded as '*' unless it is a 463785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson // type that has been typedef'd to 'BOOL'. 4638e8c49533521c40643653f943d47229e62d277f88Anders Carlsson if (!isTypeTypedefedAsBOOL(PointeeTy)) { 463985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson S += '*'; 464085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson return; 464185f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson } 46426217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) { 46439533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // GCC binary compat: Need to convert "struct objc_class *" to "#". 46449533a7fdb8397421f3be52e879442460a87389f6Steve Naroff if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) { 46459533a7fdb8397421f3be52e879442460a87389f6Steve Naroff S += '#'; 46469533a7fdb8397421f3be52e879442460a87389f6Steve Naroff return; 46479533a7fdb8397421f3be52e879442460a87389f6Steve Naroff } 46489533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // GCC binary compat: Need to convert "struct objc_object *" to "@". 46499533a7fdb8397421f3be52e879442460a87389f6Steve Naroff if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) { 46509533a7fdb8397421f3be52e879442460a87389f6Steve Naroff S += '@'; 46519533a7fdb8397421f3be52e879442460a87389f6Steve Naroff return; 46529533a7fdb8397421f3be52e879442460a87389f6Steve Naroff } 46539533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // fall through... 465485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson } 465585f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson S += '^'; 4656a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian getLegacyIntegralTypeEncoding(PointeeTy); 4657a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian 46581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures, 465943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian NULL); 4660ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4661ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4662aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian 4663ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (const ArrayType *AT = 4664ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // Ignore type qualifiers etc. 4665ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) { 46662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (isa<IncompleteArrayType>(AT) && !StructField) { 4667559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson // Incomplete arrays are encoded as a pointer to the array element. 4668559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '^'; 4669559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson 46701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(AT->getElementType(), S, 4671559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson false, ExpandStructures, FD); 4672559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } else { 4673559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '['; 46741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 46762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (getTypeSize(CAT->getElementType()) == 0) 46772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '0'; 46782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis else 46792636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += llvm::utostr(CAT->getSize().getZExtValue()); 46802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 4681559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson //Variable length arrays are encoded as a regular array with 0 elements. 46822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) && 46832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis "Unknown array type!"); 4684559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '0'; 4685559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } 46861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(AT->getElementType(), S, 4688559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson false, ExpandStructures, FD); 4689559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += ']'; 4690559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } 4691ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4692ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4694183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (T->getAs<FunctionType>()) { 4695c0a87b7db06643178ad2cbce0767548c139ea387Anders Carlsson S += '?'; 4696ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4697ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46996217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RTy = T->getAs<RecordType>()) { 470082a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar RecordDecl *RDecl = RTy->getDecl(); 4701d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar S += RDecl->isUnion() ? '(' : '{'; 4702502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar // Anonymous structures print as '?' 4703502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar if (const IdentifierInfo *II = RDecl->getIdentifier()) { 4704502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar S += II->getName(); 47056fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian if (ClassTemplateSpecializationDecl *Spec 47066fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) { 47076fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 47086fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian std::string TemplateArgsStr 47096fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian = TemplateSpecializationType::PrintTemplateArgumentList( 4710910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.data(), 4711910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.size(), 471230c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor (*this).getPrintingPolicy()); 47136fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian 47146fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian S += TemplateArgsStr; 47156fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian } 4716502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar } else { 4717502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar S += '?'; 4718502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar } 47190d504c1da852e58ff802545c823ecff3b6c654b8Daniel Dunbar if (ExpandStructures) { 47207d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian S += '='; 47212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->isUnion()) { 47222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForStructureImpl(RDecl, S, FD); 47232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 47242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RDecl->field_begin(), 47252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldEnd = RDecl->field_end(); 47262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis Field != FieldEnd; ++Field) { 47272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 47282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 47292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += Field->getNameAsString(); 47302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 47312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // Special case bit-fields. 47342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (Field->isBitField()) { 47352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(Field->getType(), S, false, true, 4736581deb3da481053c4993c7600f97acf7768caac5David Blaikie *Field); 47372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 47382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis QualType qt = Field->getType(); 47392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getLegacyIntegralTypeEncoding(qt); 47402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(qt, S, false, true, 47412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FD, /*OutermostType*/false, 47422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*EncodingProperty*/false, 47432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*StructField*/true); 47442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 4745d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar } 47467d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian } 47476de88a873a4cbe06d72602eef57d68006730a80bFariborz Jahanian } 4748d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar S += RDecl->isUnion() ? ')' : '}'; 4749ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4750ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4751e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 47525471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (const EnumType *ET = T->getAs<EnumType>()) { 47538b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian if (FD && FD->isBitField()) 475464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall EncodeBitField(this, S, T, FD); 47558b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian else 47565471bc85b69912e3b448de004498a80c0de32296Douglas Gregor S += ObjCEncodingForEnumType(this, ET); 4757ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4758ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4760dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) { 476121a98b188857d690aa4510c52ac4317ffa0908a8Steve Naroff S += "@?"; // Unlike a pointer-to-function, which is "^?". 4762dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (EncodeBlockParameters) { 4763dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson const FunctionType *FT = BT->getPointeeType()->getAs<FunctionType>(); 4764dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson 4765dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += '<'; 4766dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block return type 4767dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(FT->getResultType(), S, 4768dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandPointedToStructures, ExpandStructures, 4769dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson FD, 4770dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* OutermostType */, 4771dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodingProperty, 4772dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* StructField */, 4773dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeBlockParameters, 4774dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeClassNames); 4775dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block self 4776dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += "@?"; 4777dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block parameters 4778dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) { 4779dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson for (FunctionProtoType::arg_type_iterator I = FPT->arg_type_begin(), 4780dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson E = FPT->arg_type_end(); I && (I != E); ++I) { 4781dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(*I, S, 4782dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandPointedToStructures, 4783dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandStructures, 4784dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson FD, 4785dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* OutermostType */, 4786dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodingProperty, 4787dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* StructField */, 4788dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeBlockParameters, 4789dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeClassNames); 4790dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4791dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4792dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += '>'; 4793dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4794ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4795ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4797c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Ignore protocol qualifiers when mangling at this level. 4798c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *OT = T->getAs<ObjCObjectType>()) 4799c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall T = OT->getBaseType(); 4800c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 48010953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (const ObjCInterfaceType *OIT = T->getAs<ObjCInterfaceType>()) { 480243822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian // @encode(class_name) 48030953e767ff7817f97b3ab20896b229891eeff45bJohn McCall ObjCInterfaceDecl *OI = OIT->getDecl(); 480443822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '{'; 480543822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian const IdentifierInfo *II = OI->getIdentifier(); 480643822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += II->getName(); 480743822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '='; 4808db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose SmallVector<const ObjCIvarDecl*, 32> Ivars; 48092c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian DeepCollectObjCIvars(OI, true, Ivars); 48102c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian for (unsigned i = 0, e = Ivars.size(); i != e; ++i) { 4811db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose const FieldDecl *Field = cast<FieldDecl>(Ivars[i]); 48122c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (Field->isBitField()) 48132c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field); 481443822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian else 48152c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD); 481643822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian } 481743822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '}'; 4818ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 481943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian } 48201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4821183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ObjCObjectPointerType *OPT = T->getAs<ObjCObjectPointerType>()) { 482214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (OPT->isObjCIdType()) { 482314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '@'; 482414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4825ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 48261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 482727d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) { 482827d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // FIXME: Consider if we need to output qualifiers for 'Class<p>'. 482927d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // Since this is a binary compatibility issue, need to consult with runtime 483027d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // folks. Fortunately, this is a *very* obsure construct. 483114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '#'; 483214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4833ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 48341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4835ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (OPT->isObjCQualifiedIdType()) { 48361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(getObjCIdType(), S, 483714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ExpandPointedToStructures, 483814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ExpandStructures, FD); 4839dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (FD || EncodingProperty || EncodeClassNames) { 484014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff // Note that we do extended encoding of protocol qualifer list 484114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff // Only when doing ivar or property encoding. 484214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '"'; 484367ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 484467ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff E = OPT->qual_end(); I != E; ++I) { 484514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '<'; 484614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += (*I)->getNameAsString(); 484714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '>'; 484814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 484914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '"'; 485014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 485114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4852ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 48531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4854ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner QualType PointeeTy = OPT->getPointeeType(); 4855ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (!EncodingProperty && 4856ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner isa<TypedefType>(PointeeTy.getTypePtr())) { 4857ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // Another historical/compatibility reason. 48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // We encode the underlying type which comes out as 4859ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // {...}; 4860ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '^'; 48611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PointeeTy, S, 48621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump false, ExpandPointedToStructures, 4863ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner NULL); 486414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 486514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 4866ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner 4867ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '@'; 4868dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (OPT->getInterfaceDecl() && 4869dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson (FD || EncodingProperty || EncodeClassNames)) { 4870ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '"'; 487127d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff S += OPT->getInterfaceDecl()->getIdentifier()->getName(); 487267ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 487367ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff E = OPT->qual_end(); I != E; ++I) { 4874ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '<'; 4875ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += (*I)->getNameAsString(); 4876ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '>'; 48771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4878ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '"'; 4879ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4880ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4881ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 48821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4883532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall // gcc just blithely ignores member pointers. 4884532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall // TODO: maybe there should be a mangling for these 4885532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall if (T->getAs<MemberPointerType>()) 4886532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall return; 4887e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 4888e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian if (T->isVectorType()) { 4889e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // This matches gcc's encoding, even though technically it is 4890e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // insufficient. 4891e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // FIXME. We should do a better job than gcc. 4892e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian return; 4893e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian } 4894e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 4895b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("@encode for type not implemented!"); 489685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson} 489785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson 48982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidisvoid ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl, 48992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::string &S, 49002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis const FieldDecl *FD, 49012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis bool includeVBases) const { 49022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(RDecl && "Expected non-null RecordDecl"); 49032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(!RDecl->isUnion() && "Should not be called for unions"); 49042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->getDefinition()) 49052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis return; 49062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl); 49082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets; 49092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis const ASTRecordLayout &layout = getASTRecordLayout(RDecl); 49102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec) { 49122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (CXXRecordDecl::base_class_iterator 49132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BI = CXXRec->bases_begin(), 49142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BE = CXXRec->bases_end(); BI != BE; ++BI) { 49152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!BI->isVirtual()) { 49162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4917829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis if (base->isEmpty()) 4918829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis continue; 4919d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer uint64_t offs = toBits(layout.getBaseClassOffset(base)); 49202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 49212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, base)); 49222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis unsigned i = 0; 49272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RDecl->field_begin(), 49282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldEnd = RDecl->field_end(); 49292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis Field != FieldEnd; ++Field, ++i) { 49302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = layout.getFieldOffset(i); 49312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 4932581deb3da481053c4993c7600f97acf7768caac5David Blaikie std::make_pair(offs, *Field)); 49332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec && includeVBases) { 49362636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (CXXRecordDecl::base_class_iterator 49372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BI = CXXRec->vbases_begin(), 49382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BE = CXXRec->vbases_end(); BI != BE; ++BI) { 49392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4940829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis if (base->isEmpty()) 4941829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis continue; 4942d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer uint64_t offs = toBits(layout.getVBaseClassOffset(base)); 494319aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end()) 494419aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(), 494519aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis std::make_pair(offs, base)); 49462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CharUnits size; 49502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec) { 49512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis size = includeVBases ? layout.getSize() : layout.getNonVirtualSize(); 49522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 49532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis size = layout.getSize(); 49542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49562636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t CurOffs = 0; 49572636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::multimap<uint64_t, NamedDecl *>::iterator 49582636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurLayObj = FieldOrBaseOffsets.begin(); 49592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 496058db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor if (CXXRec && CXXRec->isDynamicClass() && 496158db7a575efc9a2f35266fe240feac3cf317753dDouglas Gregor (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) { 49622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 49632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += "\"_vptr$"; 49642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::string recname = CXXRec->getNameAsString(); 49652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (recname.empty()) recname = "?"; 49662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += recname; 49672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 49682636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += "^^?"; 49702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += getTypeSize(VoidPtrTy); 49712636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->hasFlexibleArrayMember()) { 49742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // Mark the end of the structure. 49752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = toBits(size); 49762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 49772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, (NamedDecl*)0)); 49782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49792636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) { 49812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(CurOffs <= CurLayObj->first); 49822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49832636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CurOffs < CurLayObj->first) { 49842636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t padding = CurLayObj->first - CurOffs; 49852636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // FIXME: There doesn't seem to be a way to indicate in the encoding that 49862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // packing/alignment of members is different that normal, in which case 49872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // the encoding will be out-of-sync with the real layout. 49882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // If the runtime switches to just consider the size of types without 49892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // taking into account alignment, we could make padding explicit in the 49902636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // encoding (e.g. using arrays of chars). The encoding strings would be 49912636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // longer then though. 49922636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += padding; 49932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 49942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis NamedDecl *dcl = CurLayObj->second; 49962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (dcl == 0) 49972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis break; // reached end of structure. 49982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 49992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) { 50002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // We expand the bases without their virtual bases since those are going 50012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // in the initial structure. Note that this differs from gcc which 50022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // expands virtual bases each time one is encountered in the hierarchy, 50032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // making the encoding type bigger than it really is. 50042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false); 5005829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis assert(!base->isEmpty()); 5006829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize()); 50072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 50082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldDecl *field = cast<FieldDecl>(dcl); 50092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 50102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 50112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += field->getNameAsString(); 50122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 50132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 50142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 50152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (field->isBitField()) { 50162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis EncodeBitField(this, S, field->getType(), field); 5017a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith CurOffs += field->getBitWidthValue(*this); 50182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 50192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis QualType qt = field->getType(); 50202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getLegacyIntegralTypeEncoding(qt); 50212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(qt, S, false, true, FD, 50222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*OutermostType*/false, 50232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*EncodingProperty*/false, 50242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*StructField*/true); 50252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += getTypeSize(field->getType()); 50262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 50272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 50282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 50292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis} 50302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 50311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, 5032ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian std::string& S) const { 5033ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_In) 5034ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'n'; 5035ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Inout) 5036ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'N'; 5037ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Out) 5038ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'o'; 5039ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Bycopy) 5040ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'O'; 5041ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Byref) 5042ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'R'; 5043ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Oneway) 5044ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'V'; 5045ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian} 5046ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian 50474dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas GregorTypedefDecl *ASTContext::getObjCIdDecl() const { 50484dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor if (!ObjCIdDecl) { 50494dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0); 50504dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor T = getObjCObjectPointerType(T); 50514dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T); 50524dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 50534dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor getTranslationUnitDecl(), 50544dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor SourceLocation(), SourceLocation(), 50554dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor &Idents.get("id"), IdInfo); 50564dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor } 50574dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor 50584dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor return ObjCIdDecl; 50597e219e47de26346885d667131977bd9ca2d7662aSteve Naroff} 50607e219e47de26346885d667131977bd9ca2d7662aSteve Naroff 50617a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas GregorTypedefDecl *ASTContext::getObjCSelDecl() const { 50627a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor if (!ObjCSelDecl) { 50637a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor QualType SelT = getPointerType(ObjCBuiltinSelTy); 50647a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor TypeSourceInfo *SelInfo = getTrivialTypeSourceInfo(SelT); 50657a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor ObjCSelDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 50667a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor getTranslationUnitDecl(), 50677a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor SourceLocation(), SourceLocation(), 50687a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor &Idents.get("SEL"), SelInfo); 50697a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor } 50707a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor return ObjCSelDecl; 5071b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 5072b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 507379d6726921897811232554ed94c5d77b5b7b3fc0Douglas GregorTypedefDecl *ASTContext::getObjCClassDecl() const { 507479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor if (!ObjCClassDecl) { 507579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor QualType T = getObjCObjectType(ObjCBuiltinClassTy, 0, 0); 507679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor T = getObjCObjectPointerType(T); 507779d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor TypeSourceInfo *ClassInfo = getTrivialTypeSourceInfo(T); 507879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor ObjCClassDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 507979d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor getTranslationUnitDecl(), 508079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor SourceLocation(), SourceLocation(), 508179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor &Idents.get("Class"), ClassInfo); 508279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor } 508379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor 508479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor return ObjCClassDecl; 5085a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor} 5086a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 5087a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas GregorObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const { 5088a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor if (!ObjCProtocolClassDecl) { 5089a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor ObjCProtocolClassDecl 5090a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(), 5091a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor SourceLocation(), 5092a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor &Idents.get("Protocol"), 5093a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor /*PrevDecl=*/0, 5094a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor SourceLocation(), true); 5095a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor } 5096a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 5097a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor return ObjCProtocolClassDecl; 50988baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson} 50998baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson 5100c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===// 5101c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge// __builtin_va_list Construction Functions 5102c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge//===----------------------------------------------------------------------===// 5103c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5104c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateCharPtrBuiltinVaListDecl(const ASTContext *Context) { 5105c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef char* __builtin_va_list; 5106c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType CharPtrType = Context->getPointerType(Context->CharTy); 5107c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5108c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(CharPtrType); 5109c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5110c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypeDecl 5111c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5112c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5113c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5114c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5115c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5116c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypeDecl; 5117c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5118c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5119c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) { 5120c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef void* __builtin_va_list; 5121c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VoidPtrType = Context->getPointerType(Context->VoidTy); 5122c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5123c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VoidPtrType); 5124c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5125c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypeDecl 5126c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5127c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5128c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5129c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5130c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5131c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypeDecl; 5132c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5133c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5134c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePowerABIBuiltinVaListDecl(const ASTContext *Context) { 5135c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef struct __va_list_tag { 5136c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge RecordDecl *VaListTagDecl; 5137c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5138c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct, 5139c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5140c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag")); 5141c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->startDefinition(); 5142c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5143c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const size_t NumFields = 5; 5144c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType FieldTypes[NumFields]; 5145c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const char *FieldNames[NumFields]; 5146c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5147c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned char gpr; 5148c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[0] = Context->UnsignedCharTy; 5149c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[0] = "gpr"; 5150c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5151c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned char fpr; 5152c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[1] = Context->UnsignedCharTy; 5153c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[1] = "fpr"; 5154c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5155c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned short reserved; 5156c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[2] = Context->UnsignedShortTy; 5157c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[2] = "reserved"; 5158c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5159c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* overflow_arg_area; 5160c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[3] = Context->getPointerType(Context->VoidTy); 5161c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[3] = "overflow_arg_area"; 5162c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5163c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* reg_save_area; 5164c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[4] = Context->getPointerType(Context->VoidTy); 5165c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[4] = "reg_save_area"; 5166c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5167c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // Create fields 5168c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge for (unsigned i = 0; i < NumFields; ++i) { 5169c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldDecl *Field = FieldDecl::Create(*Context, VaListTagDecl, 5170c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5171c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5172c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get(FieldNames[i]), 5173c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[i], /*TInfo=*/0, 5174c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*BitWidth=*/0, 5175c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*Mutable=*/false, 5176c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge ICIS_NoInit); 5177c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Field->setAccess(AS_public); 5178c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->addDecl(Field); 5179c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5180c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->completeDefinition(); 5181c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagType = Context->getRecordType(VaListTagDecl); 5182fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge Context->VaListTagTy = VaListTagType; 5183c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5184c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // } __va_list_tag; 5185c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTagTypedefDecl 5186c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5187c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5188c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5189c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag"), 5190c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(VaListTagType)); 5191c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagTypedefType = 5192c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTypedefType(VaListTagTypedefDecl); 5193c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5194c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef __va_list_tag __builtin_va_list[1]; 5195c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1); 5196c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagArrayType 5197c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(VaListTagTypedefType, 5198c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal, 0); 5199c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5200c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VaListTagArrayType); 5201c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5202c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5203c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5204c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5205c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5206c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5207c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5208c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5209c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5210c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5211c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl * 5212c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeCreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context) { 5213c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef struct __va_list_tag { 5214c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge RecordDecl *VaListTagDecl; 5215c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl = CreateRecordDecl(*Context, TTK_Struct, 5216c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5217c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag")); 5218c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->startDefinition(); 5219c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5220c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const size_t NumFields = 4; 5221c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType FieldTypes[NumFields]; 5222c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge const char *FieldNames[NumFields]; 5223c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5224c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned gp_offset; 5225c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[0] = Context->UnsignedIntTy; 5226c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[0] = "gp_offset"; 5227c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5228c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // unsigned fp_offset; 5229c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[1] = Context->UnsignedIntTy; 5230c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[1] = "fp_offset"; 5231c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5232c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* overflow_arg_area; 5233c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[2] = Context->getPointerType(Context->VoidTy); 5234c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[2] = "overflow_arg_area"; 5235c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5236c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // void* reg_save_area; 5237c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[3] = Context->getPointerType(Context->VoidTy); 5238c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldNames[3] = "reg_save_area"; 5239c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5240c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // Create fields 5241c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge for (unsigned i = 0; i < NumFields; ++i) { 5242c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context), 5243c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl, 5244c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5245c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), 5246c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get(FieldNames[i]), 5247c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge FieldTypes[i], /*TInfo=*/0, 5248c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*BitWidth=*/0, 5249c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge /*Mutable=*/false, 5250c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge ICIS_NoInit); 5251c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Field->setAccess(AS_public); 5252c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->addDecl(Field); 5253c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5254c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge VaListTagDecl->completeDefinition(); 5255c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagType = Context->getRecordType(VaListTagDecl); 5256fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge Context->VaListTagTy = VaListTagType; 5257c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5258c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // } __va_list_tag; 5259c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTagTypedefDecl 5260c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5261c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5262c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5263c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__va_list_tag"), 5264c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(VaListTagType)); 5265c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagTypedefType = 5266c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTypedefType(VaListTagTypedefDecl); 5267c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5268c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef __va_list_tag __builtin_va_list[1]; 5269c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1); 5270c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType VaListTagArrayType 5271c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(VaListTagTypedefType, 5272c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal,0); 5273c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypeSourceInfo *TInfo 5274c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getTrivialTypeSourceInfo(VaListTagArrayType); 5275c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5276c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5277c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5278c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5279c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5280c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TInfo); 5281c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5282c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5283c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5284c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5285c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context) { 5286c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge // typedef int __builtin_va_list[4]; 5287c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 4); 5288c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge QualType IntArrayType 5289c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = Context->getConstantArrayType(Context->IntTy, 5290c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Size, ArrayType::Normal, 0); 5291c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TypedefDecl *VaListTypedefDecl 5292c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge = TypedefDecl::Create(const_cast<ASTContext &>(*Context), 5293c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTranslationUnitDecl(), 5294c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge SourceLocation(), SourceLocation(), 5295c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge &Context->Idents.get("__builtin_va_list"), 5296c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge Context->getTrivialTypeSourceInfo(IntArrayType)); 5297c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5298c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return VaListTypedefDecl; 5299c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5300c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5301c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Ingestatic TypedefDecl *CreateVaListDecl(const ASTContext *Context, 5302c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge TargetInfo::BuiltinVaListKind Kind) { 5303c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge switch (Kind) { 5304c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::CharPtrBuiltinVaList: 5305c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateCharPtrBuiltinVaListDecl(Context); 5306c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::VoidPtrBuiltinVaList: 5307c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateVoidPtrBuiltinVaListDecl(Context); 5308c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::PowerABIBuiltinVaList: 5309c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreatePowerABIBuiltinVaListDecl(Context); 5310c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::X86_64ABIBuiltinVaList: 5311c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreateX86_64ABIBuiltinVaListDecl(Context); 5312c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge case TargetInfo::PNaClABIBuiltinVaList: 5313c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return CreatePNaClABIBuiltinVaListDecl(Context); 5314c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge } 5315c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5316c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge llvm_unreachable("Unhandled __builtin_va_list type kind"); 5317c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5318c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5319c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador IngeTypedefDecl *ASTContext::getBuiltinVaListDecl() const { 5320c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge if (!BuiltinVaListDecl) 5321c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge BuiltinVaListDecl = CreateVaListDecl(this, Target->getBuiltinVaListKind()); 5322c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5323c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge return BuiltinVaListDecl; 5324c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge} 5325c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 5326fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador IngeQualType ASTContext::getVaListTagType() const { 5327fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // Force the creation of VaListTagTy by building the __builtin_va_list 5328fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge // declaration. 5329fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge if (VaListTagTy.isNull()) 5330fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge (void) getBuiltinVaListDecl(); 5331fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 5332fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge return VaListTagTy; 5333fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge} 5334fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge 5335a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) { 53361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(ObjCConstantStringType.isNull() && 53372198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff "'NSConstantString' type already set!"); 53381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5339a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCConstantStringType = getObjCInterfaceType(Decl); 53402198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff} 53412198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff 53420bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// \brief Retrieve the template name that corresponds to a non-empty 53430bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// lookup. 53444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 53454ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin, 53464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad UnresolvedSetIterator End) const { 53470bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall unsigned size = End - Begin; 53480bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall assert(size > 1 && "set is not overloaded!"); 53497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53500bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall void *memory = Allocate(sizeof(OverloadedTemplateStorage) + 53510bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall size * sizeof(FunctionTemplateDecl*)); 53520bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size); 53530bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall 53540bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall NamedDecl **Storage = OT->getStorage(); 5355eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetIterator I = Begin; I != End; ++I) { 53560bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall NamedDecl *D = *I; 53570bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall assert(isa<FunctionTemplateDecl>(D) || 53580bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall (isa<UsingShadowDecl>(D) && 53590bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall isa<FunctionTemplateDecl>(D->getUnderlyingDecl()))); 53600bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall *Storage++ = D; 53617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } 53627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53630bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall return TemplateName(OT); 53647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor} 53657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 5366d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// \brief Retrieve the template name that represents a qualified 5367d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// template name such as \c std::vector. 53684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 53694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS, 53704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool TemplateKeyword, 53714ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad TemplateDecl *Template) const { 53720f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor assert(NNS && "Missing nested-name-specifier in qualified template name"); 53730f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor 5374789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor // FIXME: Canonicalization? 5375d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor llvm::FoldingSetNodeID ID; 5376d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template); 53771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5378d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor void *InsertPos = 0; 5379d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateName *QTN = 53800bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5381d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor if (!QTN) { 5382d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QTN = new (*this,4) QualifiedTemplateName(NNS, TemplateKeyword, Template); 5383d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateNames.InsertNode(QTN, InsertPos); 5384d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor } 53851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5386d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor return TemplateName(QTN); 5387d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor} 5388d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor 53897532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Retrieve the template name that represents a dependent 53907532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name such as \c MetaFun::template apply. 53914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 53924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 53934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const IdentifierInfo *Name) const { 53941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((!NNS || NNS->isDependent()) && 53953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor "Nested name specifier must be dependent"); 53967532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 53977532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor llvm::FoldingSetNodeID ID; 53987532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateName::Profile(ID, NNS, Name); 53997532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 54007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor void *InsertPos = 0; 54017532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateName *QTN = 54027532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 54037532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 54047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor if (QTN) 54057532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor return TemplateName(QTN); 54067532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 54077532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 54087532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor if (CanonNNS == NNS) { 54097532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Name); 54107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } else { 54117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor TemplateName Canon = getDependentTemplateName(CanonNNS, Name); 54127532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Name, Canon); 5413789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *CheckQTN = 5414789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5415789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CheckQTN && "Dependent type name canonicalization broken"); 5416789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckQTN; 54177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } 54187532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 54197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateNames.InsertNode(QTN, InsertPos); 54207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor return TemplateName(QTN); 54217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor} 54227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 5423ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// \brief Retrieve the template name that represents a dependent 5424ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// template name such as \c MetaFun::template operator+. 5425ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5426ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 54274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad OverloadedOperatorKind Operator) const { 5428ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor assert((!NNS || NNS->isDependent()) && 5429ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor "Nested name specifier must be dependent"); 5430ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5431ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor llvm::FoldingSetNodeID ID; 5432ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateName::Profile(ID, NNS, Operator); 5433ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5434ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor void *InsertPos = 0; 5435789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *QTN 5436789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5437ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5438ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (QTN) 5439ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return TemplateName(QTN); 5440ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5441ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 5442ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (CanonNNS == NNS) { 5443ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Operator); 5444ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } else { 5445ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName Canon = getDependentTemplateName(CanonNNS, Operator); 5446ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Operator, Canon); 5447789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 5448789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *CheckQTN 5449789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5450789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CheckQTN && "Dependent template name canonicalization broken"); 5451789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckQTN; 5452ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } 5453ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5454ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateNames.InsertNode(QTN, InsertPos); 5455ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return TemplateName(QTN); 5456ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5457ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 54581aee05d08b2184acadeb36de300e216390780d6cDouglas GregorTemplateName 5459146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param, 5460146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateName replacement) const { 5461146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm::FoldingSetNodeID ID; 5462146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage::Profile(ID, param, replacement); 5463146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5464146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall void *insertPos = 0; 5465146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 5466146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos); 5467146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5468146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall if (!subst) { 5469146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement); 5470146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParms.InsertNode(subst, insertPos); 5471146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 5472146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5473146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return TemplateName(subst); 5474146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall} 5475146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5476146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallTemplateName 54771aee05d08b2184acadeb36de300e216390780d6cDouglas GregorASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param, 54781aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor const TemplateArgument &ArgPack) const { 54791aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ASTContext &Self = const_cast<ASTContext &>(*this); 54801aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor llvm::FoldingSetNodeID ID; 54811aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack); 54821aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54831aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor void *InsertPos = 0; 54841aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage *Subst 54851aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos); 54861aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54871aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!Subst) { 5488146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param, 54891aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ArgPack.pack_size(), 54901aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ArgPack.pack_begin()); 54911aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos); 54921aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 54931aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 54941aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(Subst); 54951aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor} 54961aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 5497b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor/// getFromTargetType - Given one of the integer types provided by 5498d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// TargetInfo, produce the corresponding type. The unsigned @p Type 5499d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// is actually a value of type @c TargetInfo::IntType. 5500e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallCanQualType ASTContext::getFromTargetType(unsigned Type) const { 5501b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor switch (Type) { 5502e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall case TargetInfo::NoInt: return CanQualType(); 5503b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedShort: return ShortTy; 5504b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedShort: return UnsignedShortTy; 5505b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedInt: return IntTy; 5506b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedInt: return UnsignedIntTy; 5507b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedLong: return LongTy; 5508b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedLong: return UnsignedLongTy; 5509b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedLongLong: return LongLongTy; 5510b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy; 5511b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor } 5512b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor 5513b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unhandled TargetInfo::IntType value"); 5514b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor} 5515b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek 5516b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===// 5517b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek// Type Predicates. 5518b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===// 5519b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek 55204fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's 55214fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// garbage collection attribute. 55224fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// 5523ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCallQualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const { 55244e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().getGC() == LangOptions::NonGC) 5525ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return Qualifiers::GCNone; 5526ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall 55274e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie assert(getLangOpts().ObjC1); 5528ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall Qualifiers::GC GCAttrs = Ty.getObjCGCAttr(); 5529ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall 5530ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // Default behaviour under objective-C's gc is for ObjC pointers 5531ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // (or pointers to them) be treated as though they were declared 5532ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // as __strong. 5533ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall if (GCAttrs == Qualifiers::GCNone) { 5534ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType()) 5535ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return Qualifiers::Strong; 5536ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall else if (Ty->isPointerType()) 5537ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType()); 5538ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall } else { 5539ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // It's not valid to set GC attributes on anything that isn't a 5540ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // pointer. 5541ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#ifndef NDEBUG 5542ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall QualType CT = Ty->getCanonicalTypeInternal(); 5543ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall while (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 5544ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall CT = AT->getElementType(); 5545ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall assert(CT->isAnyPointerType() || CT->isBlockPointerType()); 5546ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#endif 55474fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian } 5548b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner return GCAttrs; 55494fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian} 55504fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian 55516ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===// 55526ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner// Type Compatibility Testing 55536ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===// 5554770951b5bb6028a8d326ddb4a13cef7d4a128162Chris Lattner 55551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// areCompatVectorTypes - Return true if the two specified vector types are 55566ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner/// compatible. 55576ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattnerstatic bool areCompatVectorTypes(const VectorType *LHS, 55586ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner const VectorType *RHS) { 5559467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified()); 55606ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return LHS->getElementType() == RHS->getElementType() && 556161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner LHS->getNumElements() == RHS->getNumElements(); 55626ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner} 55636ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner 5564255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregorbool ASTContext::areCompatibleVectorTypes(QualType FirstVec, 5565255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor QualType SecondVec) { 5566255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor assert(FirstVec->isVectorType() && "FirstVec should be a vector type"); 5567255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor assert(SecondVec->isVectorType() && "SecondVec should be a vector type"); 5568255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5569255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor if (hasSameUnqualifiedType(FirstVec, SecondVec)) 5570255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return true; 5571255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5572f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson // Treat Neon vector types and most AltiVec vector types as if they are the 5573f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson // equivalent GCC vector types. 5574255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor const VectorType *First = FirstVec->getAs<VectorType>(); 5575255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor const VectorType *Second = SecondVec->getAs<VectorType>(); 5576f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson if (First->getNumElements() == Second->getNumElements() && 5577255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor hasSameType(First->getElementType(), Second->getElementType()) && 5578f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson First->getVectorKind() != VectorType::AltiVecPixel && 5579f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson First->getVectorKind() != VectorType::AltiVecBool && 5580f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson Second->getVectorKind() != VectorType::AltiVecPixel && 5581f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson Second->getVectorKind() != VectorType::AltiVecBool) 5582255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return true; 5583255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5584255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return false; 5585255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor} 5586255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 55874084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===// 55884084c306635b70f37029dca938444e6013f08684Steve Naroff// ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's. 55894084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===// 55904084c306635b70f37029dca938444e6013f08684Steve Naroff 55914084c306635b70f37029dca938444e6013f08684Steve Naroff/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the 55924084c306635b70f37029dca938444e6013f08684Steve Naroff/// inheritance hierarchy of 'rProto'. 55934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool 55944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, 55954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad ObjCProtocolDecl *rProto) const { 55963fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor if (declaresSameEntity(lProto, rProto)) 559714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return true; 55984084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(), 55994084c306635b70f37029dca938444e6013f08684Steve Naroff E = rProto->protocol_end(); PI != E; ++PI) 56004084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lProto, *PI)) 56014084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 56024084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 56034084c306635b70f37029dca938444e6013f08684Steve Naroff} 560414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 56054084c306635b70f37029dca938444e6013f08684Steve Naroff/// QualifiedIdConformsQualifiedId - compare id<p,...> with id<p1,...> 56064084c306635b70f37029dca938444e6013f08684Steve Naroff/// return true if lhs's protocols conform to rhs's protocol; false 56074084c306635b70f37029dca938444e6013f08684Steve Naroff/// otherwise. 56084084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) { 56094084c306635b70f37029dca938444e6013f08684Steve Naroff if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType()) 56104084c306635b70f37029dca938444e6013f08684Steve Naroff return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false); 56114084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 56124084c306635b70f37029dca938444e6013f08684Steve Naroff} 56134084c306635b70f37029dca938444e6013f08684Steve Naroff 5614a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian/// ObjCQualifiedClassTypesAreCompatible - compare Class<p,...> and 5615a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian/// Class<p1, ...>. 5616a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanianbool ASTContext::ObjCQualifiedClassTypesAreCompatible(QualType lhs, 5617a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian QualType rhs) { 5618a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian const ObjCObjectPointerType *lhsQID = lhs->getAs<ObjCObjectPointerType>(); 5619a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 5620a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian assert ((lhsQID && rhsOPT) && "ObjCQualifiedClassTypesAreCompatible"); 5621a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5622a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 5623a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian E = lhsQID->qual_end(); I != E; ++I) { 5624a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian bool match = false; 5625a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian ObjCProtocolDecl *lhsProto = *I; 5626a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 5627a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian E = rhsOPT->qual_end(); J != E; ++J) { 5628a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian ObjCProtocolDecl *rhsProto = *J; 5629a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) { 5630a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian match = true; 5631a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian break; 5632a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5633a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5634a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (!match) 5635a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return false; 5636a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5637a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return true; 5638a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian} 5639a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 56404084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an 56414084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIDType. 56424084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, 56434084c306635b70f37029dca938444e6013f08684Steve Naroff bool compare) { 56444084c306635b70f37029dca938444e6013f08684Steve Naroff // Allow id<P..> and an 'id' or void* type in all cases. 56451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (lhs->isVoidPointerType() || 56464084c306635b70f37029dca938444e6013f08684Steve Naroff lhs->isObjCIdType() || lhs->isObjCClassType()) 56474084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 56481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (rhs->isVoidPointerType() || 56494084c306635b70f37029dca938444e6013f08684Steve Naroff rhs->isObjCIdType() || rhs->isObjCClassType()) 56504084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 56514084c306635b70f37029dca938444e6013f08684Steve Naroff 56524084c306635b70f37029dca938444e6013f08684Steve Naroff if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) { 5653183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 56541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56554084c306635b70f37029dca938444e6013f08684Steve Naroff if (!rhsOPT) return false; 56561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56574084c306635b70f37029dca938444e6013f08684Steve Naroff if (rhsOPT->qual_empty()) { 56581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the RHS is a unqualified interface pointer "NSString*", 56594084c306635b70f37029dca938444e6013f08684Steve Naroff // make sure we check the class hierarchy. 56604084c306635b70f37029dca938444e6013f08684Steve Naroff if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 56614084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56624084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56634084c306635b70f37029dca938444e6013f08684Steve Naroff // when comparing an id<P> on lhs with a static type on rhs, 56644084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 56654084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 56660fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian if (!rhsID->ClassImplementsProtocol(*I, true)) 56674084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 56684084c306635b70f37029dca938444e6013f08684Steve Naroff } 56694084c306635b70f37029dca938444e6013f08684Steve Naroff } 56704084c306635b70f37029dca938444e6013f08684Steve Naroff // If there are no qualifiers and no interface, we have an 'id'. 56714084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 56724084c306635b70f37029dca938444e6013f08684Steve Naroff } 56731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Both the right and left sides have qualifiers. 56744084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56754084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56764084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *lhsProto = *I; 56774084c306635b70f37029dca938444e6013f08684Steve Naroff bool match = false; 5678de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff 5679de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // when comparing an id<P> on lhs with a static type on rhs, 5680de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // see if static class implements all of id's protocols, directly or 5681de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // through its super class and categories. 56824084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 56834084c306635b70f37029dca938444e6013f08684Steve Naroff E = rhsOPT->qual_end(); J != E; ++J) { 56844084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *rhsProto = *J; 56854084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 56864084c306635b70f37029dca938444e6013f08684Steve Naroff (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 56874084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 56888f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff break; 56898f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff } 5690de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 56911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the RHS is a qualified interface pointer "NSString<P>*", 56924084c306635b70f37029dca938444e6013f08684Steve Naroff // make sure we check the class hierarchy. 56934084c306635b70f37029dca938444e6013f08684Steve Naroff if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 56944084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 56954084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 56964084c306635b70f37029dca938444e6013f08684Steve Naroff // when comparing an id<P> on lhs with a static type on rhs, 56974084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 56984084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 56990fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian if (rhsID->ClassImplementsProtocol(*I, true)) { 57004084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 57014084c306635b70f37029dca938444e6013f08684Steve Naroff break; 57024084c306635b70f37029dca938444e6013f08684Steve Naroff } 57034084c306635b70f37029dca938444e6013f08684Steve Naroff } 57044084c306635b70f37029dca938444e6013f08684Steve Naroff } 57054084c306635b70f37029dca938444e6013f08684Steve Naroff if (!match) 5706de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff return false; 5707de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 57081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5709de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff return true; 5710de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 57111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57124084c306635b70f37029dca938444e6013f08684Steve Naroff const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType(); 57134084c306635b70f37029dca938444e6013f08684Steve Naroff assert(rhsQID && "One of the LHS/RHS should be id<x>"); 57144084c306635b70f37029dca938444e6013f08684Steve Naroff 57151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ObjCObjectPointerType *lhsOPT = 57164084c306635b70f37029dca938444e6013f08684Steve Naroff lhs->getAsObjCInterfacePointerType()) { 5717de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // If both the right and left sides have qualifiers. 57184084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(), 57194084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsOPT->qual_end(); I != E; ++I) { 57204084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *lhsProto = *I; 57214084c306635b70f37029dca938444e6013f08684Steve Naroff bool match = false; 57224084c306635b70f37029dca938444e6013f08684Steve Naroff 5723de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // when comparing an id<P> on rhs with a static type on lhs, 57244084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 57254084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 5726de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // First, lhs protocols in the qualifier list must be found, direct 5727de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // or indirect in rhs's qualifier list or it is a mismatch. 57284084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 57294084c306635b70f37029dca938444e6013f08684Steve Naroff E = rhsQID->qual_end(); J != E; ++J) { 57304084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *rhsProto = *J; 57314084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 57324084c306635b70f37029dca938444e6013f08684Steve Naroff (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 57334084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 57344084c306635b70f37029dca938444e6013f08684Steve Naroff break; 57354084c306635b70f37029dca938444e6013f08684Steve Naroff } 57364084c306635b70f37029dca938444e6013f08684Steve Naroff } 57374084c306635b70f37029dca938444e6013f08684Steve Naroff if (!match) 57384084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 57394084c306635b70f37029dca938444e6013f08684Steve Naroff } 5740de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian 5741de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // Static class's protocols, or its super class or category protocols 5742de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // must be found, direct or indirect in rhs's qualifier list or it is a mismatch. 5743de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) { 5744de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5745de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian CollectInheritedProtocols(lhsID, LHSInheritedProtocols); 5746de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // This is rather dubious but matches gcc's behavior. If lhs has 5747de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // no type qualifier and its class has no static protocol(s) 5748de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // assume that it is mismatch. 5749de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty()) 5750de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian return false; 5751de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5752de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian LHSInheritedProtocols.begin(), 5753de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian E = LHSInheritedProtocols.end(); I != E; ++I) { 5754de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian bool match = false; 5755de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian ObjCProtocolDecl *lhsProto = (*I); 5756de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 5757de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian E = rhsQID->qual_end(); J != E; ++J) { 5758de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian ObjCProtocolDecl *rhsProto = *J; 5759de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 5760de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 5761de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian match = true; 5762de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian break; 5763de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5764de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5765de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (!match) 5766de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian return false; 5767de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5768de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 57694084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 57704084c306635b70f37029dca938444e6013f08684Steve Naroff } 57714084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 57724084c306635b70f37029dca938444e6013f08684Steve Naroff} 57734084c306635b70f37029dca938444e6013f08684Steve Naroff 57744084c306635b70f37029dca938444e6013f08684Steve Naroff/// canAssignObjCInterfaces - Return true if the two interface types are 57754084c306635b70f37029dca938444e6013f08684Steve Naroff/// compatible for assignment from RHS to LHS. This handles validation of any 57764084c306635b70f37029dca938444e6013f08684Steve Naroff/// protocol qualifiers on the LHS or RHS. 57774084c306635b70f37029dca938444e6013f08684Steve Naroff/// 57784084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, 57794084c306635b70f37029dca938444e6013f08684Steve Naroff const ObjCObjectPointerType *RHSOPT) { 5780c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5781c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5782c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 57834084c306635b70f37029dca938444e6013f08684Steve Naroff // If either type represents the built-in 'id' or 'Class' types, return true. 5784c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->isObjCUnqualifiedIdOrClass() || 5785c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHS->isObjCUnqualifiedIdOrClass()) 57864084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 57874084c306635b70f37029dca938444e6013f08684Steve Naroff 5788c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) 57891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 57901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType(RHSOPT,0), 57914084c306635b70f37029dca938444e6013f08684Steve Naroff false); 5792a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5793a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) 5794a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return ObjCQualifiedClassTypesAreCompatible(QualType(LHSOPT,0), 5795a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian QualType(RHSOPT,0)); 5796a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5797c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // If we have 2 user-defined types, fall into that path. 5798c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->getInterface() && RHS->getInterface()) 57994084c306635b70f37029dca938444e6013f08684Steve Naroff return canAssignObjCInterfaces(LHS, RHS); 58001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58014084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 580214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff} 580314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 5804132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// canAssignObjCInterfacesInBlockPointer - This routine is specifically written 5805fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// for providing type-safety for objective-c pointers used to pass/return 5806132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// arguments in block literals. When passed as arguments, passing 'A*' where 5807132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is 5808132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// not OK. For the return type, the opposite is not OK. 5809132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::canAssignObjCInterfacesInBlockPointer( 5810132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCObjectPointerType *LHSOPT, 5811a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian const ObjCObjectPointerType *RHSOPT, 5812a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian bool BlockReturnType) { 5813a98344869c278295f38e106583906377520079b8Fariborz Jahanian if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType()) 5814132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return true; 5815132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5816132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHSOPT->isObjCBuiltinType()) { 5817132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType(); 5818132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5819132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5820a98344869c278295f38e106583906377520079b8Fariborz Jahanian if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) 5821132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 5822132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian QualType(RHSOPT,0), 5823132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian false); 5824132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5825132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType(); 5826132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType(); 5827132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS && RHS) { // We have 2 user-defined types. 5828132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS != RHS) { 5829132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS->getDecl()->isSuperClassOf(RHS->getDecl())) 5830a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian return BlockReturnType; 5831132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (RHS->getDecl()->isSuperClassOf(LHS->getDecl())) 5832a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian return !BlockReturnType; 5833132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5834132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian else 5835132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return true; 5836132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5837132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return false; 5838132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian} 5839132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5840e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// getIntersectionOfProtocols - This routine finds the intersection of set 5841e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// of protocols inherited from two distinct objective-c pointer objects. 5842e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// It is used to build composite qualifier list of the composite type of 5843e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// the conditional expression involving two objective-c pointer objects. 5844e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianstatic 5845e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid getIntersectionOfProtocols(ASTContext &Context, 5846e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian const ObjCObjectPointerType *LHSOPT, 5847e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian const ObjCObjectPointerType *RHSOPT, 58485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) { 5849e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5850c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5851c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5852c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(LHS->getInterface() && "LHS must have an interface base"); 5853c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(RHS->getInterface() && "RHS must have an interface base"); 5854e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5855e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet; 5856e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian unsigned LHSNumProtocols = LHS->getNumProtocols(); 5857e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (LHSNumProtocols > 0) 5858e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end()); 5859e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian else { 5860432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5861c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Context.CollectInheritedProtocols(LHS->getInterface(), 5862c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHSInheritedProtocols); 5863e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian InheritedProtocolSet.insert(LHSInheritedProtocols.begin(), 5864e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian LHSInheritedProtocols.end()); 5865e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 5866e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5867e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian unsigned RHSNumProtocols = RHS->getNumProtocols(); 5868e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (RHSNumProtocols > 0) { 5869cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman ObjCProtocolDecl **RHSProtocols = 5870cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman const_cast<ObjCProtocolDecl **>(RHS->qual_begin()); 5871e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (unsigned i = 0; i < RHSNumProtocols; ++i) 5872e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (InheritedProtocolSet.count(RHSProtocols[i])) 5873e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian IntersectionOfProtocols.push_back(RHSProtocols[i]); 58743060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 5875432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols; 5876c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Context.CollectInheritedProtocols(RHS->getInterface(), 5877c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHSInheritedProtocols); 5878432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5879432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian RHSInheritedProtocols.begin(), 5880432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian E = RHSInheritedProtocols.end(); I != E; ++I) 5881432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian if (InheritedProtocolSet.count((*I))) 5882432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian IntersectionOfProtocols.push_back((*I)); 5883e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 5884e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian} 5885e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5886db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// areCommonBaseCompatible - Returns common base class of the two classes if 5887db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// one found. Note that this is O'2 algorithm. But it will be called as the 5888db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// last type comparison in a ?-exp of ObjC pointer types before a 5889db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// warning is issued. So, its invokation is extremely rare. 5890db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz JahanianQualType ASTContext::areCommonBaseCompatible( 5891c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectPointerType *Lptr, 5892c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectPointerType *Rptr) { 5893c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *LHS = Lptr->getObjectType(); 5894c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *RHS = Rptr->getObjectType(); 5895c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCInterfaceDecl* LDecl = LHS->getInterface(); 5896c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCInterfaceDecl* RDecl = RHS->getInterface(); 589760ef308e51c71b760d7f598c1b763ceb7b768148Douglas Gregor if (!LDecl || !RDecl || (declaresSameEntity(LDecl, RDecl))) 5898db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian return QualType(); 5899db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 59007c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian do { 5901c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHS = cast<ObjCInterfaceType>(getObjCInterfaceType(LDecl)); 5902e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (canAssignObjCInterfaces(LHS, RHS)) { 59035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl *, 8> Protocols; 5904c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall getIntersectionOfProtocols(*this, Lptr, Rptr, Protocols); 5905c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 5906c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall QualType Result = QualType(LHS, 0); 5907c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!Protocols.empty()) 5908c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = getObjCObjectType(Result, Protocols.data(), Protocols.size()); 5909c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = getObjCObjectPointerType(Result); 5910c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Result; 5911e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 59127c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian } while ((LDecl = LDecl->getSuperClass())); 5913db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 5914db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian return QualType(); 5915db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian} 5916db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 5917c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallbool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS, 5918c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *RHS) { 5919c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(LHS->getInterface() && "LHS is not an interface type"); 5920c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(RHS->getInterface() && "RHS is not an interface type"); 5921c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 59226ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // Verify that the base decls are compatible: the RHS must be a subclass of 59236ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // the LHS. 5924c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!LHS->getInterface()->isSuperClassOf(RHS->getInterface())) 59256ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return false; 59261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59276ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // RHS must have a superset of the protocols in the LHS. If the LHS is not 59286ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // protocol qualified at all, then we are good. 5929c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff if (LHS->getNumProtocols() == 0) 59306ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return true; 59311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5932b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // Okay, we know the LHS has protocol qualifiers. If the RHS doesn't, 5933b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // more detailed analysis is required. 5934b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (RHS->getNumProtocols() == 0) { 5935b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // OK, if LHS is a superclass of RHS *and* 5936b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // this superclass is assignment compatible with LHS. 5937b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // false otherwise. 5938627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian bool IsSuperClass = 5939627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian LHS->getInterface()->isSuperClassOf(RHS->getInterface()); 5940627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian if (IsSuperClass) { 5941b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // OK if conversion of LHS to SuperClass results in narrowing of types 5942b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // ; i.e., SuperClass may implement at least one of the protocols 5943b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok. 5944b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // But not SuperObj<P1,P2,P3> = lhs<P1,P2>. 5945b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols; 5946627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols); 5947b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // If super class has no protocols, it is not a match. 5948b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (SuperClassInheritedProtocols.empty()) 5949b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5950b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian 5951b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5952b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian LHSPE = LHS->qual_end(); 5953b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian LHSPI != LHSPE; LHSPI++) { 5954b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian bool SuperImplementsProtocol = false; 5955b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian ObjCProtocolDecl *LHSProto = (*LHSPI); 5956b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian 5957b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5958b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian SuperClassInheritedProtocols.begin(), 5959b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian E = SuperClassInheritedProtocols.end(); I != E; ++I) { 5960b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian ObjCProtocolDecl *SuperClassProto = (*I); 5961b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) { 5962b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian SuperImplementsProtocol = true; 5963b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian break; 5964b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5965b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5966b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (!SuperImplementsProtocol) 5967b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5968b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5969b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return true; 5970b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5971b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5972b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 59731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5974c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5975c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHSPE = LHS->qual_end(); 597691b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff LHSPI != LHSPE; LHSPI++) { 597791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff bool RHSImplementsProtocol = false; 597891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff 597991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // If the RHS doesn't implement the protocol on the left, the types 598091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // are incompatible. 5981c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator RHSPI = RHS->qual_begin(), 5982c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHSPE = RHS->qual_end(); 59838f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff RHSPI != RHSPE; RHSPI++) { 59848f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) { 598591b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff RHSImplementsProtocol = true; 59868f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff break; 59878f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff } 598891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff } 598991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // FIXME: For better diagnostics, consider passing back the protocol name. 599091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff if (!RHSImplementsProtocol) 599191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff return false; 599291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff } 599391b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // The RHS implements all protocols listed on the LHS. 599491b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff return true; 59956ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner} 59966ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner 5997389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroffbool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) { 5998389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff // get the "pointed to" types 5999183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>(); 6000183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>(); 60011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 600214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (!LHSOPT || !RHSOPT) 6003389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff return false; 600414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 600514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return canAssignObjCInterfaces(LHSOPT, RHSOPT) || 600614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff canAssignObjCInterfaces(RHSOPT, LHSOPT); 6007389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff} 6008389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff 6009569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorbool ASTContext::canBindObjCObjectType(QualType To, QualType From) { 6010569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor return canAssignObjCInterfaces( 6011569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor getObjCObjectPointerType(To)->getAs<ObjCObjectPointerType>(), 6012569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor getObjCObjectPointerType(From)->getAs<ObjCObjectPointerType>()); 6013569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 6014569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 60151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible, 6016ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// both shall have the identically qualified version of a compatible type. 60171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// C99 6.2.7p1: Two types have compatible types if their types are the 6018ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// same. See 6.7.[2,3,5] for additional rules. 6019447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregorbool ASTContext::typesAreCompatible(QualType LHS, QualType RHS, 6020447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool CompareUnqualified) { 60214e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 60220e709abafbd939326850501f795cc7a92c88a354Douglas Gregor return hasSameType(LHS, RHS); 60230e709abafbd939326850501f795cc7a92c88a354Douglas Gregor 6024447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull(); 60253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman} 60263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6027c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanianbool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) { 602882378391dfc3b2fc22f63dbf1552bd9aed39dc42Fariborz Jahanian return typesAreCompatible(LHS, RHS); 6029c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian} 6030c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian 6031132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) { 6032132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return !mergeTypes(LHS, RHS, true).isNull(); 6033132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian} 6034132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 60354846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeTransparentUnionType - if T is a transparent union type and a member 60364846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// of T is compatible with SubType, return the merged type, else return 60374846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// QualType() 60384846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType, 60394846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool OfBlockPointer, 60404846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool Unqualified) { 60414846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (const RecordType *UT = T->getAsUnionType()) { 60424846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne RecordDecl *UD = UT->getDecl(); 60434846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (UD->hasAttr<TransparentUnionAttr>()) { 60444846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne for (RecordDecl::field_iterator it = UD->field_begin(), 60454846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne itend = UD->field_end(); it != itend; ++it) { 6046f91d7572ee7fa6f2926c8e7e816039a1154a59f8Peter Collingbourne QualType ET = it->getType().getUnqualifiedType(); 60474846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified); 60484846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!MT.isNull()) 60494846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return MT; 60504846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 60514846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 60524846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 60534846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60544846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return QualType(); 60554846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne} 60564846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60574846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeFunctionArgumentTypes - merge two types which appear as function 60584846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// argument types 60594846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeFunctionArgumentTypes(QualType lhs, QualType rhs, 60604846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool OfBlockPointer, 60614846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool Unqualified) { 60624846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // GNU extension: two types are compatible if they appear as a function 60634846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // argument, one of the types is a transparent union type and the other 60644846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // type is compatible with a union member 60654846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer, 60664846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 60674846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!lmerge.isNull()) 60684846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return lmerge; 60694846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60704846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer, 60714846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 60724846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!rmerge.isNull()) 60734846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return rmerge; 60744846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 60754846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified); 60764846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne} 60774846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 6078132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs, 6079447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool OfBlockPointer, 6080447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool Unqualified) { 6081183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *lbase = lhs->getAs<FunctionType>(); 6082183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *rbase = rhs->getAs<FunctionType>(); 608372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase); 608472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase); 60853d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman bool allLTypes = true; 60863d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman bool allRTypes = true; 60873d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 60883d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check return type 6089132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian QualType retType; 6090d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian if (OfBlockPointer) { 6091d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian QualType RHS = rbase->getResultType(); 6092d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian QualType LHS = lbase->getResultType(); 6093d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian bool UnqualifiedResult = Unqualified; 6094d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian if (!UnqualifiedResult) 6095d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers()); 6096a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true); 6097d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian } 6098132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian else 60998cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall retType = mergeTypes(lbase->getResultType(), rbase->getResultType(), false, 61008cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall Unqualified); 61013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (retType.isNull()) return QualType(); 6102447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6103447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) 6104447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor retType = retType.getUnqualifiedType(); 6105447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6106447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor CanQualType LRetType = getCanonicalType(lbase->getResultType()); 6107447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor CanQualType RRetType = getCanonicalType(rbase->getResultType()); 6108447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6109447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LRetType = LRetType.getUnqualifiedType(); 6110447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RRetType = RRetType.getUnqualifiedType(); 6111447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6112447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6113447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (getCanonicalType(retType) != LRetType) 611461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allLTypes = false; 6115447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (getCanonicalType(retType) != RRetType) 611661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allRTypes = false; 61178cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 61186a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // FIXME: double check this 61196a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // FIXME: should we error if lbase->getRegParmAttr() != 0 && 61206a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // rbase->getRegParmAttr() != 0 && 61216a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // lbase->getRegParmAttr() != rbase->getRegParmAttr()? 6122264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo(); 6123264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo(); 61248cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 61258cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall // Compatible functions must have compatible calling conventions 61268cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall if (!isSameCallConv(lbaseInfo.getCC(), rbaseInfo.getCC())) 61278cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return QualType(); 61288cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 61298cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall // Regparm is part of the calling convention. 6130a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm()) 6131a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman return QualType(); 61328cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm()) 61338cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return QualType(); 61348cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 6135f85e193739c953358c865005855253af4f68a497John McCall if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult()) 6136f85e193739c953358c865005855253af4f68a497John McCall return QualType(); 6137f85e193739c953358c865005855253af4f68a497John McCall 613853c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian // functypes which return are preferred over those that do not. 613953c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian if (lbaseInfo.getNoReturn() && !rbaseInfo.getNoReturn()) 61406a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar allLTypes = false; 614153c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian else if (!lbaseInfo.getNoReturn() && rbaseInfo.getNoReturn()) 61426a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar allRTypes = false; 614353c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'. 614453c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn(); 61451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6146f85e193739c953358c865005855253af4f68a497John McCall FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn); 6147e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 61483d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto && rproto) { // two C99 style function prototypes 6149465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() && 6150465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl "C++ shouldn't be here"); 61513d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned lproto_nargs = lproto->getNumArgs(); 61523d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned rproto_nargs = rproto->getNumArgs(); 61533d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Compatible functions must have the same number of arguments 61553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto_nargs != rproto_nargs) 61563d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 61573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61583d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Variadic and non-variadic functions aren't compatible 61593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto->isVariadic() != rproto->isVariadic()) 61603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 61613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 61627fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis if (lproto->getTypeQuals() != rproto->getTypeQuals()) 61637fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis return QualType(); 61647fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis 616578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (LangOpts.ObjCAutoRefCount && 616678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian !FunctionTypesMatchOnNSConsumedAttrs(rproto, lproto)) 616778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return QualType(); 616878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 61693d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check argument compatibility 61705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 10> types; 61713d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman for (unsigned i = 0; i < lproto_nargs; i++) { 61723d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType largtype = lproto->getArgType(i).getUnqualifiedType(); 61733d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType rargtype = rproto->getArgType(i).getUnqualifiedType(); 61744846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType argtype = mergeFunctionArgumentTypes(largtype, rargtype, 61754846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne OfBlockPointer, 61764846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 61773d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (argtype.isNull()) return QualType(); 6178447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6179447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) 6180447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor argtype = argtype.getUnqualifiedType(); 6181447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 61823d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman types.push_back(argtype); 6183447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6184447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor largtype = largtype.getUnqualifiedType(); 6185447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor rargtype = rargtype.getUnqualifiedType(); 6186447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6187447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 618861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (getCanonicalType(argtype) != getCanonicalType(largtype)) 618961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allLTypes = false; 619061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (getCanonicalType(argtype) != getCanonicalType(rargtype)) 619161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allRTypes = false; 61923d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 619378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 61943d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 61953d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 6196e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6197e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo(); 6198e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = einfo; 6199e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return getFunctionType(retType, types.begin(), types.size(), EPI); 62003d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 62013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62023d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto) allRTypes = false; 62033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (rproto) allLTypes = false; 62043d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 620572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *proto = lproto ? lproto : rproto; 62063d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (proto) { 6207465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl assert(!proto->hasExceptionSpec() && "C++ shouldn't be here"); 62083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (proto->isVariadic()) return QualType(); 62093d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check that the types are compatible with the types that 62103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // would result from default argument promotions (C99 6.7.5.3p15). 62113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // The only types actually affected are promotable integer 62123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // types and floats, which would be passed as a different 62133d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // type depending on whether the prototype is visible. 62143d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned proto_nargs = proto->getNumArgs(); 62153d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman for (unsigned i = 0; i < proto_nargs; ++i) { 62163d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType argTy = proto->getArgType(i); 6217b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor 6218b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor // Look at the promotion type of enum types, since that is the type used 6219b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor // to pass enum values. 6220b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor if (const EnumType *Enum = argTy->getAs<EnumType>()) 6221b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor argTy = Enum->getDecl()->getPromotionType(); 6222b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor 62233d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (argTy->isPromotableIntegerType() || 62243d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman getCanonicalType(argTy).getUnqualifiedType() == FloatTy) 62253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 62263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 62273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62283d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 62293d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 6230e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6231e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo(); 6232e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = einfo; 62333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return getFunctionType(retType, proto->arg_type_begin(), 6234e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall proto->getNumArgs(), EPI); 62353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 62363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 62383d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 62398cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return getFunctionNoProtoType(retType, einfo); 62403d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman} 62413d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6242132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeTypes(QualType LHS, QualType RHS, 6243447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool OfBlockPointer, 6244a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian bool Unqualified, bool BlockReturnType) { 624543d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // C++ [expr]: If an expression initially has the type "reference to T", the 624643d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // type is adjusted to "T" prior to any further analysis, the expression 624743d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // designates the object or function denoted by the reference, and the 62487c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // expression is an lvalue unless the reference is an rvalue reference and 62497c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // the expression is a function call (possibly inside parentheses). 62500e709abafbd939326850501f795cc7a92c88a354Douglas Gregor assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?"); 62510e709abafbd939326850501f795cc7a92c88a354Douglas Gregor assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?"); 6252447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6253447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6254447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHS = LHS.getUnqualifiedType(); 6255447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHS = RHS.getUnqualifiedType(); 6256447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 62570e709abafbd939326850501f795cc7a92c88a354Douglas Gregor 62583d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType LHSCan = getCanonicalType(LHS), 62593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman RHSCan = getCanonicalType(RHS); 62603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6261f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner // If two types are identical, they are compatible. 62623d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LHSCan == RHSCan) 62633d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 62643d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 62650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If the qualifiers are different, the types aren't compatible... mostly. 6266a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers LQuals = LHSCan.getLocalQualifiers(); 6267a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers RQuals = RHSCan.getLocalQualifiers(); 62680953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (LQuals != RQuals) { 62690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If any of these qualifiers are different, we have a type 62700953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // mismatch. 62710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 6272f85e193739c953358c865005855253af4f68a497John McCall LQuals.getAddressSpace() != RQuals.getAddressSpace() || 6273f85e193739c953358c865005855253af4f68a497John McCall LQuals.getObjCLifetime() != RQuals.getObjCLifetime()) 62740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(); 62750953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62760953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Exactly one GC qualifier difference is allowed: __strong is 62770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // okay if the other type has no GC qualifier but is an Objective 62780953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // C object pointer (i.e. implicitly strong by default). We fix 62790953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // this by pretending that the unqualified type was actually 62800953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // qualified __strong. 62810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 62820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 62830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 62840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62850953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 62860953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(); 62870953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62880953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) { 62890953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong)); 62900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) { 62920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS); 62930953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62943d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 62950953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 62960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 62970953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Okay, qualifiers are equal. 62983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 6299852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman Type::TypeClass LHSClass = LHSCan->getTypeClass(); 6300852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman Type::TypeClass RHSClass = RHSCan->getTypeClass(); 6301f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner 63021adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // We want to consider the two function types to be the same for these 63031adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // comparisons, just force one to the other. 63041adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto; 63051adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto; 63064c721d381fb279899337d120edd4a24d405e56b2Eli Friedman 63074c721d381fb279899337d120edd4a24d405e56b2Eli Friedman // Same as above for arrays 6308a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray) 6309a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner LHSClass = Type::ConstantArray; 6310a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray) 6311a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner RHSClass = Type::ConstantArray; 63121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6313c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // ObjCInterfaces are just specialized ObjCObjects. 6314c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject; 6315c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject; 6316c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 6317213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman // Canonicalize ExtVector -> Vector. 6318213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (LHSClass == Type::ExtVector) LHSClass = Type::Vector; 6319213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (RHSClass == Type::ExtVector) RHSClass = Type::Vector; 63201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63214e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff // If the canonical type classes don't match. 63224e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff if (LHSClass != RHSClass) { 63231adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // C99 6.7.2.2p4: Each enumerated type shall be compatible with char, 63241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // a signed integer type, or an unsigned integer type. 6325842aef8d942a880eeb9535d40de31a86838264cbJohn McCall // Compatibility is based on the underlying type, not the promotion 6326842aef8d942a880eeb9535d40de31a86838264cbJohn McCall // type. 6327183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const EnumType* ETy = LHS->getAs<EnumType>()) { 6328b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian QualType TINT = ETy->getDecl()->getIntegerType(); 6329b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian if (!TINT.isNull() && hasSameType(TINT, RHSCan.getUnqualifiedType())) 63303d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return RHS; 6331bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman } 6332183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const EnumType* ETy = RHS->getAs<EnumType>()) { 6333b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian QualType TINT = ETy->getDecl()->getIntegerType(); 6334b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian if (!TINT.isNull() && hasSameType(TINT, LHSCan.getUnqualifiedType())) 63353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 6336bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman } 6337e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian // allow block pointer type to match an 'id' type. 6338419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (OfBlockPointer && !BlockReturnType) { 6339419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (LHS->isObjCIdType() && RHS->isBlockPointerType()) 6340419636316c04d570c183b4797fc811932c588358Fariborz Jahanian return LHS; 6341419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (RHS->isObjCIdType() && LHS->isBlockPointerType()) 6342419636316c04d570c183b4797fc811932c588358Fariborz Jahanian return RHS; 6343419636316c04d570c183b4797fc811932c588358Fariborz Jahanian } 6344e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian 63453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 6346ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff } 63473d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 63484a74678ed6c3dedac05d02b1ee341f1db869f049Steve Naroff // The canonical type classes match. 63491adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner switch (LHSClass) { 635072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base) 635172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base) 6352ad5e73887052193afda72db8efcb812bd083a4a8John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 635372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 635472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class: 635572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def" 6356b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 635772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 63587c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case Type::LValueReference: 63597c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case Type::RValueReference: 636072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::MemberPointer: 6361b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("C++ should never be in mergeTypes"); 636272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 6363c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCInterface: 636472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::IncompleteArray: 636572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::VariableArray: 636672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::FunctionProto: 636772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::ExtVector: 6368b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Types are eliminated above"); 636972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 63701adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::Pointer: 63713d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman { 63723d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Merge two pointer types, while trying to preserve typedef info 63736217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType(); 63746217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType(); 6375447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6376447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSPointee = LHSPointee.getUnqualifiedType(); 6377447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSPointee = RHSPointee.getUnqualifiedType(); 6378447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6379447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false, 6380447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor Unqualified); 63813d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (ResultType.isNull()) return QualType(); 638207d258756dc856c6987c394a0972884e6ed46765Eli Friedman if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 638361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 638407d258756dc856c6987c394a0972884e6ed46765Eli Friedman if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 638561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 63863d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return getPointerType(ResultType); 63873d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 6388c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff case Type::BlockPointer: 6389c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff { 6390c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff // Merge two block pointer types, while trying to preserve typedef info 63916217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType(); 63926217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType(); 6393447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6394447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSPointee = LHSPointee.getUnqualifiedType(); 6395447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSPointee = RHSPointee.getUnqualifiedType(); 6396447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6397447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer, 6398447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor Unqualified); 6399c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (ResultType.isNull()) return QualType(); 6400c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 6401c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return LHS; 6402c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 6403c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return RHS; 6404c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return getBlockPointerType(ResultType); 6405c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff } 6406b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: 6407b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman { 6408b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Merge two pointer types, while trying to preserve typedef info 6409b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType LHSValue = LHS->getAs<AtomicType>()->getValueType(); 6410b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType RHSValue = RHS->getAs<AtomicType>()->getValueType(); 6411b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (Unqualified) { 6412b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman LHSValue = LHSValue.getUnqualifiedType(); 6413b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman RHSValue = RHSValue.getUnqualifiedType(); 6414b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 6415b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType ResultType = mergeTypes(LHSValue, RHSValue, false, 6416b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Unqualified); 6417b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (ResultType.isNull()) return QualType(); 6418b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (getCanonicalType(LHSValue) == getCanonicalType(ResultType)) 6419b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return LHS; 6420b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (getCanonicalType(RHSValue) == getCanonicalType(ResultType)) 6421b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return RHS; 6422b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return getAtomicType(ResultType); 6423b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 64241adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::ConstantArray: 64253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman { 64263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const ConstantArrayType* LCAT = getAsConstantArrayType(LHS); 64273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const ConstantArrayType* RCAT = getAsConstantArrayType(RHS); 64283d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize()) 64293d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 64303d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 64313d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType LHSElem = getAsArrayType(LHS)->getElementType(); 64323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType RHSElem = getAsArrayType(RHS)->getElementType(); 6433447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6434447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSElem = LHSElem.getUnqualifiedType(); 6435447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSElem = RHSElem.getUnqualifiedType(); 6436447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6437447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6438447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified); 64393d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (ResultType.isNull()) return QualType(); 644061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 644161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 644261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 644361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 64443bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(), 64453bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman ArrayType::ArraySizeModifier(), 0); 64463bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(), 64473bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman ArrayType::ArraySizeModifier(), 0); 64483d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const VariableArrayType* LVAT = getAsVariableArrayType(LHS); 64493d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const VariableArrayType* RVAT = getAsVariableArrayType(RHS); 645061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 645161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 645261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 645361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 64543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LVAT) { 64553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // FIXME: This isn't correct! But tricky to implement because 64563d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // the array's size has to be the size of LHS, but the type 64573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // has to be different. 64583d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 64593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 64603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (RVAT) { 64613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // FIXME: This isn't correct! But tricky to implement because 64623d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // the array's size has to be the size of RHS, but the type 64633d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // has to be different. 64643d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return RHS; 64653d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 64663bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS; 64673bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS; 64687e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor return getIncompleteArrayType(ResultType, 64697e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor ArrayType::ArraySizeModifier(), 0); 64703d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 64711adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::FunctionNoProto: 6472447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified); 647372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Record: 647472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Enum: 64753d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 64761adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::Builtin: 64773cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner // Only exactly equal builtin types are compatible, which is tested above. 64783d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 647964cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar case Type::Complex: 648064cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar // Distinct complex types are incompatible. 648164cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar return QualType(); 64823cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner case Type::Vector: 64835a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // FIXME: The merged type should be an ExtVector! 64841c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall if (areCompatVectorTypes(LHSCan->getAs<VectorType>(), 64851c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall RHSCan->getAs<VectorType>())) 64863d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 648761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return QualType(); 6488c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: { 6489c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Check if the types are assignment compatible. 64905a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // FIXME: This should be type compatibility, e.g. whether 64915a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // "LHS x; RHS x;" at global scope is legal. 6492c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHSIface = LHS->getAs<ObjCObjectType>(); 6493c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHSIface = RHS->getAs<ObjCObjectType>(); 6494c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (canAssignObjCInterfaces(LHSIface, RHSIface)) 64955fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff return LHS; 64965fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff 64973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 649861490e9a965cfee8a78c12c6802138844f04250dCedric Venet } 649914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff case Type::ObjCObjectPointer: { 6500132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (OfBlockPointer) { 6501132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (canAssignObjCInterfacesInBlockPointer( 6502132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian LHS->getAs<ObjCObjectPointerType>(), 6503a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian RHS->getAs<ObjCObjectPointerType>(), 6504a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian BlockReturnType)) 65057530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return LHS; 6506132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return QualType(); 6507132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 6508183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(), 6509183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall RHS->getAs<ObjCObjectPointerType>())) 651014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return LHS; 651114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 6512bc76dd06eb881c70c9775b74bab8b88cd747f173Steve Naroff return QualType(); 65137530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie } 6514ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff } 651572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 65167530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid Type::Class!"); 6517ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff} 65187192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek 651978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanianbool ASTContext::FunctionTypesMatchOnNSConsumedAttrs( 652078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian const FunctionProtoType *FromFunctionType, 652178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian const FunctionProtoType *ToFunctionType) { 652278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromFunctionType->hasAnyConsumedArgs() != 652378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToFunctionType->hasAnyConsumedArgs()) 652478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return false; 652578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FunctionProtoType::ExtProtoInfo FromEPI = 652678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FromFunctionType->getExtProtoInfo(); 652778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FunctionProtoType::ExtProtoInfo ToEPI = 652878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToFunctionType->getExtProtoInfo(); 652978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromEPI.ConsumedArguments && ToEPI.ConsumedArguments) 653078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs(); 653178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ArgIdx != NumArgs; ++ArgIdx) { 653278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromEPI.ConsumedArguments[ArgIdx] != 653378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToEPI.ConsumedArguments[ArgIdx]) 653478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return false; 653578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian } 653678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return true; 653778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian} 653878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 65392390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 65402390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// 'RHS' attributes and returns the merged version; including for function 65412390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// return types. 65422390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz JahanianQualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) { 65432390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType LHSCan = getCanonicalType(LHS), 65442390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian RHSCan = getCanonicalType(RHS); 65452390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If two types are identical, they are compatible. 65462390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LHSCan == RHSCan) 65472390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 65482390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (RHSCan->isFunctionType()) { 65492390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (!LHSCan->isFunctionType()) 65502390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65512390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType OldReturnType = 65522390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian cast<FunctionType>(RHSCan.getTypePtr())->getResultType(); 65532390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType NewReturnType = 65542390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian cast<FunctionType>(LHSCan.getTypePtr())->getResultType(); 65552390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResReturnType = 65562390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian mergeObjCGCQualifiers(NewReturnType, OldReturnType); 65572390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResReturnType.isNull()) 65582390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65592390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) { 65602390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo(); 65612390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // In either case, use OldReturnType to build the new function type. 65622390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian const FunctionType *F = LHS->getAs<FunctionType>(); 65632390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (const FunctionProtoType *FPT = cast<FunctionProtoType>(F)) { 6564e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 6565e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = getFunctionExtInfo(LHS); 65662390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResultType 65672390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian = getFunctionType(OldReturnType, FPT->arg_type_begin(), 6568e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FPT->getNumArgs(), EPI); 65692390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return ResultType; 65702390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65712390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65722390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65732390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 65742390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65752390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If the qualifiers are different, the types can still be merged. 65762390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers LQuals = LHSCan.getLocalQualifiers(); 65772390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers RQuals = RHSCan.getLocalQualifiers(); 65782390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LQuals != RQuals) { 65792390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If any of these qualifiers are different, we have a type mismatch. 65802390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 65812390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian LQuals.getAddressSpace() != RQuals.getAddressSpace()) 65822390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65832390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65842390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // Exactly one GC qualifier difference is allowed: __strong is 65852390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // okay if the other type has no GC qualifier but is an Objective 65862390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // C object pointer (i.e. implicitly strong by default). We fix 65872390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // this by pretending that the unqualified type was actually 65882390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // qualified __strong. 65892390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 65902390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 65912390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 65922390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65932390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 65942390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 65952390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 65962390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_L == Qualifiers::Strong) 65972390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 65982390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_R == Qualifiers::Strong) 65992390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return RHS; 66002390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 66012390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 66022390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 66032390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) { 66042390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType LHSBaseQT = LHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 66052390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType RHSBaseQT = RHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 66062390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT); 66072390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResQT == LHSBaseQT) 66082390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 66092390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResQT == RHSBaseQT) 66102390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return RHS; 66112390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 66122390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 66132390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian} 66142390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 66155426bf6456a5aeac416a9150de157904d101c819Chris Lattner//===----------------------------------------------------------------------===// 6616ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman// Integer Predicates 6617ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//===----------------------------------------------------------------------===// 661888054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner 66194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getIntWidth(QualType T) const { 6620f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall if (const EnumType *ET = dyn_cast<EnumType>(T)) 662129a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman T = ET->getDecl()->getIntegerType(); 66221274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (T->isBooleanType()) 66231274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor return 1; 6624f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman // For builtin types, just use the standard type sizing method 6625ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return (unsigned)getTypeSize(T); 6626ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman} 6627ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman 6628ad74a758189180b8ab8faea648e4766c3bfd7fcbEli FriedmanQualType ASTContext::getCorrespondingUnsignedType(QualType T) { 6629f60946222721d9ba3c059563935c17b84703187aDouglas Gregor assert(T->hasSignedIntegerRepresentation() && "Unexpected type"); 66306a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 66316a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner // Turn <4 x signed int> -> <4 x unsigned int> 66326a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner if (const VectorType *VTy = T->getAs<VectorType>()) 66336a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()), 6634e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VTy->getNumElements(), VTy->getVectorKind()); 66356a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 66366a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner // For enums, we return the unsigned version of the base type. 66376a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner if (const EnumType *ETy = T->getAs<EnumType>()) 6638ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman T = ETy->getDecl()->getIntegerType(); 66396a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 66406a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner const BuiltinType *BTy = T->getAs<BuiltinType>(); 66416a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner assert(BTy && "Unexpected signed integer type"); 6642ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman switch (BTy->getKind()) { 6643ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Char_S: 6644ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::SChar: 6645ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedCharTy; 6646ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Short: 6647ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedShortTy; 6648ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Int: 6649ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedIntTy; 6650ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Long: 6651ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedLongTy; 6652ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::LongLong: 6653ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedLongLongTy; 66542df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::Int128: 66552df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner return UnsignedInt128Ty; 6656ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman default: 6657b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unexpected signed integer type"); 6658ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman } 6659ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman} 6660ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman 66617b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios KyrtzidisASTMutationListener::~ASTMutationListener() { } 66627b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 666386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 666486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===// 666586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner// Builtin Type Computation 666686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===// 666786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 666886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the 666933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// pointer over the consumed characters. This returns the resultant type. If 667033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// AllowTypeModifiers is false then modifier like * are not parsed, just basic 667133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// types. This allows "v2i*" to be parsed as a pointer to a v2i instead of 667233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// a vector of "i*". 667314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// 667414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// RequiresICE is filled in on return to indicate whether the value is required 667514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// to be an Integer Constant Expression. 66764ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, 667786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ASTContext::GetBuiltinTypeError &Error, 667814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner bool &RequiresICE, 667933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner bool AllowTypeModifiers) { 668086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Modifiers. 668186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner int HowLong = 0; 668286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner bool Signed = false, Unsigned = false; 668314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE = false; 6684393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner 668533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // Read the prefixed modifiers first. 668686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner bool Done = false; 668786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (!Done) { 668886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner switch (*Str++) { 66891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump default: Done = true; --Str; break; 6690393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner case 'I': 669114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE = true; 6692393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner break; 669386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'S': 669486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!"); 669586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Signed && "Can't use 'S' modifier multiple times!"); 669686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Signed = true; 669786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 669886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'U': 669986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Signed && "Can't use both 'S' and 'U' modifiers!"); 670086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Unsigned && "Can't use 'S' modifier multiple times!"); 670186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Unsigned = true; 670286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 670386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'L': 670486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong <= 2 && "Can't have LLLL modifier"); 670586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ++HowLong; 670686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 670786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 670886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 670986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 671086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner QualType Type; 67111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 671286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Read the base type. 671386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner switch (*Str++) { 6714b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown builtin type letter!"); 671586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'v': 671686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && 671786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'v'!"); 671886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.VoidTy; 671986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 672086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'f': 672186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && 672286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'f'!"); 672386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.FloatTy; 672486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 672586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'd': 672686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong < 2 && !Signed && !Unsigned && 672786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'd'!"); 672886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (HowLong) 672986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.LongDoubleTy; 673086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 673186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.DoubleTy; 673286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 673386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 's': 673486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && "Bad modifiers used with 's'!"); 673586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Unsigned) 673686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.UnsignedShortTy; 673786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 673886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.ShortTy; 673986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 674086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'i': 674186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (HowLong == 3) 674286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty; 674386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (HowLong == 2) 674486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy; 674586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (HowLong == 1) 674686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy; 674786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 674886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy; 674986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 675086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'c': 675186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && "Bad modifiers used with 'c'!"); 675286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Signed) 675386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.SignedCharTy; 675486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (Unsigned) 675586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.UnsignedCharTy; 675686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 675786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.CharTy; 675886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 675986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'b': // boolean 676086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!"); 676186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.BoolTy; 676286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 676386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'z': // size_t. 676486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!"); 676586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getSizeType(); 676686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 676786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'F': 676886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getCFConstantStringType(); 676986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 6770ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian case 'G': 6771ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian Type = Context.getObjCIdType(); 6772ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian break; 6773ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian case 'H': 6774ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian Type = Context.getObjCSelType(); 6775ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian break; 677686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'a': 677786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getBuiltinVaListType(); 677886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Type.isNull() && "builtin va list type not initialized!"); 677986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 678086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'A': 678186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // This is a "reference" to a va_list; however, what exactly 678286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // this means depends on how va_list is defined. There are two 678386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // different kinds of va_list: ones passed by value, and ones 678486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // passed by reference. An example of a by-value va_list is 678586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // x86, where va_list is a char*. An example of by-ref va_list 678686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // is x86-64, where va_list is a __va_list_tag[1]. For x86, 678786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // we want this argument to be a char*&; for x86-64, we want 678886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // it to be a __va_list_tag*. 678986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getBuiltinVaListType(); 679086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Type.isNull() && "builtin va list type not initialized!"); 679114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner if (Type->isArrayType()) 679286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getArrayDecayedType(Type); 679314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner else 679486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getLValueReferenceType(Type); 679586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 679686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'V': { 679786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner char *End; 679886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner unsigned NumElements = strtoul(Str, &End, 10); 679986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(End != Str && "Missing vector size"); 680086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Str = End; 68011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 680214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ElementType = DecodeTypeFromStr(Str, Context, Error, 680314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE, false); 680414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Can't require vector ICE"); 680533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner 680633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // TODO: No way to make AltiVec vectors in builtins yet. 6807788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner Type = Context.getVectorType(ElementType, NumElements, 6808e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::GenericVector); 680986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 681086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6811b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor case 'E': { 6812b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor char *End; 6813b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6814b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor unsigned NumElements = strtoul(Str, &End, 10); 6815b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor assert(End != Str && "Missing vector size"); 6816b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6817b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor Str = End; 6818b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor 6819b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE, 6820b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor false); 6821b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor Type = Context.getExtVectorType(ElementType, NumElements); 6822b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor break; 6823b4bc99ba5540a618c86c136c9112ead8fb1d9866Douglas Gregor } 6824d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor case 'X': { 682514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE, 682614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner false); 682714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Can't require complex ICE"); 6828d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor Type = Context.getComplexType(ElementType); 6829d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor break; 6830cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian } 6831cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian case 'Y' : { 6832cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian Type = Context.getPointerDiffType(); 6833cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian break; 6834cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian } 68359a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner case 'P': 6836c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor Type = Context.getFILEType(); 6837c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor if (Type.isNull()) { 6838f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Error = ASTContext::GE_Missing_stdio; 683986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 684086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6841fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump break; 68429a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner case 'J': 6843f711c41dd9412a8182793259d355c4f6979ed5edMike Stump if (Signed) 6844782fa308a765aeac2acb39c4e697c937ec21185bMike Stump Type = Context.getsigjmp_bufType(); 6845f711c41dd9412a8182793259d355c4f6979ed5edMike Stump else 6846f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Type = Context.getjmp_bufType(); 6847f711c41dd9412a8182793259d355c4f6979ed5edMike Stump 6848fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump if (Type.isNull()) { 6849f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Error = ASTContext::GE_Missing_setjmp; 6850fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump return QualType(); 6851fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump } 6852fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump break; 6853e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola case 'K': 6854e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!"); 6855e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola Type = Context.getucontext_tType(); 6856e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola 6857e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola if (Type.isNull()) { 6858e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola Error = ASTContext::GE_Missing_ucontext; 6859e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola return QualType(); 6860e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola } 6861e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola break; 6862782fa308a765aeac2acb39c4e697c937ec21185bMike Stump } 68631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 686433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // If there are modifiers and if we're allowed to parse them, go for it. 686533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Done = !AllowTypeModifiers; 686686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (!Done) { 6867187ab37a05b8f7015b9f39cc8cd9129a0c6d0b48John McCall switch (char c = *Str++) { 686833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner default: Done = true; --Str; break; 686933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case '*': 687033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case '&': { 687133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // Both pointers and references can have their pointee types 687233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // qualified with an address space. 687333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner char *End; 687433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner unsigned AddrSpace = strtoul(Str, &End, 10); 687533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner if (End != Str && AddrSpace != 0) { 687633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getAddrSpaceQualType(Type, AddrSpace); 687733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Str = End; 687833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner } 687933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner if (c == '*') 688033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getPointerType(Type); 688133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner else 688233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getLValueReferenceType(Type); 688333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 688433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner } 688533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // FIXME: There's no way to have a built-in with an rvalue ref arg. 688633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case 'C': 688733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Type.withConst(); 688833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 688933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case 'D': 689033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getVolatileType(Type); 689133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 689218932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek case 'R': 689318932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek Type = Type.withRestrict(); 689418932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek break; 689586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 689686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6897393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner 689814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert((!RequiresICE || Type->isIntegralOrEnumerationType()) && 6899393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner "Integer constant 'I' type must be an integer"); 69001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 690186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return Type; 690286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner} 690386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 690486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// GetBuiltinType - Return the type for the specified builtin. 690533daae66462e8f51ee153463b32bdefd60c801aaChris LattnerQualType ASTContext::GetBuiltinType(unsigned Id, 690614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner GetBuiltinTypeError &Error, 69074ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned *IntegerConstantArgs) const { 690833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner const char *TypeStr = BuiltinInfo.GetTypeString(Id); 69091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 8> ArgTypes; 69111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 691214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner bool RequiresICE = false; 691386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Error = GE_None; 691414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error, 691514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE, true); 691686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Error != GE_None) 691786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 691814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 691914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE"); 692014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 692186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (TypeStr[0] && TypeStr[0] != '.') { 692214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true); 692386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Error != GE_None) 692486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 692586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 692614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner // If this argument is required to be an IntegerConstantExpression and the 692714e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner // caller cares, fill in the bitmask we return. 692814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner if (RequiresICE && IntegerConstantArgs) 692914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner *IntegerConstantArgs |= 1 << ArgTypes.size(); 693014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 693186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Do array -> pointer decay. The builtin should use the decayed type. 693286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Ty->isArrayType()) 693386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Ty = getArrayDecayedType(Ty); 69341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 693586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ArgTypes.push_back(Ty); 693686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 693786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 693886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert((TypeStr[0] != '.' || TypeStr[1] == 0) && 693986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "'.' should only occur at end of builtin type list!"); 694086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 694100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall FunctionType::ExtInfo EI; 694200ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true); 694300ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall 694400ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall bool Variadic = (TypeStr[0] == '.'); 694500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall 694600ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall // We really shouldn't be making a no-proto type here, especially in C++. 694700ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall if (ArgTypes.empty() && Variadic) 694800ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall return getFunctionNoProtoType(ResType, EI); 6949ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor 6950e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI; 695100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall EPI.ExtInfo = EI; 695200ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall EPI.Variadic = Variadic; 6953e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6954e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return getFunctionType(ResType, ArgTypes.data(), ArgTypes.size(), EPI); 695586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner} 6956a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman 695790e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) { 695890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage External = GVA_StrongExternal; 695990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 696090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis Linkage L = FD->getLinkage(); 696190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (L) { 696290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case NoLinkage: 696390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case InternalLinkage: 696490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case UniqueExternalLinkage: 696590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_Internal; 696690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 696790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case ExternalLinkage: 696890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (FD->getTemplateSpecializationKind()) { 696990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_Undeclared: 697090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitSpecialization: 697190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis External = GVA_StrongExternal; 697290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis break; 697390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 697490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDefinition: 697590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_ExplicitTemplateInstantiation; 697690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 697790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDeclaration: 697890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ImplicitInstantiation: 697990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis External = GVA_TemplateInstantiation; 698090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis break; 698190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 698290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 698390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 698490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!FD->isInlined()) 698590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return External; 698690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 69874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().CPlusPlus || FD->hasAttr<GNUInlineAttr>()) { 698890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // GNU or C99 inline semantics. Determine whether this symbol should be 698990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // externally visible. 699090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->isInlineDefinitionExternallyVisible()) 699190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return External; 699290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 699390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // C99 inline semantics, where the symbol is not externally visible. 699490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_C99Inline; 699590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 699690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 699790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // C++0x [temp.explicit]p9: 699890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // [ Note: The intent is that an inline function that is the subject of 699990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // an explicit instantiation declaration will still be implicitly 700090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // instantiated when used so that the body can be considered for 700190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // inlining, but that no out-of-line copy of the inline function would be 700290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // generated in the translation unit. -- end note ] 700390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->getTemplateSpecializationKind() 700490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis == TSK_ExplicitInstantiationDeclaration) 700590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_C99Inline; 700690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 700790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_CXXInline; 700890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 700990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 701090e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) { 701190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // If this is a static data member, compute the kind of template 701290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // specialization. Otherwise, this variable is not part of a 701390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // template. 701490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis TemplateSpecializationKind TSK = TSK_Undeclared; 701590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (VD->isStaticDataMember()) 701690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis TSK = VD->getTemplateSpecializationKind(); 701790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 701890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis Linkage L = VD->getLinkage(); 70194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (L == ExternalLinkage && getLangOpts().CPlusPlus && 702090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis VD->getType()->getLinkage() == UniqueExternalLinkage) 702190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis L = UniqueExternalLinkage; 702290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 702390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (L) { 702490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case NoLinkage: 702590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case InternalLinkage: 702690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case UniqueExternalLinkage: 702790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_Internal; 702890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 702990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case ExternalLinkage: 703090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (TSK) { 703190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_Undeclared: 703290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitSpecialization: 703390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_StrongExternal; 703490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 703590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDeclaration: 703690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis llvm_unreachable("Variable should not be instantiated"); 703790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Fall through to treat this like any other instantiation. 703890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 703990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDefinition: 704090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_ExplicitTemplateInstantiation; 704190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 704290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ImplicitInstantiation: 704390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_TemplateInstantiation; 704490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 704590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 704690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 70477530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid Linkage!"); 704890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 704990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 70504ac7c0bb39696e92fd220118fedc484c09a69870Argyrios Kyrtzidisbool ASTContext::DeclMustBeEmitted(const Decl *D) { 705190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 705290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!VD->isFileVarDecl()) 705390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 7054144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis } else if (!isa<FunctionDecl>(D)) 705590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 705690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 7057ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis // Weak references don't produce any output by themselves. 7058ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis if (D->hasAttr<WeakRefAttr>()) 7059ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis return false; 7060ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 706190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Aliases and used decls are required. 706290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>()) 706390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 706490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 706590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 706690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Forward declarations aren't required. 706710620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (!FD->doesThisDeclarationHaveABody()) 7068dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky return FD->doesDeclarationForceExternallyVisibleDefinition(); 706990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 707090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Constructors and destructors are required. 707190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>()) 707290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 707390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 707490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // The key function for a class is required. 707590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 707690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const CXXRecordDecl *RD = MD->getParent(); 707790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (MD->isOutOfLine() && RD->isDynamicClass()) { 707890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const CXXMethodDecl *KeyFunc = getKeyFunction(RD); 707990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl()) 708090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 708190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 708290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 708390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 708490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage Linkage = GetGVALinkageForFunction(FD); 708590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 708690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // static, static inline, always_inline, and extern inline functions can 708790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // always be deferred. Normal inline functions can be deferred in C99/C++. 708890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Implicit template instantiations can also be deferred in C++. 708990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (Linkage == GVA_Internal || Linkage == GVA_C99Inline || 70903a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) 709190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 709290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 709390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 709494da1587f7d584fc61df793229d197969f204cd9Douglas Gregor 709590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const VarDecl *VD = cast<VarDecl>(D); 709690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis assert(VD->isFileVarDecl() && "Expected file scoped var"); 709790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 7098ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly) 7099ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis return false; 7100ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 710190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Structs that have non-trivial constructors or destructors are required. 710290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 710390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // FIXME: Handle references. 7104023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // FIXME: Be more selective about which constructors we care about. 710590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const RecordType *RT = VD->getType()->getAs<RecordType>()) { 710690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 7107023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt if (RD->hasDefinition() && !(RD->hasTrivialDefaultConstructor() && 7108023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialCopyConstructor() && 7109023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialMoveConstructor() && 7110023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialDestructor())) 711190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 711290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 711390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 711490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 711590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage L = GetGVALinkageForVariable(VD); 711690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (L == GVA_Internal || L == GVA_TemplateInstantiation) { 711790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!(VD->getInit() && VD->getInit()->HasSideEffects(*this))) 711890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 711990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 712090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 712190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 712290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 7123071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 71248f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur IskhodzhanovCallingConv ASTContext::getDefaultCXXMethodCallConv(bool isVariadic) { 7125ee743f903858e337434ac0335f147f4de4ecae05Charles Davis // Pass through to the C++ ABI object 71268f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov return ABI->getDefaultMethodCallConv(isVariadic); 71278f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov} 71288f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov 71298f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur IskhodzhanovCallingConv ASTContext::getCanonicalCallConv(CallingConv CC) const { 71308f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov if (CC == CC_C && !LangOpts.MRTD && getTargetInfo().getCXXABI() != CXXABI_Microsoft) 71318f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov return CC_Default; 71328f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov return CC; 7133ee743f903858e337434ac0335f147f4de4ecae05Charles Davis} 7134ee743f903858e337434ac0335f147f4de4ecae05Charles Davis 71354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const { 7136dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson // Pass through to the C++ ABI object 7137dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson return ABI->isNearlyEmpty(RD); 7138dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson} 7139dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson 714014110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *ASTContext::createMangleContext() { 7141bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor switch (Target->getCXXABI()) { 714214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_ARM: 714314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_Itanium: 714414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne return createItaniumMangleContext(*this, getDiagnostics()); 714514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_Microsoft: 714614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne return createMicrosoftMangleContext(*this, getDiagnostics()); 714714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne } 7148b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unsupported ABI"); 714914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne} 715014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne 7151071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI::~CXXABI() {} 7152ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek 7153ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremeneksize_t ASTContext::getSideTableAllocatedMemory() const { 71540c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek return ASTRecordLayouts.getMemorySize() 71550c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(ObjCLayouts) 71560c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(KeyFunctions) 71570c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(ObjCImpls) 71580c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(BlockVarCopyInits) 71590c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(DeclAttrs) 71600c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromStaticDataMember) 71610c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUsingDecl) 71620c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) 71630c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) 71640c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(OverriddenMethods) 71650c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(Types) 7166af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet + llvm::capacity_in_bytes(VariableArrayTypes) 71670d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet + llvm::capacity_in_bytes(ClassScopeSpecializationPattern); 7168ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek} 7169d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek 71709e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorunsigned ASTContext::getLambdaManglingNumber(CXXMethodDecl *CallOperator) { 71719e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor CXXRecordDecl *Lambda = CallOperator->getParent(); 71729e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor return LambdaMangleContexts[Lambda->getDeclContext()] 71739e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor .getManglingNumber(CallOperator); 71749e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor} 71759e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 71769e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 7177d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekvoid ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) { 7178d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek ParamIndices[D] = index; 7179d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek} 7180d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek 7181d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekunsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const { 7182d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek ParameterIndexTable::const_iterator I = ParamIndices.find(D); 7183d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek assert(I != ParamIndices.end() && 7184d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek "ParmIndices lacks entry set by ParmVarDecl"); 7185d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek return I->second; 7186d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek} 7187