ASTContext.cpp revision 4e4d08403ca5cfd4d558fa2936215d3a4e5a528d
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- ASTContext.cpp - Context to hold long-lived AST nodes ------------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the ASTContext interface. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h" 15bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck#include "clang/AST/CharUnits.h" 1649aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h" 17980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 19b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLoc.h" 20e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h" 21ea1471e0e967548c596a71469702f8846dbaf3c0John McCall#include "clang/AST/ExprCXX.h" 222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/ExternalASTSource.h" 237b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h" 2419cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 2514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/Mangle.h" 261b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 27a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner#include "clang/Basic/SourceManager.h" 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 29f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "llvm/ADT/SmallString.h" 3085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson#include "llvm/ADT/StringExtras.h" 316fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman#include "llvm/Support/MathExtras.h" 32f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "llvm/Support/raw_ostream.h" 330c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek#include "llvm/Support/Capacity.h" 34071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#include "CXXABI.h" 352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis#include <map> 3629445a0542d128cd7ee587ee52229670b9b54a12Anders Carlsson 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 391827403a7138946305c0058f262e02b595cf882fDouglas Gregorunsigned ASTContext::NumImplicitDefaultConstructors; 401827403a7138946305c0058f262e02b595cf882fDouglas Gregorunsigned ASTContext::NumImplicitDefaultConstructorsDeclared; 41225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorunsigned ASTContext::NumImplicitCopyConstructors; 42225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorunsigned ASTContext::NumImplicitCopyConstructorsDeclared; 43ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveConstructors; 44ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveConstructorsDeclared; 45a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorunsigned ASTContext::NumImplicitCopyAssignmentOperators; 46a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorunsigned ASTContext::NumImplicitCopyAssignmentOperatorsDeclared; 47ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveAssignmentOperators; 48ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntunsigned ASTContext::NumImplicitMoveAssignmentOperatorsDeclared; 494923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregorunsigned ASTContext::NumImplicitDestructors; 504923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregorunsigned ASTContext::NumImplicitDestructorsDeclared; 514923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerenum FloatingRank { 53aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov HalfRank, FloatRank, DoubleRank, LongDoubleRank 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 563e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregorvoid 573e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID, 583e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *Parm) { 593e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Parm->getDepth()); 603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Parm->getPosition()); 6161c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor ID.AddBoolean(Parm->isParameterPack()); 623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList *Params = Parm->getTemplateParameters(); 643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(Params->size()); 653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor for (TemplateParameterList::const_iterator P = Params->begin(), 663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor PEnd = Params->end(); 673e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor P != PEnd; ++P) { 683e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(0); 703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddBoolean(TTP->isParameterPack()); 713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor continue; 723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(1); 7661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor ID.AddBoolean(NTTP->isParameterPack()); 779e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr()); 786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddBoolean(true); 806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddInteger(NTTP->getNumExpansionTypes()); 819e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 829e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman QualType T = NTTP->getExpansionType(I); 839e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman ID.AddPointer(T.getCanonicalType().getAsOpaquePtr()); 849e9c454b12671a624f666fc6fbf132fdf183effcEli Friedman } 856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else 866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ID.AddBoolean(false); 873e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor continue; 883e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 893e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 903e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 913e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor ID.AddInteger(2); 923e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Profile(ID, TTP); 933e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 943e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor} 953e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 963e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorTemplateTemplateParmDecl * 973e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas GregorASTContext::getCanonicalTemplateTemplateParmDecl( 984ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad TemplateTemplateParmDecl *TTP) const { 993e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Check if we already have a canonical template template parameter. 1003e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor llvm::FoldingSetNodeID ID; 1013e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonicalTemplateTemplateParm::Profile(ID, TTP); 1023e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor void *InsertPos = 0; 1033e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonicalTemplateTemplateParm *Canonical 1043e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 1053e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (Canonical) 1063e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor return Canonical->getParam(); 1073e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 1083e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Build a canonical template parameter list. 1093e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList *Params = TTP->getTemplateParameters(); 1105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NamedDecl *, 4> CanonParams; 1113e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.reserve(Params->size()); 1123e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor for (TemplateParameterList::const_iterator P = Params->begin(), 1133e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor PEnd = Params->end(); 1143e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor P != PEnd; ++P) { 1153e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) 1163e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.push_back( 1173e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTypeParmDecl::Create(*this, getTranslationUnitDecl(), 118344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation(), 119344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation(), 120344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara TTP->getDepth(), 1213e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TTP->getIndex(), 0, false, 1223e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TTP->isParameterPack())); 1233e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor else if (NonTypeTemplateParmDecl *NTTP 1246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 1256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T = getCanonicalType(NTTP->getType()); 1266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T); 1276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NonTypeTemplateParmDecl *Param; 1286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 1295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 2> ExpandedTypes; 1305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TypeSourceInfo *, 2> ExpandedTInfos; 1316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 1326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I))); 1336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos.push_back( 1346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor getTrivialTypeSourceInfo(ExpandedTypes.back())); 1356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 1366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 1376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 138ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 139ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 1406952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getDepth(), 1416952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getPosition(), 0, 1426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T, 1436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TInfo, 1446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.data(), 1456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes.size(), 1466952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos.data()); 1476952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else { 1486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 149ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 150ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 1516952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getDepth(), 1526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->getPosition(), 0, 1536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T, 1546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NTTP->isParameterPack(), 1556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TInfo); 1566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 1576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor CanonParams.push_back(Param); 1586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 1596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else 1603e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.push_back(getCanonicalTemplateTemplateParmDecl( 1613e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor cast<TemplateTemplateParmDecl>(*P))); 1623e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 1633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 1643e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateTemplateParmDecl *CanonTTP 1653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 1663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation(), TTP->getDepth(), 16761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor TTP->getPosition(), 16861c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor TTP->isParameterPack(), 16961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor 0, 1703e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor TemplateParameterList::Create(*this, SourceLocation(), 1713e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation(), 1723e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.data(), 1733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonParams.size(), 1743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor SourceLocation())); 1753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 1763e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Get the new insert position for the node we care about. 1773e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 1783e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor assert(Canonical == 0 && "Shouldn't be in the map!"); 1793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor (void)Canonical; 1803e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 1813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // Create the canonical template template parameter entry. 1823e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP); 1833e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos); 1843e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor return CanonTTP; 1853e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor} 1863e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 187071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *ASTContext::createCXXABI(const TargetInfo &T) { 188ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall if (!LangOpts.CPlusPlus) return 0; 189ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall 19020cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis switch (T.getCXXABI()) { 191ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall case CXXABI_ARM: 192ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall return CreateARMCXXABI(*this); 193ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall case CXXABI_Itanium: 194071cc7deffad608165b1ddd5263e8bf181861520Charles Davis return CreateItaniumCXXABI(*this); 19520cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis case CXXABI_Microsoft: 19620cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis return CreateMicrosoftCXXABI(*this); 19720cf717034ba1f20fc47c025ecb72ed9b631ad13Charles Davis } 1987530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid CXXABI type!"); 199071cc7deffad608165b1ddd5263e8bf181861520Charles Davis} 200071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 201bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorstatic const LangAS::Map *getAddressSpaceMap(const TargetInfo &T, 202207f4d8543529221932af82836016a2ef066c917Peter Collingbourne const LangOptions &LOpts) { 203207f4d8543529221932af82836016a2ef066c917Peter Collingbourne if (LOpts.FakeAddressSpaceMap) { 204207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // The fake address space map must have a distinct entry for each 205207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // language-specific address space. 206207f4d8543529221932af82836016a2ef066c917Peter Collingbourne static const unsigned FakeAddrSpaceMap[] = { 207207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 1, // opencl_global 208207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 2, // opencl_local 209207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 3 // opencl_constant 210207f4d8543529221932af82836016a2ef066c917Peter Collingbourne }; 211bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return &FakeAddrSpaceMap; 212207f4d8543529221932af82836016a2ef066c917Peter Collingbourne } else { 213bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return &T.getAddressSpaceMap(); 214207f4d8543529221932af82836016a2ef066c917Peter Collingbourne } 215207f4d8543529221932af82836016a2ef066c917Peter Collingbourne} 216207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 2173e3cd93b2fd9644e970c389e715c13883faf68b6Douglas GregorASTContext::ASTContext(LangOptions& LOpts, SourceManager &SM, 218bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor const TargetInfo *t, 219e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar IdentifierTable &idents, SelectorTable &sels, 2201b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner Builtin::Context &builtins, 221bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned size_reserve, 222bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor bool DelayInitialization) 223bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor : FunctionProtoTypes(this_()), 224bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor TemplateSpecializationTypes(this_()), 225bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor DependentTemplateSpecializationTypes(this_()), 226bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor SubstTemplateTemplateParmPacks(this_()), 227bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor GlobalNestedNameSpecifier(0), 228bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Int128Decl(0), UInt128Decl(0), 229a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor ObjCIdDecl(0), ObjCSelDecl(0), ObjCClassDecl(0), ObjCProtocolClassDecl(0), 230e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor CFConstantStringTypeDecl(0), ObjCInstanceTypeDecl(0), 231bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor FILEDecl(0), 232e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola jmp_bufDecl(0), sigjmp_bufDecl(0), ucontext_tDecl(0), 233e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola BlockDescriptorType(0), BlockDescriptorExtendedType(0), 234e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola cudaConfigureCallDecl(0), 235e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor NullTypeSourceInfo(QualType()), 236e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor FirstLocalImport(), LastLocalImport(), 237bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor SourceMgr(SM), LangOpts(LOpts), 23830c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor AddrSpaceMap(0), Target(t), PrintingPolicy(LOpts), 239bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Idents(idents), Selectors(sels), 240bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor BuiltinInfo(builtins), 241bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor DeclarationNames(*this), 24230c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor ExternalSource(0), Listener(0), 243bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor LastSDM(0, 0), 244bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor UniqueBlockByRefTypeID(0) 245bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor{ 2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (size_reserve > 0) Types.reserve(size_reserve); 247e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar TUDecl = TranslationUnitDecl::Create(*this); 248bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 249bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor if (!DelayInitialization) { 250bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor assert(t && "No target supplied for ASTContext initialization"); 251bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor InitBuiltinTypes(*t); 252bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor } 253e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar} 254e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar 2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerASTContext::~ASTContext() { 2563478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek // Release the DenseMaps associated with DeclContext objects. 2573478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek // FIXME: Is this the ideal solution? 2583478eb6872d836600caf45b0f81c2065d685d6e0Ted Kremenek ReleaseDeclContextMaps(); 2597d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 26063fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // Call all of the deallocation functions. 26163fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor for (unsigned I = 0, N = Deallocations.size(); I != N; ++I) 26263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor Deallocations[I].first(Deallocations[I].second); 2630054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 264dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed 26563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // because they can contain DenseMaps. 26663fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor for (llvm::DenseMap<const ObjCContainerDecl*, 26763fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor const ASTRecordLayout*>::iterator 26863fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) 26963fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor // Increment in loop to prevent using deallocated memory. 27063fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 27163fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor R->Destroy(*this); 27263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor 273dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator 274dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) { 275dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek // Increment in loop to prevent using deallocated memory. 276dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 277dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek R->Destroy(*this); 278dcfcfbec478f7ed96cd8d92f30c29bd4e30d5b9cTed Kremenek } 2796320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 2806320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(), 2816320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor AEnd = DeclAttrs.end(); 2826320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor A != AEnd; ++A) 2836320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor A->second->~AttrVec(); 2846320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 285ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor 2860054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) { 2870054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor Deallocations.push_back(std::make_pair(Callback, Data)); 2880054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2890054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 2916f42b62b6194f53bcbc349f5d17388e1936535d7Dylan NoblesmithASTContext::setExternalSource(OwningPtr<ExternalASTSource> &Source) { 2922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ExternalSource.reset(Source.take()); 2932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ASTContext::PrintStats() const { 296cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "\n*** AST Context Stats:\n"; 297cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << " " << Types.size() << " types total.\n"; 2987c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 299dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned counts[] = { 3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define TYPE(Name, Parent) 0, 301dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent) 302dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def" 303dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor 0 // Extra 304dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor }; 305c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor 3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Types.size(); i != e; ++i) { 3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Type *T = Types[i]; 308dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor counts[(unsigned)T->getTypeClass()]++; 3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 311dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned Idx = 0; 312dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor unsigned TotalBytes = 0; 313dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define TYPE(Name, Parent) \ 314dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor if (counts[Idx]) \ 315cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << " " << counts[Idx] << " " << #Name \ 316cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " types\n"; \ 317dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor TotalBytes += counts[Idx] * sizeof(Name##Type); \ 318dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor ++Idx; 319dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#define ABSTRACT_TYPE(Name, Parent) 320dbe833da54e1b6192991b64fc453cd50b5ee7909Douglas Gregor#include "clang/AST/TypeNodes.def" 3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "Total bytes = " << TotalBytes << "\n"; 323cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 3244923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor // Implicit special member functions. 325cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/" 326cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitDefaultConstructors 327cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit default constructors created\n"; 328cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitCopyConstructorsDeclared << "/" 329cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitCopyConstructors 330cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit copy constructors created\n"; 3314e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 332cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitMoveConstructorsDeclared << "/" 333cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitMoveConstructors 334cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit move constructors created\n"; 335cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/" 336cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitCopyAssignmentOperators 337cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit copy assignment operators created\n"; 3384e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 339cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/" 340cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitMoveAssignmentOperators 341cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit move assignment operators created\n"; 342cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << NumImplicitDestructorsDeclared << "/" 343cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << NumImplicitDestructors 344cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth << " implicit destructors created\n"; 345cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 3462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (ExternalSource.get()) { 347cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth llvm::errs() << "\n"; 3482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ExternalSource->PrintStats(); 3492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 350cd92a65edc7cbbbb7e3aee8d31008594de90fa51Chandler Carruth 35163fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor BumpAlloc.PrintStats(); 3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 354772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getInt128Decl() const { 355772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (!Int128Decl) { 356772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(Int128Ty); 357772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor Int128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 358772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor getTranslationUnitDecl(), 359772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 360772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 361772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor &Idents.get("__int128_t"), 362772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TInfo); 363772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 364772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 365772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor return Int128Decl; 366772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor} 367772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 368772eeaefef2c883aabe35caf4543e7e32d290183Douglas GregorTypedefDecl *ASTContext::getUInt128Decl() const { 369772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (!UInt128Decl) { 370772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(UnsignedInt128Ty); 371772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor UInt128Decl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 372772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor getTranslationUnitDecl(), 373772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 374772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor SourceLocation(), 375772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor &Idents.get("__uint128_t"), 376772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor TInfo); 377772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 378772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 379772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor return UInt128Decl; 380772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor} 3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 382e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallvoid ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) { 3836b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K); 384e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall R = CanQualType::CreateUnsafe(QualType(Ty, 0)); 3856b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Types.push_back(Ty); 3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 388bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorvoid ASTContext::InitBuiltinTypes(const TargetInfo &Target) { 389bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor assert((!this->Target || this->Target == &Target) && 390bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor "Incorrect target reinitialization"); 3915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(VoidTy.isNull() && "Context reinitialized?"); 3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor this->Target = &Target; 394bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 395bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor ABI.reset(createCXXABI(Target)); 396bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor AddrSpaceMap = getAddressSpaceMap(Target, LangOpts); 397bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor 3985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p19. 3995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(VoidTy, BuiltinType::Void); 4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p2. 4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(BoolTy, BuiltinType::Bool); 4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p3. 40415b91764d08e886391c865c4a444d7b51141c284Eli Friedman if (LangOpts.CharIsSigned) 4055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(CharTy, BuiltinType::Char_S); 4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 4075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(CharTy, BuiltinType::Char_U); 4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p4. 4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(SignedCharTy, BuiltinType::SChar); 4105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(ShortTy, BuiltinType::Short); 4115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(IntTy, BuiltinType::Int); 4125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongTy, BuiltinType::Long); 4135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongLongTy, BuiltinType::LongLong); 4141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p6. 4165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedCharTy, BuiltinType::UChar); 4175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedShortTy, BuiltinType::UShort); 4185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedIntTy, BuiltinType::UInt); 4195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedLongTy, BuiltinType::ULong); 4205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(UnsignedLongLongTy, BuiltinType::ULongLong); 4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p10. 4235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(FloatTy, BuiltinType::Float); 4245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(DoubleTy, BuiltinType::Double); 4255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InitBuiltinType(LongDoubleTy, BuiltinType::LongDouble); 42664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 4272df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner // GNU extension, 128-bit integers. 4282df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner InitBuiltinType(Int128Ty, BuiltinType::Int128); 4292df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner InitBuiltinType(UnsignedInt128Ty, BuiltinType::UInt128); 4302df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner 4313f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner if (LangOpts.CPlusPlus) { // C++ 3.9.1p5 432d3d77cd138f8e830f6547b6f83fcd5721ccf5f5dEli Friedman if (TargetInfo::isTypeSigned(Target.getWCharType())) 4333f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner InitBuiltinType(WCharTy, BuiltinType::WChar_S); 4343f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner else // -fshort-wchar makes wchar_t be unsigned. 4353f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner InitBuiltinType(WCharTy, BuiltinType::WChar_U); 4363f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner } else // C99 4373a2503227c3db04a3619735127483263c1075ef7Chris Lattner WCharTy = getFromTargetType(Target.getWCharType()); 43864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 439f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 440f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith InitBuiltinType(Char16Ty, BuiltinType::Char16); 441f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith else // C99 442f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char16Ty = getFromTargetType(Target.getChar16Type()); 443f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 444f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 445f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith InitBuiltinType(Char32Ty, BuiltinType::Char32); 446f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith else // C99 447f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char32Ty = getFromTargetType(Target.getChar32Type()); 448f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 449898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // Placeholder type for type-dependent expressions whose type is 450898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // completely unknown. No code should ever check a type against 451898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // DependentTy and users should never see it; however, it is here to 452898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // help diagnose failures to properly check for type-dependent 453898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // expressions. 454898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor InitBuiltinType(DependentTy, BuiltinType::Dependent); 4558e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 4562a984cad5ac3fdceeff2bd99daa7b90979313475John McCall // Placeholder type for functions. 4572a984cad5ac3fdceeff2bd99daa7b90979313475John McCall InitBuiltinType(OverloadTy, BuiltinType::Overload); 4582a984cad5ac3fdceeff2bd99daa7b90979313475John McCall 459864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // Placeholder type for bound members. 460864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall InitBuiltinType(BoundMemberTy, BuiltinType::BoundMember); 461864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 4623c3b7f90a863af43fa63043d396553ecf205351cJohn McCall // Placeholder type for pseudo-objects. 4633c3b7f90a863af43fa63043d396553ecf205351cJohn McCall InitBuiltinType(PseudoObjectTy, BuiltinType::PseudoObject); 4643c3b7f90a863af43fa63043d396553ecf205351cJohn McCall 4651de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall // "any" type; useful for debugger-like clients. 4661de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall InitBuiltinType(UnknownAnyTy, BuiltinType::UnknownAny); 4671de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall 4680ddaeb9b031070ec64afe92d9892875ac44df427John McCall // Placeholder type for unbridged ARC casts. 4690ddaeb9b031070ec64afe92d9892875ac44df427John McCall InitBuiltinType(ARCUnbridgedCastTy, BuiltinType::ARCUnbridgedCast); 4700ddaeb9b031070ec64afe92d9892875ac44df427John McCall 4715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.2.5p11. 4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer FloatComplexTy = getComplexType(FloatTy); 4735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DoubleComplexTy = getComplexType(DoubleTy); 4745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer LongDoubleComplexTy = getComplexType(LongDoubleTy); 4758e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 4767e219e47de26346885d667131977bd9ca2d7662aSteve Naroff BuiltinVaListType = QualType(); 4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47813dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian // Builtin types for 'id', 'Class', and 'SEL'. 479de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId); 480de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass); 48113dcd00615de5c4279d97bdf63cd5f0a14fd9dccFariborz Jahanian InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel); 482ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 483ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // Builtin type for __objc_yes and __objc_no 484ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek ObjCBuiltinBoolTy = SignedCharTy; 485ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 486a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCConstantStringType = QualType(); 4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // void * type 48933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian VoidPtrTy = getPointerType(VoidTy); 4906e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 4916e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // nullptr type (C++0x 2.14.7) 4926e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl InitBuiltinType(NullPtrTy, BuiltinType::NullPtr); 493aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov 494aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov // half type (OpenCL 6.1.1.1) / ARM NEON __fp16 495aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov InitBuiltinType(HalfTy, BuiltinType::Half); 4965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 498d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikieDiagnosticsEngine &ASTContext::getDiagnostics() const { 49978a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis return SourceMgr.getDiagnostics(); 50078a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis} 50178a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis 5026320064d0c60fa8683f5623881c9394fd4aa7689Douglas GregorAttrVec& ASTContext::getDeclAttrs(const Decl *D) { 5036320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor AttrVec *&Result = DeclAttrs[D]; 5046320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor if (!Result) { 5056320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor void *Mem = Allocate(sizeof(AttrVec)); 5066320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor Result = new (Mem) AttrVec; 5076320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor } 5086320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 5096320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor return *Result; 5106320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 5116320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 5126320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor/// \brief Erase the attributes corresponding to the given declaration. 5136320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregorvoid ASTContext::eraseDeclAttrs(const Decl *D) { 5146320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D); 5156320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor if (Pos != DeclAttrs.end()) { 5166320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor Pos->second->~AttrVec(); 5176320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor DeclAttrs.erase(Pos); 5186320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor } 5196320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor} 5206320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor 521251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorMemberSpecializationInfo * 522663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas GregorASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) { 5237caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Var->isStaticDataMember() && "Not a static data member"); 524663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos 5257caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor = InstantiatedFromStaticDataMember.find(Var); 5267caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Pos == InstantiatedFromStaticDataMember.end()) 5277caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return 0; 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5297caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return Pos->second; 5307caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 5317caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 5321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 533251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas GregorASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, 5349421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis TemplateSpecializationKind TSK, 5359421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis SourceLocation PointOfInstantiation) { 5367caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Inst->isStaticDataMember() && "Not a static data member"); 5377caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Tmpl->isStaticDataMember() && "Not a static data member"); 5387caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(!InstantiatedFromStaticDataMember[Inst] && 5397caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor "Already noted what static data member was instantiated from"); 540251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor InstantiatedFromStaticDataMember[Inst] 5419421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis = new (*this) MemberSpecializationInfo(Tmpl, TSK, PointOfInstantiation); 5427caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 5437caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 544af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetFunctionDecl *ASTContext::getClassScopeSpecializationPattern( 545af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet const FunctionDecl *FD){ 546af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(FD && "Specialization is 0"); 547af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet llvm::DenseMap<const FunctionDecl*, FunctionDecl *>::const_iterator Pos 5480d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet = ClassScopeSpecializationPattern.find(FD); 5490d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet if (Pos == ClassScopeSpecializationPattern.end()) 550af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return 0; 551af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 552af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return Pos->second; 553af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 554af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 555af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichetvoid ASTContext::setClassScopeSpecializationPattern(FunctionDecl *FD, 556af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet FunctionDecl *Pattern) { 557af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(FD && "Specialization is 0"); 558af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(Pattern && "Class scope specialization pattern is 0"); 5590d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet ClassScopeSpecializationPattern[FD] = Pattern; 560af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 561af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 5627ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallNamedDecl * 563ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) { 5647ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos 565ed97649e9574b9d854fa4d6109c9333ae0993554John McCall = InstantiatedFromUsingDecl.find(UUD); 566ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Pos == InstantiatedFromUsingDecl.end()) 5670d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return 0; 5681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5690d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return Pos->second; 5700d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 5710d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 5720d8df780aef1acda5962347a32591efc629b6748Anders Carlssonvoid 573ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) { 574ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert((isa<UsingDecl>(Pattern) || 575ed97649e9574b9d854fa4d6109c9333ae0993554John McCall isa<UnresolvedUsingValueDecl>(Pattern) || 576ed97649e9574b9d854fa4d6109c9333ae0993554John McCall isa<UnresolvedUsingTypenameDecl>(Pattern)) && 577ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "pattern decl is not a using decl"); 578ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists"); 579ed97649e9574b9d854fa4d6109c9333ae0993554John McCall InstantiatedFromUsingDecl[Inst] = Pattern; 580ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 581ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 582ed97649e9574b9d854fa4d6109c9333ae0993554John McCallUsingShadowDecl * 583ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) { 584ed97649e9574b9d854fa4d6109c9333ae0993554John McCall llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos 585ed97649e9574b9d854fa4d6109c9333ae0993554John McCall = InstantiatedFromUsingShadowDecl.find(Inst); 586ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Pos == InstantiatedFromUsingShadowDecl.end()) 587ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return 0; 588ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 589ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Pos->second; 590ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 591ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 592ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid 593ed97649e9574b9d854fa4d6109c9333ae0993554John McCallASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, 594ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingShadowDecl *Pattern) { 595ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists"); 596ed97649e9574b9d854fa4d6109c9333ae0993554John McCall InstantiatedFromUsingShadowDecl[Inst] = Pattern; 5970d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 5980d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 599d8b285fee4471f393da8ee30f552ceacdc362afaAnders CarlssonFieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) { 600d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos 601d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson = InstantiatedFromUnnamedFieldDecl.find(Field); 602d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (Pos == InstantiatedFromUnnamedFieldDecl.end()) 603d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return 0; 6041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 605d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return Pos->second; 606d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson} 607d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 608d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlssonvoid ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, 609d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson FieldDecl *Tmpl) { 610d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed"); 611d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Tmpl->getDeclName() && "Template field decl is not unnamed"); 612d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!InstantiatedFromUnnamedFieldDecl[Inst] && 613d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson "Already noted what unnamed field was instantiated from"); 6141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 615d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl; 616d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson} 617d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 61814d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanianbool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD, 61914d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian const FieldDecl *LastFD) const { 62014d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian return (FD->isBitField() && LastFD && !LastFD->isBitField() && 621a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) == 0); 62214d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian} 62314d56ef43ff4921c6749f7340212fbb743fdbb9bFariborz Jahanian 624340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanianbool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD, 625340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian const FieldDecl *LastFD) const { 626340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian return (FD->isBitField() && LastFD && LastFD->isBitField() && 627a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) == 0 && 628a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this) != 0); 629340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian} 630340fa242130c2d8d74c83edca0952e771aebe0e6Fariborz Jahanian 6319b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanianbool ASTContext::BitfieldFollowsBitfield(const FieldDecl *FD, 6329b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian const FieldDecl *LastFD) const { 6339b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian return (FD->isBitField() && LastFD && LastFD->isBitField() && 634a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this) && 635a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this)); 6369b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian} 6379b3acaa32548d0ce78b9c39a3911397f6738a47cFariborz Jahanian 638dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::NonBitfieldFollowsBitfield(const FieldDecl *FD, 63952bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian const FieldDecl *LastFD) const { 64052bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian return (!FD->isBitField() && LastFD && LastFD->isBitField() && 641a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith LastFD->getBitWidthValue(*this)); 64252bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian} 64352bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian 644dd7fddb5b6883326e52b278a9b7e9cefea29aae0Chad Rosierbool ASTContext::BitfieldFollowsNonBitfield(const FieldDecl *FD, 64552bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian const FieldDecl *LastFD) const { 64652bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian return (FD->isBitField() && LastFD && !LastFD->isBitField() && 647a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith FD->getBitWidthValue(*this)); 64852bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian} 64952bbe7a1133c3cb57e9246f1b96c12940ea3821aFariborz Jahanian 6507d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator 6517d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const { 6527d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 6537d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor = OverriddenMethods.find(Method); 6547d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor if (Pos == OverriddenMethods.end()) 6557d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return 0; 6567d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 6577d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return Pos->second.begin(); 6587d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 6597d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 6607d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_cxx_method_iterator 6617d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas GregorASTContext::overridden_methods_end(const CXXMethodDecl *Method) const { 6627d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 6637d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor = OverriddenMethods.find(Method); 6647d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor if (Pos == OverriddenMethods.end()) 6657d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return 0; 6667d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 6677d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor return Pos->second.end(); 6687d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 6697d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 670c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidisunsigned 671c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios KyrtzidisASTContext::overridden_methods_size(const CXXMethodDecl *Method) const { 672c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 673c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis = OverriddenMethods.find(Method); 674c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Pos == OverriddenMethods.end()) 675c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return 0; 676c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 677c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis return Pos->second.size(); 678c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis} 679c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis 6807d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregorvoid ASTContext::addOverriddenMethod(const CXXMethodDecl *Method, 6817d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor const CXXMethodDecl *Overridden) { 6827d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor OverriddenMethods[Method].push_back(Overridden); 6837d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor} 6847d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor 685e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregorvoid ASTContext::addedLocalImportDecl(ImportDecl *Import) { 686e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor assert(!Import->NextLocalImport && "Import declaration already in the chain"); 687e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor assert(!Import->isFromASTFile() && "Non-local import declaration"); 688e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor if (!FirstLocalImport) { 689e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor FirstLocalImport = Import; 690e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport = Import; 691e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor return; 692e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor } 693e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor 694e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport->NextLocalImport = Import; 695e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor LastLocalImport = Import; 696e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor} 697e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor 698464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===// 699464175bba1318bef7905122e9fda20cff926df78Chris Lattner// Type Sizing and Analysis 700464175bba1318bef7905122e9fda20cff926df78Chris Lattner//===----------------------------------------------------------------------===// 701a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 702b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified 703b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner/// scalar floating point type. 704b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattnerconst llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const { 705183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const BuiltinType *BT = T->getAs<BuiltinType>(); 706b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner assert(BT && "Not a floating point type!"); 707b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner switch (BT->getKind()) { 708b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Not a floating point type!"); 709aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: return Target->getHalfFormat(); 710bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::Float: return Target->getFloatFormat(); 711bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::Double: return Target->getDoubleFormat(); 712bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor case BuiltinType::LongDouble: return Target->getLongDoubleFormat(); 713b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner } 714b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner} 715b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner 7168b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck/// getDeclAlign - Return a conservative estimate of the alignment of the 717af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// specified decl. Note that bitfields do not have a valid alignment, so 718af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner/// this method will assert on them. 7195d484e8cf710207010720589d89602233de61d01Sebastian Redl/// If @p RefAsPointee, references are treated like their underlying type 7205d484e8cf710207010720589d89602233de61d01Sebastian Redl/// (for alignof), else they're treated like pointers (for CodeGen). 7214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const { 722bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned Align = Target->getCharWidth(); 723dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 7244081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall bool UseAlignAttrOnly = false; 7254081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (unsigned AlignFromAttr = D->getMaxAlignment()) { 7264081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall Align = AlignFromAttr; 7274081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall 7284081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // __attribute__((aligned)) can increase or decrease alignment 7294081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // *except* on a struct or struct member, where it only increases 7304081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // alignment unless 'packed' is also specified. 7314081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // 73282d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne // It is an error for alignas to decrease alignment, so we can 7334081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall // ignore that possibility; Sema should diagnose it. 7344081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (isa<FieldDecl>(D)) { 7354081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall UseAlignAttrOnly = D->hasAttr<PackedAttr>() || 7364081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 7374081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } else { 7384081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall UseAlignAttrOnly = true; 7394081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } 7404081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } 74178a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian else if (isa<FieldDecl>(D)) 74278a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian UseAlignAttrOnly = 74378a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian D->hasAttr<PackedAttr>() || 74478a7d7d79964119a3f35b262eb154b5cbf1001edFariborz Jahanian cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 745dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 746ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // If we're using the align attribute only, just ignore everything 747ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // else about the declaration and its type. 7484081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall if (UseAlignAttrOnly) { 749ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // do nothing 750ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 7514081a5c5f1381c4ec77f8ab3866693917e4329c4John McCall } else if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 752af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner QualType T = VD->getType(); 7536217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const ReferenceType* RT = T->getAs<ReferenceType>()) { 7545d484e8cf710207010720589d89602233de61d01Sebastian Redl if (RefAsPointee) 7555d484e8cf710207010720589d89602233de61d01Sebastian Redl T = RT->getPointeeType(); 7565d484e8cf710207010720589d89602233de61d01Sebastian Redl else 7575d484e8cf710207010720589d89602233de61d01Sebastian Redl T = getPointerType(RT->getPointeeType()); 7585d484e8cf710207010720589d89602233de61d01Sebastian Redl } 7595d484e8cf710207010720589d89602233de61d01Sebastian Redl if (!T->isIncompleteType() && !T->isFunctionType()) { 7603b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Adjust alignments of declarations with array type by the 7613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // large-array alignment on the target. 762bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor unsigned MinWidth = Target->getLargeArrayMinWidth(); 7633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall const ArrayType *arrayType; 7643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (MinWidth && (arrayType = getAsArrayType(T))) { 7653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (isa<VariableArrayType>(arrayType)) 766bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = std::max(Align, Target->getLargeArrayAlign()); 7673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall else if (isa<ConstantArrayType>(arrayType) && 7683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType))) 769bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = std::max(Align, Target->getLargeArrayAlign()); 7703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 7713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Walk through any array types while we're at it. 7723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall T = getBaseElementType(arrayType); 7736deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola } 7749f1210c3280104417a4ad30f0a00825ac8fa718aChad Rosier Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr())); 775dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman } 776ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 777ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Fields can be subject to extra alignment constraints, like if 778ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // the field is packed, the struct is packed, or the struct has a 779ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // a max-field-alignment constraint (#pragma pack). So calculate 780ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // the actual alignment of the field within the struct, and then 781ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // (as we're expected to) constrain that by the alignment of the type. 782ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (const FieldDecl *field = dyn_cast<FieldDecl>(VD)) { 783ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // So calculate the alignment of the field. 784ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall const ASTRecordLayout &layout = getASTRecordLayout(field->getParent()); 785ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 786ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Start with the record's overall alignment. 787dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck unsigned fieldAlign = toBits(layout.getAlignment()); 788ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 789ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Use the GCD of that and the offset within the record. 790ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall uint64_t offset = layout.getFieldOffset(field->getFieldIndex()); 791ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (offset > 0) { 792ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // Alignment is always a power of 2, so the GCD will be a power of 2, 793ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall // which means we get to do this crazy thing instead of Euclid's. 794ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall uint64_t lowBitOfOffset = offset & (~offset + 1); 795ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall if (lowBitOfOffset < fieldAlign) 796ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall fieldAlign = static_cast<unsigned>(lowBitOfOffset); 797ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall } 798ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall 799ba4f5d5754c8291690d01ca9581926673d69b24cJohn McCall Align = std::min(Align, fieldAlign); 80005f62474dd2b0f1cb69adbe0787f2868788aa949Charles Davis } 801af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner } 802dcdafb6a701aa9d81edcb088915f58933315dc05Eli Friedman 803eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(Align); 804af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner} 805b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner 806ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits> 807bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(const Type *T) const { 808ea1471e0e967548c596a71469702f8846dbaf3c0John McCall std::pair<uint64_t, unsigned> Info = getTypeInfo(T); 809eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return std::make_pair(toCharUnitsFromBits(Info.first), 810eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck toCharUnitsFromBits(Info.second)); 811ea1471e0e967548c596a71469702f8846dbaf3c0John McCall} 812ea1471e0e967548c596a71469702f8846dbaf3c0John McCall 813ea1471e0e967548c596a71469702f8846dbaf3c0John McCallstd::pair<CharUnits, CharUnits> 814bee5a79fc95e3003d755031e3d2bb4410a71e1c1Ken DyckASTContext::getTypeInfoInChars(QualType T) const { 815ea1471e0e967548c596a71469702f8846dbaf3c0John McCall return getTypeInfoInChars(T.getTypePtr()); 816ea1471e0e967548c596a71469702f8846dbaf3c0John McCall} 817ea1471e0e967548c596a71469702f8846dbaf3c0John McCall 818bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbarstd::pair<uint64_t, unsigned> ASTContext::getTypeInfo(const Type *T) const { 819bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar TypeInfoMap::iterator it = MemoizedTypeInfo.find(T); 820bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar if (it != MemoizedTypeInfo.end()) 821bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar return it->second; 822bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar 823bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar std::pair<uint64_t, unsigned> Info = getTypeInfoImpl(T); 824bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar MemoizedTypeInfo.insert(std::make_pair(T, Info)); 825bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar return Info; 826bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar} 827bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar 828bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// getTypeInfoImpl - Return the size of the specified type, in bits. This 829bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar/// method does not work on incomplete types. 8300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// 8310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// FIXME: Pointers into different addr spaces could have different sizes and 8320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// alignment requirements: getPointerInfo should take an AddrSpace, this 8330953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/// should take a QualType, &c. 834d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattnerstd::pair<uint64_t, unsigned> 835bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel DunbarASTContext::getTypeInfoImpl(const Type *T) const { 8365e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump uint64_t Width=0; 8375e301007e31e14c8ff647288e1b8bd8dbf8a5fe4Mike Stump unsigned Align=8; 838a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner switch (T->getTypeClass()) { 83972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base) 84072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base) 84118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor#define NON_CANONICAL_TYPE(Class, Base) 84272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class: 84372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def" 844d3d49bb27c7ffd9accc0a6c00e887111c0348845John McCall llvm_unreachable("Should not see dependent types"); 84572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 8465d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::FunctionNoProto: 8475d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::FunctionProto: 84818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // GCC extension: alignof(function) = 32 bits 84918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 85018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = 32; 85118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 85218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 85372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::IncompleteArray: 854fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::VariableArray: 85518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 85618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = getTypeAlign(cast<ArrayType>(T)->getElementType()); 85718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 85818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 859fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::ConstantArray: { 8601d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const ConstantArrayType *CAT = cast<ConstantArrayType>(T); 8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 86298be4943e8dc4f3905629a7102668960873cf863Chris Lattner std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType()); 863fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara uint64_t Size = CAT->getSize().getZExtValue(); 864bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar assert((Size == 0 || EltInfo.first <= (uint64_t)(-1)/Size) && 865bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar "Overflow in array type bit size evaluation"); 866fea966a4103ed9c018d1494b95e9d09b161f5a70Abramo Bagnara Width = EltInfo.first*Size; 867030d8846c7e520330007087e949f621989876e3aChris Lattner Align = EltInfo.second; 868cd88b4171753dcb2bc0a21d78f1597c796bb8a20Argyrios Kyrtzidis Width = llvm::RoundUpToAlignment(Width, Align); 869030d8846c7e520330007087e949f621989876e3aChris Lattner break; 8705c09a02a5db85e08a432b6eeced9aa656349710dChristopher Lamb } 871213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman case Type::ExtVector: 872030d8846c7e520330007087e949f621989876e3aChris Lattner case Type::Vector: { 8739fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner const VectorType *VT = cast<VectorType>(T); 8749fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType()); 8759fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Width = EltInfo.first*VT->getNumElements(); 8764bd998bbc228915d2b9cae5b67879de48940d05eEli Friedman Align = Width; 8776fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman // If the alignment is not a power of 2, round up to the next power of 2. 8786fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman // This happens for non-power-of-2 length vectors. 8798eefcd353c1d06a10104f69e5079ebab3183f9a3Dan Gohman if (Align & (Align-1)) { 8809fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Align = llvm::NextPowerOf2(Align); 8819fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner Width = llvm::RoundUpToAlignment(Width, Align); 8829fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner } 883030d8846c7e520330007087e949f621989876e3aChris Lattner break; 884030d8846c7e520330007087e949f621989876e3aChris Lattner } 8855d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner 8869e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner case Type::Builtin: 887a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner switch (cast<BuiltinType>(T)->getKind()) { 888b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown builtin type!"); 889d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner case BuiltinType::Void: 89018857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // GCC extension: alignof(void) = 8 bits. 89118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Width = 0; 89218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor Align = 8; 89318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor break; 89418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 8956f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Bool: 896bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getBoolWidth(); 897bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getBoolAlign(); 8986f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 899692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::Char_S: 900692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::Char_U: 901692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UChar: 9026f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::SChar: 903bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getCharWidth(); 904bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getCharAlign(); 9056f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 9063f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 9073f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 908bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getWCharWidth(); 909bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getWCharAlign(); 91064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis break; 911f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case BuiltinType::Char16: 912bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getChar16Width(); 913bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getChar16Align(); 914f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith break; 915f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case BuiltinType::Char32: 916bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getChar32Width(); 917bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getChar32Align(); 918f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith break; 919692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UShort: 9206f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Short: 921bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getShortWidth(); 922bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getShortAlign(); 9236f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 924692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::UInt: 9256f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Int: 926bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getIntWidth(); 927bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getIntAlign(); 9286f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 929692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::ULong: 9306f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Long: 931bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongWidth(); 932bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongAlign(); 9336f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 934692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner case BuiltinType::ULongLong: 9356f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::LongLong: 936bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongLongWidth(); 937bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongLongAlign(); 9386f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 939ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner case BuiltinType::Int128: 940ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner case BuiltinType::UInt128: 941ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner Width = 128; 942ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner Align = 128; // int128_t is 128-bit aligned on all targets. 943ec16cb9b5a481d62a73ad47fa59034ced4d62022Chris Lattner break; 944aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: 945aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov Width = Target->getHalfWidth(); 946aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov Align = Target->getHalfAlign(); 947aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov break; 9486f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Float: 949bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getFloatWidth(); 950bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getFloatAlign(); 9516f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 9526f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::Double: 953bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getDoubleWidth(); 954bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getDoubleAlign(); 9556f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 9566f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner case BuiltinType::LongDouble: 957bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getLongDoubleWidth(); 958bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getLongDoubleAlign(); 9596f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 9606e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl case BuiltinType::NullPtr: 961bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t) 962bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); // == sizeof(void*) 9631590d9c0fec4c710c2962e4bb71f76979b5163d3Sebastian Redl break; 964e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCId: 965e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCClass: 966e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian case BuiltinType::ObjCSel: 967bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); 968bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); 969e04f5fc25cf49e8a5b836459d836c20dc3229a95Fariborz Jahanian break; 970a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner } 971bfef6d7c67831a135d6ab79931f010f750a730adChris Lattner break; 972d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff case Type::ObjCObjectPointer: 973bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(0); 974bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(0); 9756f62c2abd8077bf70d2166d37e8caa426b34d8e4Chris Lattner break; 976485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff case Type::BlockPointer: { 977207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace( 978207f4d8543529221932af82836016a2ef066c917Peter Collingbourne cast<BlockPointerType>(T)->getPointeeType()); 979bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 980bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 981485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff break; 982485eeff9ba73376c8e01179bf1a501b1723446cbSteve Naroff } 9835d484e8cf710207010720589d89602233de61d01Sebastian Redl case Type::LValueReference: 9845d484e8cf710207010720589d89602233de61d01Sebastian Redl case Type::RValueReference: { 9855d484e8cf710207010720589d89602233de61d01Sebastian Redl // alignof and sizeof should never enter this code path here, so we go 9865d484e8cf710207010720589d89602233de61d01Sebastian Redl // the pointer route. 987207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace( 988207f4d8543529221932af82836016a2ef066c917Peter Collingbourne cast<ReferenceType>(T)->getPointeeType()); 989bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 990bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 9915d484e8cf710207010720589d89602233de61d01Sebastian Redl break; 9925d484e8cf710207010720589d89602233de61d01Sebastian Redl } 993f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner case Type::Pointer: { 994207f4d8543529221932af82836016a2ef066c917Peter Collingbourne unsigned AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType()); 995bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Width = Target->getPointerWidth(AS); 996bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor Align = Target->getPointerAlign(AS); 997f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner break; 998f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner } 999f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl case Type::MemberPointer: { 1000071cc7deffad608165b1ddd5263e8bf181861520Charles Davis const MemberPointerType *MPT = cast<MemberPointerType>(T); 10011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<uint64_t, unsigned> PtrDiffInfo = 10021cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson getTypeInfo(getPointerDiffType()); 1003071cc7deffad608165b1ddd5263e8bf181861520Charles Davis Width = PtrDiffInfo.first * ABI->getMemberPointerSize(MPT); 10041cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson Align = PtrDiffInfo.second; 10051cca74ef3627a3a0ab14501d23e336548f6611b2Anders Carlsson break; 1006f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl } 10075d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner case Type::Complex: { 10085d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner // Complex types have the same alignment as their elements, but twice the 10095d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner // size. 10101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<uint64_t, unsigned> EltInfo = 101198be4943e8dc4f3905629a7102668960873cf863Chris Lattner getTypeInfo(cast<ComplexType>(T)->getElementType()); 10129e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner Width = EltInfo.first*2; 10135d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner Align = EltInfo.second; 10145d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner break; 10155d2a6303467184b1f159bb6556efc434e50e3c28Chris Lattner } 1016c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: 1017c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr()); 101844a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel case Type::ObjCInterface: { 10191d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T); 102044a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl()); 1021dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck Width = toBits(Layout.getSize()); 1022dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck Align = toBits(Layout.getAlignment()); 102344a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel break; 102444a3dded8080c5c9cfdad208ade8f8f7850d9a4fDevang Patel } 102572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Record: 102672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Enum: { 10271d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const TagType *TT = cast<TagType>(T); 10281d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar 10291d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar if (TT->getDecl()->isInvalidDecl()) { 103022ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor Width = 8; 103122ce41d9fc8509da65858c75bf5b3c4dae2d8c04Douglas Gregor Align = 8; 10328389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner break; 10338389eab190afef3462f6418b8d8fb70fb01c4005Chris Lattner } 10341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10351d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar if (const EnumType *ET = dyn_cast<EnumType>(TT)) 10367176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner return getTypeInfo(ET->getDecl()->getIntegerType()); 10377176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner 10381d75118af76cae2bfc06389cde410e14bd0a19fcDaniel Dunbar const RecordType *RT = cast<RecordType>(TT); 10397176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl()); 1040dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck Width = toBits(Layout.getSize()); 1041dac54c124e302d6f028ea5723c425b7f66fc7c71Ken Dyck Align = toBits(Layout.getAlignment()); 1042dc0d73e6495404418acf8548875aeaff07791a74Chris Lattner break; 1043a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner } 10447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 10459fcfe926432f3c3f7e9a61219e55c352fd358e45Chris Lattner case Type::SubstTemplateTypeParm: 104649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return getTypeInfo(cast<SubstTemplateTypeParmType>(T)-> 104749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall getReplacementType().getTypePtr()); 104849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 104934b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: { 105034b41d939a1328f484511c6002ba2456db879a29Richard Smith const AutoType *A = cast<AutoType>(T); 105134b41d939a1328f484511c6002ba2456db879a29Richard Smith assert(A->isDeduced() && "Cannot request the size of a dependent type"); 1052dc856aff4428380baa9afb5577ea04f8fb6beb13Matt Beaumont-Gay return getTypeInfo(A->getDeducedType().getTypePtr()); 105334b41d939a1328f484511c6002ba2456db879a29Richard Smith } 105434b41d939a1328f484511c6002ba2456db879a29Richard Smith 1055075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara case Type::Paren: 1056075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr()); 1057075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 105818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::Typedef: { 1059162e1c1b487352434552147967c3dd296ebee2f7Richard Smith const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl(); 1060df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor std::pair<uint64_t, unsigned> Info 1061df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor = getTypeInfo(Typedef->getUnderlyingType().getTypePtr()); 1062c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // If the typedef has an aligned attribute on it, it overrides any computed 1063c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // alignment we have. This violates the GCC documentation (which says that 1064c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner // attribute(aligned) can only round up) but matches its implementation. 1065c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner if (unsigned AttrAlign = Typedef->getMaxAlignment()) 1066c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner Align = AttrAlign; 1067c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner else 1068c1de52de64725945e5ae87e6f99ddedf161856e5Chris Lattner Align = Info.second; 1069df1367af26cb2959775e9511108f12dcd2370a27Douglas Gregor Width = Info.first; 10707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor break; 10717176331b0f5cfaaa2b5aa487a6660e859e371119Chris Lattner } 107218857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 107318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::TypeOfExpr: 107418857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType() 107518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor .getTypePtr()); 107618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 107718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor case Type::TypeOf: 107818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr()); 107918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 1080395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson case Type::Decltype: 1081395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType() 1082395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson .getTypePtr()); 1083395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 1084ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 1085ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType()); 1086ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 1087465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara case Type::Elaborated: 1088465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr()); 10891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10909d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall case Type::Attributed: 10919d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return getTypeInfo( 10929d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall cast<AttributedType>(T)->getEquivalentType().getTypePtr()); 10939d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 10943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith case Type::TemplateSpecialization: { 10951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(getCanonicalType(T) != T && 109618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor "Cannot request the size of a dependent type"); 10973e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T); 10983e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // A type alias template specialization may refer to a typedef with the 10993e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // aligned attribute on it. 11003e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (TST->isTypeAlias()) 11013e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return getTypeInfo(TST->getAliasedType().getTypePtr()); 11023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else 11033e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return getTypeInfo(getCanonicalType(T)); 11043e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 11053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 1106b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 11072be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman std::pair<uint64_t, unsigned> Info 11082be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman = getTypeInfo(cast<AtomicType>(T)->getValueType()); 11092be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Width = Info.first; 11102be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Align = Info.second; 11112be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman if (Width != 0 && Width <= Target->getMaxAtomicPromoteWidth() && 11122be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman llvm::isPowerOf2_64(Width)) { 11132be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // We can potentially perform lock-free atomic operations for this 11142be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // type; promote the alignment appropriately. 11152be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // FIXME: We could potentially promote the width here as well... 11162be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // is that worthwhile? (Non-struct atomic types generally have 11172be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // power-of-two size anyway, but structs might not. Requires a bit 11182be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman // of implementation work to make sure we zero out the extra bits.) 11192be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman Align = static_cast<unsigned>(Width); 11202be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman } 1121b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 1122b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 112318857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor } 11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11252be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2"); 11269e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner return std::make_pair(Width, Align); 1127a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner} 1128a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 1129eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck/// toCharUnitsFromBits - Convert a size in bits to a size in characters. 1130eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen DyckCharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const { 1131eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return CharUnits::fromQuantity(BitSize / getCharWidth()); 1132eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck} 1133eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck 1134dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck/// toBits - Convert a size in characters to a size in characters. 1135dd76a9ab9ea675671200f94b18ce95766841952bKen Dyckint64_t ASTContext::toBits(CharUnits CharSize) const { 1136dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck return CharSize.getQuantity() * getCharWidth(); 1137dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck} 1138dd76a9ab9ea675671200f94b18ce95766841952bKen Dyck 1139bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// getTypeSizeInChars - Return the size of the specified type, in characters. 1140bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck/// This method does not work on incomplete types. 11414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(QualType T) const { 1142eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeSize(T)); 1143bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck} 11444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeSizeInChars(const Type *T) const { 1145eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeSize(T)); 1146bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck} 1147bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck 114816e20cce43385001f33f8e3f90ee345609c805d1Ken Dyck/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in 114986fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck/// characters. This method does not work on incomplete types. 11504ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(QualType T) const { 1151eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeAlign(T)); 115286fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck} 11534ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getTypeAlignInChars(const Type *T) const { 1154eb6f5dc86531f794ba7746a2da4d28e37cf5da7eKen Dyck return toCharUnitsFromBits(getTypeAlign(T)); 115586fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck} 115686fa4311c8a330957ff5b765fbb0a7750ecd38c9Ken Dyck 115734ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// getPreferredTypeAlign - Return the "preferred" alignment of the specified 115834ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// type for the current target in bits. This can be different than the ABI 115934ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// alignment in cases where it is beneficial for performance to overalign 116034ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner/// a data type. 11614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getPreferredTypeAlign(const Type *T) const { 116234ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner unsigned ABIAlign = getTypeAlign(T); 11631eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman 11641eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman // Double and long long should be naturally aligned if possible. 1165183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType* CT = T->getAs<ComplexType>()) 11661eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman T = CT->getElementType().getTypePtr(); 11671eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman if (T->isSpecificBuiltinType(BuiltinType::Double) || 11681eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman T->isSpecificBuiltinType(BuiltinType::LongLong)) 11691eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman return std::max(ABIAlign, (unsigned)getTypeSize(T)); 11701eed60297ef4701b899c6a3b9680bf08f3403422Eli Friedman 117134ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner return ABIAlign; 117234ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner} 117334ebde404dc17d89487b07e6daaf1b47d5dfee39Chris Lattner 11742c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// DeepCollectObjCIvars - 11752c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// This routine first collects all declared, but not synthesized, ivars in 11762c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// super class and then collects all ivars, including those synthesized for 11772c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// current class. This routine is used for implementation of current class 11782c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian/// when all ivars, declared and synthesized are known. 11799820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian/// 11802c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanianvoid ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, 11812c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian bool leafClass, 1182db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const { 11832c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass()) 11842c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian DeepCollectObjCIvars(SuperClass, false, Ivars); 11852c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (!leafClass) { 11862c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(), 11872c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian E = OI->ivar_end(); I != E; ++I) 118811062e11236b7bc689dad150e8b490fd6b063ec3Fariborz Jahanian Ivars.push_back(*I); 11893060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 1190bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI); 1191db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv; 1192bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian Iv= Iv->getNextIvar()) 1193bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian Ivars.push_back(Iv); 1194bf9eb88792e022e54a658657bf22e1925948e384Fariborz Jahanian } 11959820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian} 11969820074dd47d37681085e964cd3392ac0b3e67b9Fariborz Jahanian 1197e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// CollectInheritedProtocols - Collect all protocols in current class and 1198e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// those inherited by it. 1199e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid ASTContext::CollectInheritedProtocols(const Decl *CDecl, 1200432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) { 1201e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) { 120253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // We can use protocol_iterator here instead of 120353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // all_referenced_protocol_iterator since we are walking all categories. 120453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCInterfaceDecl::all_protocol_iterator P = OI->all_referenced_protocol_begin(), 120553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek PE = OI->all_referenced_protocol_end(); P != PE; ++P) { 1206e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 12073fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1208e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1209b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) { 12103fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert((*P)->getCanonicalDecl()); 1211e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1212e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1213b2f812165676230bce5d0215e49a4749c451ca9cFariborz Jahanian } 1214e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 1215e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian // Categories of this Interface. 1216e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (const ObjCCategoryDecl *CDeclChain = OI->getCategoryList(); 1217e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CDeclChain; CDeclChain = CDeclChain->getNextClassCategory()) 1218e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(CDeclChain, Protocols); 1219e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (ObjCInterfaceDecl *SD = OI->getSuperClass()) 1220e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian while (SD) { 1221e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(SD, Protocols); 1222e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian SD = SD->getSuperClass(); 1223e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1224b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) { 122553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (ObjCCategoryDecl::protocol_iterator P = OC->protocol_begin(), 1226e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = OC->protocol_end(); P != PE; ++P) { 1227e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 12283fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1229e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1230e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) 1231e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1232e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1233b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) { 1234e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(), 1235e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = OP->protocol_end(); P != PE; ++P) { 1236e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian ObjCProtocolDecl *Proto = (*P); 12373fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor Protocols.insert(Proto->getCanonicalDecl()); 1238e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1239e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian PE = Proto->protocol_end(); P != PE; ++P) 1240e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian CollectInheritedProtocols(*P, Protocols); 1241e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1242e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 1243e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian} 1244e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 12454ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const { 12463bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian unsigned count = 0; 12473bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // Count ivars declared in class extension. 124880aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian for (const ObjCCategoryDecl *CDecl = OI->getFirstClassExtension(); CDecl; 124980aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian CDecl = CDecl->getNextClassExtension()) 1250b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer count += CDecl->ivar_size(); 1251b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer 12523bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // Count ivar defined in this class's implementation. This 12533bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian // includes synthesized ivars. 12543bfacdf6f0706987c1b33c625cd68fb880881c22Fariborz Jahanian if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) 1255b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer count += ImplDecl->ivar_size(); 1256b170ca5f4a8397c10e52050ff5df6885a3e6eca9Benjamin Kramer 12578e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian return count; 12588e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian} 12598e6ac1d80055fa37b9b84029c7e751624ba7f84cFariborz Jahanian 12608deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidisbool ASTContext::isSentinelNullExpr(const Expr *E) { 12618deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (!E) 12628deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return false; 12638deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 12648deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis // nullptr_t is always treated as null. 12658deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (E->getType()->isNullPtrType()) return true; 12668deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 12678deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (E->getType()->isAnyPointerType() && 12688deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis E->IgnoreParenCasts()->isNullPointerConstant(*this, 12698deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis Expr::NPC_ValueDependentIsNull)) 12708deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return true; 12718deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 12728deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis // Unfortunately, __null has type 'int'. 12738deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis if (isa<GNUNullExpr>(E)) return true; 12748deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 12758deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis return false; 12768deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis} 12778deabc133c121f6c5561d0b2171a41cb2c29b2ceArgyrios Kyrtzidis 12788a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists. 12798a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) { 12808a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 12818a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis I = ObjCImpls.find(D); 12828a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis if (I != ObjCImpls.end()) 12838a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return cast<ObjCImplementationDecl>(I->second); 12848a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return 0; 12858a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 12868a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists. 12878a1d722f13df383600f36d77f842957c8adb5f1bArgyrios KyrtzidisObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) { 12888a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 12898a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis I = ObjCImpls.find(D); 12908a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis if (I != ObjCImpls.end()) 12918a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return cast<ObjCCategoryImplDecl>(I->second); 12928a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis return 0; 12938a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 12948a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis 12958a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCInterfaceDecl. 12968a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD, 12978a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImplementationDecl *ImplD) { 12988a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis assert(IFaceD && ImplD && "Passed null params"); 12998a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImpls[IFaceD] = ImplD; 13008a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 13018a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis/// \brief Set the implementation of ObjCCategoryDecl. 13028a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidisvoid ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD, 13038a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCCategoryImplDecl *ImplD) { 13048a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis assert(CatD && ImplD && "Passed null params"); 13058a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis ObjCImpls[CatD] = ImplD; 13068a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis} 13078a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis 130887ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios KyrtzidisObjCInterfaceDecl *ASTContext::getObjContainingInterface(NamedDecl *ND) const { 130987ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext())) 131087ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return ID; 131187ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ND->getDeclContext())) 131287ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return CD->getClassInterface(); 131387ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis if (ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(ND->getDeclContext())) 131487ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return IMD->getClassInterface(); 131587ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis 131687ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis return 0; 131787ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis} 131887ec9c257c99b4136af6c7f5be5a2d486906ba84Argyrios Kyrtzidis 13191ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Get the copy initialization expression of VarDecl,or NULL if 13201ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// none exists. 1321830937bc1100fba7682f7c32c40512085870f50cFariborz JahanianExpr *ASTContext::getBlockVarCopyInits(const VarDecl*VD) { 1322d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD && "Passed null params"); 1323d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD->hasAttr<BlocksAttr>() && 1324d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian "getBlockVarCopyInits - not __block var"); 1325830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian llvm::DenseMap<const VarDecl*, Expr*>::iterator 1326d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian I = BlockVarCopyInits.find(VD); 13271ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian return (I != BlockVarCopyInits.end()) ? cast<Expr>(I->second) : 0; 13281ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian} 13291ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian 13301ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian/// \brief Set the copy inialization expression of a block var decl. 13311ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanianvoid ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) { 13321ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian assert(VD && Init && "Passed null params"); 1333d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian assert(VD->hasAttr<BlocksAttr>() && 1334d016ec204c54d766c4561d43548551ffde0e6b43Fariborz Jahanian "setBlockVarCopyInits - not __block var"); 13351ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian BlockVarCopyInits[VD] = Init; 13361ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian} 13371ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian 1338a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall/// \brief Allocate an uninitialized TypeSourceInfo. 1339b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// 1340a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall/// The caller should initialize the memory held by TypeSourceInfo using 1341b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// the TypeLoc wrappers. 1342b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// 1343b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \param T the type that will be the basis for type source info. This type 1344b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// should refer to how the declarator was written in source code, not to 1345b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// what type semantic analysis resolved the declarator to. 1346a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T, 13474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned DataSize) const { 1348109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall if (!DataSize) 1349109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall DataSize = TypeLoc::getFullDataSizeForType(T); 1350109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall else 1351109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall assert(DataSize == TypeLoc::getFullDataSizeForType(T) && 1352a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall "incorrect data size provided to CreateTypeSourceInfo!"); 1353109de5ead1dfcb3bc985cddb8cb3ed5bcecad88dJohn McCall 1354a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *TInfo = 1355a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8); 1356a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall new (TInfo) TypeSourceInfo(T); 1357a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TInfo; 1358b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 1359b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis 1360a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T, 13616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SourceLocation L) const { 1362a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = CreateTypeSourceInfo(T); 1363c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L); 1364a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall return DI; 1365a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall} 1366a4eb74d4dfe126c686dc708fec444c85ffb73b47John McCall 1367b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout & 13684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const { 1369b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar return getObjCLayout(D, 0); 1370b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar} 1371b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar 1372b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbarconst ASTRecordLayout & 13734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getASTObjCImplementationLayout( 13744ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const ObjCImplementationDecl *D) const { 1375b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar return getObjCLayout(D->getClassInterface(), D); 1376b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar} 1377b2dbbb99e12806eaaf53b7ccabc32f42b5719443Daniel Dunbar 1378a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===// 1379a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner// Type creation/memoization methods 1380a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner//===----------------------------------------------------------------------===// 1381a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 13824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 13833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const { 13843b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned fastQuals = quals.getFastQualifiers(); 13853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall quals.removeFastQualifiers(); 13860953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 13870953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Check if we've already instantiated this type. 13880953e767ff7817f97b3ab20896b229891eeff45bJohn McCall llvm::FoldingSetNodeID ID; 13893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQuals::Profile(ID, baseType, quals); 13903b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 13913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) { 13923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(eq->getQualifiers() == quals); 13933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(eq, fastQuals); 13940953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 13950953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 13963b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If the base type is not canonical, make the appropriate canonical type. 13973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon; 13983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!baseType->isCanonicalUnqualified()) { 13993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split(); 1400200fa53fd420aa8369586f569dbece04930ad6a3John McCall canonSplit.Quals.addConsistentQualifiers(quals); 1401200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getExtQualType(canonSplit.Ty, canonSplit.Quals); 14023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 14033b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Re-find the insert position. 14043b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos); 14053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 14063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 14073b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQuals *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals); 14083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExtQualNodes.InsertNode(eq, insertPos); 14093b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(eq, fastQuals); 14100953e767ff7817f97b3ab20896b229891eeff45bJohn McCall} 14110953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 14124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 14134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const { 1414f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner QualType CanT = getCanonicalType(T); 1415f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner if (CanT.getAddressSpace() == AddressSpace) 1416f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner return T; 1417b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner 14180953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If we are composing extended qualifiers together, merge together 14190953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // into one ExtQuals node. 14200953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Quals; 14210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *TypeNode = Quals.strip(T); 14221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If this type already has an address space specified, it cannot get 14240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // another one. 14250953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Quals.hasAddressSpace() && 14260953e767ff7817f97b3ab20896b229891eeff45bJohn McCall "Type cannot be in multiple addr spaces!"); 14270953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Quals.addAddressSpace(AddressSpace); 14281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14290953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getExtQualType(TypeNode, Quals); 1430ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb} 1431ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb 1432b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris LattnerQualType ASTContext::getObjCGCQualType(QualType T, 14334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Qualifiers::GC GCAttr) const { 1434d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian QualType CanT = getCanonicalType(T); 1435b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner if (CanT.getObjCGCAttr() == GCAttr) 1436d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian return T; 14371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14387f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall if (const PointerType *ptr = T->getAs<PointerType>()) { 14397f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall QualType Pointee = ptr->getPointeeType(); 144058f9f2c884af6b72d036b746a016d8031d31cb7aSteve Naroff if (Pointee->isAnyPointerType()) { 14414027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian QualType ResultType = getObjCGCQualType(Pointee, GCAttr); 14424027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian return getPointerType(ResultType); 14434027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian } 14444027cd1b924e29784a49085b1717f35cdd719146Fariborz Jahanian } 14451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14460953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If we are composing extended qualifiers together, merge together 14470953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // into one ExtQuals node. 14480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Quals; 14490953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *TypeNode = Quals.strip(T); 14501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14510953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If this type already has an ObjCGC specified, it cannot get 14520953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // another one. 14530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Quals.hasObjCGCAttr() && 14540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall "Type cannot have multiple ObjCGCs!"); 14550953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Quals.addObjCGCAttr(GCAttr); 14561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14570953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getExtQualType(TypeNode, Quals); 1458d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian} 1459a7674d8a9a69f3f6fe16e70cf2a3b2b15fb7c43dChris Lattner 1460e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCallconst FunctionType *ASTContext::adjustFunctionType(const FunctionType *T, 1461e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FunctionType::ExtInfo Info) { 1462e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall if (T->getExtInfo() == Info) 1463e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall return T; 1464e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 1465e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall QualType Result; 1466e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(T)) { 1467e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall Result = getFunctionNoProtoType(FNPT->getResultType(), Info); 1468e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall } else { 1469e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall const FunctionProtoType *FPT = cast<FunctionProtoType>(T); 1470e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 1471e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall EPI.ExtInfo = Info; 1472e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall Result = getFunctionType(FPT->getResultType(), FPT->arg_type_begin(), 1473e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall FPT->getNumArgs(), EPI); 1474e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall } 1475e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 1476e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall return cast<FunctionType>(Result.getTypePtr()); 1477e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall} 1478e6a365d772a6b455f1e23ac9ae5f40d65a55a18cJohn McCall 14795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getComplexType - Return the uniqued reference to the type for a complex 14805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// number with the specified element type. 14814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getComplexType(QualType T) const { 14825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 14835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 14845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 14855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexType::Profile(ID, T); 14861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 14885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos)) 14895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(CT, 0); 14901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the pointee type isn't canonical, this won't be a canonical type either, 14925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 14935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 1494467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 1495f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getComplexType(getCanonicalType(T)); 14961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 14985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos); 1499c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 15005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 15016b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical); 15025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 15035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ComplexTypes.InsertNode(New, InsertPos); 15045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 15055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 15065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 15075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getPointerType - Return the uniqued reference to the type for a pointer to 15085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the specified type. 15094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPointerType(QualType T) const { 15105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 15115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 15125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 15135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerType::Profile(ID, T); 15141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 15165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 15175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(PT, 0); 15181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the pointee type isn't canonical, this won't be a canonical type either, 15205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 15215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 1522467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 1523f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getPointerType(getCanonicalType(T)); 15241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 15265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1527c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 15285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 15296b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical); 15305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 15315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PointerTypes.InsertNode(New, InsertPos); 15325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 15335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 15345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 15351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getBlockPointerType - Return the uniqued reference to the type for 15365618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff/// a pointer to the specified block. 15374ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockPointerType(QualType T) const { 1538296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff assert(T->isFunctionType() && "block of function types only"); 1539296e8d5fdcf9946f51e866adc8d281379e51efe9Steve Naroff // Unique pointers, to guarantee there is only one block of a particular 15405618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // structure. 15415618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff llvm::FoldingSetNodeID ID; 15425618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerType::Profile(ID, T); 15431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15445618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff void *InsertPos = 0; 15455618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff if (BlockPointerType *PT = 15465618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 15475618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return QualType(PT, 0); 15481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the block pointee type isn't canonical, this won't be a canonical 15505618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // type either so fill in the canonical type field. 15515618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff QualType Canonical; 1552467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!T.isCanonical()) { 15535618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Canonical = getBlockPointerType(getCanonicalType(T)); 15541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15555618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff // Get the new insert position for the node we care about. 15565618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerType *NewIP = 15575618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1558c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 15595618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff } 15606b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall BlockPointerType *New 15616b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) BlockPointerType(T, Canonical); 15625618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff Types.push_back(New); 15635618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff BlockPointerTypes.InsertNode(New, InsertPos); 15645618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return QualType(New, 0); 15655618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff} 15665618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff 15677c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getLValueReferenceType - Return the uniqued reference to the type for an 15687c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// lvalue reference to the specified type. 15694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 15704ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const { 15719625e44c0252485277a340746ed8ac950686156fDouglas Gregor assert(getCanonicalType(T) != OverloadTy && 15729625e44c0252485277a340746ed8ac950686156fDouglas Gregor "Unresolved overloaded function type"); 15739625e44c0252485277a340746ed8ac950686156fDouglas Gregor 15745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique pointers, to guarantee there is only one pointer of a particular 15755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 15765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 157754e14c4db764c0636160d26c5bbf491637c83a76John McCall ReferenceType::Profile(ID, T, SpelledAsLValue); 15785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 15795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 15807c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (LValueReferenceType *RT = 15817c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 15825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(RT, 0); 15837c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 158454e14c4db764c0636160d26c5bbf491637c83a76John McCall const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 158554e14c4db764c0636160d26c5bbf491637c83a76John McCall 15865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the referencee type isn't canonical, this won't be a canonical type 15875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // either, so fill in the canonical type field. 15885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 158954e14c4db764c0636160d26c5bbf491637c83a76John McCall if (!SpelledAsLValue || InnerRef || !T.isCanonical()) { 159054e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 159154e14c4db764c0636160d26c5bbf491637c83a76John McCall Canonical = getLValueReferenceType(getCanonicalType(PointeeType)); 15927c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 15937c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // Get the new insert position for the node we care about. 15947c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceType *NewIP = 15957c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1596c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 15977c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl } 15987c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 15996b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall LValueReferenceType *New 160054e14c4db764c0636160d26c5bbf491637c83a76John McCall = new (*this, TypeAlignment) LValueReferenceType(T, Canonical, 160154e14c4db764c0636160d26c5bbf491637c83a76John McCall SpelledAsLValue); 16027c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl Types.push_back(New); 16037c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl LValueReferenceTypes.InsertNode(New, InsertPos); 160454e14c4db764c0636160d26c5bbf491637c83a76John McCall 16057c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl return QualType(New, 0); 16067c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl} 16077c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 16087c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// getRValueReferenceType - Return the uniqued reference to the type for an 16097c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl/// rvalue reference to the specified type. 16104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRValueReferenceType(QualType T) const { 16117c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // Unique pointers, to guarantee there is only one pointer of a particular 16127c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // structure. 16137c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl llvm::FoldingSetNodeID ID; 161454e14c4db764c0636160d26c5bbf491637c83a76John McCall ReferenceType::Profile(ID, T, false); 16157c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 16167c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl void *InsertPos = 0; 16177c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (RValueReferenceType *RT = 16187c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 16197c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl return QualType(RT, 0); 16207c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 162154e14c4db764c0636160d26c5bbf491637c83a76John McCall const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 162254e14c4db764c0636160d26c5bbf491637c83a76John McCall 16237c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // If the referencee type isn't canonical, this won't be a canonical type 16247c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // either, so fill in the canonical type field. 16257c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl QualType Canonical; 162654e14c4db764c0636160d26c5bbf491637c83a76John McCall if (InnerRef || !T.isCanonical()) { 162754e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 162854e14c4db764c0636160d26c5bbf491637c83a76John McCall Canonical = getRValueReferenceType(getCanonicalType(PointeeType)); 16297c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 16305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 16317c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceType *NewIP = 16327c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1633c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 16345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16366b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall RValueReferenceType *New 16376b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) RValueReferenceType(T, Canonical); 16385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 16397c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl RValueReferenceTypes.InsertNode(New, InsertPos); 16405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 16415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1643f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// getMemberPointerType - Return the uniqued reference to the type for a 1644f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl/// member pointer to the specified type, in the specified class. 16454ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const { 1646f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Unique pointers, to guarantee there is only one pointer of a particular 1647f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // structure. 1648f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl llvm::FoldingSetNodeID ID; 1649f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerType::Profile(ID, T, Cls); 1650f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1651f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl void *InsertPos = 0; 1652f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl if (MemberPointerType *PT = 1653f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 1654f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl return QualType(PT, 0); 1655f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1656f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // If the pointee or class type isn't canonical, this won't be a canonical 1657f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // type either, so fill in the canonical type field. 1658f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl QualType Canonical; 165987c12c4a4667279dacb3d4a93c64b49148a0ff79Douglas Gregor if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) { 1660f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls)); 1661f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 1662f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Get the new insert position for the node we care about. 1663f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerType *NewIP = 1664f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1665c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1666f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl } 16676b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall MemberPointerType *New 16686b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical); 1669f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl Types.push_back(New); 1670f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl MemberPointerTypes.InsertNode(New, InsertPos); 1671f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl return QualType(New, 0); 1672f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl} 1673f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl 16741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getConstantArrayType - Return the unique reference to the type for an 1675fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff/// array of the specified element type. 16761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getConstantArrayType(QualType EltTy, 167738aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner const llvm::APInt &ArySizeIn, 1678c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff ArrayType::ArraySizeModifier ASM, 167963e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara unsigned IndexTypeQuals) const { 1680923d56d436f750bc1f29db50e641078725558a1bSebastian Redl assert((EltTy->isDependentType() || 1681923d56d436f750bc1f29db50e641078725558a1bSebastian Redl EltTy->isIncompleteType() || EltTy->isConstantSizeType()) && 1682587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman "Constant array of VLAs is illegal!"); 1683587cbdfd95f4b0aaccc14b31f5debe85d5daf7edEli Friedman 168438aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner // Convert the array size into a canonical width matching the pointer size for 168538aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner // the target. 168638aeec7299c48cb79523f7f89776fb258c84aeeaChris Lattner llvm::APInt ArySize(ArySizeIn); 16879f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad ArySize = 1688bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor ArySize.zextOrTrunc(Target->getPointerWidth(getTargetAddressSpace(EltTy))); 16891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 169163e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, IndexTypeQuals); 16921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 16941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ConstantArrayType *ATP = 16957192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos)) 16965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(ATP, 0); 16971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If the element type isn't canonical or has qualifiers, this won't 16993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // be a canonical type either, so fill in the canonical type field. 17003b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType Canon; 17013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 17023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(EltTy).split(); 1703200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize, 170463e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ASM, IndexTypeQuals); 1705200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getQualifiedType(Canon, canonSplit.Quals); 17063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 17075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 17081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ConstantArrayType *NewIP = 17097192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos); 1710c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 17115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 17121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17136b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ConstantArrayType *New = new(*this,TypeAlignment) 171463e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara ConstantArrayType(EltTy, Canon, ArySize, ASM, IndexTypeQuals); 17157192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek ConstantArrayTypes.InsertNode(New, InsertPos); 17165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 17175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 17185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 17195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1720ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// getVariableArrayDecayedType - Turns the given type, which may be 1721ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// variably-modified, into the corresponding type with all the known 1722ce8890371fcdb983ae487c87fa40606a34896ff7John McCall/// sizes replaced with [*]. 1723ce8890371fcdb983ae487c87fa40606a34896ff7John McCallQualType ASTContext::getVariableArrayDecayedType(QualType type) const { 1724ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Vastly most common case. 1725ce8890371fcdb983ae487c87fa40606a34896ff7John McCall if (!type->isVariablyModifiedType()) return type; 1726ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1727ce8890371fcdb983ae487c87fa40606a34896ff7John McCall QualType result; 1728ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1729ce8890371fcdb983ae487c87fa40606a34896ff7John McCall SplitQualType split = type.getSplitDesugaredType(); 1730200fa53fd420aa8369586f569dbece04930ad6a3John McCall const Type *ty = split.Ty; 1731ce8890371fcdb983ae487c87fa40606a34896ff7John McCall switch (ty->getTypeClass()) { 1732ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define TYPE(Class, Base) 1733ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define ABSTRACT_TYPE(Class, Base) 1734ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 1735ce8890371fcdb983ae487c87fa40606a34896ff7John McCall#include "clang/AST/TypeNodes.def" 1736ce8890371fcdb983ae487c87fa40606a34896ff7John McCall llvm_unreachable("didn't desugar past all non-canonical types?"); 1737ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1738ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types should never be variably-modified. 1739ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Builtin: 1740ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Complex: 1741ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Vector: 1742ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ExtVector: 1743ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentSizedExtVector: 1744ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCObject: 1745ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCInterface: 1746ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ObjCObjectPointer: 1747ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Record: 1748ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Enum: 1749ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::UnresolvedUsing: 1750ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TypeOfExpr: 1751ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TypeOf: 1752ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Decltype: 1753ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case Type::UnaryTransform: 1754ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentName: 1755ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::InjectedClassName: 1756ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TemplateSpecialization: 1757ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentTemplateSpecialization: 1758ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::TemplateTypeParm: 1759ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::SubstTemplateTypeParmPack: 176034b41d939a1328f484511c6002ba2456db879a29Richard Smith case Type::Auto: 1761ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::PackExpansion: 1762ce8890371fcdb983ae487c87fa40606a34896ff7John McCall llvm_unreachable("type should never be variably-modified"); 1763ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1764ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types can be variably-modified but should never need to 1765ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // further decay. 1766ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::FunctionNoProto: 1767ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::FunctionProto: 1768ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::BlockPointer: 1769ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::MemberPointer: 1770ce8890371fcdb983ae487c87fa40606a34896ff7John McCall return type; 1771ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1772ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // These types can be variably-modified. All these modifications 1773ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // preserve structure except as noted by comments. 1774ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // TODO: if we ever care about optimizing VLAs, there are no-op 1775ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // optimizations available here. 1776ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::Pointer: 1777ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getPointerType(getVariableArrayDecayedType( 1778ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cast<PointerType>(ty)->getPointeeType())); 1779ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1780ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1781ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::LValueReference: { 1782ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const LValueReferenceType *lv = cast<LValueReferenceType>(ty); 1783ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getLValueReferenceType( 1784ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(lv->getPointeeType()), 1785ce8890371fcdb983ae487c87fa40606a34896ff7John McCall lv->isSpelledAsLValue()); 1786ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1787745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1788ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1789ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::RValueReference: { 1790ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const RValueReferenceType *lv = cast<RValueReferenceType>(ty); 1791ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getRValueReferenceType( 1792ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(lv->getPointeeType())); 1793ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1794745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1795745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1796b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: { 1797b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman const AtomicType *at = cast<AtomicType>(ty); 1798b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman result = getAtomicType(getVariableArrayDecayedType(at->getValueType())); 1799b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman break; 1800b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 1801b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 1802ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::ConstantArray: { 1803ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const ConstantArrayType *cat = cast<ConstantArrayType>(ty); 1804ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getConstantArrayType( 1805ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(cat->getElementType()), 1806ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getSize(), 1807ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getSizeModifier(), 1808ce8890371fcdb983ae487c87fa40606a34896ff7John McCall cat->getIndexTypeCVRQualifiers()); 1809ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1810745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian } 1811745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1812ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::DependentSizedArray: { 1813ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const DependentSizedArrayType *dat = cast<DependentSizedArrayType>(ty); 1814ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getDependentSizedArrayType( 1815ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(dat->getElementType()), 1816ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getSizeExpr(), 1817ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getSizeModifier(), 1818ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getIndexTypeCVRQualifiers(), 1819ce8890371fcdb983ae487c87fa40606a34896ff7John McCall dat->getBracketsRange()); 1820ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1821ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1822ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1823ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Turn incomplete types into [*] types. 1824ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::IncompleteArray: { 1825ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const IncompleteArrayType *iat = cast<IncompleteArrayType>(ty); 1826ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getVariableArrayType( 1827ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(iat->getElementType()), 1828ce8890371fcdb983ae487c87fa40606a34896ff7John McCall /*size*/ 0, 1829ce8890371fcdb983ae487c87fa40606a34896ff7John McCall ArrayType::Normal, 1830ce8890371fcdb983ae487c87fa40606a34896ff7John McCall iat->getIndexTypeCVRQualifiers(), 1831ce8890371fcdb983ae487c87fa40606a34896ff7John McCall SourceRange()); 1832ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1833ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1834ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1835ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Turn VLA types into [*] types. 1836ce8890371fcdb983ae487c87fa40606a34896ff7John McCall case Type::VariableArray: { 1837ce8890371fcdb983ae487c87fa40606a34896ff7John McCall const VariableArrayType *vat = cast<VariableArrayType>(ty); 1838ce8890371fcdb983ae487c87fa40606a34896ff7John McCall result = getVariableArrayType( 1839ce8890371fcdb983ae487c87fa40606a34896ff7John McCall getVariableArrayDecayedType(vat->getElementType()), 1840ce8890371fcdb983ae487c87fa40606a34896ff7John McCall /*size*/ 0, 1841ce8890371fcdb983ae487c87fa40606a34896ff7John McCall ArrayType::Star, 1842ce8890371fcdb983ae487c87fa40606a34896ff7John McCall vat->getIndexTypeCVRQualifiers(), 1843ce8890371fcdb983ae487c87fa40606a34896ff7John McCall vat->getBracketsRange()); 1844ce8890371fcdb983ae487c87fa40606a34896ff7John McCall break; 1845ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1846ce8890371fcdb983ae487c87fa40606a34896ff7John McCall } 1847ce8890371fcdb983ae487c87fa40606a34896ff7John McCall 1848ce8890371fcdb983ae487c87fa40606a34896ff7John McCall // Apply the top-level qualifiers from the original. 1849200fa53fd420aa8369586f569dbece04930ad6a3John McCall return getQualifiedType(result, split.Quals); 1850ce8890371fcdb983ae487c87fa40606a34896ff7John McCall} 1851745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian 1852bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// getVariableArrayType - Returns a non-unique reference to the type for a 1853bdbf7b030a3e0ddb95240076683830e6f78c79a5Steve Naroff/// variable array of the specified element type. 18547e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas GregorQualType ASTContext::getVariableArrayType(QualType EltTy, 18557e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor Expr *NumElts, 1856c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff ArrayType::ArraySizeModifier ASM, 185763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara unsigned IndexTypeQuals, 18584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceRange Brackets) const { 1859c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // Since we don't unique expressions, it isn't possible to unique VLA's 1860c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // that have an expression provided for their size. 18613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType Canon; 1862715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor 18633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Be sure to pull qualifiers off the element type. 18643b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 18653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(EltTy).split(); 1866200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM, 186763e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara IndexTypeQuals, Brackets); 1868200fa53fd420aa8369586f569dbece04930ad6a3John McCall Canon = getQualifiedType(Canon, canonSplit.Quals); 1869715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor } 1870715e9c8a39437347e838aa108df443fe1086d359Douglas Gregor 18716b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall VariableArrayType *New = new(*this, TypeAlignment) 187263e7d25d2e6036616b42f744fd4a39cd5f911960Abramo Bagnara VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets); 1873c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 1874c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman VariableArrayTypes.push_back(New); 1875c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman Types.push_back(New); 1876c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman return QualType(New, 0); 1877c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman} 1878c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 1879898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// getDependentSizedArrayType - Returns a non-unique reference to 1880898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// the type for a dependently-sized array of the specified element 188104d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor/// type. 18823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getDependentSizedArrayType(QualType elementType, 18833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Expr *numElements, 1884898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor ArrayType::ArraySizeModifier ASM, 18853b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned elementTypeQuals, 18863b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SourceRange brackets) const { 18873b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert((!numElements || numElements->isTypeDependent() || 18883b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall numElements->isValueDependent()) && 1889898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor "Size must be type- or value-dependent!"); 1890898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 18913b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Dependently-sized array types that do not have a specified number 18923b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // of elements will have their sizes deduced from a dependent 18933b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // initializer. We do no canonicalization here at all, which is okay 18943b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // because they can't be used in most locations. 18953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!numElements) { 18963b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *newType 18973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = new (*this, TypeAlignment) 18983b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType(*this, elementType, QualType(), 18993b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall numElements, ASM, elementTypeQuals, 19003b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall brackets); 19013b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(newType); 19023b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(newType, 0); 1903cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor } 1904cb78d8852a454684c987220132cdb5e54dd00121Douglas Gregor 19053b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Otherwise, we actually build a new type every time, but we 19063b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // also build a canonical type. 19071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19083b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonElementType = getCanonicalType(elementType).split(); 1909898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 19103b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 19113b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall llvm::FoldingSetNodeID ID; 19123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType::Profile(ID, *this, 1913200fa53fd420aa8369586f569dbece04930ad6a3John McCall QualType(canonElementType.Ty, 0), 19143b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals, numElements); 19153b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 19163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Look for an existing type with these properties. 19173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *canonTy = 19183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos); 19193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 19203b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If we don't have one, build one. 19213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!canonTy) { 19223b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall canonTy = new (*this, TypeAlignment) 1923200fa53fd420aa8369586f569dbece04930ad6a3John McCall DependentSizedArrayType(*this, QualType(canonElementType.Ty, 0), 19243b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType(), numElements, ASM, elementTypeQuals, 19253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall brackets); 19263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayTypes.InsertNode(canonTy, insertPos); 19273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(canonTy); 19283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 19293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 19303b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Apply qualifiers from the element type to the array. 19313b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon = getQualifiedType(QualType(canonTy,0), 1932200fa53fd420aa8369586f569dbece04930ad6a3John McCall canonElementType.Quals); 19333b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 19343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // If we didn't need extra canonicalization for the element type, 19353b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // then just use that as our result. 1936200fa53fd420aa8369586f569dbece04930ad6a3John McCall if (QualType(canonElementType.Ty, 0) == elementType) 19373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return canon; 19383b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 19393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Otherwise, we need to build a type which follows the spelling 19403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // of the element type. 19413b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType *sugaredType 19423b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = new (*this, TypeAlignment) 19433b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall DependentSizedArrayType(*this, elementType, canon, numElements, 19443b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals, brackets); 19453b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(sugaredType); 19463b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(sugaredType, 0); 19473b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall} 19483b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 19493b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getIncompleteArrayType(QualType elementType, 1950c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman ArrayType::ArraySizeModifier ASM, 19513b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall unsigned elementTypeQuals) const { 1952c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman llvm::FoldingSetNodeID ID; 19533b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals); 1954c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 19553b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall void *insertPos = 0; 19563b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (IncompleteArrayType *iat = 19573b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos)) 19583b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(iat, 0); 1959c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 1960c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // If the element type isn't canonical, this won't be a canonical type 19613b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // either, so fill in the canonical type field. We also have to pull 19623b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // qualifiers off the element type. 19633b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType canon; 1964c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 19653b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) { 19663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType canonSplit = getCanonicalType(elementType).split(); 1967200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0), 19683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ASM, elementTypeQuals); 1969200fa53fd420aa8369586f569dbece04930ad6a3John McCall canon = getQualifiedType(canon, canonSplit.Quals); 1970c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 1971c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // Get the new insert position for the node we care about. 19723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType *existing = 19733b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos); 19743b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(!existing && "Shouldn't be in the map!"); (void) existing; 19752bd24ba6d10f8c811c8e2a57c8397e07082ba497Ted Kremenek } 1976c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 19773b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType *newType = new (*this, TypeAlignment) 19783b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayType(elementType, canon, ASM, elementTypeQuals); 1979c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman 19803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall IncompleteArrayTypes.InsertNode(newType, insertPos); 19813b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Types.push_back(newType); 19823b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return QualType(newType, 0); 1983fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff} 1984fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff 198573322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// getVectorType - Return the unique reference to a vector type of 198673322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type. 198782287d19ded35248c4ce6a425ce74116a13ce44eJohn ThompsonQualType ASTContext::getVectorType(QualType vecType, unsigned NumElts, 19884ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad VectorType::VectorKind VecKind) const { 19893b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall assert(vecType->isBuiltinType()); 19901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Check if we've already instantiated a vector of this type. 19925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 1993e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind); 1994788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 19955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 19965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 19975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(VTP, 0); 19985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 19995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the element type isn't canonical, this won't be a canonical type either, 20005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // so fill in the canonical type field. 20015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 2002255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor if (!vecType.isCanonical()) { 2003231da7eb3dd13007e5e40fffe48998e5ef284e06Bob Wilson Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind); 20041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 20065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2007c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 20085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 20096b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall VectorType *New = new (*this, TypeAlignment) 2010e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType(vecType, NumElts, Canonical, VecKind); 20115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VectorTypes.InsertNode(New, InsertPos); 20125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 20135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 20145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 20155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2016213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman/// getExtVectorType - Return the unique reference to an extended vector type of 201773322924127c873c13101b705dd823f5539ffa5fSteve Naroff/// the specified element type and size. VectorType must be a built-in type. 20184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 20194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const { 20204ac01401b1ec602a1f58c217544d3dcb5fcbd7f1Douglas Gregor assert(vecType->isBuiltinType() || vecType->isDependentType()); 20211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 202273322924127c873c13101b705dd823f5539ffa5fSteve Naroff // Check if we've already instantiated a vector of this type. 202373322924127c873c13101b705dd823f5539ffa5fSteve Naroff llvm::FoldingSetNodeID ID; 2024788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner VectorType::Profile(ID, vecType, NumElts, Type::ExtVector, 2025e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::GenericVector); 202673322924127c873c13101b705dd823f5539ffa5fSteve Naroff void *InsertPos = 0; 202773322924127c873c13101b705dd823f5539ffa5fSteve Naroff if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 202873322924127c873c13101b705dd823f5539ffa5fSteve Naroff return QualType(VTP, 0); 202973322924127c873c13101b705dd823f5539ffa5fSteve Naroff 203073322924127c873c13101b705dd823f5539ffa5fSteve Naroff // If the element type isn't canonical, this won't be a canonical type either, 203173322924127c873c13101b705dd823f5539ffa5fSteve Naroff // so fill in the canonical type field. 203273322924127c873c13101b705dd823f5539ffa5fSteve Naroff QualType Canonical; 2033467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall if (!vecType.isCanonical()) { 2034213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman Canonical = getExtVectorType(getCanonicalType(vecType), NumElts); 20351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 203673322924127c873c13101b705dd823f5539ffa5fSteve Naroff // Get the new insert position for the node we care about. 203773322924127c873c13101b705dd823f5539ffa5fSteve Naroff VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2038c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 203973322924127c873c13101b705dd823f5539ffa5fSteve Naroff } 20406b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ExtVectorType *New = new (*this, TypeAlignment) 20416b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall ExtVectorType(vecType, NumElts, Canonical); 204273322924127c873c13101b705dd823f5539ffa5fSteve Naroff VectorTypes.InsertNode(New, InsertPos); 204373322924127c873c13101b705dd823f5539ffa5fSteve Naroff Types.push_back(New); 204473322924127c873c13101b705dd823f5539ffa5fSteve Naroff return QualType(New, 0); 204573322924127c873c13101b705dd823f5539ffa5fSteve Naroff} 204673322924127c873c13101b705dd823f5539ffa5fSteve Naroff 20474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 20484ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentSizedExtVectorType(QualType vecType, 20494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Expr *SizeExpr, 20504ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceLocation AttrLoc) const { 20512ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor llvm::FoldingSetNodeID ID; 20521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType), 20532ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SizeExpr); 20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20552ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor void *InsertPos = 0; 20562ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorType *Canon 20572ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 20582ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorType *New; 20592ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor if (Canon) { 20602ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor // We already have a canonical version of this array type; use it as 20612ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor // the canonical type for a newly-built type. 20626b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 20636b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0), 20646b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall SizeExpr, AttrLoc); 20652ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } else { 20662ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType CanonVecTy = getCanonicalType(vecType); 20672ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor if (CanonVecTy == vecType) { 20686b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 20696b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr, 20706b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall AttrLoc); 2071789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2072789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentSizedExtVectorType *CanonCheck 2073789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 2074789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken"); 2075789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CanonCheck; 20762ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor DependentSizedExtVectorTypes.InsertNode(New, InsertPos); 20772ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } else { 20782ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr, 20792ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SourceLocation()); 20806b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall New = new (*this, TypeAlignment) 20816b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc); 20822ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } 20832ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor } 20841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20859cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor Types.push_back(New); 20869cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor return QualType(New, 0); 20879cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor} 20889cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor 208972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'. 20905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 20914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 20924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionNoProtoType(QualType ResultTy, 20934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FunctionType::ExtInfo &Info) const { 2094cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv DefaultCC = Info.getCC(); 2095cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2096cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CC_X86StdCall : DefaultCC; 20975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique functions, to guarantee there is only one function of a particular 20985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 20995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 2100264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionNoProtoType::Profile(ID, ResultTy, Info); 21011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 21031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionNoProtoType *FT = 210472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 21055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FT, 0); 21061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 2108ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor if (!ResultTy.isCanonical() || 210904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall getCanonicalCallConv(CallConv) != CallConv) { 2110264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Canonical = 2111264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola getFunctionNoProtoType(getCanonicalType(ResultTy), 2112264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Info.withCallingConv(getCanonicalCallConv(CallConv))); 21131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 211572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoType *NewIP = 211672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2117c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 21185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 21191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2120cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionProtoType::ExtInfo newInfo = Info.withCallingConv(CallConv); 21216b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall FunctionNoProtoType *New = new (*this, TypeAlignment) 2122cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionNoProtoType(ResultTy, Canonical, newInfo); 21235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(New); 212472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionNoProtoTypes.InsertNode(New, InsertPos); 21255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(New, 0); 21265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 21275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 21285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFunctionType - Return a normal function type with a typed argument 21295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// list. isVariadic indicates whether the argument list includes '...'. 21304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 21314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getFunctionType(QualType ResultTy, 21324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const QualType *ArgArray, unsigned NumArgs, 21334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FunctionProtoType::ExtProtoInfo &EPI) const { 21345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Unique functions, to guarantee there is only one function of a particular 21355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // structure. 21365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer llvm::FoldingSetNodeID ID; 21378026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl FunctionProtoType::Profile(ID, ResultTy, ArgArray, NumArgs, EPI, *this); 21385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 21395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void *InsertPos = 0; 21401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionProtoType *FTP = 214172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 21425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FTP, 0); 2143465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2144465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl // Determine whether the type being created is already canonical or not. 2145eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith bool isCanonical = 2146eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith EPI.ExceptionSpecType == EST_None && ResultTy.isCanonical() && 2147eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith !EPI.HasTrailingReturn; 21485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs && isCanonical; ++i) 214954e14c4db764c0636160d26c5bbf491637c83a76John McCall if (!ArgArray[i].isCanonicalAsParam()) 21505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer isCanonical = false; 21515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2152cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv DefaultCC = EPI.ExtInfo.getCC(); 2153cfe9af250f466e7e38becea4428990448ae07737Roman Divacky const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2154cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CC_X86StdCall : DefaultCC; 2155e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 21565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this type isn't canonical, get the canonical version of it. 2157465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl // The exception spec is not part of the canonical type. 21585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Canonical; 215904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) { 21605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 16> CanonicalArgs; 21615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer CanonicalArgs.reserve(NumArgs); 21625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs; ++i) 216354e14c4db764c0636160d26c5bbf491637c83a76John McCall CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i])); 2164465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2165e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI; 2166eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith CanonicalEPI.HasTrailingReturn = false; 21678b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl CanonicalEPI.ExceptionSpecType = EST_None; 21688b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl CanonicalEPI.NumExceptions = 0; 2169e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall CanonicalEPI.ExtInfo 2170e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall = CanonicalEPI.ExtInfo.withCallingConv(getCanonicalCallConv(CallConv)); 2171e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 2172f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner Canonical = getFunctionType(getCanonicalType(ResultTy), 2173beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad CanonicalArgs.data(), NumArgs, 2174e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall CanonicalEPI); 2175465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 21765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Get the new insert position for the node we care about. 217772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoType *NewIP = 217872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2179c6ed729f669044f5072a49d79041f455d971ece3Jeffrey Yasskin assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 21805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2181465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl 2182f85e193739c953358c865005855253af4f68a497John McCall // FunctionProtoType objects are allocated with extra bytes after 2183f85e193739c953358c865005855253af4f68a497John McCall // them for three variable size arrays at the end: 2184f85e193739c953358c865005855253af4f68a497John McCall // - parameter types 2185f85e193739c953358c865005855253af4f68a497John McCall // - exception types 2186f85e193739c953358c865005855253af4f68a497John McCall // - consumed-arguments flags 2187f85e193739c953358c865005855253af4f68a497John McCall // Instead of the exception types, there could be a noexcept 2188f85e193739c953358c865005855253af4f68a497John McCall // expression. 2189e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall size_t Size = sizeof(FunctionProtoType) + 219060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl NumArgs * sizeof(QualType); 219160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (EPI.ExceptionSpecType == EST_Dynamic) 219260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Size += EPI.NumExceptions * sizeof(QualType); 219360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) { 21948026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl Size += sizeof(Expr*); 219560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 2196f85e193739c953358c865005855253af4f68a497John McCall if (EPI.ConsumedArguments) 2197f85e193739c953358c865005855253af4f68a497John McCall Size += NumArgs * sizeof(bool); 2198f85e193739c953358c865005855253af4f68a497John McCall 2199e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment); 2200cfe9af250f466e7e38becea4428990448ae07737Roman Divacky FunctionProtoType::ExtProtoInfo newEPI = EPI; 2201cfe9af250f466e7e38becea4428990448ae07737Roman Divacky newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv); 22028026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl new (FTP) FunctionProtoType(ResultTy, ArgArray, NumArgs, Canonical, newEPI); 22035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Types.push_back(FTP); 220472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor FunctionProtoTypes.InsertNode(FTP, InsertPos); 22055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return QualType(FTP, 0); 22065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 22075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#ifndef NDEBUG 22093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallstatic bool NeedsInjectedClassNameType(const RecordDecl *D) { 22103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!isa<CXXRecordDecl>(D)) return false; 22113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const CXXRecordDecl *RD = cast<CXXRecordDecl>(D); 22123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (isa<ClassTemplatePartialSpecializationDecl>(RD)) 22133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return true; 22143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (RD->getDescribedClassTemplate() && 22153cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall !isa<ClassTemplateSpecializationDecl>(RD)) 22163cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return true; 22173cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return false; 22183cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 22193cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif 22203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 22213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// getInjectedClassNameType - Return the unique reference to the 22223cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/// injected class name type for the specified templated declaration. 22233cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl, 22244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType TST) const { 22253cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(NeedsInjectedClassNameType(Decl)); 22263cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (Decl->TypeForDecl) { 22273cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 2228ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) { 22293cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(PrevDecl->TypeForDecl && "previous declaration has no type"); 22303cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Decl->TypeForDecl = PrevDecl->TypeForDecl; 22313cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 22323cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } else { 2233f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Type *newType = 223431f17ecbef57b5679c017c375db330546b7b5145John McCall new (*this, TypeAlignment) InjectedClassNameType(Decl, TST); 2235f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2236f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 22373cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } 22383cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return QualType(Decl->TypeForDecl, 0); 22393cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 22403cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 22412ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// getTypeDeclType - Return the unique reference to the type for the 22422ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor/// specified type declaration. 22434ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const { 22441e6759e9e33dcaa73ce14c8a908ac9f87ac16463Argyrios Kyrtzidis assert(Decl && "Passed null for Decl param"); 2245becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!Decl->TypeForDecl && "TypeForDecl present in slow case"); 22461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2247162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (const TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Decl)) 22482ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor return getTypedefType(Typedef); 2249becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall 2250becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!isa<TemplateTypeParmDecl>(Decl) && 2251becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "Template type parameter types are always available."); 2252becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall 225319c8576b7328f4dc2d07682f5da552875c1912efJohn McCall if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) { 2254ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor assert(!Record->getPreviousDecl() && 2255becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "struct/union has previous declaration"); 2256becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall assert(!NeedsInjectedClassNameType(Record)); 2257400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return getRecordType(Record); 225819c8576b7328f4dc2d07682f5da552875c1912efJohn McCall } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) { 2259ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor assert(!Enum->getPreviousDecl() && 2260becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall "enum has previous declaration"); 2261400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return getEnumType(Enum); 226219c8576b7328f4dc2d07682f5da552875c1912efJohn McCall } else if (const UnresolvedUsingTypenameDecl *Using = 2263ed97649e9574b9d854fa4d6109c9333ae0993554John McCall dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) { 2264f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using); 2265f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2266f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 22679fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump } else 2268becb8d5a6ab5103393eac5344ae69bcb860601ddJohn McCall llvm_unreachable("TypeDecl without a type?"); 226949aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis 227049aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis return QualType(Decl->TypeForDecl, 0); 22712ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor} 22722ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor 22735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTypedefType - Return the unique reference to the type for the 2274162e1c1b487352434552147967c3dd296ebee2f7Richard Smith/// specified typedef name decl. 22759763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType 2276162e1c1b487352434552147967c3dd296ebee2f7Richard SmithASTContext::getTypedefType(const TypedefNameDecl *Decl, 2277162e1c1b487352434552147967c3dd296ebee2f7Richard Smith QualType Canonical) const { 22785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 22791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22809763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis if (Canonical.isNull()) 22819763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Canonical = getCanonicalType(Decl->getUnderlyingType()); 2282f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall TypedefType *newType = new(*this, TypeAlignment) 22836b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypedefType(Type::Typedef, Decl, Canonical); 2284f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2285f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2286f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 22875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 22885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getRecordType(const RecordDecl *Decl) const { 2290400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2291400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2292ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (const RecordDecl *PrevDecl = Decl->getPreviousDecl()) 2293400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (PrevDecl->TypeForDecl) 2294400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2295400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2296f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall RecordType *newType = new (*this, TypeAlignment) RecordType(Decl); 2297f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2298f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2299f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 2300400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis} 2301400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 23024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getEnumType(const EnumDecl *Decl) const { 2303400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2304400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2305ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (const EnumDecl *PrevDecl = Decl->getPreviousDecl()) 2306400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis if (PrevDecl->TypeForDecl) 2307400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2308400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 2309f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall EnumType *newType = new (*this, TypeAlignment) EnumType(Decl); 2310f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Decl->TypeForDecl = newType; 2311f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall Types.push_back(newType); 2312f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall return QualType(newType, 0); 2313400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis} 2314400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis 23159d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType ASTContext::getAttributedType(AttributedType::Kind attrKind, 23169d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType modifiedType, 23179d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType equivalentType) { 23189d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall llvm::FoldingSetNodeID id; 23199d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType::Profile(id, attrKind, modifiedType, equivalentType); 23209d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 23219d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall void *insertPos = 0; 23229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos); 23239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (type) return QualType(type, 0); 23249d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 23259d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType canon = getCanonicalType(equivalentType); 23269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall type = new (*this, TypeAlignment) 23279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedType(canon, attrKind, modifiedType, equivalentType); 23289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 23299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall Types.push_back(type); 23309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedTypes.InsertNode(type, insertPos); 23319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 23329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return QualType(type, 0); 23339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 23349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 23359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 233649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/// \brief Retrieve a substitution-result type. 233749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType 233849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm, 23394ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType Replacement) const { 2340467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(Replacement.isCanonical() 234149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall && "replacement types must always be canonical"); 234249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 234349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall llvm::FoldingSetNodeID ID; 234449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType::Profile(ID, Parm, Replacement); 234549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall void *InsertPos = 0; 234649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType *SubstParm 234749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 234849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 234949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall if (!SubstParm) { 235049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstParm = new (*this, TypeAlignment) 235149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmType(Parm, Replacement); 235249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall Types.push_back(SubstParm); 235349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 235449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall } 235549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 235649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return QualType(SubstParm, 0); 235749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 235849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 2359c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor/// \brief Retrieve a 2360c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType ASTContext::getSubstTemplateTypeParmPackType( 2361c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const TemplateTypeParmType *Parm, 2362c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const TemplateArgument &ArgPack) { 2363c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifndef NDEBUG 2364c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(), 2365c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor PEnd = ArgPack.pack_end(); 2366c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor P != PEnd; ++P) { 2367c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type"); 2368c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor assert(P->getAsType().isCanonical() && "Pack contains non-canonical type"); 2369c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2370c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#endif 2371c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2372c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor llvm::FoldingSetNodeID ID; 2373c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack); 2374c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor void *InsertPos = 0; 2375c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (SubstTemplateTypeParmPackType *SubstParm 2376c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos)) 2377c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return QualType(SubstParm, 0); 2378c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2379c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor QualType Canon; 2380c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (!Parm->isCanonicalUnqualified()) { 2381c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Canon = getCanonicalType(QualType(Parm, 0)); 2382c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon), 2383c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor ArgPack); 2384c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos); 2385c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2386c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2387c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackType *SubstParm 2388c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon, 2389c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor ArgPack); 2390c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Types.push_back(SubstParm); 2391c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 2392c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return QualType(SubstParm, 0); 2393c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 2394c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 2395fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor/// \brief Retrieve the template type parameter type for a template 23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parameter or parameter pack with the given depth, index, and (optionally) 239776e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson/// name. 23981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index, 239976e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson bool ParameterPack, 24004fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl) const { 2401fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor llvm::FoldingSetNodeID ID; 24024fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl); 2403fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor void *InsertPos = 0; 24041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateTypeParmType *TypeParm 2405fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2406fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2407fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor if (TypeParm) 2408fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return QualType(TypeParm, 0); 24091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24104fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth if (TTPDecl) { 241176e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack); 24124fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon); 2413789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2414789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor TemplateTypeParmType *TypeCheck 2415789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2416789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!TypeCheck && "Template type parameter canonical type broken"); 2417789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)TypeCheck; 241876e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson } else 24196b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeParm = new (*this, TypeAlignment) 24206b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TemplateTypeParmType(Depth, Index, ParameterPack); 2421fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2422fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor Types.push_back(TypeParm); 2423fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos); 2424fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 2425fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return QualType(TypeParm, 0); 2426fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor} 2427fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor 24283cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallTypeSourceInfo * 24293cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallASTContext::getTemplateSpecializationTypeInfo(TemplateName Name, 24303cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall SourceLocation NameLoc, 24313cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const TemplateArgumentListInfo &Args, 24323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 24337c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Name.getAsDependentTemplateName() && 24347c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 24353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType TST = getTemplateSpecializationType(Name, Args, Underlying); 24363cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 24373cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeSourceInfo *DI = CreateTypeSourceInfo(TST); 24383cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TemplateSpecializationTypeLoc TL 24393cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc()); 244055d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara TL.setTemplateKeywordLoc(SourceLocation()); 24413cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setTemplateNameLoc(NameLoc); 24423cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setLAngleLoc(Args.getLAngleLoc()); 24433cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setRAngleLoc(Args.getRAngleLoc()); 24443cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 24453cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.setArgLocInfo(i, Args[i].getLocInfo()); 24463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return DI; 24473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 24483cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 24491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 24507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorASTContext::getTemplateSpecializationType(TemplateName Template, 2451d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args, 24523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 24537c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 24547c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 24557c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 2456d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned NumArgs = Args.size(); 2457d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 24585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> ArgVec; 2459833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ArgVec.reserve(NumArgs); 2460833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0; i != NumArgs; ++i) 2461833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ArgVec.push_back(Args[i].getArgument()); 2462833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 246331f17ecbef57b5679c017c375db330546b7b5145John McCall return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs, 24643e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Underlying); 2465833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2466833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2467b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#ifndef NDEBUG 2468b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregorstatic bool hasAnyPackExpansions(const TemplateArgument *Args, 2469b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor unsigned NumArgs) { 2470b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 2471b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor if (Args[I].isPackExpansion()) 2472b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor return true; 2473b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor 2474b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor return true; 2475b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor} 2476b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor#endif 2477b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor 2478833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType 2479833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallASTContext::getTemplateSpecializationType(TemplateName Template, 24807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor const TemplateArgument *Args, 24817532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor unsigned NumArgs, 24823e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType Underlying) const { 24837c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 24847c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 24850f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor // Look through qualified template names. 24860f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 24870f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor Template = TemplateName(QTN->getTemplateDecl()); 24887c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 2489b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor bool IsTypeAlias = 24903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Template.getAsTemplateDecl() && 24913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl()); 24923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType CanonType; 24933e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!Underlying.isNull()) 24943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith CanonType = getCanonicalType(Underlying); 24953e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith else { 2496b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor // We can get here with an alias template when the specialization contains 2497b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor // a pack expansion that does not match up with a parameter pack. 2498b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor assert((!IsTypeAlias || hasAnyPackExpansions(Args, NumArgs)) && 2499b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor "Caller must compute aliased type"); 2500b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor IsTypeAlias = false; 25013e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith CanonType = getCanonicalTemplateSpecializationType(Template, Args, 25023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NumArgs); 25033e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 2504fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor 25051275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // Allocate the (non-canonical) template specialization type, but don't 25061275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // try to unique it: these types typically have location information that 25071275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // we don't unique and don't want to lose. 25083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith void *Mem = Allocate(sizeof(TemplateSpecializationType) + 25093e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith sizeof(TemplateArgument) * NumArgs + 2510b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor (IsTypeAlias? sizeof(QualType) : 0), 25116b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeAlignment); 25121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateSpecializationType *Spec 2513b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, CanonType, 2514b70126a328f89937f46db42f9e3cba1592887c91Douglas Gregor IsTypeAlias ? Underlying : QualType()); 25151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 251655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor Types.push_back(Spec); 25171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(Spec, 0); 251855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor} 251955f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor 25201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 25219763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisASTContext::getCanonicalTemplateSpecializationType(TemplateName Template, 25229763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis const TemplateArgument *Args, 25234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned NumArgs) const { 25247c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor assert(!Template.getAsDependentTemplateName() && 25257c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor "No dependent template names here!"); 25263e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 25270f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor // Look through qualified template names. 25280f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 25290f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor Template = TemplateName(QTN->getTemplateDecl()); 25307c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor 25319763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Build the canonical template specialization type. 25329763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateName CanonTemplate = getCanonicalTemplateName(Template); 25335f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> CanonArgs; 25349763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.reserve(NumArgs); 25359763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis for (unsigned I = 0; I != NumArgs; ++I) 25369763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.push_back(getCanonicalTemplateArgument(Args[I])); 25379763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 25389763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Determine whether this canonical template specialization type already 25399763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // exists. 25409763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis llvm::FoldingSetNodeID ID; 25419763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationType::Profile(ID, CanonTemplate, 25429763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.data(), NumArgs, *this); 25439763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 25449763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis void *InsertPos = 0; 25459763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationType *Spec 25469763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 25479763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 25489763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis if (!Spec) { 25499763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis // Allocate a new canonical template specialization type. 25509763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis void *Mem = Allocate((sizeof(TemplateSpecializationType) + 25519763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis sizeof(TemplateArgument) * NumArgs), 25529763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TypeAlignment); 25539763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Spec = new (Mem) TemplateSpecializationType(CanonTemplate, 25549763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis CanonArgs.data(), NumArgs, 25553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith QualType(), QualType()); 25569763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis Types.push_back(Spec); 25579763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis TemplateSpecializationTypes.InsertNode(Spec, InsertPos); 25589763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis } 25599763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 25609763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis assert(Spec->isDependentType() && 25619763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis "Non-dependent template-id type must have a canonical type"); 25629763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis return QualType(Spec, 0); 25639763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis} 25649763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis 25659763e221e16026ddf487d2564ed349d2c874a1a1Argyrios KyrtzidisQualType 2566465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword, 2567465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara NestedNameSpecifier *NNS, 25684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType NamedType) const { 2569e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor llvm::FoldingSetNodeID ID; 2570465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType::Profile(ID, Keyword, NNS, NamedType); 2571e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2572e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor void *InsertPos = 0; 2573465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2574e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor if (T) 2575e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor return QualType(T, 0); 2576e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2577789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor QualType Canon = NamedType; 2578789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor if (!Canon.isCanonical()) { 2579789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor Canon = getCanonicalType(NamedType); 2580465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2581465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara assert(!CheckT && "Elaborated canonical type broken"); 2582789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckT; 2583789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor } 2584789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2585465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara T = new (*this) ElaboratedType(Keyword, NNS, NamedType, Canon); 2586e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor Types.push_back(T); 2587465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedTypes.InsertNode(T, InsertPos); 2588e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor return QualType(T, 0); 2589e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor} 2590e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor 2591075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType 25924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getParenType(QualType InnerType) const { 2593075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara llvm::FoldingSetNodeID ID; 2594075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType::Profile(ID, InnerType); 2595075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2596075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara void *InsertPos = 0; 2597075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2598075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (T) 2599075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(T, 0); 2600075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2601075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType Canon = InnerType; 2602075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (!Canon.isCanonical()) { 2603075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Canon = getCanonicalType(InnerType); 2604075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2605075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara assert(!CheckT && "Paren canonical type broken"); 2606075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara (void)CheckT; 2607075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara } 2608075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 2609075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara T = new (*this) ParenType(InnerType, Canon); 2610075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Types.push_back(T); 2611075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenTypes.InsertNode(T, InsertPos); 2612075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(T, 0); 2613075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 2614075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 26154a2023f5014e82389d5980d307b89c545dbbac81Douglas GregorQualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword, 26164a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 26174a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor const IdentifierInfo *Name, 26184ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad QualType Canon) const { 2619d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor assert(NNS->isDependent() && "nested-name-specifier must be dependent"); 2620d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2621d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor if (Canon.isNull()) { 2622d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 26234a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor ElaboratedTypeKeyword CanonKeyword = Keyword; 26244a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor if (Keyword == ETK_None) 26254a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor CanonKeyword = ETK_Typename; 26264a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor 26274a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor if (CanonNNS != NNS || CanonKeyword != Keyword) 26284a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor Canon = getDependentNameType(CanonKeyword, CanonNNS, Name); 2629d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 2630d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2631d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor llvm::FoldingSetNodeID ID; 26324a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor DependentNameType::Profile(ID, Keyword, NNS, Name); 2633d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 2634d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor void *InsertPos = 0; 26354714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameType *T 26364714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos); 2637d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor if (T) 2638d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return QualType(T, 0); 2639d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 26404a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor T = new (*this) DependentNameType(Keyword, NNS, Name, Canon); 2641d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor Types.push_back(T); 26424714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameTypes.InsertNode(T, InsertPos); 26431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 2644d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor} 2645d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 26461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 264733500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType( 264833500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword Keyword, 26494a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 265033500955d731c73717af52088b7fc0e7a85681e7John McCall const IdentifierInfo *Name, 26514ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const TemplateArgumentListInfo &Args) const { 265233500955d731c73717af52088b7fc0e7a85681e7John McCall // TODO: avoid this copy 26535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> ArgCopy; 265433500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, E = Args.size(); I != E; ++I) 265533500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.push_back(Args[I].getArgument()); 265633500955d731c73717af52088b7fc0e7a85681e7John McCall return getDependentTemplateSpecializationType(Keyword, NNS, Name, 265733500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.size(), 265833500955d731c73717af52088b7fc0e7a85681e7John McCall ArgCopy.data()); 265933500955d731c73717af52088b7fc0e7a85681e7John McCall} 266033500955d731c73717af52088b7fc0e7a85681e7John McCall 266133500955d731c73717af52088b7fc0e7a85681e7John McCallQualType 266233500955d731c73717af52088b7fc0e7a85681e7John McCallASTContext::getDependentTemplateSpecializationType( 266333500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword Keyword, 266433500955d731c73717af52088b7fc0e7a85681e7John McCall NestedNameSpecifier *NNS, 266533500955d731c73717af52088b7fc0e7a85681e7John McCall const IdentifierInfo *Name, 266633500955d731c73717af52088b7fc0e7a85681e7John McCall unsigned NumArgs, 26674ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const TemplateArgument *Args) const { 2668aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor assert((!NNS || NNS->isDependent()) && 2669aa2187de137e5b809dcbbe14f3b61ae907a3d8aaDouglas Gregor "nested-name-specifier must be dependent"); 26701734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 2671789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor llvm::FoldingSetNodeID ID; 267233500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS, 267333500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, Args); 2674789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 2675789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor void *InsertPos = 0; 267633500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationType *T 267733500955d731c73717af52088b7fc0e7a85681e7John McCall = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 2678789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor if (T) 2679789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor return QualType(T, 0); 2680789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 268133500955d731c73717af52088b7fc0e7a85681e7John McCall NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 268233500955d731c73717af52088b7fc0e7a85681e7John McCall 268333500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeKeyword CanonKeyword = Keyword; 268433500955d731c73717af52088b7fc0e7a85681e7John McCall if (Keyword == ETK_None) CanonKeyword = ETK_Typename; 26851734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 268633500955d731c73717af52088b7fc0e7a85681e7John McCall bool AnyNonCanonArgs = false; 26875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> CanonArgs(NumArgs); 268833500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0; I != NumArgs; ++I) { 268933500955d731c73717af52088b7fc0e7a85681e7John McCall CanonArgs[I] = getCanonicalTemplateArgument(Args[I]); 269033500955d731c73717af52088b7fc0e7a85681e7John McCall if (!CanonArgs[I].structurallyEquals(Args[I])) 269133500955d731c73717af52088b7fc0e7a85681e7John McCall AnyNonCanonArgs = true; 2692789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor } 26931734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 269433500955d731c73717af52088b7fc0e7a85681e7John McCall QualType Canon; 269533500955d731c73717af52088b7fc0e7a85681e7John McCall if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) { 269633500955d731c73717af52088b7fc0e7a85681e7John McCall Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS, 269733500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, 269833500955d731c73717af52088b7fc0e7a85681e7John McCall CanonArgs.data()); 269933500955d731c73717af52088b7fc0e7a85681e7John McCall 270033500955d731c73717af52088b7fc0e7a85681e7John McCall // Find the insert position again. 270133500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 270233500955d731c73717af52088b7fc0e7a85681e7John McCall } 270333500955d731c73717af52088b7fc0e7a85681e7John McCall 270433500955d731c73717af52088b7fc0e7a85681e7John McCall void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) + 270533500955d731c73717af52088b7fc0e7a85681e7John McCall sizeof(TemplateArgument) * NumArgs), 270633500955d731c73717af52088b7fc0e7a85681e7John McCall TypeAlignment); 2707ef99001908e799c388f1363b1e607dad5f5b57d3John McCall T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS, 270833500955d731c73717af52088b7fc0e7a85681e7John McCall Name, NumArgs, Args, Canon); 27091734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor Types.push_back(T); 271033500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypes.InsertNode(T, InsertPos); 27111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 27121734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor} 27131734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor 2714cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas GregorQualType ASTContext::getPackExpansionType(QualType Pattern, 2715cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 27167536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor llvm::FoldingSetNodeID ID; 2717cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor PackExpansionType::Profile(ID, Pattern, NumExpansions); 27187536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 27197536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor assert(Pattern->containsUnexpandedParameterPack() && 27207536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor "Pack expansions must expand one or more parameter packs"); 27217536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor void *InsertPos = 0; 27227536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionType *T 27237536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 27247536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (T) 27257536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return QualType(T, 0); 27267536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 27277536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor QualType Canon; 27287536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (!Pattern.isCanonical()) { 2729cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions); 27307536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 27317536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor // Find the insert position again. 27327536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 27337536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor } 27347536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 2735cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor T = new (*this) PackExpansionType(Pattern, Canon, NumExpansions); 27367536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor Types.push_back(T); 27377536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypes.InsertNode(T, InsertPos); 27387536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor return QualType(T, 0); 27397536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 27407536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 274188cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// CmpProtocolNames - Comparison predicate for sorting protocols 274288cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner/// alphabetically. 274388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattnerstatic bool CmpProtocolNames(const ObjCProtocolDecl *LHS, 274488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner const ObjCProtocolDecl *RHS) { 27452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS->getDeclName() < RHS->getDeclName(); 274688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner} 274788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2748c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallstatic bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols, 274954e14c4db764c0636160d26c5bbf491637c83a76John McCall unsigned NumProtocols) { 275054e14c4db764c0636160d26c5bbf491637c83a76John McCall if (NumProtocols == 0) return true; 275154e14c4db764c0636160d26c5bbf491637c83a76John McCall 275261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor if (Protocols[0]->getCanonicalDecl() != Protocols[0]) 275361cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor return false; 275461cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor 275554e14c4db764c0636160d26c5bbf491637c83a76John McCall for (unsigned i = 1; i != NumProtocols; ++i) 275661cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor if (!CmpProtocolNames(Protocols[i-1], Protocols[i]) || 275761cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor Protocols[i]->getCanonicalDecl() != Protocols[i]) 275854e14c4db764c0636160d26c5bbf491637c83a76John McCall return false; 275954e14c4db764c0636160d26c5bbf491637c83a76John McCall return true; 276054e14c4db764c0636160d26c5bbf491637c83a76John McCall} 276154e14c4db764c0636160d26c5bbf491637c83a76John McCall 276254e14c4db764c0636160d26c5bbf491637c83a76John McCallstatic void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols, 276388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner unsigned &NumProtocols) { 276488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols; 27651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 276688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner // Sort protocols, keyed by name. 276788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames); 276888cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 276961cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor // Canonicalize. 277061cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor for (unsigned I = 0, N = NumProtocols; I != N; ++I) 277161cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor Protocols[I] = Protocols[I]->getCanonicalDecl(); 277261cc296de6c1f82fa84c0abb3ecd142a584838efDouglas Gregor 277388cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner // Remove duplicates. 277488cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner ProtocolsEnd = std::unique(Protocols, ProtocolsEnd); 277588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner NumProtocols = ProtocolsEnd-Protocols; 277688cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner} 277788cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2778c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType ASTContext::getObjCObjectType(QualType BaseType, 2779c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCProtocolDecl * const *Protocols, 27804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned NumProtocols) const { 2781c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // If the base type is an interface and there aren't any protocols 2782c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // to add, then the interface type will do just fine. 2783c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!NumProtocols && isa<ObjCInterfaceType>(BaseType)) 2784c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return BaseType; 2785d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff 2786c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Look in the folding set for an existing type. 2787c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall llvm::FoldingSetNodeID ID; 2788c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypeImpl::Profile(ID, BaseType, Protocols, NumProtocols); 2789d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff void *InsertPos = 0; 2790c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos)) 2791c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(QT, 0); 2792d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff 2793c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Build the canonical type, which has the canonical base type and 2794c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // a sorted-and-uniqued list of protocols. 279554e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Canonical; 2796c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall bool ProtocolsSorted = areSortedAndUniqued(Protocols, NumProtocols); 2797c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ProtocolsSorted || !BaseType.isCanonical()) { 2798c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ProtocolsSorted) { 27995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols, 28000237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer Protocols + NumProtocols); 280154e14c4db764c0636160d26c5bbf491637c83a76John McCall unsigned UniqueCount = NumProtocols; 280254e14c4db764c0636160d26c5bbf491637c83a76John McCall 280354e14c4db764c0636160d26c5bbf491637c83a76John McCall SortAndUniqueProtocols(&Sorted[0], UniqueCount); 2804c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectType(getCanonicalType(BaseType), 2805c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall &Sorted[0], UniqueCount); 280654e14c4db764c0636160d26c5bbf491637c83a76John McCall } else { 2807c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectType(getCanonicalType(BaseType), 2808c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Protocols, NumProtocols); 280954e14c4db764c0636160d26c5bbf491637c83a76John McCall } 281054e14c4db764c0636160d26c5bbf491637c83a76John McCall 281154e14c4db764c0636160d26c5bbf491637c83a76John McCall // Regenerate InsertPos. 2812c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos); 281354e14c4db764c0636160d26c5bbf491637c83a76John McCall } 281454e14c4db764c0636160d26c5bbf491637c83a76John McCall 2815c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall unsigned Size = sizeof(ObjCObjectTypeImpl); 2816c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Size += NumProtocols * sizeof(ObjCProtocolDecl *); 2817fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor void *Mem = Allocate(Size, TypeAlignment); 2818c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypeImpl *T = 2819c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall new (Mem) ObjCObjectTypeImpl(Canonical, BaseType, Protocols, NumProtocols); 28201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2821c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Types.push_back(T); 2822c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectTypes.InsertNode(T, InsertPos); 2823c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return QualType(T, 0); 2824d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff} 282588cb27a160adc305783a44f922ee4b216006ebf9Chris Lattner 2826c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for 2827c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/// the given object type. 28284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const { 28294b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian llvm::FoldingSetNodeID ID; 2830c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerType::Profile(ID, ObjectT); 28311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28324b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian void *InsertPos = 0; 2833c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ObjCObjectPointerType *QT = 2834c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 28354b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian return QualType(QT, 0); 28361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2837c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Find the canonical object type. 283854e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Canonical; 2839c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ObjectT.isCanonical()) { 2840c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT)); 284154e14c4db764c0636160d26c5bbf491637c83a76John McCall 2842c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Regenerate InsertPos. 2843c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 284454e14c4db764c0636160d26c5bbf491637c83a76John McCall } 284554e14c4db764c0636160d26c5bbf491637c83a76John McCall 2846c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // No match. 2847c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment); 2848c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerType *QType = 2849c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall new (Mem) ObjCObjectPointerType(Canonical, ObjectT); 285024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 285124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis Types.push_back(QType); 2852c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypes.InsertNode(QType, InsertPos); 285324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis return QualType(QType, 0); 285424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 285524fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2856deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// getObjCInterfaceType - Return the unique reference to the type for the 2857deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor/// specified ObjC interface decl. The list of protocols is optional. 28580af550115df1f57f17a4f125ff0e8b34820c65d1Douglas GregorQualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl, 28590af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor ObjCInterfaceDecl *PrevDecl) const { 2860deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor if (Decl->TypeForDecl) 2861deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor return QualType(Decl->TypeForDecl, 0); 286274c730ad1f6818b676b0bad46d806a9176950328Sebastian Redl 28630af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor if (PrevDecl) { 28640af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl"); 28650af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor Decl->TypeForDecl = PrevDecl->TypeForDecl; 28660af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor return QualType(PrevDecl->TypeForDecl, 0); 28670af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor } 28680af550115df1f57f17a4f125ff0e8b34820c65d1Douglas Gregor 28698d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor // Prefer the definition, if there is one. 28708d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor if (const ObjCInterfaceDecl *Def = Decl->getDefinition()) 28718d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor Decl = Def; 28728d2dbbf9ddfd9d762a341d83f83d840ff68ce03dDouglas Gregor 2873deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment); 2874deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ObjCInterfaceType *T = new (Mem) ObjCInterfaceType(Decl); 2875deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Decl->TypeForDecl = T; 2876deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor Types.push_back(T); 2877deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor return QualType(T, 0); 2878c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 2879c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 288072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique 288172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor/// TypeOfExprType AST's (since expression's are never shared). For example, 28829752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// multiple declarations that refer to "typeof(x)" all contain different 28831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// DeclRefExpr's. This doesn't effect the type checker, since it operates 28849752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique). 28854ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfExprType(Expr *tofExpr) const { 2886dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor TypeOfExprType *toe; 2887b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor if (tofExpr->isTypeDependent()) { 2888b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor llvm::FoldingSetNodeID ID; 2889b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprType::Profile(ID, *this, tofExpr); 28901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2891b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor void *InsertPos = 0; 2892b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprType *Canon 2893b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos); 2894b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor if (Canon) { 2895b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // We already have a "canonical" version of an identical, dependent 2896b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // typeof(expr) type. Use that as our canonical type. 28976b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, 2898b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor QualType((TypeOfExprType*)Canon, 0)); 28993060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 2900b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor // Build a new, canonical typeof(expr) type. 29016b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Canon 29026b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr); 2903b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor DependentTypeOfExprTypes.InsertNode(Canon, InsertPos); 2904b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor toe = Canon; 2905b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor } 2906b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor } else { 2907dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor QualType Canonical = getCanonicalType(tofExpr->getType()); 29086b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical); 2909dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor } 29109752f25748d954df99087d741ea35db37ff16beaSteve Naroff Types.push_back(toe); 29119752f25748d954df99087d741ea35db37ff16beaSteve Naroff return QualType(toe, 0); 2912d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff} 2913d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff 29149752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// getTypeOfType - Unlike many "get<Type>" functions, we don't unique 29159752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// TypeOfType AST's. The only motivation to unique these nodes would be 29169752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be 29171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates 29189752f25748d954df99087d741ea35db37ff16beaSteve Naroff/// on canonical type's (which are always unique). 29194ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTypeOfType(QualType tofType) const { 2920f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner QualType Canonical = getCanonicalType(tofType); 29216b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical); 29229752f25748d954df99087d741ea35db37ff16beaSteve Naroff Types.push_back(tot); 29239752f25748d954df99087d741ea35db37ff16beaSteve Naroff return QualType(tot, 0); 2924d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff} 2925d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff 292660a9a2a404a4cf259d39133383e922aa00ca9043Anders Carlsson 2927395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// getDecltypeType - Unlike many "get<Type>" functions, we don't unique 2928395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// DecltypeType AST's. The only motivation to unique these nodes would be 2929395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be 29301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// an issue. This doesn't effect the type checker, since it operates 293139e02032b01874a0d02ba85a4cd3922adda81376David Blaikie/// on canonical types (which are always unique). 2932f8af98286022f72157d84951b48fde5fb369ab29Douglas GregorQualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const { 2933dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor DecltypeType *dt; 2934561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 2935561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // C++0x [temp.type]p2: 2936561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // If an expression e involves a template parameter, decltype(e) denotes a 2937561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // unique dependent type. Two such decltype-specifiers refer to the same 2938561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // type only if their expressions are equivalent (14.5.6.1). 2939561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (e->isInstantiationDependent()) { 29409d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor llvm::FoldingSetNodeID ID; 29419d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeType::Profile(ID, *this, e); 29421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29439d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor void *InsertPos = 0; 29449d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeType *Canon 29459d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos); 29469d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor if (Canon) { 29479d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // We already have a "canonical" version of an equivalent, dependent 29489d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // decltype type. Use that as our canonical type. 29496b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall dt = new (*this, TypeAlignment) DecltypeType(e, DependentTy, 29509d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor QualType((DecltypeType*)Canon, 0)); 29513060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 29529d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor // Build a new, canonical typeof(expr) type. 29536b304a0254a13f42390b865ff5ba668a49cc58aeJohn McCall Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e); 29549d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor DependentDecltypeTypes.InsertNode(Canon, InsertPos); 29559d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor dt = Canon; 29569d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor } 29579d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor } else { 2958f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor dt = new (*this, TypeAlignment) DecltypeType(e, UnderlyingType, 2959f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor getCanonicalType(UnderlyingType)); 2960dd0257c77719a13d4acd513df40b04300cbfc871Douglas Gregor } 2961395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson Types.push_back(dt); 2962395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson return QualType(dt, 0); 2963395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson} 2964395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 2965ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// getUnaryTransformationType - We don't unique these, since the memory 2966ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt/// savings are minimal and these are rare. 2967ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntQualType ASTContext::getUnaryTransformType(QualType BaseType, 2968ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt QualType UnderlyingType, 2969ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt UnaryTransformType::UTTKind Kind) 2970ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt const { 2971ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt UnaryTransformType *Ty = 297269d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType, 297369d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor Kind, 297469d9775da47a4b9f165dbc33277f02982928a94eDouglas Gregor UnderlyingType->isDependentType() ? 297512fc4b0624706b474fa10308631fa8daf92f340fPeter Collingbourne QualType() : getCanonicalType(UnderlyingType)); 2976ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt Types.push_back(Ty); 2977ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return QualType(Ty, 0); 2978ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 2979ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 2980483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith/// getAutoType - We only unique auto types after they've been deduced. 298134b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTContext::getAutoType(QualType DeducedType) const { 2982483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith void *InsertPos = 0; 2983483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (!DeducedType.isNull()) { 2984483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith // Look in the folding set for an existing type. 2985483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith llvm::FoldingSetNodeID ID; 2986483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoType::Profile(ID, DeducedType); 2987483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos)) 2988483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith return QualType(AT, 0); 2989483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith } 2990483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith 2991483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType); 2992483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith Types.push_back(AT); 2993483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith if (InsertPos) 2994483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith AutoTypes.InsertNode(AT, InsertPos); 2995483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith return QualType(AT, 0); 299634b41d939a1328f484511c6002ba2456db879a29Richard Smith} 299734b41d939a1328f484511c6002ba2456db879a29Richard Smith 2998b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// getAtomicType - Return the uniqued reference to the atomic type for 2999b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman/// the given value type. 3000b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanQualType ASTContext::getAtomicType(QualType T) const { 3001b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Unique pointers, to guarantee there is only one pointer of a particular 3002b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // structure. 3003b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman llvm::FoldingSetNodeID ID; 3004b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType::Profile(ID, T); 3005b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3006b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman void *InsertPos = 0; 3007b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos)) 3008b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return QualType(AT, 0); 3009b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3010b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // If the atomic value type isn't canonical, this won't be a canonical type 3011b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // either, so fill in the canonical type field. 3012b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType Canonical; 3013b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (!T.isCanonical()) { 3014b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Canonical = getAtomicType(getCanonicalType(T)); 3015b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3016b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Get the new insert position for the node we care about. 3017b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos); 3018b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 3019b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 3020b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicType *New = new (*this, TypeAlignment) AtomicType(T, Canonical); 3021b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Types.push_back(New); 3022b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman AtomicTypes.InsertNode(New, InsertPos); 3023b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return QualType(New, 0); 3024b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman} 3025b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 3026ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoDeductType - Get type pattern for deducing against 'auto'. 3027ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoDeductType() const { 3028ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith if (AutoDeductTy.isNull()) 3029ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith AutoDeductTy = getAutoType(QualType()); 3030ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith assert(!AutoDeductTy.isNull() && "can't build 'auto' pattern"); 3031ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith return AutoDeductTy; 3032ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 3033ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 3034ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith/// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'. 3035ad762fcdc16b9e4705b12b09d92b8c026212b906Richard SmithQualType ASTContext::getAutoRRefDeductType() const { 3036ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith if (AutoRRefDeductTy.isNull()) 3037ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType()); 3038ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern"); 3039ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith return AutoRRefDeductTy; 3040ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 3041ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 30425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getTagDeclType - Return the unique reference to the type for the 30435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified TagDecl (struct/union/class/enum) decl. 30444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getTagDeclType(const TagDecl *Decl) const { 3045d778f88d32b96a74c9edb7342c81357606a7cdc0Ted Kremenek assert (Decl); 3046e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump // FIXME: What is the design on getTagDeclType when it requires casting 3047e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump // away const? mutable? 3048e607ed068334bacb8d7b093996b4671c6ca79e25Mike Stump return getTypeDeclType(const_cast<TagDecl*>(Decl)); 30495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 30505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getSizeType - Return the unique type for "size_t" (C99 7.17), the result 30521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and 30531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// needs to agree with the definition in <stddef.h>. 3054a3ccda58913cc1a4b8564e349448b12acc462da7Anders CarlssonCanQualType ASTContext::getSizeType() const { 3055bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return getFromTargetType(Target->getSizeType()); 30565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 30575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 305829e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5). 305929e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getIntMaxType() const { 306029e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg return getFromTargetType(Target->getIntMaxType()); 306129e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg} 306229e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg 306329e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5). 306429e97cb35fab314388f62b68fefa78947e93c1dcHans WennborgCanQualType ASTContext::getUIntMaxType() const { 306529e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg return getFromTargetType(Target->getUIntMaxType()); 306629e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg} 306729e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg 306864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getSignedWCharType - Return the type of "signed wchar_t". 306964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension. 307064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getSignedWCharType() const { 307164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // FIXME: derive from "Target" ? 307264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis return WCharTy; 307364c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis} 307464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 307564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// getUnsignedWCharType - Return the type of "unsigned wchar_t". 307664c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis/// Used when in C++, as a GCC extension. 307764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios KyrtzidisQualType ASTContext::getUnsignedWCharType() const { 307864c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // FIXME: derive from "Target" ? 307964c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis return UnsignedIntTy; 308064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis} 308164c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis 308229e97cb35fab314388f62b68fefa78947e93c1dcHans Wennborg/// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17) 30838b9023ba35a86838789e2c9034a6128728c547aaChris Lattner/// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9). 30848b9023ba35a86838789e2c9034a6128728c547aaChris LattnerQualType ASTContext::getPointerDiffType() const { 3085bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return getFromTargetType(Target->getPtrDiffType(0)); 30868b9023ba35a86838789e2c9034a6128728c547aaChris Lattner} 30878b9023ba35a86838789e2c9034a6128728c547aaChris Lattner 3088e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===// 3089e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner// Type Operators 3090e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner//===----------------------------------------------------------------------===// 3091e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 30924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCanQualType ASTContext::getCanonicalParamType(QualType T) const { 309354e14c4db764c0636160d26c5bbf491637c83a76John McCall // Push qualifiers into arrays, and then discard any remaining 309454e14c4db764c0636160d26c5bbf491637c83a76John McCall // qualifiers. 309554e14c4db764c0636160d26c5bbf491637c83a76John McCall T = getCanonicalType(T); 3096745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian T = getVariableArrayDecayedType(T); 309754e14c4db764c0636160d26c5bbf491637c83a76John McCall const Type *Ty = T.getTypePtr(); 309854e14c4db764c0636160d26c5bbf491637c83a76John McCall QualType Result; 309954e14c4db764c0636160d26c5bbf491637c83a76John McCall if (isa<ArrayType>(Ty)) { 310054e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = getArrayDecayedType(QualType(Ty,0)); 310154e14c4db764c0636160d26c5bbf491637c83a76John McCall } else if (isa<FunctionType>(Ty)) { 310254e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = getPointerType(QualType(Ty, 0)); 310354e14c4db764c0636160d26c5bbf491637c83a76John McCall } else { 310454e14c4db764c0636160d26c5bbf491637c83a76John McCall Result = QualType(Ty, 0); 310554e14c4db764c0636160d26c5bbf491637c83a76John McCall } 310654e14c4db764c0636160d26c5bbf491637c83a76John McCall 310754e14c4db764c0636160d26c5bbf491637c83a76John McCall return CanQualType::CreateUnsafe(Result); 310854e14c4db764c0636160d26c5bbf491637c83a76John McCall} 310954e14c4db764c0636160d26c5bbf491637c83a76John McCall 311062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCallQualType ASTContext::getUnqualifiedArrayType(QualType type, 311162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall Qualifiers &quals) { 311262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall SplitQualType splitType = type.getSplitUnqualifiedType(); 311362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 311462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // FIXME: getSplitUnqualifiedType() actually walks all the way to 311562c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // the unqualified desugared type and then drops it on the floor. 311662c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // We then have to strip that sugar back off with 311762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // getUnqualifiedDesugaredType(), which is silly. 311862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall const ArrayType *AT = 3119200fa53fd420aa8369586f569dbece04930ad6a3John McCall dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType()); 312062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 312162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // If we don't have an array, just use the results in splitType. 31229dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (!AT) { 3123200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals = splitType.Quals; 3124200fa53fd420aa8369586f569dbece04930ad6a3John McCall return QualType(splitType.Ty, 0); 312528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 312628e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 312762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // Otherwise, recurse on the array's element type. 312862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall QualType elementType = AT->getElementType(); 312962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall QualType unqualElementType = getUnqualifiedArrayType(elementType, quals); 313062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 313162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // If that didn't change the element type, AT has no qualifiers, so we 313262c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // can just use the results in splitType. 313362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall if (elementType == unqualElementType) { 313462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall assert(quals.empty()); // from the recursive call 3135200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals = splitType.Quals; 3136200fa53fd420aa8369586f569dbece04930ad6a3John McCall return QualType(splitType.Ty, 0); 313762c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall } 313862c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall 313962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // Otherwise, add in the qualifiers from the outermost type, then 314062c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall // build the type back up. 3141200fa53fd420aa8369586f569dbece04930ad6a3John McCall quals.addConsistentQualifiers(splitType.Quals); 314228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 31439dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 314462c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getConstantArrayType(unqualElementType, CAT->getSize(), 314528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth CAT->getSizeModifier(), 0); 314628e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 314728e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 31489dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 314962c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0); 315028e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth } 315128e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 31529dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(AT)) { 315362c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getVariableArrayType(unqualElementType, 31543fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall VAT->getSizeExpr(), 31559dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getSizeModifier(), 31569dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getIndexTypeCVRQualifiers(), 31579dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor VAT->getBracketsRange()); 31589dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor } 31599dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor 31609dadd94e1c17fa030d1f88d8f2113ff59ccc6714Douglas Gregor const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(AT); 316162c28c831bbf207cc36e683e7c321fc33bf8928cJohn McCall return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(), 316228e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth DSAT->getSizeModifier(), 0, 316328e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth SourceRange()); 316428e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth} 316528e318cc6008c2bc008f0caee70dc736a03d6289Chandler Carruth 31665a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types that 31675a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// may be similar (C++ 4.4), replaces T1 and T2 with the type that 31685a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// they point to and return true. If T1 and T2 aren't pointer types 31695a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// or pointer-to-member types, or if they are not similar at this 31705a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// level, returns false and leaves T1 and T2 unchanged. Top-level 31715a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// qualifiers on T1 and T2 are ignored. This function will typically 31725a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// be called in a loop that successively "unwraps" pointer and 31735a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor/// pointer-to-member types to compare them at each level. 31745a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregorbool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) { 31755a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const PointerType *T1PtrType = T1->getAs<PointerType>(), 31765a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2PtrType = T2->getAs<PointerType>(); 31775a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1PtrType && T2PtrType) { 31785a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1PtrType->getPointeeType(); 31795a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2PtrType->getPointeeType(); 31805a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 31815a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 31825a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 31835a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(), 31845a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2MPType = T2->getAs<MemberPointerType>(); 31855a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1MPType && T2MPType && 31865a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0), 31875a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor QualType(T2MPType->getClass(), 0))) { 31885a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1MPType->getPointeeType(); 31895a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2MPType->getPointeeType(); 31905a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 31915a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 31925a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 31934e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1) { 31945a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor const ObjCObjectPointerType *T1OPType = T1->getAs<ObjCObjectPointerType>(), 31955a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor *T2OPType = T2->getAs<ObjCObjectPointerType>(); 31965a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor if (T1OPType && T2OPType) { 31975a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T1 = T1OPType->getPointeeType(); 31985a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor T2 = T2OPType->getPointeeType(); 31995a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return true; 32005a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 32015a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 32025a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 32035a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor // FIXME: Block pointers, too? 32045a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 32055a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor return false; 32065a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor} 32075a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 32084ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameInfo 32094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getNameForTemplate(TemplateName Name, 32104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad SourceLocation NameLoc) const { 3211146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall switch (Name.getKind()) { 3212146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::QualifiedTemplate: 3213146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::Template: 32142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: CHECKME: what about DNLoc? 3215146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(), 3216146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 32172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 3218146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::OverloadedTemplate: { 3219146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate(); 3220146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall // DNInfo work in progress: CHECKME: what about DNLoc? 3221146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc); 3222146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3223146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3224146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::DependentTemplate: { 3225146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 32262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName DName; 322780ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall if (DTN->isIdentifier()) { 32282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DName = DeclarationNames.getIdentifier(DTN->getIdentifier()); 32292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(DName, NameLoc); 323080ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } else { 32312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DName = DeclarationNames.getCXXOperatorName(DTN->getOperator()); 32322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: FIXME: source locations? 32332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameLoc DNLoc; 32342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DNLoc.CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding(); 32352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DNLoc.CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding(); 32362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(DName, NameLoc, DNLoc); 323780ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } 323880ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall } 323980ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall 3240146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 3241146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 3242146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 3243146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(subst->getParameter()->getDeclName(), 3244146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 3245146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3246146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3247146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParmPack: { 3248146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmPackStorage *subst 3249146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParmPack(); 3250146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DeclarationNameInfo(subst->getParameterPack()->getDeclName(), 3251146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall NameLoc); 3252146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3253146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3254146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3255146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("bad template name kind!"); 325680ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall} 325780ad16f4b2b350ddbaae21a52975e63df5aafc2cJohn McCall 32584ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const { 3259146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall switch (Name.getKind()) { 3260146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::QualifiedTemplate: 3261146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::Template: { 3262146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateDecl *Template = Name.getAsTemplateDecl(); 32633e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor if (TemplateTemplateParmDecl *TTP 3264146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = dyn_cast<TemplateTemplateParmDecl>(Template)) 32653e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor Template = getCanonicalTemplateTemplateParmDecl(TTP); 32663e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor 32673e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor // The canonical template name is the canonical template declaration. 326897fbaa2a38804268a024f1a104b43fcf8b4411b0Argyrios Kyrtzidis return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl())); 32693e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor } 327025a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor 3271146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::OverloadedTemplate: 3272146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("cannot canonicalize overloaded template"); 3273146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3274146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::DependentTemplate: { 3275146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 3276146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall assert(DTN && "Non-dependent template names must refer to template decls."); 3277146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return DTN->CanonicalTemplateName; 3278146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3279146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3280146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 3281146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 3282146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 3283146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return getCanonicalTemplateName(subst->getReplacement()); 32841aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 32851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3286146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParmPack: { 3287146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmPackStorage *subst 3288146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParmPack(); 3289146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateTemplateParmDecl *canonParameter 3290146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack()); 3291146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateArgument canonArgPack 3292146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = getCanonicalTemplateArgument(subst->getArgumentPack()); 3293146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack); 3294146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3295146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 3296146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 3297146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm_unreachable("bad template name!"); 329825a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor} 329925a3ef7cc5fd55dc8cc67c6e6770c8595657e082Douglas Gregor 3300db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregorbool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) { 3301db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor X = getCanonicalTemplateName(X); 3302db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor Y = getCanonicalTemplateName(Y); 3303db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor return X.getAsVoidPointer() == Y.getAsVoidPointer(); 3304db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor} 3305db0d4b751e83b8841b8f48f913f17e50467f13d4Douglas Gregor 33061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument 33074ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const { 33081275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor switch (Arg.getKind()) { 33091275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Null: 33101275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor return Arg; 33111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33121275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Expression: 33131275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor return Arg; 33141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33151275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Declaration: 3316833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TemplateArgument(Arg.getAsDecl()->getCanonicalDecl()); 33171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3318788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 3319788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate())); 3320a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 3321a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 3322a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgument(getCanonicalTemplateName( 3323a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg.getAsTemplateOrTemplatePattern()), 33242be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor Arg.getNumTemplateExpansions()); 3325a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 33261275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Integral: 3327833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TemplateArgument(*Arg.getAsIntegral(), 33281275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor getCanonicalType(Arg.getIntegralType())); 33291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33301275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Type: 3331833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TemplateArgument(getCanonicalType(Arg.getAsType())); 33321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33331275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor case TemplateArgument::Pack: { 333487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor if (Arg.pack_size() == 0) 333587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor return Arg; 333687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 3337910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *CanonArgs 3338910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = new (*this) TemplateArgument[Arg.pack_size()]; 33391275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor unsigned Idx = 0; 33401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 33411275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor AEnd = Arg.pack_end(); 33421275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor A != AEnd; (void)++A, ++Idx) 33431275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor CanonArgs[Idx] = getCanonicalTemplateArgument(*A); 33441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3345910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return TemplateArgument(CanonArgs, Arg.pack_size()); 33461275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor } 33471275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor } 33481275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor 33491275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor // Silence GCC warning 3350b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unhandled template argument kind"); 33511275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor} 33521275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor 3353d57959af02b4af695276f4204443afe6e5d86bd8Douglas GregorNestedNameSpecifier * 33544ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const { 33551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!NNS) 3356d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return 0; 3357d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3358d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor switch (NNS->getKind()) { 3359d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Identifier: 3360d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // Canonicalize the prefix but keep the identifier the same. 33611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return NestedNameSpecifier::Create(*this, 3362d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor getCanonicalNestedNameSpecifier(NNS->getPrefix()), 3363d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor NNS->getAsIdentifier()); 3364d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3365d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Namespace: 3366d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // A namespace is canonical; build a nested-name-specifier with 3367d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // this namespace and no prefix. 336814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(*this, 0, 336914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespace()->getOriginalNamespace()); 337014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 337114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor case NestedNameSpecifier::NamespaceAlias: 337214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor // A namespace is canonical; build a nested-name-specifier with 337314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor // this namespace and no prefix. 337414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(*this, 0, 337514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespaceAlias()->getNamespace() 337614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor ->getOriginalNamespace()); 3377d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3378d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::TypeSpec: 3379d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: { 3380d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor QualType T = getCanonicalType(QualType(NNS->getAsType(), 0)); 3381264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor 3382264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // If we have some kind of dependent-named type (e.g., "typename T::type"), 3383264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // break it apart into its prefix and identifier, then reconsititute those 3384264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // as the canonical nested-name-specifier. This is required to canonicalize 3385264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // a dependent nested-name-specifier involving typedefs of dependent-name 3386264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // types, e.g., 3387264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // typedef typename T::type T1; 3388264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor // typedef typename T1::type T2; 338916412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman if (const DependentNameType *DNT = T->getAs<DependentNameType>()) 339016412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman return NestedNameSpecifier::Create(*this, DNT->getQualifier(), 3391264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor const_cast<IdentifierInfo *>(DNT->getIdentifier())); 3392264bf66d55563dd86a3d7e06738aa427de512d2cDouglas Gregor 339316412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // Otherwise, just canonicalize the type, and force it to be a TypeSpec. 339416412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // FIXME: Why are TypeSpec and TypeSpecWithTemplate distinct in the 339516412ef25a2203b7066d0db2b41f944631e5cf79Eli Friedman // first place? 33963b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return NestedNameSpecifier::Create(*this, 0, false, 33973b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall const_cast<Type*>(T.getTypePtr())); 3398d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 3399d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3400d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case NestedNameSpecifier::Global: 3401d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor // The global specifier is canonical and unique. 3402d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor return NNS; 3403d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor } 3404d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 34057530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid NestedNameSpecifier::Kind!"); 3406d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor} 3407d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor 3408c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner 34094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadconst ArrayType *ASTContext::getAsArrayType(QualType T) const { 3410c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Handle the non-qualified case efficiently. 3411a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor if (!T.hasLocalQualifiers()) { 3412c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Handle the common positive case fast. 3413c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ArrayType *AT = dyn_cast<ArrayType>(T)) 3414c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return AT; 3415c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner } 34161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34170953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Handle the common negative case fast. 34183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!isa<ArrayType>(T.getCanonicalType())) 3419c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return 0; 34201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Apply any qualifiers from the array type to the element type. This 3422c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // implements C99 6.7.3p8: "If the specification of an array type includes 3423c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // any type qualifiers, the element type is so qualified, not the array type." 34241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3425c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If we get here, we either have type qualifiers on the type, or we have 3426c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // sugar such as a typedef in the way. If we have type qualifiers on the type 342750d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor // we must propagate them down into the element type. 34280953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 34293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType split = T.getSplitDesugaredType(); 3430200fa53fd420aa8369586f569dbece04930ad6a3John McCall Qualifiers qs = split.Quals; 34311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3432c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If we have a simple case, just return now. 3433200fa53fd420aa8369586f569dbece04930ad6a3John McCall const ArrayType *ATy = dyn_cast<ArrayType>(split.Ty); 34343b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (ATy == 0 || qs.empty()) 3435c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return ATy; 34361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3437c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Otherwise, we have an array and we have qualifiers on it. Push the 3438c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // qualifiers into the array element type and return a new array type. 34393b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs); 34401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3441c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy)) 3442c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(), 3443c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner CAT->getSizeModifier(), 34440953e767ff7817f97b3ab20896b229891eeff45bJohn McCall CAT->getIndexTypeCVRQualifiers())); 3445c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy)) 3446c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return cast<ArrayType>(getIncompleteArrayType(NewEltTy, 3447c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner IAT->getSizeModifier(), 34480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall IAT->getIndexTypeCVRQualifiers())); 3449898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 34501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const DependentSizedArrayType *DSAT 3451898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor = dyn_cast<DependentSizedArrayType>(ATy)) 3452898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return cast<ArrayType>( 34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDependentSizedArrayType(NewEltTy, 34543fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall DSAT->getSizeExpr(), 3455898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor DSAT->getSizeModifier(), 34560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall DSAT->getIndexTypeCVRQualifiers(), 34577e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor DSAT->getBracketsRange())); 34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3459c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner const VariableArrayType *VAT = cast<VariableArrayType>(ATy); 34607e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor return cast<ArrayType>(getVariableArrayType(NewEltTy, 34613fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall VAT->getSizeExpr(), 3462c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner VAT->getSizeModifier(), 34630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall VAT->getIndexTypeCVRQualifiers(), 34647e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor VAT->getBracketsRange())); 346577c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner} 346677c9647cae939104c6cb2b6a4dd8ca859d2e5770Chris Lattner 346779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas GregorQualType ASTContext::getAdjustedParameterType(QualType T) { 346879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // C99 6.7.5.3p7: 346979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // A declaration of a parameter as "array of type" shall be 347079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // adjusted to "qualified pointer to type", where the type 347179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // qualifiers (if any) are those specified within the [ and ] of 347279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // the array type derivation. 347379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor if (T->isArrayType()) 347479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return getArrayDecayedType(T); 347579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 347679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // C99 6.7.5.3p8: 347779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // A declaration of a parameter as "function returning type" 347879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // shall be adjusted to "pointer to function returning type", as 347979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor // in 6.3.2.1. 348079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor if (T->isFunctionType()) 348179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return getPointerType(T); 348279e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 348379e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return T; 348479e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor} 348579e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 348679e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas GregorQualType ASTContext::getSignatureParameterType(QualType T) { 348779e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor T = getVariableArrayDecayedType(T); 348879e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor T = getAdjustedParameterType(T); 348979e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor return T.getUnqualifiedType(); 349079e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor} 349179e6bd379773447a74cc3e579d9081e4c5cb6d63Douglas Gregor 3492e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// getArrayDecayedType - Return the properly qualified result of decaying the 3493e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// specified array type to a pointer. This operation is non-trivial when 3494e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// handling typedefs etc. The canonical type of "T" must be an array type, 3495e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// this returns a pointer to a properly qualified element of the array. 3496e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// 3497e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner/// See C99 6.7.5.3p7 and C99 6.3.2.1p3. 34984ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getArrayDecayedType(QualType Ty) const { 3499c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // Get the element type with 'getAsArrayType' so that we don't lose any 3500c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // typedefs in the element type of the array. This also handles propagation 3501c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // of type qualifiers from the array type into the element type if present 3502c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // (C99 6.7.3p8). 3503c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner const ArrayType *PrettyArrayType = getAsArrayType(Ty); 3504c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner assert(PrettyArrayType && "Not an array type!"); 35051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3506c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner QualType PtrTy = getPointerType(PrettyArrayType->getElementType()); 3507e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 3508e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner // int x[restrict 4] -> int *restrict 35090953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers()); 3510e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner} 3511e6327747b72bb687c948270f702ff53c30f411a6Chris Lattner 35123b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(const ArrayType *array) const { 35133b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return getBaseElementType(array->getElementType()); 35145e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor} 35155e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor 35163b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCallQualType ASTContext::getBaseElementType(QualType type) const { 35173b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Qualifiers qs; 35183b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall while (true) { 35193b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall SplitQualType split = type.getSplitDesugaredType(); 3520200fa53fd420aa8369586f569dbece04930ad6a3John McCall const ArrayType *array = split.Ty->getAsArrayTypeUnsafe(); 35213b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!array) break; 35221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35233b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall type = array->getElementType(); 3524200fa53fd420aa8369586f569dbece04930ad6a3John McCall qs.addConsistentQualifiers(split.Quals); 35253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall } 35261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall return getQualifiedType(type, qs); 35286183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson} 35296183a99b064b397d98297904fbd6cf00fe1f453dAnders Carlsson 35300de78998e7bda473b408437053e48661b510d453Fariborz Jahanian/// getConstantArrayElementCount - Returns number of constant array elements. 35311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpuint64_t 35320de78998e7bda473b408437053e48661b510d453Fariborz JahanianASTContext::getConstantArrayElementCount(const ConstantArrayType *CA) const { 35330de78998e7bda473b408437053e48661b510d453Fariborz Jahanian uint64_t ElementCount = 1; 35340de78998e7bda473b408437053e48661b510d453Fariborz Jahanian do { 35350de78998e7bda473b408437053e48661b510d453Fariborz Jahanian ElementCount *= CA->getSize().getZExtValue(); 35360de78998e7bda473b408437053e48661b510d453Fariborz Jahanian CA = dyn_cast<ConstantArrayType>(CA->getElementType()); 35370de78998e7bda473b408437053e48661b510d453Fariborz Jahanian } while (CA); 35380de78998e7bda473b408437053e48661b510d453Fariborz Jahanian return ElementCount; 35390de78998e7bda473b408437053e48661b510d453Fariborz Jahanian} 35400de78998e7bda473b408437053e48661b510d453Fariborz Jahanian 35415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getFloatingRank - Return a relative rank for floating point types. 35425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// This routine will assert if passed a built-in type that isn't a float. 3543a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattnerstatic FloatingRank getFloatingRank(QualType T) { 3544183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType *CT = T->getAs<ComplexType>()) 35455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return getFloatingRank(CT->getElementType()); 3546a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner 3547183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type"); 3548183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall switch (T->getAs<BuiltinType>()->getKind()) { 3549b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("getFloatingRank(): not a floating type"); 3550aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case BuiltinType::Half: return HalfRank; 35515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Float: return FloatRank; 35525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Double: return DoubleRank; 35535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongDouble: return LongDoubleRank; 35545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 35555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 35565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getFloatingTypeOfSizeWithinDomain - Returns a real floating 35581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// point or a complex type (based on typeDomain/typeSize). 3559716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeDomain' is a real floating point or complex type. 3560716c7304ff5d27a95e1e7823acd1d09d5ec3e37fSteve Naroff/// 'typeSize' is a real floating point or complex type. 35611361b11066239ea15764a2a844405352d87296b3Chris LattnerQualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size, 35621361b11066239ea15764a2a844405352d87296b3Chris Lattner QualType Domain) const { 35631361b11066239ea15764a2a844405352d87296b3Chris Lattner FloatingRank EltRank = getFloatingRank(Size); 35641361b11066239ea15764a2a844405352d87296b3Chris Lattner if (Domain->isComplexType()) { 35651361b11066239ea15764a2a844405352d87296b3Chris Lattner switch (EltRank) { 3566561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie case HalfRank: llvm_unreachable("Complex half is not supported"); 3567f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case FloatRank: return FloatComplexTy; 3568f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case DoubleRank: return DoubleComplexTy; 3569f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff case LongDoubleRank: return LongDoubleComplexTy; 3570f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff } 3571f1448a0e4a1e868ff873a8530a61a09cb68666ccSteve Naroff } 35721361b11066239ea15764a2a844405352d87296b3Chris Lattner 35731361b11066239ea15764a2a844405352d87296b3Chris Lattner assert(Domain->isRealFloatingType() && "Unknown domain!"); 35741361b11066239ea15764a2a844405352d87296b3Chris Lattner switch (EltRank) { 3575561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie case HalfRank: llvm_unreachable("Half ranks are not valid here"); 35761361b11066239ea15764a2a844405352d87296b3Chris Lattner case FloatRank: return FloatTy; 35771361b11066239ea15764a2a844405352d87296b3Chris Lattner case DoubleRank: return DoubleTy; 35781361b11066239ea15764a2a844405352d87296b3Chris Lattner case LongDoubleRank: return LongDoubleTy; 35795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3580561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie llvm_unreachable("getFloatingRank(): illegal value for rank"); 35815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 35825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 35837cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// getFloatingTypeOrder - Compare the rank of the two specified floating 35847cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// point types, ignoring the domain of the type (i.e. 'double' == 35857cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If 35861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1. 35874ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const { 3588a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner FloatingRank LHSR = getFloatingRank(LHS); 3589a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner FloatingRank RHSR = getFloatingRank(RHS); 35901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3591a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner if (LHSR == RHSR) 3592fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return 0; 3593a75cea3f6be0daa8054d36af81a6ffda1713f82dChris Lattner if (LHSR > RHSR) 3594fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return 1; 3595fb0d49669aa370b4c0993c5cee60275ef9fd6518Steve Naroff return -1; 35965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 35975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3598f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This 3599f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// routine will assert if passed a built-in type that isn't an integer or enum, 3600f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner/// or if it is not canonicalized. 3601f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallunsigned ASTContext::getIntegerRank(const Type *T) const { 3602467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(T->isCanonicalUnqualified() && "T should be canonicalized"); 3603f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith 3604f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner switch (cast<BuiltinType>(T)->getKind()) { 3605b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("getIntegerRank(): not a built-in integer"); 36067cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Bool: 3607f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 1 + (getIntWidth(BoolTy) << 3); 36087cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Char_S: 36097cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Char_U: 36107cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::SChar: 36117cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UChar: 3612f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 2 + (getIntWidth(CharTy) << 3); 36137cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Short: 36147cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UShort: 3615f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 3 + (getIntWidth(ShortTy) << 3); 36167cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Int: 36177cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::UInt: 3618f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 4 + (getIntWidth(IntTy) << 3); 36197cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::Long: 36207cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::ULong: 3621f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 5 + (getIntWidth(LongTy) << 3); 36227cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::LongLong: 36237cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner case BuiltinType::ULongLong: 3624f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman return 6 + (getIntWidth(LongLongTy) << 3); 36252df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::Int128: 36262df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::UInt128: 36272df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner return 7 + (getIntWidth(Int128Ty) << 3); 3628f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner } 3629f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner} 3630f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner 363104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \brief Whether this is a promotable bitfield reference according 363204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions). 363304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// 363404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// \returns the type this bit-field will promote to, or NULL if no 363504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman/// promotion occurs. 36364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::isPromotableBitField(Expr *E) const { 3637ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor if (E->isTypeDependent() || E->isValueDependent()) 3638ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor return QualType(); 3639ceafbdeb93ecf323cca74e660bf54504c86f3b71Douglas Gregor 364004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman FieldDecl *Field = E->getBitField(); 364104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (!Field) 364204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return QualType(); 364304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 364404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman QualType FT = Field->getType(); 364504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 3646a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith uint64_t BitWidth = Field->getBitWidthValue(*this); 364704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman uint64_t IntSize = getTypeSize(IntTy); 364804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // GCC extension compatibility: if the bit-field size is less than or equal 364904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // to the size of int, it gets promoted no matter what its type is. 365004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // For instance, unsigned long bf : 4 gets promoted to signed int. 365104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (BitWidth < IntSize) 365204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return IntTy; 365304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 365404e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman if (BitWidth == IntSize) 365504e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy; 365604e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 365704e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // Types bigger than int are not subject to promotions, and therefore act 365804e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // like the base type. 365904e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // FIXME: This doesn't quite match what gcc does, but what gcc does here 366004e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman // is ridiculous. 366104e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman return QualType(); 366204e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman} 366304e8357f6801e9ff52673e7e899a67bbabf9de93Eli Friedman 3664a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// getPromotedIntegerType - Returns the type that Promotable will 3665a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable 3666a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman/// integer type. 36674ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getPromotedIntegerType(QualType Promotable) const { 3668a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(!Promotable.isNull()); 3669a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(Promotable->isPromotableIntegerType()); 3670842aef8d942a880eeb9535d40de31a86838264cbJohn McCall if (const EnumType *ET = Promotable->getAs<EnumType>()) 3671842aef8d942a880eeb9535d40de31a86838264cbJohn McCall return ET->getDecl()->getPromotionType(); 367268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman 367368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (const BuiltinType *BT = Promotable->getAs<BuiltinType>()) { 367468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t 367568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // (3.9.1) can be converted to a prvalue of the first of the following 367668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // types that can represent all the values of its underlying type: 367768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // int, unsigned int, long int, unsigned long int, long long int, or 367868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // unsigned long long int [...] 367968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // FIXME: Is there some better way to compute this? 368068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (BT->getKind() == BuiltinType::WChar_S || 368168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::WChar_U || 368268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::Char16 || 368368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman BT->getKind() == BuiltinType::Char32) { 368468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S; 368568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman uint64_t FromSize = getTypeSize(BT); 368668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy, 368768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman LongLongTy, UnsignedLongLongTy }; 368868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman for (size_t Idx = 0; Idx < llvm::array_lengthof(PromoteTypes); ++Idx) { 368968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman uint64_t ToSize = getTypeSize(PromoteTypes[Idx]); 369068a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman if (FromSize < ToSize || 369168a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman (FromSize == ToSize && 369268a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) 369368a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman return PromoteTypes[Idx]; 369468a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 369568a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman llvm_unreachable("char type should fit into long long"); 369668a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 369768a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman } 369868a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman 369968a2dc446fe6d32d5da3557902100ed06b21b12bEli Friedman // At this point, we should have a signed or unsigned integer type. 3700a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman if (Promotable->isSignedIntegerType()) 3701a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman return IntTy; 3702a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman uint64_t PromotableSize = getTypeSize(Promotable); 3703a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman uint64_t IntSize = getTypeSize(IntTy); 3704a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize); 3705a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy; 3706a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman} 3707a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman 370831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// \brief Recurses in pointer/array types until it finds an objc retainable 370931862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis/// type and returns its ownership. 371031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios KyrtzidisQualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const { 371131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis while (!T.isNull()) { 371231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis if (T.getObjCLifetime() != Qualifiers::OCL_None) 371331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis return T.getObjCLifetime(); 371431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis if (T->isArrayType()) 371531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis T = getBaseElementType(T); 371631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else if (const PointerType *PT = T->getAs<PointerType>()) 371731862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis T = PT->getPointeeType(); 371831862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 371928445f0b62f6aed851ff87ce64d9b19200d3211fArgyrios Kyrtzidis T = RT->getPointeeType(); 372031862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis else 372131862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis break; 372231862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis } 372331862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis 372431862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis return Qualifiers::OCL_None; 372531862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis} 372631862ba5ea70b1f2c81d03f8a0100b61cd6f06f6Argyrios Kyrtzidis 37271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// getIntegerTypeOrder - Returns the highest ranked integer type: 37287cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner/// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If 37291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// LHS < RHS, return -1. 37304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadint ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const { 3731f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *LHSC = getCanonicalType(LHS).getTypePtr(); 3732f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const Type *RHSC = getCanonicalType(RHS).getTypePtr(); 37337cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSC == RHSC) return 0; 37341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3735f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner bool LHSUnsigned = LHSC->isUnsignedIntegerType(); 3736f52ab250ff92bc51a9ac9a8e19bd43b63a5f844fChris Lattner bool RHSUnsigned = RHSC->isUnsignedIntegerType(); 37371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37387cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner unsigned LHSRank = getIntegerRank(LHSC); 37397cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner unsigned RHSRank = getIntegerRank(RHSC); 37401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37417cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSUnsigned == RHSUnsigned) { // Both signed or both unsigned. 37427cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSRank == RHSRank) return 0; 37437cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return LHSRank > RHSRank ? 1 : -1; 37447cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner } 37451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37467cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // Otherwise, the LHS is signed and the RHS is unsigned or visa versa. 37477cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSUnsigned) { 37487cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the unsigned [LHS] type is larger, return it. 37497cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (LHSRank >= RHSRank) 37507cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return 1; 37511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37527cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the signed type can represent all values of the unsigned type, it 37537cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // wins. Because we are dealing with 2's complement and types that are 37541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // powers of two larger than each other, this is always safe. 37557cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return -1; 37567cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner } 37577cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner 37587cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the unsigned [RHS] type is larger, return it. 37597cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner if (RHSRank >= LHSRank) 37607cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return -1; 37611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37627cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // If the signed type can represent all values of the unsigned type, it 37637cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner // wins. Because we are dealing with 2's complement and types that are 37641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // powers of two larger than each other, this is always safe. 37657cfeb08f2466d6263ec6ff1402298f93f6d6991fChris Lattner return 1; 37665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 376771993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson 376879cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlssonstatic RecordDecl * 3769ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, 3770ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, IdentifierInfo *Id) { 3771ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation Loc; 37724e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (Ctx.getLangOpts().CPlusPlus) 3773ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 377479cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson else 3775ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 377679cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson} 3777ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara 37781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// getCFConstantStringType - Return the type used for constant CFStrings. 37794ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getCFConstantStringType() const { 378071993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson if (!CFConstantStringTypeDecl) { 37811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CFConstantStringTypeDecl = 3782ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara CreateRecordDecl(*this, TTK_Struct, TUDecl, 378379cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("NSConstantString")); 37845cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall CFConstantStringTypeDecl->startDefinition(); 378579cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson 3786f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson QualType FieldTypes[4]; 37871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 378871993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // const int *isa; 37890953e767ff7817f97b3ab20896b229891eeff45bJohn McCall FieldTypes[0] = getPointerType(IntTy.withConst()); 3790f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson // int flags; 3791f06273f8bbacb086a46bde456429c8d08f6d07eeAnders Carlsson FieldTypes[1] = IntTy; 379271993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // const char *str; 37930953e767ff7817f97b3ab20896b229891eeff45bJohn McCall FieldTypes[2] = getPointerType(CharTy.withConst()); 379471993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson // long length; 37951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldTypes[3] = LongTy; 37961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 379744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Create fields 379844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor for (unsigned i = 0; i < 4; ++i) { 37991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl, 3800ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 380144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor SourceLocation(), 0, 3802a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 38031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*BitWidth=*/0, 38047a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 38057a614d8380297fcd2bc23986241905d97222948cRichard Smith /*HasInit=*/false); 38062888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 380717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis CFConstantStringTypeDecl->addDecl(Field); 380844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 380944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 3810838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor CFConstantStringTypeDecl->completeDefinition(); 381171993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson } 38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 381371993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson return getTagDeclType(CFConstantStringTypeDecl); 38148467583c2704e7a9691ea56939a029015f0ade0aGabor Greif} 3815b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson 3816319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregorvoid ASTContext::setCFConstantStringType(QualType T) { 38176217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *Rec = T->getAs<RecordType>(); 3818319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor assert(Rec && "Invalid CFConstantStringType"); 3819319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor CFConstantStringTypeDecl = Rec->getDecl(); 3820319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor} 3821319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor 38224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorType() const { 3823adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump if (BlockDescriptorType) 3824adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump return getTagDeclType(BlockDescriptorType); 3825adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3826adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump RecordDecl *T; 3827adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump // FIXME: Needs the FlagAppleBlock bit. 3828ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 382979cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("__block_descriptor")); 38305cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall T->startDefinition(); 3831adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3832adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump QualType FieldTypes[] = { 3833adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump UnsignedLongTy, 3834adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump UnsignedLongTy, 3835adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump }; 3836adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3837adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump const char *FieldNames[] = { 3838adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump "reserved", 3839083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "Size" 3840adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump }; 3841adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3842adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump for (size_t i = 0; i < 2; ++i) { 3843ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 3844adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump SourceLocation(), 3845adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump &Idents.get(FieldNames[i]), 3846a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 3847adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump /*BitWidth=*/0, 38487a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 38497a614d8380297fcd2bc23986241905d97222948cRichard Smith /*HasInit=*/false); 38502888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 3851adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump T->addDecl(Field); 3852adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump } 3853adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3854838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 3855adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3856adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump BlockDescriptorType = T; 3857adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 3858adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump return getTagDeclType(BlockDescriptorType); 3859adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump} 3860adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump 38614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType ASTContext::getBlockDescriptorExtendedType() const { 3862083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump if (BlockDescriptorExtendedType) 3863083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump return getTagDeclType(BlockDescriptorExtendedType); 3864083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3865083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump RecordDecl *T; 3866083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump // FIXME: Needs the FlagAppleBlock bit. 3867ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 386879cbc7dd2aacd85a28f469b5dc73c4ea296e7072Anders Carlsson &Idents.get("__block_descriptor_withcopydispose")); 38695cfa011e61e14e6f2e1659047d809706c0e4c6a3John McCall T->startDefinition(); 3870083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3871083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump QualType FieldTypes[] = { 3872083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump UnsignedLongTy, 3873083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump UnsignedLongTy, 3874083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump getPointerType(VoidPtrTy), 3875083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump getPointerType(VoidPtrTy) 3876083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump }; 3877083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3878083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump const char *FieldNames[] = { 3879083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "reserved", 3880083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "Size", 3881083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "CopyFuncPtr", 3882083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump "DestroyFuncPtr" 3883083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump }; 3884083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3885083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump for (size_t i = 0; i < 4; ++i) { 3886ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 3887083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump SourceLocation(), 3888083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump &Idents.get(FieldNames[i]), 3889a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 3890083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump /*BitWidth=*/0, 38917a614d8380297fcd2bc23986241905d97222948cRichard Smith /*Mutable=*/false, 38927a614d8380297fcd2bc23986241905d97222948cRichard Smith /*HasInit=*/false); 38932888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 3894083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump T->addDecl(Field); 3895083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump } 3896083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3897838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 3898083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3899083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump BlockDescriptorExtendedType = T; 3900083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 3901083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump return getTagDeclType(BlockDescriptorExtendedType); 3902083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump} 3903083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump 39044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::BlockRequiresCopying(QualType Ty) const { 3905f85e193739c953358c865005855253af4f68a497John McCall if (Ty->isObjCRetainableType()) 3906af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return true; 39074e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) { 3908e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian if (const RecordType *RT = Ty->getAs<RecordType>()) { 3909e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 3910ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt return RD->hasConstCopyConstructor(); 3911e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian 3912e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian } 3913e38be617437ccdcc180c5a49e447cbcd07539292Fariborz Jahanian } 3914af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return false; 3915af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump} 3916af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 39174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadQualType 39185f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerASTContext::BuildByRefType(StringRef DeclName, QualType Ty) const { 3919af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // type = struct __Block_byref_1_X { 3920ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // void *__isa; 3921af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // struct __Block_byref_1_X *__forwarding; 3922ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // unsigned int __flags; 3923ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // unsigned int __size; 3924a7e6845660f91ec611427e1db842780e1ec12bdbEli Friedman // void *__copy_helper; // as needed 3925a7e6845660f91ec611427e1db842780e1ec12bdbEli Friedman // void *__destroy_help // as needed 3926af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // int X; 3927ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump // } * 3928ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump 3929af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump bool HasCopyAndDispose = BlockRequiresCopying(Ty); 3930af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 3931af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump // FIXME: Move up 3932f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<36> Name; 3933f5942a44880be26878592eb052b737579349411eBenjamin Kramer llvm::raw_svector_ostream(Name) << "__Block_byref_" << 3934f5942a44880be26878592eb052b737579349411eBenjamin Kramer ++UniqueBlockByRefTypeID << '_' << DeclName; 3935af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump RecordDecl *T; 3936ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara T = CreateRecordDecl(*this, TTK_Struct, TUDecl, &Idents.get(Name.str())); 3937af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump T->startDefinition(); 3938af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump QualType Int32Ty = IntTy; 3939af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump assert(getIntWidth(IntTy) == 32 && "non-32bit int not supported"); 3940af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump QualType FieldTypes[] = { 3941af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 3942af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(getTagDeclType(T)), 3943af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Int32Ty, 3944af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Int32Ty, 3945af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 3946af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump getPointerType(VoidPtrTy), 3947af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump Ty 3948af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump }; 3949af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 39505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FieldNames[] = { 3951af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__isa", 3952af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__forwarding", 3953af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__flags", 3954af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__size", 3955af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__copy_helper", 3956af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump "__destroy_helper", 3957af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump DeclName, 3958af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump }; 3959af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 3960af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump for (size_t i = 0; i < 7; ++i) { 3961af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump if (!HasCopyAndDispose && i >=4 && i <= 5) 3962af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump continue; 3963af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 3964ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation(), 3965af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump &Idents.get(FieldNames[i]), 3966a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall FieldTypes[i], /*TInfo=*/0, 39677a614d8380297fcd2bc23986241905d97222948cRichard Smith /*BitWidth=*/0, /*Mutable=*/false, 39687a614d8380297fcd2bc23986241905d97222948cRichard Smith /*HasInit=*/false); 39692888b65aae768f54062505330df7be230a0510c7John McCall Field->setAccess(AS_public); 3970af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump T->addDecl(Field); 3971af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump } 3972af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 3973838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor T->completeDefinition(); 3974af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump 3975af7b44d847d3e44c43346d508b2e55a6254b6e9dMike Stump return getPointerType(getTagDeclType(T)); 3976ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump} 3977ea26cb522e88fc86b0d1cae61dcefcfe4cc20231Mike Stump 3978e97179c675b341927807c718be215c8d1aab8acbDouglas GregorTypedefDecl *ASTContext::getObjCInstanceTypeDecl() { 3979e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor if (!ObjCInstanceTypeDecl) 3980e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor ObjCInstanceTypeDecl = TypedefDecl::Create(*this, 3981e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor getTranslationUnitDecl(), 3982e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor SourceLocation(), 3983e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor SourceLocation(), 3984e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor &Idents.get("instancetype"), 3985e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor getTrivialTypeSourceInfo(getObjCIdType())); 3986e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor return ObjCInstanceTypeDecl; 3987e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor} 3988e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor 3989e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// This returns true if a type has been typedefed to BOOL: 3990e8c49533521c40643653f943d47229e62d277f88Anders Carlsson// typedef <type> BOOL; 39912d99833e8c956775f2183601cd120b65b569c867Chris Lattnerstatic bool isTypeTypedefedAsBOOL(QualType T) { 3992e8c49533521c40643653f943d47229e62d277f88Anders Carlsson if (const TypedefType *TT = dyn_cast<TypedefType>(T)) 3993bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner if (IdentifierInfo *II = TT->getDecl()->getIdentifier()) 3994bb49c3ee5d270485f4b273691fd14bc97403fa5dChris Lattner return II->isStr("BOOL"); 39951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 399685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson return false; 399785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson} 399885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson 3999a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingTypeSize returns size of type for objective-c encoding 400033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// purpose. 40014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadCharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const { 4002f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (!type->isIncompleteArrayType() && type->isIncompleteType()) 4003f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return CharUnits::Zero(); 4004f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4005199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits sz = getTypeSizeInChars(type); 40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 400733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Make all integer and enum types at least as large as an int 40082ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (sz.isPositive() && type->isIntegralOrEnumerationType()) 4009199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck sz = std::max(sz, getTypeSizeInChars(IntTy)); 401033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Treat arrays as pointers, since that's how they're passed in. 401133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian else if (type->isArrayType()) 4012199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck sz = getTypeSizeInChars(VoidPtrTy); 4013aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck return sz; 4014199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck} 4015199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck 4016199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstatic inline 4017199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyckstd::string charUnitsToString(const CharUnits &CU) { 4018199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck return llvm::itostr(CU.getQuantity()); 401933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 402033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 40216b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// getObjCEncodingForBlock - Return the encoded type for this block 40225e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall/// declaration. 40236b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallstd::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const { 40246b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall std::string S; 40256b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 40265e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall const BlockDecl *Decl = Expr->getBlockDecl(); 40275e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType BlockTy = 40285e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Expr->getType()->getAs<BlockPointerType>()->getPointeeType(); 40295e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Encode result type. 4030c71a4915ca216847599d03cab4ed1c5086b0eb43John McCall getObjCEncodingForType(BlockTy->getAs<FunctionType>()->getResultType(), S); 40315e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Compute size of all parameters. 40325e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Start with computing size of a pointer in number of bytes. 40335e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // FIXME: There might(should) be a better way of doing this computation! 40345e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall SourceLocation Loc; 4035199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 4036199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ParmOffset = PtrSize; 40376f46c2653c1545cc3fef0c0df996d18160160ce8Fariborz Jahanian for (BlockDecl::param_const_iterator PI = Decl->param_begin(), 40385e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall E = Decl->param_end(); PI != E; ++PI) { 40395e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType PType = (*PI)->getType(); 4040aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck CharUnits sz = getObjCEncodingTypeSize(PType); 4041199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck assert (sz.isPositive() && "BlockExpr - Incomplete param type"); 40425e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmOffset += sz; 40435e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 40445e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Size of the argument frame 4045199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 40465e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Block pointer and offset. 40475e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall S += "@?0"; 40485e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall 40495e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Argument types. 40505e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmOffset = PtrSize; 40515e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E = 40525e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Decl->param_end(); PI != E; ++PI) { 40535e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall ParmVarDecl *PVDecl = *PI; 40545e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall QualType PType = PVDecl->getOriginalType(); 40555e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall if (const ArrayType *AT = 40565e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 40575e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // Use array's original type only if it has known number of 40585389f48b24937ad7b4093307128b3cbf25235654David Chisnall // elements. 40595389f48b24937ad7b4093307128b3cbf25235654David Chisnall if (!isa<ConstantArrayType>(AT)) 40605389f48b24937ad7b4093307128b3cbf25235654David Chisnall PType = PVDecl->getType(); 40615389f48b24937ad7b4093307128b3cbf25235654David Chisnall } else if (PType->isFunctionType()) 40625389f48b24937ad7b4093307128b3cbf25235654David Chisnall PType = PVDecl->getType(); 40635389f48b24937ad7b4093307128b3cbf25235654David Chisnall getObjCEncodingForType(PType, S); 40645389f48b24937ad7b4093307128b3cbf25235654David Chisnall S += charUnitsToString(ParmOffset); 40655389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset += getObjCEncodingTypeSize(PType); 40665389f48b24937ad7b4093307128b3cbf25235654David Chisnall } 40676b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall 40686b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall return S; 40695389f48b24937ad7b4093307128b3cbf25235654David Chisnall} 40705389f48b24937ad7b4093307128b3cbf25235654David Chisnall 4071f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl, 40725389f48b24937ad7b4093307128b3cbf25235654David Chisnall std::string& S) { 40735389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Encode result type. 40745389f48b24937ad7b4093307128b3cbf25235654David Chisnall getObjCEncodingForType(Decl->getResultType(), S); 40755389f48b24937ad7b4093307128b3cbf25235654David Chisnall CharUnits ParmOffset; 40765389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Compute size of all parameters. 40775389f48b24937ad7b4093307128b3cbf25235654David Chisnall for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 40785389f48b24937ad7b4093307128b3cbf25235654David Chisnall E = Decl->param_end(); PI != E; ++PI) { 40795389f48b24937ad7b4093307128b3cbf25235654David Chisnall QualType PType = (*PI)->getType(); 40805389f48b24937ad7b4093307128b3cbf25235654David Chisnall CharUnits sz = getObjCEncodingTypeSize(PType); 4081f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (sz.isZero()) 4082f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return true; 4083f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 40845389f48b24937ad7b4093307128b3cbf25235654David Chisnall assert (sz.isPositive() && 4085f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor "getObjCEncodingForFunctionDecl - Incomplete param type"); 40865389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset += sz; 40875389f48b24937ad7b4093307128b3cbf25235654David Chisnall } 40885389f48b24937ad7b4093307128b3cbf25235654David Chisnall S += charUnitsToString(ParmOffset); 40895389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmOffset = CharUnits::Zero(); 40905389f48b24937ad7b4093307128b3cbf25235654David Chisnall 40915389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Argument types. 40925389f48b24937ad7b4093307128b3cbf25235654David Chisnall for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 40935389f48b24937ad7b4093307128b3cbf25235654David Chisnall E = Decl->param_end(); PI != E; ++PI) { 40945389f48b24937ad7b4093307128b3cbf25235654David Chisnall ParmVarDecl *PVDecl = *PI; 40955389f48b24937ad7b4093307128b3cbf25235654David Chisnall QualType PType = PVDecl->getOriginalType(); 40965389f48b24937ad7b4093307128b3cbf25235654David Chisnall if (const ArrayType *AT = 40975389f48b24937ad7b4093307128b3cbf25235654David Chisnall dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 40985389f48b24937ad7b4093307128b3cbf25235654David Chisnall // Use array's original type only if it has known number of 40995e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall // elements. 41005e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall if (!isa<ConstantArrayType>(AT)) 41015e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall PType = PVDecl->getType(); 41025e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } else if (PType->isFunctionType()) 41035e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall PType = PVDecl->getType(); 41045e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall getObjCEncodingForType(PType, S); 4105199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 4106aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck ParmOffset += getObjCEncodingTypeSize(PType); 41075e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 4108f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4109f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return false; 41105e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall} 41115e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall 4112dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// getObjCEncodingForMethodParameter - Return the encoded type for a single 4113dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// method parameter or return type. If Extended, include class names and 4114dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson/// block object types. 4115dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilsonvoid ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, 4116dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson QualType T, std::string& S, 4117dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool Extended) const { 4118dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode type qualifer, 'in', 'inout', etc. for the parameter. 4119dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeQualifier(QT, S); 4120dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode parameter type. 4121dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(T, S, true, true, 0, 4122dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson true /*OutermostType*/, 4123dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /*EncodingProperty*/, 4124dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /*StructField*/, 4125dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Extended /*EncodeBlockParameters*/, 4126dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Extended /*EncodeClassNames*/); 4127dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson} 4128dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson 4129a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek/// getObjCEncodingForMethodDecl - Return the encoded type for this method 413033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian/// declaration. 4131f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregorbool ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, 4132dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson std::string& S, 4133dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool Extended) const { 4134c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: This is not very efficient. 4135dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Encode return type. 4136dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(), 4137dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson Decl->getResultType(), S, Extended); 413833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Compute size of all parameters. 413933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Start with computing size of a pointer in number of bytes. 414033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // FIXME: There might(should) be a better way of doing this computation! 414133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian SourceLocation Loc; 4142199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 414333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // The first two arguments (self and _cmd) are pointers; account for 414433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // their size. 4145199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ParmOffset = 2 * PtrSize; 4146491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(), 41477732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian E = Decl->sel_param_end(); PI != E; ++PI) { 414889951a86b594513c2a013532ed45d197413b1087Chris Lattner QualType PType = (*PI)->getType(); 4149aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck CharUnits sz = getObjCEncodingTypeSize(PType); 4150f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor if (sz.isZero()) 4151f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return true; 4152f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4153199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck assert (sz.isPositive() && 4154199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck "getObjCEncodingForMethodDecl - Incomplete param type"); 415533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian ParmOffset += sz; 415633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian } 4157199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 415833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian S += "@0:"; 4159199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(PtrSize); 41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 416133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian // Argument types. 416233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian ParmOffset = 2 * PtrSize; 4163491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(), 41647732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian E = Decl->sel_param_end(); PI != E; ++PI) { 4165491306a83c4f0f49f95a3bcbca8580cb98a91c7aArgyrios Kyrtzidis const ParmVarDecl *PVDecl = *PI; 41661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType PType = PVDecl->getOriginalType(); 41674306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian if (const ArrayType *AT = 4168ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 4169ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff // Use array's original type only if it has known number of 4170ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff // elements. 4171bb3fde337fb712c0e6da8790d431621be4793048Steve Naroff if (!isa<ConstantArrayType>(AT)) 4172ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff PType = PVDecl->getType(); 4173ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff } else if (PType->isFunctionType()) 4174ab76d45e023fc5ae966968344e180cd09fdcc746Steve Naroff PType = PVDecl->getType(); 4175dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(), 4176dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson PType, S, Extended); 4177199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck S += charUnitsToString(ParmOffset); 4178aa8741a1db98eef05f09b1200dba94aa5dc3bc3dKen Dyck ParmOffset += getObjCEncodingTypeSize(PType); 417933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian } 4180f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor 4181f968d8374791c37bc464efd9168c2d33dd73605fDouglas Gregor return false; 418233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 418333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 4184c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// getObjCEncodingForPropertyDecl - Return the encoded type for this 418583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// property declaration. If non-NULL, Container must be either an 4186c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be 4187c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar/// NULL when getting encodings for protocol properties. 41881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Property attributes are stored as a comma-delimited C string. The simple 41891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// attributes readonly and bycopy are encoded as single characters. The 41901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// parametrized attributes, getter=name, setter=name, and ivar=name, are 41911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// encoded as single characters, followed by an identifier. Property types 41921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// are also encoded as a parametrized attribute. The characters used to encode 419383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// these attributes are defined by the following enumeration: 419483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @code 419583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// enum PropertyAttributes { 419683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyReadOnly = 'R', // property is read-only. 419783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyBycopy = 'C', // property is a copy of the value last assigned 419883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyByref = '&', // property is a reference to the value last assigned 419983bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyDynamic = 'D', // property is dynamic 420083bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyGetter = 'G', // followed by getter selector name 420183bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertySetter = 'S', // followed by setter selector name 420283bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyInstanceVariable = 'V' // followed by instance variable name 420383bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyType = 't' // followed by old-style type encoding. 420483bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyWeak = 'W' // 'weak' property 420583bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyStrong = 'P' // property GC'able 420683bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// kPropertyNonAtomic = 'N' // property non-atomic 420783bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// }; 420883bccb85ff4b9981c4250c45494b439df8cbf983Fariborz Jahanian/// @endcode 42091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, 4210c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar const Decl *Container, 42114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad std::string& S) const { 4212c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // Collect information from the property implementation decl(s). 4213c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar bool Dynamic = false; 4214c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar ObjCPropertyImplDecl *SynthesizePID = 0; 4215c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4216c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: Duplicated code due to poor abstraction. 4217c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (Container) { 42181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ObjCCategoryImplDecl *CID = 4219c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar dyn_cast<ObjCCategoryImplDecl>(Container)) { 4220c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar for (ObjCCategoryImplDecl::propimpl_iterator 422117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i = CID->propimpl_begin(), e = CID->propimpl_end(); 4222653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor i != e; ++i) { 4223c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar ObjCPropertyImplDecl *PID = *i; 4224c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyDecl() == PD) { 4225c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4226c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar Dynamic = true; 4227c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4228c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar SynthesizePID = PID; 4229c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4230c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4231c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4232c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 423361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container); 4234c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar for (ObjCCategoryImplDecl::propimpl_iterator 423517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i = OID->propimpl_begin(), e = OID->propimpl_end(); 4236653f1b1bf293a9bd96fd4dd6372e779cc7af1597Douglas Gregor i != e; ++i) { 4237c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar ObjCPropertyImplDecl *PID = *i; 4238c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyDecl() == PD) { 4239c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4240c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar Dynamic = true; 4241c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4242c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar SynthesizePID = PID; 4243c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4244c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 42451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4246c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4247c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4248c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4249c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: This is not very efficient. 4250c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S = "T"; 4251c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4252c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // Encode result type. 4253090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian // GCC has some special rules regarding encoding of properties which 4254090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian // closely resembles encoding of ivars. 42551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0, 4256090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian true /* outermost type */, 4257090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian true /* encoding for property */); 4258c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4259c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->isReadOnly()) { 4260c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",R"; 4261c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } else { 4262c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar switch (PD->getSetterKind()) { 4263c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar case ObjCPropertyDecl::Assign: break; 4264c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar case ObjCPropertyDecl::Copy: S += ",C"; break; 42651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case ObjCPropertyDecl::Retain: S += ",&"; break; 42663a02b44e3948f7762dbfba94b7961281ca29d022Fariborz Jahanian case ObjCPropertyDecl::Weak: S += ",W"; break; 4267c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4268c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4269c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4270c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // It really isn't clear at all what this means, since properties 4271c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // are "dynamic by default". 4272c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (Dynamic) 4273c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",D"; 4274c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4275090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic) 4276090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian S += ",N"; 42771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4278c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) { 4279c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",G"; 4280077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S += PD->getGetterName().getAsString(); 4281c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4282c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4283c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) { 4284c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",S"; 4285077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner S += PD->getSetterName().getAsString(); 4286c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4287c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4288c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar if (SynthesizePID) { 4289c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl(); 4290c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar S += ",V"; 429139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner S += OID->getNameAsString(); 4292c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar } 4293c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4294c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar // FIXME: OBJCGC: weak & strong 4295c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar} 4296c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar 4297a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// getLegacyIntegralTypeEncoding - 42981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Another legacy compatibility encoding: 32-bit longs are encoded as 42991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 'l' or 'L' , but not always. For typedefs, we need to use 4300a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 'i' or 'I' instead if encoding a struct field, or a pointer! 4301a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian/// 4302a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanianvoid ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const { 43038e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump if (isa<TypedefType>(PointeeTy.getTypePtr())) { 4304183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) { 43054ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32) 4306a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian PointeeTy = UnsignedIntTy; 43071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 43084ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32) 4309a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian PointeeTy = IntTy; 4310a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4311a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4312a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian} 4313a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian 43147d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanianvoid ASTContext::getObjCEncodingForType(QualType T, std::string& S, 43154ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const FieldDecl *Field) const { 431682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // We follow the behavior of gcc, expanding structures which are 431782a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // directly pointed to, and expanding embedded structures. Note that 431882a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // these rules are sufficient to prevent recursive encoding of the 431982a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar // same type. 43201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(T, S, true, true, Field, 43215b8c7d9fb620ba3a71e996d61e7b9bdf763b5c09Fariborz Jahanian true /* outermost type */); 432282a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar} 432382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar 432464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnallstatic char ObjCEncodingForPrimitiveKind(const ASTContext *C, QualType T) { 432564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall switch (T->getAs<BuiltinType>()->getKind()) { 4326b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unhandled builtin type kind"); 432764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Void: return 'v'; 432864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Bool: return 'B'; 432964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Char_U: 433064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UChar: return 'C'; 433164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UShort: return 'S'; 433264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UInt: return 'I'; 433364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::ULong: 43344ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad return C->getIntWidth(T) == 32 ? 'L' : 'Q'; 433564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::UInt128: return 'T'; 433664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::ULongLong: return 'Q'; 433764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Char_S: 433864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::SChar: return 'c'; 433964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Short: return 's'; 43403f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 43413f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 434264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Int: return 'i'; 434364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Long: 43444ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad return C->getIntWidth(T) == 32 ? 'l' : 'q'; 434564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::LongLong: return 'q'; 434664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Int128: return 't'; 434764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Float: return 'f'; 434864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall case BuiltinType::Double: return 'd'; 43493a0be84b2aed8563150cdbd976a98838afa261ebDaniel Dunbar case BuiltinType::LongDouble: return 'D'; 435064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall } 435164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall} 435264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall 43535471bc85b69912e3b448de004498a80c0de32296Douglas Gregorstatic char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) { 43545471bc85b69912e3b448de004498a80c0de32296Douglas Gregor EnumDecl *Enum = ET->getDecl(); 43555471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 43565471bc85b69912e3b448de004498a80c0de32296Douglas Gregor // The encoding of an non-fixed enum type is always 'i', regardless of size. 43575471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (!Enum->isFixed()) 43585471bc85b69912e3b448de004498a80c0de32296Douglas Gregor return 'i'; 43595471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 43605471bc85b69912e3b448de004498a80c0de32296Douglas Gregor // The encoding of a fixed enum type matches its fixed underlying type. 43615471bc85b69912e3b448de004498a80c0de32296Douglas Gregor return ObjCEncodingForPrimitiveKind(C, Enum->getIntegerType()); 43625471bc85b69912e3b448de004498a80c0de32296Douglas Gregor} 43635471bc85b69912e3b448de004498a80c0de32296Douglas Gregor 43644ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic void EncodeBitField(const ASTContext *Ctx, std::string& S, 436564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall QualType T, const FieldDecl *FD) { 4366a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl"); 43678b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian S += 'b'; 436864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // The NeXT runtime encodes bit fields as b followed by the number of bits. 436964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // The GNU runtime requires more information; bitfields are encoded as b, 437064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // then the offset (in bits) of the first element, then the type of the 437164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // bitfield, then the size in bits. For example, in this structure: 437264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // 437364fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // struct 437464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // { 437564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // int integer; 437664fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // int flags:2; 437764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // }; 437864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // On a 32-bit system, the encoding for flags would be b2 for the NeXT 437964fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // runtime, but b32i2 for the GNU runtime. The reason for this extra 438064fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // information is not especially sensible, but we're stuck with it for 438164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // compatibility with GCC, although providing it breaks anything that 438264fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall // actually uses runtime introspection and wants to work on both runtimes... 43834e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!Ctx->getLangOpts().NeXTRuntime) { 438464fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall const RecordDecl *RD = FD->getParent(); 438564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD); 438682905749d5c8d8b4edec11de754a73349cb96603Eli Friedman S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex())); 43875471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (const EnumType *ET = T->getAs<EnumType>()) 43885471bc85b69912e3b448de004498a80c0de32296Douglas Gregor S += ObjCEncodingForEnumType(Ctx, ET); 4389c7ff82c2040f45eaad2eddea0e4461dddc972cd1David Chisnall else 43904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad S += ObjCEncodingForPrimitiveKind(Ctx, T); 439164fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall } 4392a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith S += llvm::utostr(FD->getBitWidthValue(*Ctx)); 43938b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian} 43948b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian 439501eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar// FIXME: Use SmallString for accumulating string. 439682a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbarvoid ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, 439782a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar bool ExpandPointedToStructures, 439882a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar bool ExpandStructures, 4399153bfe5795e2c1a5a738e73d3784964e082237fcDaniel Dunbar const FieldDecl *FD, 4400090b3f71702c5626d8520f9608d77c6f26dcfa15Fariborz Jahanian bool OutermostType, 44012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis bool EncodingProperty, 4402dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool StructField, 4403dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool EncodeBlockParameters, 4404dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson bool EncodeClassNames) const { 440564fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall if (T->getAs<BuiltinType>()) { 4406ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (FD && FD->isBitField()) 440764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall return EncodeBitField(this, S, T, FD); 440864fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall S += ObjCEncodingForPrimitiveKind(this, T); 4409ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4410ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 44111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4412183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ComplexType *CT = T->getAs<ComplexType>()) { 4413c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson S += 'j'; 44141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false, 4415c612f7bc9a6379cd7e7c2dd306d05938e890051bAnders Carlsson false); 4416ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4417ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 441860bce3ef20a4c9684e3825cdd739fefb9810327dFariborz Jahanian 4419aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian // encoding for pointer or r3eference types. 4420aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian QualType PointeeTy; 44216217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = T->getAs<PointerType>()) { 44228d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian if (PT->isObjCSelType()) { 44238d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian S += ':'; 44248d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian return; 44258d2c0a9814e56c2b22e22d1045181c735aef62fdFariborz Jahanian } 4426aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian PointeeTy = PT->getPointeeType(); 4427aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian } 4428aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 4429aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian PointeeTy = RT->getPointeeType(); 4430aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian if (!PointeeTy.isNull()) { 4431a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian bool isReadOnly = false; 4432a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // For historical/compatibility reasons, the read-only qualifier of the 4433a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // pointee gets emitted _before_ the '^'. The read-only qualifier of 4434a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // the pointer itself gets ignored, _unless_ we are looking at a typedef! 44351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Also, do not emit the 'r' for anything but the outermost type! 44368e1fab243ab8023b7ee3899745386b3b3a4258f8Mike Stump if (isa<TypedefType>(T.getTypePtr())) { 4437a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (OutermostType && T.isConstQualified()) { 4438a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian isReadOnly = true; 4439a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian S += 'r'; 4440a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 44419fdbab3cbc2fc04bcaf5768023d83707f3151144Mike Stump } else if (OutermostType) { 4442a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian QualType P = PointeeTy; 44436217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek while (P->getAs<PointerType>()) 44446217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek P = P->getAs<PointerType>()->getPointeeType(); 4445a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (P.isConstQualified()) { 4446a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian isReadOnly = true; 4447a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian S += 'r'; 4448a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4449a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 4450a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian if (isReadOnly) { 4451a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // Another legacy compatibility encoding. Some ObjC qualifier and type 4452a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // combinations need to be rearranged. 4453a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian // Rewrite "in const" from "nr" to "rn" 44545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (StringRef(S).endswith("nr")) 44550237941e0beb0c929934b66ad29443b484d987feBenjamin Kramer S.replace(S.end()-2, S.end(), "rn"); 4456a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian } 44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 445885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson if (PointeeTy->isCharType()) { 445985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson // char pointer types should be encoded as '*' unless it is a 446085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson // type that has been typedef'd to 'BOOL'. 4461e8c49533521c40643653f943d47229e62d277f88Anders Carlsson if (!isTypeTypedefedAsBOOL(PointeeTy)) { 446285f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson S += '*'; 446385f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson return; 446485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson } 44656217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) { 44669533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // GCC binary compat: Need to convert "struct objc_class *" to "#". 44679533a7fdb8397421f3be52e879442460a87389f6Steve Naroff if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) { 44689533a7fdb8397421f3be52e879442460a87389f6Steve Naroff S += '#'; 44699533a7fdb8397421f3be52e879442460a87389f6Steve Naroff return; 44709533a7fdb8397421f3be52e879442460a87389f6Steve Naroff } 44719533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // GCC binary compat: Need to convert "struct objc_object *" to "@". 44729533a7fdb8397421f3be52e879442460a87389f6Steve Naroff if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) { 44739533a7fdb8397421f3be52e879442460a87389f6Steve Naroff S += '@'; 44749533a7fdb8397421f3be52e879442460a87389f6Steve Naroff return; 44759533a7fdb8397421f3be52e879442460a87389f6Steve Naroff } 44769533a7fdb8397421f3be52e879442460a87389f6Steve Naroff // fall through... 447785f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson } 447885f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson S += '^'; 4479a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian getLegacyIntegralTypeEncoding(PointeeTy); 4480a1c033e9514865f3a7b0d8b3b20e6de926cfec6cFariborz Jahanian 44811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures, 448243822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian NULL); 4483ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4484ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4485aa1d76163e4b0b1cc54e222be67379f8c02e8ffaFariborz Jahanian 4486ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (const ArrayType *AT = 4487ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // Ignore type qualifiers etc. 4488ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) { 44892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (isa<IncompleteArrayType>(AT) && !StructField) { 4490559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson // Incomplete arrays are encoded as a pointer to the array element. 4491559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '^'; 4492559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson 44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(AT->getElementType(), S, 4494559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson false, ExpandStructures, FD); 4495559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } else { 4496559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '['; 44971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 44992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (getTypeSize(CAT->getElementType()) == 0) 45002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '0'; 45012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis else 45022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += llvm::utostr(CAT->getSize().getZExtValue()); 45032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 4504559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson //Variable length arrays are encoded as a regular array with 0 elements. 45052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) && 45062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis "Unknown array type!"); 4507559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += '0'; 4508559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } 45091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(AT->getElementType(), S, 4511559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson false, ExpandStructures, FD); 4512559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson S += ']'; 4513559a83330416affb0e341a2c53800cbf924a5178Anders Carlsson } 4514ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4515ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 45161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4517183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (T->getAs<FunctionType>()) { 4518c0a87b7db06643178ad2cbce0767548c139ea387Anders Carlsson S += '?'; 4519ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4520ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 45211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45226217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RTy = T->getAs<RecordType>()) { 452382a6cfbc421cc99c5b7313271f399f7ef95056ecDaniel Dunbar RecordDecl *RDecl = RTy->getDecl(); 4524d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar S += RDecl->isUnion() ? '(' : '{'; 4525502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar // Anonymous structures print as '?' 4526502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar if (const IdentifierInfo *II = RDecl->getIdentifier()) { 4527502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar S += II->getName(); 45286fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian if (ClassTemplateSpecializationDecl *Spec 45296fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) { 45306fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 45316fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian std::string TemplateArgsStr 45326fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian = TemplateSpecializationType::PrintTemplateArgumentList( 4533910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.data(), 4534910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.size(), 453530c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor (*this).getPrintingPolicy()); 45366fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian 45376fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian S += TemplateArgsStr; 45386fb94391dc7cb11fd4bbdb969bbab11b6b48c223Fariborz Jahanian } 4539502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar } else { 4540502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar S += '?'; 4541502a4a1ce4c34cf78c8182d9798da0a51d9b7302Daniel Dunbar } 45420d504c1da852e58ff802545c823ecff3b6c654b8Daniel Dunbar if (ExpandStructures) { 45437d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian S += '='; 45442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->isUnion()) { 45452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForStructureImpl(RDecl, S, FD); 45462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 45472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RDecl->field_begin(), 45482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldEnd = RDecl->field_end(); 45492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis Field != FieldEnd; ++Field) { 45502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 45512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 45522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += Field->getNameAsString(); 45532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 45542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 45551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45562636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // Special case bit-fields. 45572636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (Field->isBitField()) { 45582636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(Field->getType(), S, false, true, 45592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis (*Field)); 45602636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 45612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis QualType qt = Field->getType(); 45622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getLegacyIntegralTypeEncoding(qt); 45632636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(qt, S, false, true, 45642636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FD, /*OutermostType*/false, 45652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*EncodingProperty*/false, 45662636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*StructField*/true); 45672636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 4568d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar } 45697d6b46d9a9d75dea8ef9f6973dd50633c1f37963Fariborz Jahanian } 45706de88a873a4cbe06d72602eef57d68006730a80bFariborz Jahanian } 4571d96b35bc6becf8db00d140c11e3d0e53f27567a1Daniel Dunbar S += RDecl->isUnion() ? ')' : '}'; 4572ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4573ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4574e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 45755471bc85b69912e3b448de004498a80c0de32296Douglas Gregor if (const EnumType *ET = T->getAs<EnumType>()) { 45768b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian if (FD && FD->isBitField()) 457764fd7e86c1a90d9ff78e4a0bd79f69499667a4e3David Chisnall EncodeBitField(this, S, T, FD); 45788b4bf90eb6d3d08cf3bfb86705f0fdb20b9c5875Fariborz Jahanian else 45795471bc85b69912e3b448de004498a80c0de32296Douglas Gregor S += ObjCEncodingForEnumType(this, ET); 4580ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4581ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 45821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4583dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) { 458421a98b188857d690aa4510c52ac4317ffa0908a8Steve Naroff S += "@?"; // Unlike a pointer-to-function, which is "^?". 4585dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (EncodeBlockParameters) { 4586dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson const FunctionType *FT = BT->getPointeeType()->getAs<FunctionType>(); 4587dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson 4588dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += '<'; 4589dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block return type 4590dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(FT->getResultType(), S, 4591dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandPointedToStructures, ExpandStructures, 4592dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson FD, 4593dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* OutermostType */, 4594dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodingProperty, 4595dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* StructField */, 4596dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeBlockParameters, 4597dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeClassNames); 4598dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block self 4599dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += "@?"; 4600dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson // Block parameters 4601dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) { 4602dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson for (FunctionProtoType::arg_type_iterator I = FPT->arg_type_begin(), 4603dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson E = FPT->arg_type_end(); I && (I != E); ++I) { 4604dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson getObjCEncodingForTypeImpl(*I, S, 4605dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandPointedToStructures, 4606dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson ExpandStructures, 4607dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson FD, 4608dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* OutermostType */, 4609dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodingProperty, 4610dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson false /* StructField */, 4611dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeBlockParameters, 4612dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson EncodeClassNames); 4613dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4614dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4615dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson S += '>'; 4616dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson } 4617ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4618ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4620c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Ignore protocol qualifiers when mangling at this level. 4621c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *OT = T->getAs<ObjCObjectType>()) 4622c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall T = OT->getBaseType(); 4623c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 46240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (const ObjCInterfaceType *OIT = T->getAs<ObjCInterfaceType>()) { 462543822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian // @encode(class_name) 46260953e767ff7817f97b3ab20896b229891eeff45bJohn McCall ObjCInterfaceDecl *OI = OIT->getDecl(); 462743822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '{'; 462843822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian const IdentifierInfo *II = OI->getIdentifier(); 462943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += II->getName(); 463043822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '='; 4631db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose SmallVector<const ObjCIvarDecl*, 32> Ivars; 46322c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian DeepCollectObjCIvars(OI, true, Ivars); 46332c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian for (unsigned i = 0, e = Ivars.size(); i != e; ++i) { 4634db8264e4c5ffd7af6fbad4ca4306bd382bb02691Jordy Rose const FieldDecl *Field = cast<FieldDecl>(Ivars[i]); 46352c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian if (Field->isBitField()) 46362c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field); 463743822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian else 46382c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD); 463943822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian } 464043822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian S += '}'; 4641ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 464243822eaeddeaa419b90f23c68af6b23c46788a58Fariborz Jahanian } 46431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4644183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ObjCObjectPointerType *OPT = T->getAs<ObjCObjectPointerType>()) { 464514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (OPT->isObjCIdType()) { 464614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '@'; 464714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4648ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 465027d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) { 465127d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // FIXME: Consider if we need to output qualifiers for 'Class<p>'. 465227d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // Since this is a binary compatibility issue, need to consult with runtime 465327d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff // folks. Fortunately, this is a *very* obsure construct. 465414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '#'; 465514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4656ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4658ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (OPT->isObjCQualifiedIdType()) { 46591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(getObjCIdType(), S, 466014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ExpandPointedToStructures, 466114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ExpandStructures, FD); 4662dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (FD || EncodingProperty || EncodeClassNames) { 466314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff // Note that we do extended encoding of protocol qualifer list 466414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff // Only when doing ivar or property encoding. 466514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '"'; 466667ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 466767ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff E = OPT->qual_end(); I != E; ++I) { 466814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '<'; 466914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += (*I)->getNameAsString(); 467014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '>'; 467114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 467214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff S += '"'; 467314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 467414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 4675ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 46761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4677ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner QualType PointeeTy = OPT->getPointeeType(); 4678ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner if (!EncodingProperty && 4679ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner isa<TypedefType>(PointeeTy.getTypePtr())) { 4680ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // Another historical/compatibility reason. 46811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // We encode the underlying type which comes out as 4682ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner // {...}; 4683ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '^'; 46841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getObjCEncodingForTypeImpl(PointeeTy, S, 46851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump false, ExpandPointedToStructures, 4686ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner NULL); 468714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return; 468814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 4689ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner 4690ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '@'; 4691dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson if (OPT->getInterfaceDecl() && 4692dc8dab6fabf4bfd4f4b94bf572ac3342a5bbfcd7Bob Wilson (FD || EncodingProperty || EncodeClassNames)) { 4693ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '"'; 469427d20a24a1b816cecbd142727d2c81af5a6a111bSteve Naroff S += OPT->getInterfaceDecl()->getIdentifier()->getName(); 469567ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 469667ef8eaea8a0a2073147a8d863f0e3f30d525802Steve Naroff E = OPT->qual_end(); I != E; ++I) { 4697ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '<'; 4698ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += (*I)->getNameAsString(); 4699ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '>'; 47001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4701ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner S += '"'; 4702ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 4703ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner return; 4704ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattner } 47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4706532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall // gcc just blithely ignores member pointers. 4707532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall // TODO: maybe there should be a mangling for these 4708532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall if (T->getAs<MemberPointerType>()) 4709532ec7baf2d0791abc9551ef856a537711c5774aJohn McCall return; 4710e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 4711e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian if (T->isVectorType()) { 4712e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // This matches gcc's encoding, even though technically it is 4713e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // insufficient. 4714e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian // FIXME. We should do a better job than gcc. 4715e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian return; 4716e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian } 4717e6012c7ecb9d848f4091c8c48e7d9946cc36b23fFariborz Jahanian 4718b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("@encode for type not implemented!"); 471985f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson} 472085f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson 47212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidisvoid ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl, 47222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::string &S, 47232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis const FieldDecl *FD, 47242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis bool includeVBases) const { 47252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(RDecl && "Expected non-null RecordDecl"); 47262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(!RDecl->isUnion() && "Should not be called for unions"); 47272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->getDefinition()) 47282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis return; 47292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 47302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl); 47312636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets; 47322636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis const ASTRecordLayout &layout = getASTRecordLayout(RDecl); 47332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 47342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec) { 47352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (CXXRecordDecl::base_class_iterator 47362636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BI = CXXRec->bases_begin(), 47372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BE = CXXRec->bases_end(); BI != BE; ++BI) { 47382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!BI->isVirtual()) { 47392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4740829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis if (base->isEmpty()) 4741829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis continue; 47422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = layout.getBaseClassOffsetInBits(base); 47432636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 47442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, base)); 47452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 47492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis unsigned i = 0; 47502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RDecl->field_begin(), 47512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldEnd = RDecl->field_end(); 47522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis Field != FieldEnd; ++Field, ++i) { 47532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = layout.getFieldOffset(i); 47542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 47552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, *Field)); 47562636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47572636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 47582636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec && includeVBases) { 47592636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (CXXRecordDecl::base_class_iterator 47602636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BI = CXXRec->vbases_begin(), 47612636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis BE = CXXRec->vbases_end(); BI != BE; ++BI) { 47622636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4763829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis if (base->isEmpty()) 4764829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis continue; 47652636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = layout.getVBaseClassOffsetInBits(base); 476619aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end()) 476719aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(), 476819aa8609a5d04eed9b81aa1c4608e8a4f3df6ccdArgyrios Kyrtzidis std::make_pair(offs, base)); 47692636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47702636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47712636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 47722636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CharUnits size; 47732636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRec) { 47742636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis size = includeVBases ? layout.getSize() : layout.getNonVirtualSize(); 47752636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 47762636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis size = layout.getSize(); 47772636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47782636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 47792636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t CurOffs = 0; 47802636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::multimap<uint64_t, NamedDecl *>::iterator 47812636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurLayObj = FieldOrBaseOffsets.begin(); 47822636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 4783cb8061e321bc6f46f154529885028256c7ae1fb2Argyrios Kyrtzidis if ((CurLayObj != FieldOrBaseOffsets.end() && CurLayObj->first != 0) || 4784cb8061e321bc6f46f154529885028256c7ae1fb2Argyrios Kyrtzidis (CurLayObj == FieldOrBaseOffsets.end() && 4785cb8061e321bc6f46f154529885028256c7ae1fb2Argyrios Kyrtzidis CXXRec && CXXRec->isDynamicClass())) { 47862636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(CXXRec && CXXRec->isDynamicClass() && 47872636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis "Offset 0 was empty but no VTable ?"); 47882636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 47892636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += "\"_vptr$"; 47902636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::string recname = CXXRec->getNameAsString(); 47912636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (recname.empty()) recname = "?"; 47922636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += recname; 47932636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 47942636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47952636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += "^^?"; 47962636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += getTypeSize(VoidPtrTy); 47972636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 47982636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 47992636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (!RDecl->hasFlexibleArrayMember()) { 48002636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // Mark the end of the structure. 48012636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t offs = toBits(size); 48022636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 48032636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis std::make_pair(offs, (NamedDecl*)0)); 48042636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48052636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48062636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) { 48072636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis assert(CurOffs <= CurLayObj->first); 48082636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48092636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CurOffs < CurLayObj->first) { 48102636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis uint64_t padding = CurLayObj->first - CurOffs; 48112636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // FIXME: There doesn't seem to be a way to indicate in the encoding that 48122636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // packing/alignment of members is different that normal, in which case 48132636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // the encoding will be out-of-sync with the real layout. 48142636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // If the runtime switches to just consider the size of types without 48152636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // taking into account alignment, we could make padding explicit in the 48162636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // encoding (e.g. using arrays of chars). The encoding strings would be 48172636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // longer then though. 48182636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += padding; 48192636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48202636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48212636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis NamedDecl *dcl = CurLayObj->second; 48222636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (dcl == 0) 48232636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis break; // reached end of structure. 48242636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48252636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) { 48262636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // We expand the bases without their virtual bases since those are going 48272636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // in the initial structure. Note that this differs from gcc which 48282636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // expands virtual bases each time one is encountered in the hierarchy, 48292636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis // making the encoding type bigger than it really is. 48302636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false); 4831829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis assert(!base->isEmpty()); 4832829f20097e030229fd4c234b84948f53312eaf55Argyrios Kyrtzidis CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize()); 48332636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 48342636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis FieldDecl *field = cast<FieldDecl>(dcl); 48352636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (FD) { 48362636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 48372636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += field->getNameAsString(); 48382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis S += '"'; 48392636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48412636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis if (field->isBitField()) { 48422636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis EncodeBitField(this, S, field->getType(), field); 4843a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith CurOffs += field->getBitWidthValue(*this); 48442636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } else { 48452636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis QualType qt = field->getType(); 48462636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getLegacyIntegralTypeEncoding(qt); 48472636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis getObjCEncodingForTypeImpl(qt, S, false, true, FD, 48482636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*OutermostType*/false, 48492636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*EncodingProperty*/false, 48502636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis /*StructField*/true); 48512636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis CurOffs += getTypeSize(field->getType()); 48522636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48532636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48542636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis } 48552636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis} 48562636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis 48571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, 4858ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian std::string& S) const { 4859ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_In) 4860ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'n'; 4861ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Inout) 4862ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'N'; 4863ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Out) 4864ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'o'; 4865ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Bycopy) 4866ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'O'; 4867ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Byref) 4868ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'R'; 4869ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian if (QT & Decl::OBJC_TQ_Oneway) 4870ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian S += 'V'; 4871ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian} 4872ecb01e666665efabd2aa76a76f6080e2a78965faFariborz Jahanian 4873ce7b38c4f1ea9c51e2f46a82e3f57456b74269d5Chris Lattnervoid ASTContext::setBuiltinVaListType(QualType T) { 4874b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson assert(BuiltinVaListType.isNull() && "__builtin_va_list type already set!"); 48751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4876b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson BuiltinVaListType = T; 4877b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson} 4878b2cf3573d7351094f6247fcca94703ce88eb9ee0Anders Carlsson 48794dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas GregorTypedefDecl *ASTContext::getObjCIdDecl() const { 48804dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor if (!ObjCIdDecl) { 48814dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0); 48824dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor T = getObjCObjectPointerType(T); 48834dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T); 48844dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 48854dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor getTranslationUnitDecl(), 48864dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor SourceLocation(), SourceLocation(), 48874dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor &Idents.get("id"), IdInfo); 48884dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor } 48894dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor 48904dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor return ObjCIdDecl; 48917e219e47de26346885d667131977bd9ca2d7662aSteve Naroff} 48927e219e47de26346885d667131977bd9ca2d7662aSteve Naroff 48937a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas GregorTypedefDecl *ASTContext::getObjCSelDecl() const { 48947a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor if (!ObjCSelDecl) { 48957a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor QualType SelT = getPointerType(ObjCBuiltinSelTy); 48967a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor TypeSourceInfo *SelInfo = getTrivialTypeSourceInfo(SelT); 48977a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor ObjCSelDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 48987a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor getTranslationUnitDecl(), 48997a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor SourceLocation(), SourceLocation(), 49007a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor &Idents.get("SEL"), SelInfo); 49017a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor } 49027a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor return ObjCSelDecl; 4903b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 4904b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 490579d6726921897811232554ed94c5d77b5b7b3fc0Douglas GregorTypedefDecl *ASTContext::getObjCClassDecl() const { 490679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor if (!ObjCClassDecl) { 490779d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor QualType T = getObjCObjectType(ObjCBuiltinClassTy, 0, 0); 490879d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor T = getObjCObjectPointerType(T); 490979d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor TypeSourceInfo *ClassInfo = getTrivialTypeSourceInfo(T); 491079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor ObjCClassDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), 491179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor getTranslationUnitDecl(), 491279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor SourceLocation(), SourceLocation(), 491379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor &Idents.get("Class"), ClassInfo); 491479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor } 491579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor 491679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor return ObjCClassDecl; 4917a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor} 4918a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 4919a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas GregorObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const { 4920a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor if (!ObjCProtocolClassDecl) { 4921a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor ObjCProtocolClassDecl 4922a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(), 4923a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor SourceLocation(), 4924a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor &Idents.get("Protocol"), 4925a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor /*PrevDecl=*/0, 4926a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor SourceLocation(), true); 4927a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor } 4928a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 4929a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor return ObjCProtocolClassDecl; 49308baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson} 49318baaca50f07d0c10bba69c8d88c1b9078c92d06dAnders Carlsson 4932a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) { 49331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(ObjCConstantStringType.isNull() && 49342198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff "'NSConstantString' type already set!"); 49351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4936a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek ObjCConstantStringType = getObjCInterfaceType(Decl); 49372198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff} 49382198891824c38d45b2279de5d5e3ef9394eb457cSteve Naroff 49390bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// \brief Retrieve the template name that corresponds to a non-empty 49400bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall/// lookup. 49414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 49424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin, 49434ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad UnresolvedSetIterator End) const { 49440bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall unsigned size = End - Begin; 49450bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall assert(size > 1 && "set is not overloaded!"); 49467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 49470bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall void *memory = Allocate(sizeof(OverloadedTemplateStorage) + 49480bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall size * sizeof(FunctionTemplateDecl*)); 49490bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size); 49500bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall 49510bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall NamedDecl **Storage = OT->getStorage(); 4952eec51cf1ba5f0e62c9cdb81b5c63babdd6e649abJohn McCall for (UnresolvedSetIterator I = Begin; I != End; ++I) { 49530bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall NamedDecl *D = *I; 49540bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall assert(isa<FunctionTemplateDecl>(D) || 49550bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall (isa<UsingShadowDecl>(D) && 49560bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall isa<FunctionTemplateDecl>(D->getUnderlyingDecl()))); 49570bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall *Storage++ = D; 49587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } 49597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 49600bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall return TemplateName(OT); 49617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor} 49627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 4963d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// \brief Retrieve the template name that represents a qualified 4964d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor/// template name such as \c std::vector. 49654ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 49664ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS, 49674ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool TemplateKeyword, 49684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad TemplateDecl *Template) const { 49690f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor assert(NNS && "Missing nested-name-specifier in qualified template name"); 49700f0ea2a96534c615ff5fdd81363989b23cf2164aDouglas Gregor 4971789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor // FIXME: Canonicalization? 4972d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor llvm::FoldingSetNodeID ID; 4973d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template); 49741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4975d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor void *InsertPos = 0; 4976d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateName *QTN = 49770bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 4978d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor if (!QTN) { 4979d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QTN = new (*this,4) QualifiedTemplateName(NNS, TemplateKeyword, Template); 4980d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor QualifiedTemplateNames.InsertNode(QTN, InsertPos); 4981d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor } 49821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4983d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor return TemplateName(QTN); 4984d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor} 4985d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor 49867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Retrieve the template name that represents a dependent 49877532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name such as \c MetaFun::template apply. 49884ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateName 49894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 49904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const IdentifierInfo *Name) const { 49911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((!NNS || NNS->isDependent()) && 49923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor "Nested name specifier must be dependent"); 49937532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 49947532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor llvm::FoldingSetNodeID ID; 49957532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateName::Profile(ID, NNS, Name); 49967532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 49977532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor void *InsertPos = 0; 49987532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateName *QTN = 49997532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 50007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 50017532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor if (QTN) 50027532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor return TemplateName(QTN); 50037532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 50047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 50057532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor if (CanonNNS == NNS) { 50067532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Name); 50077532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } else { 50087532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor TemplateName Canon = getDependentTemplateName(CanonNNS, Name); 50097532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Name, Canon); 5010789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *CheckQTN = 5011789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5012789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CheckQTN && "Dependent type name canonicalization broken"); 5013789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckQTN; 50147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor } 50157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 50167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor DependentTemplateNames.InsertNode(QTN, InsertPos); 50177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor return TemplateName(QTN); 50187532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor} 50197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor 5020ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// \brief Retrieve the template name that represents a dependent 5021ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor/// template name such as \c MetaFun::template operator+. 5022ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5023ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 50244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad OverloadedOperatorKind Operator) const { 5025ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor assert((!NNS || NNS->isDependent()) && 5026ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor "Nested name specifier must be dependent"); 5027ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5028ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor llvm::FoldingSetNodeID ID; 5029ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateName::Profile(ID, NNS, Operator); 5030ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5031ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor void *InsertPos = 0; 5032789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *QTN 5033789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5034ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5035ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (QTN) 5036ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return TemplateName(QTN); 5037ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5038ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 5039ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (CanonNNS == NNS) { 5040ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Operator); 5041ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } else { 5042ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName Canon = getDependentTemplateName(CanonNNS, Operator); 5043ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QTN = new (*this,4) DependentTemplateName(NNS, Operator, Canon); 5044789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor 5045789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor DependentTemplateName *CheckQTN 5046789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 5047789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor assert(!CheckQTN && "Dependent template name canonicalization broken"); 5048789b1f640205e81b5af250693246120f1ce9d147Douglas Gregor (void)CheckQTN; 5049ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } 5050ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5051ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateNames.InsertNode(QTN, InsertPos); 5052ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return TemplateName(QTN); 5053ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5054ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 50551aee05d08b2184acadeb36de300e216390780d6cDouglas GregorTemplateName 5056146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param, 5057146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall TemplateName replacement) const { 5058146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall llvm::FoldingSetNodeID ID; 5059146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage::Profile(ID, param, replacement); 5060146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5061146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall void *insertPos = 0; 5062146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 5063146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos); 5064146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5065146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall if (!subst) { 5066146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement); 5067146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParms.InsertNode(subst, insertPos); 5068146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 5069146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5070146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall return TemplateName(subst); 5071146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall} 5072146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5073146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallTemplateName 50741aee05d08b2184acadeb36de300e216390780d6cDouglas GregorASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param, 50751aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor const TemplateArgument &ArgPack) const { 50761aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ASTContext &Self = const_cast<ASTContext &>(*this); 50771aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor llvm::FoldingSetNodeID ID; 50781aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack); 50791aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 50801aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor void *InsertPos = 0; 50811aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage *Subst 50821aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos); 50831aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 50841aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!Subst) { 5085146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param, 50861aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ArgPack.pack_size(), 50871aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor ArgPack.pack_begin()); 50881aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos); 50891aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 50901aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 50911aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(Subst); 50921aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor} 50931aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 5094b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor/// getFromTargetType - Given one of the integer types provided by 5095d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// TargetInfo, produce the corresponding type. The unsigned @p Type 5096d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor/// is actually a value of type @c TargetInfo::IntType. 5097e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCallCanQualType ASTContext::getFromTargetType(unsigned Type) const { 5098b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor switch (Type) { 5099e27ec8ad56dbf1efb2de004b90fbbb86f740e3f1John McCall case TargetInfo::NoInt: return CanQualType(); 5100b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedShort: return ShortTy; 5101b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedShort: return UnsignedShortTy; 5102b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedInt: return IntTy; 5103b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedInt: return UnsignedIntTy; 5104b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedLong: return LongTy; 5105b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedLong: return UnsignedLongTy; 5106b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::SignedLongLong: return LongLongTy; 5107b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy; 5108b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor } 5109b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor 5110b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unhandled TargetInfo::IntType value"); 5111b4e66d5259f90e9aae4d40fc5de801e046c7df94Douglas Gregor} 5112b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek 5113b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===// 5114b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek// Type Predicates. 5115b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek//===----------------------------------------------------------------------===// 5116b6ccaac65ca72f72954eb3893bbd940bedd23f00Ted Kremenek 51174fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's 51184fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// garbage collection attribute. 51194fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian/// 5120ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCallQualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const { 51214e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().getGC() == LangOptions::NonGC) 5122ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return Qualifiers::GCNone; 5123ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall 51244e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie assert(getLangOpts().ObjC1); 5125ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall Qualifiers::GC GCAttrs = Ty.getObjCGCAttr(); 5126ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall 5127ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // Default behaviour under objective-C's gc is for ObjC pointers 5128ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // (or pointers to them) be treated as though they were declared 5129ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // as __strong. 5130ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall if (GCAttrs == Qualifiers::GCNone) { 5131ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType()) 5132ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return Qualifiers::Strong; 5133ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall else if (Ty->isPointerType()) 5134ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType()); 5135ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall } else { 5136ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // It's not valid to set GC attributes on anything that isn't a 5137ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall // pointer. 5138ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#ifndef NDEBUG 5139ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall QualType CT = Ty->getCanonicalTypeInternal(); 5140ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall while (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 5141ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall CT = AT->getElementType(); 5142ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall assert(CT->isAnyPointerType() || CT->isBlockPointerType()); 5143ae278a3a57595349a411f6474938d4dd1b263a0eJohn McCall#endif 51444fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian } 5145b7d2553edd2532d29b98b9e76bcf6a62bc48b417Chris Lattner return GCAttrs; 51464fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian} 51474fd83ea566f4a0c083001c84b75da6cc8c99c1d6Fariborz Jahanian 51486ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===// 51496ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner// Type Compatibility Testing 51506ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner//===----------------------------------------------------------------------===// 5151770951b5bb6028a8d326ddb4a13cef7d4a128162Chris Lattner 51521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// areCompatVectorTypes - Return true if the two specified vector types are 51536ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner/// compatible. 51546ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattnerstatic bool areCompatVectorTypes(const VectorType *LHS, 51556ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner const VectorType *RHS) { 5156467b27b9a24bdc823218ad1ad0e37673b6cc1e83John McCall assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified()); 51576ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return LHS->getElementType() == RHS->getElementType() && 515861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner LHS->getNumElements() == RHS->getNumElements(); 51596ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner} 51606ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner 5161255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregorbool ASTContext::areCompatibleVectorTypes(QualType FirstVec, 5162255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor QualType SecondVec) { 5163255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor assert(FirstVec->isVectorType() && "FirstVec should be a vector type"); 5164255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor assert(SecondVec->isVectorType() && "SecondVec should be a vector type"); 5165255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5166255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor if (hasSameUnqualifiedType(FirstVec, SecondVec)) 5167255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return true; 5168255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5169f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson // Treat Neon vector types and most AltiVec vector types as if they are the 5170f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson // equivalent GCC vector types. 5171255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor const VectorType *First = FirstVec->getAs<VectorType>(); 5172255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor const VectorType *Second = SecondVec->getAs<VectorType>(); 5173f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson if (First->getNumElements() == Second->getNumElements() && 5174255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor hasSameType(First->getElementType(), Second->getElementType()) && 5175f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson First->getVectorKind() != VectorType::AltiVecPixel && 5176f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson First->getVectorKind() != VectorType::AltiVecBool && 5177f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson Second->getVectorKind() != VectorType::AltiVecPixel && 5178f69eb7cf8e616b5aad7911ec6f79b24b0a009227Bob Wilson Second->getVectorKind() != VectorType::AltiVecBool) 5179255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return true; 5180255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 5181255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor return false; 5182255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor} 5183255210ef415b9893f0e3794e8d9a704194c12f3cDouglas Gregor 51844084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===// 51854084c306635b70f37029dca938444e6013f08684Steve Naroff// ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's. 51864084c306635b70f37029dca938444e6013f08684Steve Naroff//===----------------------------------------------------------------------===// 51874084c306635b70f37029dca938444e6013f08684Steve Naroff 51884084c306635b70f37029dca938444e6013f08684Steve Naroff/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the 51894084c306635b70f37029dca938444e6013f08684Steve Naroff/// inheritance hierarchy of 'rProto'. 51904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool 51914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, 51924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad ObjCProtocolDecl *rProto) const { 51933fc73ee0c613715ebce78e30b4d050ea715a007dDouglas Gregor if (declaresSameEntity(lProto, rProto)) 519414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return true; 51954084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(), 51964084c306635b70f37029dca938444e6013f08684Steve Naroff E = rProto->protocol_end(); PI != E; ++PI) 51974084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lProto, *PI)) 51984084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 51994084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 52004084c306635b70f37029dca938444e6013f08684Steve Naroff} 520114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 52024084c306635b70f37029dca938444e6013f08684Steve Naroff/// QualifiedIdConformsQualifiedId - compare id<p,...> with id<p1,...> 52034084c306635b70f37029dca938444e6013f08684Steve Naroff/// return true if lhs's protocols conform to rhs's protocol; false 52044084c306635b70f37029dca938444e6013f08684Steve Naroff/// otherwise. 52054084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) { 52064084c306635b70f37029dca938444e6013f08684Steve Naroff if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType()) 52074084c306635b70f37029dca938444e6013f08684Steve Naroff return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false); 52084084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 52094084c306635b70f37029dca938444e6013f08684Steve Naroff} 52104084c306635b70f37029dca938444e6013f08684Steve Naroff 5211a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian/// ObjCQualifiedClassTypesAreCompatible - compare Class<p,...> and 5212a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian/// Class<p1, ...>. 5213a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanianbool ASTContext::ObjCQualifiedClassTypesAreCompatible(QualType lhs, 5214a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian QualType rhs) { 5215a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian const ObjCObjectPointerType *lhsQID = lhs->getAs<ObjCObjectPointerType>(); 5216a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 5217a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian assert ((lhsQID && rhsOPT) && "ObjCQualifiedClassTypesAreCompatible"); 5218a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5219a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 5220a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian E = lhsQID->qual_end(); I != E; ++I) { 5221a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian bool match = false; 5222a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian ObjCProtocolDecl *lhsProto = *I; 5223a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 5224a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian E = rhsOPT->qual_end(); J != E; ++J) { 5225a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian ObjCProtocolDecl *rhsProto = *J; 5226a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) { 5227a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian match = true; 5228a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian break; 5229a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5230a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5231a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (!match) 5232a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return false; 5233a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian } 5234a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return true; 5235a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian} 5236a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 52374084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an 52384084c306635b70f37029dca938444e6013f08684Steve Naroff/// ObjCQualifiedIDType. 52394084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, 52404084c306635b70f37029dca938444e6013f08684Steve Naroff bool compare) { 52414084c306635b70f37029dca938444e6013f08684Steve Naroff // Allow id<P..> and an 'id' or void* type in all cases. 52421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (lhs->isVoidPointerType() || 52434084c306635b70f37029dca938444e6013f08684Steve Naroff lhs->isObjCIdType() || lhs->isObjCClassType()) 52444084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 52451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (rhs->isVoidPointerType() || 52464084c306635b70f37029dca938444e6013f08684Steve Naroff rhs->isObjCIdType() || rhs->isObjCClassType()) 52474084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 52484084c306635b70f37029dca938444e6013f08684Steve Naroff 52494084c306635b70f37029dca938444e6013f08684Steve Naroff if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) { 5250183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 52511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52524084c306635b70f37029dca938444e6013f08684Steve Naroff if (!rhsOPT) return false; 52531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52544084c306635b70f37029dca938444e6013f08684Steve Naroff if (rhsOPT->qual_empty()) { 52551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the RHS is a unqualified interface pointer "NSString*", 52564084c306635b70f37029dca938444e6013f08684Steve Naroff // make sure we check the class hierarchy. 52574084c306635b70f37029dca938444e6013f08684Steve Naroff if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 52584084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 52594084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 52604084c306635b70f37029dca938444e6013f08684Steve Naroff // when comparing an id<P> on lhs with a static type on rhs, 52614084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 52624084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 52630fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian if (!rhsID->ClassImplementsProtocol(*I, true)) 52644084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 52654084c306635b70f37029dca938444e6013f08684Steve Naroff } 52664084c306635b70f37029dca938444e6013f08684Steve Naroff } 52674084c306635b70f37029dca938444e6013f08684Steve Naroff // If there are no qualifiers and no interface, we have an 'id'. 52684084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 52694084c306635b70f37029dca938444e6013f08684Steve Naroff } 52701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Both the right and left sides have qualifiers. 52714084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 52724084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 52734084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *lhsProto = *I; 52744084c306635b70f37029dca938444e6013f08684Steve Naroff bool match = false; 5275de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff 5276de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // when comparing an id<P> on lhs with a static type on rhs, 5277de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // see if static class implements all of id's protocols, directly or 5278de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff // through its super class and categories. 52794084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 52804084c306635b70f37029dca938444e6013f08684Steve Naroff E = rhsOPT->qual_end(); J != E; ++J) { 52814084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *rhsProto = *J; 52824084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 52834084c306635b70f37029dca938444e6013f08684Steve Naroff (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 52844084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 52858f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff break; 52868f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff } 5287de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 52881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the RHS is a qualified interface pointer "NSString<P>*", 52894084c306635b70f37029dca938444e6013f08684Steve Naroff // make sure we check the class hierarchy. 52904084c306635b70f37029dca938444e6013f08684Steve Naroff if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 52914084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 52924084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsQID->qual_end(); I != E; ++I) { 52934084c306635b70f37029dca938444e6013f08684Steve Naroff // when comparing an id<P> on lhs with a static type on rhs, 52944084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 52954084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 52960fd8904c5f71a11d29f67716c3ebdf7ad1c855fbFariborz Jahanian if (rhsID->ClassImplementsProtocol(*I, true)) { 52974084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 52984084c306635b70f37029dca938444e6013f08684Steve Naroff break; 52994084c306635b70f37029dca938444e6013f08684Steve Naroff } 53004084c306635b70f37029dca938444e6013f08684Steve Naroff } 53014084c306635b70f37029dca938444e6013f08684Steve Naroff } 53024084c306635b70f37029dca938444e6013f08684Steve Naroff if (!match) 5303de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff return false; 5304de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 53051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5306de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff return true; 5307de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff } 53081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53094084c306635b70f37029dca938444e6013f08684Steve Naroff const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType(); 53104084c306635b70f37029dca938444e6013f08684Steve Naroff assert(rhsQID && "One of the LHS/RHS should be id<x>"); 53114084c306635b70f37029dca938444e6013f08684Steve Naroff 53121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ObjCObjectPointerType *lhsOPT = 53134084c306635b70f37029dca938444e6013f08684Steve Naroff lhs->getAsObjCInterfacePointerType()) { 5314de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // If both the right and left sides have qualifiers. 53154084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(), 53164084c306635b70f37029dca938444e6013f08684Steve Naroff E = lhsOPT->qual_end(); I != E; ++I) { 53174084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *lhsProto = *I; 53184084c306635b70f37029dca938444e6013f08684Steve Naroff bool match = false; 53194084c306635b70f37029dca938444e6013f08684Steve Naroff 5320de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // when comparing an id<P> on rhs with a static type on lhs, 53214084c306635b70f37029dca938444e6013f08684Steve Naroff // see if static class implements all of id's protocols, directly or 53224084c306635b70f37029dca938444e6013f08684Steve Naroff // through its super class and categories. 5323de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // First, lhs protocols in the qualifier list must be found, direct 5324de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // or indirect in rhs's qualifier list or it is a mismatch. 53254084c306635b70f37029dca938444e6013f08684Steve Naroff for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 53264084c306635b70f37029dca938444e6013f08684Steve Naroff E = rhsQID->qual_end(); J != E; ++J) { 53274084c306635b70f37029dca938444e6013f08684Steve Naroff ObjCProtocolDecl *rhsProto = *J; 53284084c306635b70f37029dca938444e6013f08684Steve Naroff if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 53294084c306635b70f37029dca938444e6013f08684Steve Naroff (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 53304084c306635b70f37029dca938444e6013f08684Steve Naroff match = true; 53314084c306635b70f37029dca938444e6013f08684Steve Naroff break; 53324084c306635b70f37029dca938444e6013f08684Steve Naroff } 53334084c306635b70f37029dca938444e6013f08684Steve Naroff } 53344084c306635b70f37029dca938444e6013f08684Steve Naroff if (!match) 53354084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 53364084c306635b70f37029dca938444e6013f08684Steve Naroff } 5337de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian 5338de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // Static class's protocols, or its super class or category protocols 5339de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // must be found, direct or indirect in rhs's qualifier list or it is a mismatch. 5340de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) { 5341de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5342de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian CollectInheritedProtocols(lhsID, LHSInheritedProtocols); 5343de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // This is rather dubious but matches gcc's behavior. If lhs has 5344de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // no type qualifier and its class has no static protocol(s) 5345de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian // assume that it is mismatch. 5346de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty()) 5347de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian return false; 5348de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5349de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian LHSInheritedProtocols.begin(), 5350de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian E = LHSInheritedProtocols.end(); I != E; ++I) { 5351de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian bool match = false; 5352de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian ObjCProtocolDecl *lhsProto = (*I); 5353de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 5354de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian E = rhsQID->qual_end(); J != E; ++J) { 5355de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian ObjCProtocolDecl *rhsProto = *J; 5356de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 5357de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 5358de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian match = true; 5359de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian break; 5360de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5361de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5362de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian if (!match) 5363de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian return false; 5364de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 5365de5b17ea3c74d2844ed035a1edfa6479866139b5Fariborz Jahanian } 53664084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 53674084c306635b70f37029dca938444e6013f08684Steve Naroff } 53684084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 53694084c306635b70f37029dca938444e6013f08684Steve Naroff} 53704084c306635b70f37029dca938444e6013f08684Steve Naroff 53714084c306635b70f37029dca938444e6013f08684Steve Naroff/// canAssignObjCInterfaces - Return true if the two interface types are 53724084c306635b70f37029dca938444e6013f08684Steve Naroff/// compatible for assignment from RHS to LHS. This handles validation of any 53734084c306635b70f37029dca938444e6013f08684Steve Naroff/// protocol qualifiers on the LHS or RHS. 53744084c306635b70f37029dca938444e6013f08684Steve Naroff/// 53754084c306635b70f37029dca938444e6013f08684Steve Naroffbool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, 53764084c306635b70f37029dca938444e6013f08684Steve Naroff const ObjCObjectPointerType *RHSOPT) { 5377c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5378c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5379c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 53804084c306635b70f37029dca938444e6013f08684Steve Naroff // If either type represents the built-in 'id' or 'Class' types, return true. 5381c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->isObjCUnqualifiedIdOrClass() || 5382c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHS->isObjCUnqualifiedIdOrClass()) 53834084c306635b70f37029dca938444e6013f08684Steve Naroff return true; 53844084c306635b70f37029dca938444e6013f08684Steve Naroff 5385c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) 53861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 53871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType(RHSOPT,0), 53884084c306635b70f37029dca938444e6013f08684Steve Naroff false); 5389a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5390a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) 5391a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian return ObjCQualifiedClassTypesAreCompatible(QualType(LHSOPT,0), 5392a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian QualType(RHSOPT,0)); 5393a8f8dac6a29f6d33474a38a32ce9dd859b696da9Fariborz Jahanian 5394c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // If we have 2 user-defined types, fall into that path. 5395c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHS->getInterface() && RHS->getInterface()) 53964084c306635b70f37029dca938444e6013f08684Steve Naroff return canAssignObjCInterfaces(LHS, RHS); 53971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53984084c306635b70f37029dca938444e6013f08684Steve Naroff return false; 539914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff} 540014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 5401132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// canAssignObjCInterfacesInBlockPointer - This routine is specifically written 5402fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// for providing type-safety for objective-c pointers used to pass/return 5403132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// arguments in block literals. When passed as arguments, passing 'A*' where 5404132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is 5405132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian/// not OK. For the return type, the opposite is not OK. 5406132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::canAssignObjCInterfacesInBlockPointer( 5407132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCObjectPointerType *LHSOPT, 5408a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian const ObjCObjectPointerType *RHSOPT, 5409a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian bool BlockReturnType) { 5410a98344869c278295f38e106583906377520079b8Fariborz Jahanian if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType()) 5411132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return true; 5412132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5413132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHSOPT->isObjCBuiltinType()) { 5414132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType(); 5415132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5416132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5417a98344869c278295f38e106583906377520079b8Fariborz Jahanian if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) 5418132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 5419132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian QualType(RHSOPT,0), 5420132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian false); 5421132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5422132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType(); 5423132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType(); 5424132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS && RHS) { // We have 2 user-defined types. 5425132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS != RHS) { 5426132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (LHS->getDecl()->isSuperClassOf(RHS->getDecl())) 5427a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian return BlockReturnType; 5428132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (RHS->getDecl()->isSuperClassOf(LHS->getDecl())) 5429a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian return !BlockReturnType; 5430132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5431132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian else 5432132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return true; 5433132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 5434132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return false; 5435132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian} 5436132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 5437e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// getIntersectionOfProtocols - This routine finds the intersection of set 5438e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// of protocols inherited from two distinct objective-c pointer objects. 5439e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// It is used to build composite qualifier list of the composite type of 5440e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian/// the conditional expression involving two objective-c pointer objects. 5441e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianstatic 5442e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanianvoid getIntersectionOfProtocols(ASTContext &Context, 5443e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian const ObjCObjectPointerType *LHSOPT, 5444e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian const ObjCObjectPointerType *RHSOPT, 54455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) { 5446e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5447c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5448c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5449c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(LHS->getInterface() && "LHS must have an interface base"); 5450c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(RHS->getInterface() && "RHS must have an interface base"); 5451e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5452e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet; 5453e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian unsigned LHSNumProtocols = LHS->getNumProtocols(); 5454e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (LHSNumProtocols > 0) 5455e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end()); 5456e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian else { 5457432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5458c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Context.CollectInheritedProtocols(LHS->getInterface(), 5459c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHSInheritedProtocols); 5460e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian InheritedProtocolSet.insert(LHSInheritedProtocols.begin(), 5461e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian LHSInheritedProtocols.end()); 5462e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 5463e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5464e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian unsigned RHSNumProtocols = RHS->getNumProtocols(); 5465e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (RHSNumProtocols > 0) { 5466cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman ObjCProtocolDecl **RHSProtocols = 5467cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman const_cast<ObjCProtocolDecl **>(RHS->qual_begin()); 5468e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian for (unsigned i = 0; i < RHSNumProtocols; ++i) 5469e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (InheritedProtocolSet.count(RHSProtocols[i])) 5470e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian IntersectionOfProtocols.push_back(RHSProtocols[i]); 54713060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 5472432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols; 5473c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Context.CollectInheritedProtocols(RHS->getInterface(), 5474c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHSInheritedProtocols); 5475432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5476432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian RHSInheritedProtocols.begin(), 5477432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian E = RHSInheritedProtocols.end(); I != E; ++I) 5478432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian if (InheritedProtocolSet.count((*I))) 5479432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian IntersectionOfProtocols.push_back((*I)); 5480e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 5481e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian} 5482e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian 5483db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// areCommonBaseCompatible - Returns common base class of the two classes if 5484db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// one found. Note that this is O'2 algorithm. But it will be called as the 5485db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// last type comparison in a ?-exp of ObjC pointer types before a 5486db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian/// warning is issued. So, its invokation is extremely rare. 5487db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz JahanianQualType ASTContext::areCommonBaseCompatible( 5488c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectPointerType *Lptr, 5489c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectPointerType *Rptr) { 5490c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *LHS = Lptr->getObjectType(); 5491c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *RHS = Rptr->getObjectType(); 5492c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCInterfaceDecl* LDecl = LHS->getInterface(); 5493c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCInterfaceDecl* RDecl = RHS->getInterface(); 549460ef308e51c71b760d7f598c1b763ceb7b768148Douglas Gregor if (!LDecl || !RDecl || (declaresSameEntity(LDecl, RDecl))) 5495db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian return QualType(); 5496db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 54977c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian do { 5498c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHS = cast<ObjCInterfaceType>(getObjCInterfaceType(LDecl)); 5499e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian if (canAssignObjCInterfaces(LHS, RHS)) { 55005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ObjCProtocolDecl *, 8> Protocols; 5501c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall getIntersectionOfProtocols(*this, Lptr, Rptr, Protocols); 5502c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 5503c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall QualType Result = QualType(LHS, 0); 5504c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!Protocols.empty()) 5505c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = getObjCObjectType(Result, Protocols.data(), Protocols.size()); 5506c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = getObjCObjectPointerType(Result); 5507c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Result; 5508e23fa2d0e84d1b878e012442a726c664216a9adfFariborz Jahanian } 55097c2bdcb4d30f2d370b4367664e6a11b075ce2cb3Fariborz Jahanian } while ((LDecl = LDecl->getSuperClass())); 5510db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 5511db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian return QualType(); 5512db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian} 5513db07b3f7cdcb505329c1280d7cf70791739a7cadFariborz Jahanian 5514c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallbool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS, 5515c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *RHS) { 5516c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(LHS->getInterface() && "LHS is not an interface type"); 5517c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall assert(RHS->getInterface() && "RHS is not an interface type"); 5518c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 55196ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // Verify that the base decls are compatible: the RHS must be a subclass of 55206ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // the LHS. 5521c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!LHS->getInterface()->isSuperClassOf(RHS->getInterface())) 55226ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return false; 55231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55246ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // RHS must have a superset of the protocols in the LHS. If the LHS is not 55256ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner // protocol qualified at all, then we are good. 5526c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff if (LHS->getNumProtocols() == 0) 55276ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner return true; 55281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5529b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // Okay, we know the LHS has protocol qualifiers. If the RHS doesn't, 5530b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // more detailed analysis is required. 5531b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (RHS->getNumProtocols() == 0) { 5532b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // OK, if LHS is a superclass of RHS *and* 5533b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // this superclass is assignment compatible with LHS. 5534b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // false otherwise. 5535627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian bool IsSuperClass = 5536627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian LHS->getInterface()->isSuperClassOf(RHS->getInterface()); 5537627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian if (IsSuperClass) { 5538b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // OK if conversion of LHS to SuperClass results in narrowing of types 5539b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // ; i.e., SuperClass may implement at least one of the protocols 5540b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok. 5541b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // But not SuperObj<P1,P2,P3> = lhs<P1,P2>. 5542b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols; 5543627788c29976fbeb4ad47bcfcb3576889070e357Fariborz Jahanian CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols); 5544b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian // If super class has no protocols, it is not a match. 5545b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (SuperClassInheritedProtocols.empty()) 5546b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5547b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian 5548b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5549b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian LHSPE = LHS->qual_end(); 5550b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian LHSPI != LHSPE; LHSPI++) { 5551b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian bool SuperImplementsProtocol = false; 5552b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian ObjCProtocolDecl *LHSProto = (*LHSPI); 5553b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian 5554b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5555b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian SuperClassInheritedProtocols.begin(), 5556b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian E = SuperClassInheritedProtocols.end(); I != E; ++I) { 5557b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian ObjCProtocolDecl *SuperClassProto = (*I); 5558b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) { 5559b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian SuperImplementsProtocol = true; 5560b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian break; 5561b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5562b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5563b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian if (!SuperImplementsProtocol) 5564b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5565b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5566b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return true; 5567b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 5568b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian return false; 5569b7bc34a83aff8af09f2a78aa6d1dcafe18ad8619Fariborz Jahanian } 55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5571c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5572c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall LHSPE = LHS->qual_end(); 557391b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff LHSPI != LHSPE; LHSPI++) { 557491b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff bool RHSImplementsProtocol = false; 557591b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff 557691b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // If the RHS doesn't implement the protocol on the left, the types 557791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // are incompatible. 5578c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall for (ObjCObjectType::qual_iterator RHSPI = RHS->qual_begin(), 5579c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall RHSPE = RHS->qual_end(); 55808f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff RHSPI != RHSPE; RHSPI++) { 55818f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) { 558291b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff RHSImplementsProtocol = true; 55838f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff break; 55848f16756441450ed9fb39316e47d107fc2a1ef35bSteve Naroff } 558591b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff } 558691b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // FIXME: For better diagnostics, consider passing back the protocol name. 558791b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff if (!RHSImplementsProtocol) 558891b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff return false; 558991b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff } 559091b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff // The RHS implements all protocols listed on the LHS. 559191b0b0cf6b537cbcbca0038c7032f87161a41d31Steve Naroff return true; 55926ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner} 55936ac46a4a521366d7ab36ebe2ce4e624ab96b06f9Chris Lattner 5594389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroffbool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) { 5595389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff // get the "pointed to" types 5596183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>(); 5597183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>(); 55981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 559914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (!LHSOPT || !RHSOPT) 5600389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff return false; 560114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 560214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return canAssignObjCInterfaces(LHSOPT, RHSOPT) || 560314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff canAssignObjCInterfaces(RHSOPT, LHSOPT); 5604389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff} 5605389bf46ae41241a656ed71b00ac2177d7f385651Steve Naroff 5606569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregorbool ASTContext::canBindObjCObjectType(QualType To, QualType From) { 5607569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor return canAssignObjCInterfaces( 5608569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor getObjCObjectPointerType(To)->getAs<ObjCObjectPointerType>(), 5609569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor getObjCObjectPointerType(From)->getAs<ObjCObjectPointerType>()); 5610569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor} 5611569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor 56121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible, 5613ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// both shall have the identically qualified version of a compatible type. 56141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// C99 6.2.7p1: Two types have compatible types if their types are the 5615ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff/// same. See 6.7.[2,3,5] for additional rules. 5616447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregorbool ASTContext::typesAreCompatible(QualType LHS, QualType RHS, 5617447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool CompareUnqualified) { 56184e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 56190e709abafbd939326850501f795cc7a92c88a354Douglas Gregor return hasSameType(LHS, RHS); 56200e709abafbd939326850501f795cc7a92c88a354Douglas Gregor 5621447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull(); 56223d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman} 56233d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 5624c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanianbool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) { 562582378391dfc3b2fc22f63dbf1552bd9aed39dc42Fariborz Jahanian return typesAreCompatible(LHS, RHS); 5626c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian} 5627c286f3835eb6001c61664cef5d610dfaf80a6e9bFariborz Jahanian 5628132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanianbool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) { 5629132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return !mergeTypes(LHS, RHS, true).isNull(); 5630132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian} 5631132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian 56324846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeTransparentUnionType - if T is a transparent union type and a member 56334846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// of T is compatible with SubType, return the merged type, else return 56344846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// QualType() 56354846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType, 56364846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool OfBlockPointer, 56374846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool Unqualified) { 56384846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (const RecordType *UT = T->getAsUnionType()) { 56394846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne RecordDecl *UD = UT->getDecl(); 56404846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (UD->hasAttr<TransparentUnionAttr>()) { 56414846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne for (RecordDecl::field_iterator it = UD->field_begin(), 56424846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne itend = UD->field_end(); it != itend; ++it) { 5643f91d7572ee7fa6f2926c8e7e816039a1154a59f8Peter Collingbourne QualType ET = it->getType().getUnqualifiedType(); 56444846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified); 56454846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!MT.isNull()) 56464846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return MT; 56474846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 56484846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 56494846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne } 56504846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 56514846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return QualType(); 56524846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne} 56534846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 56544846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// mergeFunctionArgumentTypes - merge two types which appear as function 56554846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne/// argument types 56564846675e0e42d1802b0ffd8972a45e72aeb3758dPeter CollingbourneQualType ASTContext::mergeFunctionArgumentTypes(QualType lhs, QualType rhs, 56574846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool OfBlockPointer, 56584846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne bool Unqualified) { 56594846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // GNU extension: two types are compatible if they appear as a function 56604846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // argument, one of the types is a transparent union type and the other 56614846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne // type is compatible with a union member 56624846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer, 56634846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 56644846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!lmerge.isNull()) 56654846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return lmerge; 56664846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 56674846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer, 56684846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 56694846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne if (!rmerge.isNull()) 56704846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return rmerge; 56714846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 56724846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified); 56734846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne} 56744846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne 5675132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs, 5676447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool OfBlockPointer, 5677447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool Unqualified) { 5678183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *lbase = lhs->getAs<FunctionType>(); 5679183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *rbase = rhs->getAs<FunctionType>(); 568072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase); 568172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase); 56823d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman bool allLTypes = true; 56833d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman bool allRTypes = true; 56843d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 56853d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check return type 5686132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian QualType retType; 5687d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian if (OfBlockPointer) { 5688d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian QualType RHS = rbase->getResultType(); 5689d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian QualType LHS = lbase->getResultType(); 5690d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian bool UnqualifiedResult = Unqualified; 5691d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian if (!UnqualifiedResult) 5692d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers()); 5693a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true); 5694d263fd1451299b1e5f5f1acb2bb13b0a4119aee8Fariborz Jahanian } 5695132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian else 56968cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall retType = mergeTypes(lbase->getResultType(), rbase->getResultType(), false, 56978cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall Unqualified); 56983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (retType.isNull()) return QualType(); 5699447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 5700447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) 5701447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor retType = retType.getUnqualifiedType(); 5702447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 5703447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor CanQualType LRetType = getCanonicalType(lbase->getResultType()); 5704447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor CanQualType RRetType = getCanonicalType(rbase->getResultType()); 5705447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 5706447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LRetType = LRetType.getUnqualifiedType(); 5707447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RRetType = RRetType.getUnqualifiedType(); 5708447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 5709447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 5710447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (getCanonicalType(retType) != LRetType) 571161710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allLTypes = false; 5712447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (getCanonicalType(retType) != RRetType) 571361710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allRTypes = false; 57148cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 57156a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // FIXME: double check this 57166a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // FIXME: should we error if lbase->getRegParmAttr() != 0 && 57176a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // rbase->getRegParmAttr() != 0 && 57186a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar // lbase->getRegParmAttr() != rbase->getRegParmAttr()? 5719264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo(); 5720264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo(); 57218cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 57228cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall // Compatible functions must have compatible calling conventions 57238cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall if (!isSameCallConv(lbaseInfo.getCC(), rbaseInfo.getCC())) 57248cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return QualType(); 57258cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 57268cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall // Regparm is part of the calling convention. 5727a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm()) 5728a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman return QualType(); 57298cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm()) 57308cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return QualType(); 57318cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall 5732f85e193739c953358c865005855253af4f68a497John McCall if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult()) 5733f85e193739c953358c865005855253af4f68a497John McCall return QualType(); 5734f85e193739c953358c865005855253af4f68a497John McCall 573553c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian // functypes which return are preferred over those that do not. 573653c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian if (lbaseInfo.getNoReturn() && !rbaseInfo.getNoReturn()) 57376a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar allLTypes = false; 573853c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian else if (!lbaseInfo.getNoReturn() && rbaseInfo.getNoReturn()) 57396a15c8586cc3e5d6e01c4c4e8b4374584569b58fDaniel Dunbar allRTypes = false; 574053c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'. 574153c8167d7a007daae87f342c0fedd03f1dcf1b62Fariborz Jahanian bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn(); 57421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5743f85e193739c953358c865005855253af4f68a497John McCall FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn); 5744e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 57453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto && rproto) { // two C99 style function prototypes 5746465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() && 5747465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl "C++ shouldn't be here"); 57483d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned lproto_nargs = lproto->getNumArgs(); 57493d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned rproto_nargs = rproto->getNumArgs(); 57503d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 57513d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Compatible functions must have the same number of arguments 57523d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto_nargs != rproto_nargs) 57533d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 57543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 57553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Variadic and non-variadic functions aren't compatible 57563d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto->isVariadic() != rproto->isVariadic()) 57573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 57583d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 57597fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis if (lproto->getTypeQuals() != rproto->getTypeQuals()) 57607fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis return QualType(); 57617fb5e4888221cd36652d078c6b171ac55e7f406dArgyrios Kyrtzidis 576278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (LangOpts.ObjCAutoRefCount && 576378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian !FunctionTypesMatchOnNSConsumedAttrs(rproto, lproto)) 576478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return QualType(); 576578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 57663d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check argument compatibility 57675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 10> types; 57683d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman for (unsigned i = 0; i < lproto_nargs; i++) { 57693d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType largtype = lproto->getArgType(i).getUnqualifiedType(); 57703d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType rargtype = rproto->getArgType(i).getUnqualifiedType(); 57714846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne QualType argtype = mergeFunctionArgumentTypes(largtype, rargtype, 57724846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne OfBlockPointer, 57734846675e0e42d1802b0ffd8972a45e72aeb3758dPeter Collingbourne Unqualified); 57743d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (argtype.isNull()) return QualType(); 5775447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 5776447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) 5777447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor argtype = argtype.getUnqualifiedType(); 5778447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 57793d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman types.push_back(argtype); 5780447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 5781447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor largtype = largtype.getUnqualifiedType(); 5782447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor rargtype = rargtype.getUnqualifiedType(); 5783447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 5784447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 578561710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (getCanonicalType(argtype) != getCanonicalType(largtype)) 578661710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allLTypes = false; 578761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (getCanonicalType(argtype) != getCanonicalType(rargtype)) 578861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner allRTypes = false; 57893d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 579078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 57913d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 57923d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 5793e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 5794e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo(); 5795e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = einfo; 5796e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return getFunctionType(retType, types.begin(), types.size(), EPI); 57973d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 57983d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 57993d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (lproto) allRTypes = false; 58003d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (rproto) allLTypes = false; 58013d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 580272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *proto = lproto ? lproto : rproto; 58033d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (proto) { 5804465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl assert(!proto->hasExceptionSpec() && "C++ shouldn't be here"); 58053d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (proto->isVariadic()) return QualType(); 58063d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Check that the types are compatible with the types that 58073d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // would result from default argument promotions (C99 6.7.5.3p15). 58083d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // The only types actually affected are promotable integer 58093d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // types and floats, which would be passed as a different 58103d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // type depending on whether the prototype is visible. 58113d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman unsigned proto_nargs = proto->getNumArgs(); 58123d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman for (unsigned i = 0; i < proto_nargs; ++i) { 58133d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType argTy = proto->getArgType(i); 5814b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor 5815b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor // Look at the promotion type of enum types, since that is the type used 5816b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor // to pass enum values. 5817b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor if (const EnumType *Enum = argTy->getAs<EnumType>()) 5818b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor argTy = Enum->getDecl()->getPromotionType(); 5819b0f8eacfdcd0d43f51e669f2d723992d4af9f746Douglas Gregor 58203d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (argTy->isPromotableIntegerType() || 58213d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman getCanonicalType(argTy).getUnqualifiedType() == FloatTy) 58223d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 58233d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 58243d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 58253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 58263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 5827e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 5828e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo(); 5829e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = einfo; 58303d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return getFunctionType(retType, proto->arg_type_begin(), 5831e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall proto->getNumArgs(), EPI); 58323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 58333d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 58343d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allLTypes) return lhs; 58353d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (allRTypes) return rhs; 58368cc246c9a68c783a5b90d2e8b8927521cb3a49b7John McCall return getFunctionNoProtoType(retType, einfo); 58373d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman} 58383d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 5839132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz JahanianQualType ASTContext::mergeTypes(QualType LHS, QualType RHS, 5840447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor bool OfBlockPointer, 5841a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian bool Unqualified, bool BlockReturnType) { 584243d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // C++ [expr]: If an expression initially has the type "reference to T", the 584343d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // type is adjusted to "T" prior to any further analysis, the expression 584443d69750e7f7b26076e7474dec8839bb777b260fBill Wendling // designates the object or function denoted by the reference, and the 58457c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // expression is an lvalue unless the reference is an rvalue reference and 58467c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // the expression is a function call (possibly inside parentheses). 58470e709abafbd939326850501f795cc7a92c88a354Douglas Gregor assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?"); 58480e709abafbd939326850501f795cc7a92c88a354Douglas Gregor assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?"); 5849447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 5850447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 5851447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHS = LHS.getUnqualifiedType(); 5852447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHS = RHS.getUnqualifiedType(); 5853447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 58540e709abafbd939326850501f795cc7a92c88a354Douglas Gregor 58553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType LHSCan = getCanonicalType(LHS), 58563d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman RHSCan = getCanonicalType(RHS); 58573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 5858f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner // If two types are identical, they are compatible. 58593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LHSCan == RHSCan) 58603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 58613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 58620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If the qualifiers are different, the types aren't compatible... mostly. 5863a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers LQuals = LHSCan.getLocalQualifiers(); 5864a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers RQuals = RHSCan.getLocalQualifiers(); 58650953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (LQuals != RQuals) { 58660953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // If any of these qualifiers are different, we have a type 58670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // mismatch. 58680953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 5869f85e193739c953358c865005855253af4f68a497John McCall LQuals.getAddressSpace() != RQuals.getAddressSpace() || 5870f85e193739c953358c865005855253af4f68a497John McCall LQuals.getObjCLifetime() != RQuals.getObjCLifetime()) 58710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(); 58720953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 58730953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Exactly one GC qualifier difference is allowed: __strong is 58740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // okay if the other type has no GC qualifier but is an Objective 58750953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // C object pointer (i.e. implicitly strong by default). We fix 58760953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // this by pretending that the unqualified type was actually 58770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // qualified __strong. 58780953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 58790953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 58800953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 58810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 58820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 58830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(); 58840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 58850953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) { 58860953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong)); 58870953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 58880953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) { 58890953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS); 58900953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 58913d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 58920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 58930953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 58940953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // Okay, qualifiers are equal. 58953d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 5896852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman Type::TypeClass LHSClass = LHSCan->getTypeClass(); 5897852d63b806c5cbd730c6b9d696e2e27d02546b49Eli Friedman Type::TypeClass RHSClass = RHSCan->getTypeClass(); 5898f3692dc4a47dc48d10cec0415c6e9e39b7a39707Chris Lattner 58991adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // We want to consider the two function types to be the same for these 59001adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // comparisons, just force one to the other. 59011adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto; 59021adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto; 59034c721d381fb279899337d120edd4a24d405e56b2Eli Friedman 59044c721d381fb279899337d120edd4a24d405e56b2Eli Friedman // Same as above for arrays 5905a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray) 5906a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner LHSClass = Type::ConstantArray; 5907a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray) 5908a36a61f218b9f7a97f2c0f511e0b29eb42e8f78bChris Lattner RHSClass = Type::ConstantArray; 59091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5910c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // ObjCInterfaces are just specialized ObjCObjects. 5911c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject; 5912c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject; 5913c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 5914213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman // Canonicalize ExtVector -> Vector. 5915213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (LHSClass == Type::ExtVector) LHSClass = Type::Vector; 5916213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (RHSClass == Type::ExtVector) RHSClass = Type::Vector; 59171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59184e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff // If the canonical type classes don't match. 59194e78fd0a960eaa7e97467f2e8f390f3a57da279bSteve Naroff if (LHSClass != RHSClass) { 59201adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner // C99 6.7.2.2p4: Each enumerated type shall be compatible with char, 59211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // a signed integer type, or an unsigned integer type. 5922842aef8d942a880eeb9535d40de31a86838264cbJohn McCall // Compatibility is based on the underlying type, not the promotion 5923842aef8d942a880eeb9535d40de31a86838264cbJohn McCall // type. 5924183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const EnumType* ETy = LHS->getAs<EnumType>()) { 5925b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian QualType TINT = ETy->getDecl()->getIntegerType(); 5926b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian if (!TINT.isNull() && hasSameType(TINT, RHSCan.getUnqualifiedType())) 59273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return RHS; 5928bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman } 5929183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const EnumType* ETy = RHS->getAs<EnumType>()) { 5930b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian QualType TINT = ETy->getDecl()->getIntegerType(); 5931b918d6b1f794266e126e5445d69233462087d764Fariborz Jahanian if (!TINT.isNull() && hasSameType(TINT, LHSCan.getUnqualifiedType())) 59323d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 5933bab96968886f4b77083f4e26a28986ddb1e42d67Eli Friedman } 5934e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian // allow block pointer type to match an 'id' type. 5935419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (OfBlockPointer && !BlockReturnType) { 5936419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (LHS->isObjCIdType() && RHS->isBlockPointerType()) 5937419636316c04d570c183b4797fc811932c588358Fariborz Jahanian return LHS; 5938419636316c04d570c183b4797fc811932c588358Fariborz Jahanian if (RHS->isObjCIdType() && LHS->isBlockPointerType()) 5939419636316c04d570c183b4797fc811932c588358Fariborz Jahanian return RHS; 5940419636316c04d570c183b4797fc811932c588358Fariborz Jahanian } 5941e7cff2c00c3d74e38984a4db5c48d7e303d3ab8eFariborz Jahanian 59423d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 5943ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff } 59443d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 59454a74678ed6c3dedac05d02b1ee341f1db869f049Steve Naroff // The canonical type classes match. 59461adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner switch (LHSClass) { 594772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define TYPE(Class, Base) 594872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define ABSTRACT_TYPE(Class, Base) 5949ad5e73887052193afda72db8efcb812bd083a4a8John McCall#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 595072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 595172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#define DEPENDENT_TYPE(Class, Base) case Type::Class: 595272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor#include "clang/AST/TypeNodes.def" 5953b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 595472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 59557c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case Type::LValueReference: 59567c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case Type::RValueReference: 595772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::MemberPointer: 5958b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("C++ should never be in mergeTypes"); 595972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 5960c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCInterface: 596172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::IncompleteArray: 596272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::VariableArray: 596372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::FunctionProto: 596472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::ExtVector: 5965b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Types are eliminated above"); 596672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 59671adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::Pointer: 59683d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman { 59693d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // Merge two pointer types, while trying to preserve typedef info 59706217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType(); 59716217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType(); 5972447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 5973447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSPointee = LHSPointee.getUnqualifiedType(); 5974447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSPointee = RHSPointee.getUnqualifiedType(); 5975447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 5976447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false, 5977447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor Unqualified); 59783d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (ResultType.isNull()) return QualType(); 597907d258756dc856c6987c394a0972884e6ed46765Eli Friedman if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 598061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 598107d258756dc856c6987c394a0972884e6ed46765Eli Friedman if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 598261710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 59833d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return getPointerType(ResultType); 59843d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 5985c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff case Type::BlockPointer: 5986c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff { 5987c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff // Merge two block pointer types, while trying to preserve typedef info 59886217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType(); 59896217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType(); 5990447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 5991447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSPointee = LHSPointee.getUnqualifiedType(); 5992447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSPointee = RHSPointee.getUnqualifiedType(); 5993447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 5994447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer, 5995447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor Unqualified); 5996c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (ResultType.isNull()) return QualType(); 5997c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 5998c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return LHS; 5999c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 6000c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return RHS; 6001c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff return getBlockPointerType(ResultType); 6002c0febd58f5cbf4a93fd12f461863564dba0af76dSteve Naroff } 6003b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case Type::Atomic: 6004b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman { 6005b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman // Merge two pointer types, while trying to preserve typedef info 6006b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType LHSValue = LHS->getAs<AtomicType>()->getValueType(); 6007b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType RHSValue = RHS->getAs<AtomicType>()->getValueType(); 6008b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (Unqualified) { 6009b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman LHSValue = LHSValue.getUnqualifiedType(); 6010b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman RHSValue = RHSValue.getUnqualifiedType(); 6011b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 6012b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman QualType ResultType = mergeTypes(LHSValue, RHSValue, false, 6013b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Unqualified); 6014b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (ResultType.isNull()) return QualType(); 6015b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (getCanonicalType(LHSValue) == getCanonicalType(ResultType)) 6016b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return LHS; 6017b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (getCanonicalType(RHSValue) == getCanonicalType(ResultType)) 6018b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return RHS; 6019b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return getAtomicType(ResultType); 6020b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 60211adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::ConstantArray: 60223d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman { 60233d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const ConstantArrayType* LCAT = getAsConstantArrayType(LHS); 60243d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const ConstantArrayType* RCAT = getAsConstantArrayType(RHS); 60253d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize()) 60263d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 60273d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman 60283d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType LHSElem = getAsArrayType(LHS)->getElementType(); 60293d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman QualType RHSElem = getAsArrayType(RHS)->getElementType(); 6030447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor if (Unqualified) { 6031447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor LHSElem = LHSElem.getUnqualifiedType(); 6032447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor RHSElem = RHSElem.getUnqualifiedType(); 6033447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor } 6034447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor 6035447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified); 60363d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (ResultType.isNull()) return QualType(); 603761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 603861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 603961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 604061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 60413bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(), 60423bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman ArrayType::ArraySizeModifier(), 0); 60433bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(), 60443bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman ArrayType::ArraySizeModifier(), 0); 60453d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const VariableArrayType* LVAT = getAsVariableArrayType(LHS); 60463d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman const VariableArrayType* RVAT = getAsVariableArrayType(RHS); 604761710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 604861710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return LHS; 604961710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 605061710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return RHS; 60513d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (LVAT) { 60523d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // FIXME: This isn't correct! But tricky to implement because 60533d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // the array's size has to be the size of LHS, but the type 60543d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // has to be different. 60553d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 60563d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 60573d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman if (RVAT) { 60583d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // FIXME: This isn't correct! But tricky to implement because 60593d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // the array's size has to be the size of RHS, but the type 60603d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman // has to be different. 60613d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return RHS; 60623d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 60633bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS; 60643bc0f45a5e65814f42b22dcdf7249d1120d16f36Eli Friedman if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS; 60657e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor return getIncompleteArrayType(ResultType, 60667e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor ArrayType::ArraySizeModifier(), 0); 60673d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman } 60681adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::FunctionNoProto: 6069447234dd459a00a5ed9b7c3e066162cd7a75bf2dDouglas Gregor return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified); 607072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Record: 607172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Type::Enum: 60723d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 60731adb88370beab45af2f065afe86b51ccd59ec50dChris Lattner case Type::Builtin: 60743cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner // Only exactly equal builtin types are compatible, which is tested above. 60753d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 607664cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar case Type::Complex: 607764cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar // Distinct complex types are incompatible. 607864cfdb7da3cb744642fe8a99ad5c851ad3c930b2Daniel Dunbar return QualType(); 60793cc4c0c3058a788689b8fc73c0ac139544435c97Chris Lattner case Type::Vector: 60805a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // FIXME: The merged type should be an ExtVector! 60811c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall if (areCompatVectorTypes(LHSCan->getAs<VectorType>(), 60821c471f3e1c0ec8cbc82447bb35908dfc55463e46John McCall RHSCan->getAs<VectorType>())) 60833d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return LHS; 608461710854be2b098428aff5316e64bd34b30fbcb7Chris Lattner return QualType(); 6085c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall case Type::ObjCObject: { 6086c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // Check if the types are assignment compatible. 60875a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // FIXME: This should be type compatibility, e.g. whether 60885a61f0e5c5aaecd5713c3fa4b78be7167a7eeff2Eli Friedman // "LHS x; RHS x;" at global scope is legal. 6089c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* LHSIface = LHS->getAs<ObjCObjectType>(); 6090c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType* RHSIface = RHS->getAs<ObjCObjectType>(); 6091c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (canAssignObjCInterfaces(LHSIface, RHSIface)) 60925fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff return LHS; 60935fd659db11922fc12a58e478f7b745f9656b15a7Steve Naroff 60943d815e7eb56c25d7ed812eced32e41df43039f9aEli Friedman return QualType(); 609561490e9a965cfee8a78c12c6802138844f04250dCedric Venet } 609614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff case Type::ObjCObjectPointer: { 6097132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (OfBlockPointer) { 6098132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian if (canAssignObjCInterfacesInBlockPointer( 6099132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian LHS->getAs<ObjCObjectPointerType>(), 6100a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian RHS->getAs<ObjCObjectPointerType>(), 6101a4fdbfad150ae37bddaa4094d3925a27a1a1cf3fFariborz Jahanian BlockReturnType)) 61027530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie return LHS; 6103132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian return QualType(); 6104132f2a2da34f378fc675b9e174564b0f52c31d98Fariborz Jahanian } 6105183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(), 6106183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall RHS->getAs<ObjCObjectPointerType>())) 610714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return LHS; 610814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 6109bc76dd06eb881c70c9775b74bab8b88cd747f173Steve Naroff return QualType(); 61107530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie } 6111ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff } 611272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 61137530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid Type::Class!"); 6114ec0550fa3653d46560bf4484a2e988329c228e39Steve Naroff} 61157192f8e9592729882a09d84d77838db26e39ebd4Ted Kremenek 611678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanianbool ASTContext::FunctionTypesMatchOnNSConsumedAttrs( 611778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian const FunctionProtoType *FromFunctionType, 611878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian const FunctionProtoType *ToFunctionType) { 611978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromFunctionType->hasAnyConsumedArgs() != 612078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToFunctionType->hasAnyConsumedArgs()) 612178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return false; 612278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FunctionProtoType::ExtProtoInfo FromEPI = 612378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FromFunctionType->getExtProtoInfo(); 612478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian FunctionProtoType::ExtProtoInfo ToEPI = 612578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToFunctionType->getExtProtoInfo(); 612678213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromEPI.ConsumedArguments && ToEPI.ConsumedArguments) 612778213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian for (unsigned ArgIdx = 0, NumArgs = FromFunctionType->getNumArgs(); 612878213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ArgIdx != NumArgs; ++ArgIdx) { 612978213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian if (FromEPI.ConsumedArguments[ArgIdx] != 613078213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian ToEPI.ConsumedArguments[ArgIdx]) 613178213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return false; 613278213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian } 613378213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian return true; 613478213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian} 613578213e4aec6d8d22b5828dd2687fa19116ebaa26Fariborz Jahanian 61362390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 61372390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// 'RHS' attributes and returns the merged version; including for function 61382390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian/// return types. 61392390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz JahanianQualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) { 61402390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType LHSCan = getCanonicalType(LHS), 61412390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian RHSCan = getCanonicalType(RHS); 61422390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If two types are identical, they are compatible. 61432390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LHSCan == RHSCan) 61442390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 61452390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (RHSCan->isFunctionType()) { 61462390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (!LHSCan->isFunctionType()) 61472390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 61482390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType OldReturnType = 61492390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian cast<FunctionType>(RHSCan.getTypePtr())->getResultType(); 61502390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType NewReturnType = 61512390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian cast<FunctionType>(LHSCan.getTypePtr())->getResultType(); 61522390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResReturnType = 61532390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian mergeObjCGCQualifiers(NewReturnType, OldReturnType); 61542390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResReturnType.isNull()) 61552390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 61562390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) { 61572390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo(); 61582390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // In either case, use OldReturnType to build the new function type. 61592390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian const FunctionType *F = LHS->getAs<FunctionType>(); 61602390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (const FunctionProtoType *FPT = cast<FunctionProtoType>(F)) { 6161e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 6162e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = getFunctionExtInfo(LHS); 61632390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResultType 61642390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian = getFunctionType(OldReturnType, FPT->arg_type_begin(), 6165e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FPT->getNumArgs(), EPI); 61662390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return ResultType; 61672390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 61682390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 61692390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 61702390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 61712390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 61722390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If the qualifiers are different, the types can still be merged. 61732390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers LQuals = LHSCan.getLocalQualifiers(); 61742390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers RQuals = RHSCan.getLocalQualifiers(); 61752390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LQuals != RQuals) { 61762390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // If any of these qualifiers are different, we have a type mismatch. 61772390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 61782390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian LQuals.getAddressSpace() != RQuals.getAddressSpace()) 61792390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 61802390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 61812390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // Exactly one GC qualifier difference is allowed: __strong is 61822390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // okay if the other type has no GC qualifier but is an Objective 61832390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // C object pointer (i.e. implicitly strong by default). We fix 61842390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // this by pretending that the unqualified type was actually 61852390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian // qualified __strong. 61862390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 61872390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 61882390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 61892390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 61902390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 61912390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 61922390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 61932390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_L == Qualifiers::Strong) 61942390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 61952390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (GC_R == Qualifiers::Strong) 61962390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return RHS; 61972390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 61982390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 61992390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 62002390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) { 62012390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType LHSBaseQT = LHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 62022390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType RHSBaseQT = RHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 62032390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT); 62042390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResQT == LHSBaseQT) 62052390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return LHS; 62062390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian if (ResQT == RHSBaseQT) 62072390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return RHS; 62082390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian } 62092390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian return QualType(); 62102390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian} 62112390a72a3ebd37737fec5ba1385db9c3bb22fc59Fariborz Jahanian 62125426bf6456a5aeac416a9150de157904d101c819Chris Lattner//===----------------------------------------------------------------------===// 6213ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman// Integer Predicates 6214ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman//===----------------------------------------------------------------------===// 621588054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner 62164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned ASTContext::getIntWidth(QualType T) const { 6217f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall if (const EnumType *ET = dyn_cast<EnumType>(T)) 621829a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman T = ET->getDecl()->getIntegerType(); 62191274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (T->isBooleanType()) 62201274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor return 1; 6221f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman // For builtin types, just use the standard type sizing method 6222ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return (unsigned)getTypeSize(T); 6223ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman} 6224ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman 6225ad74a758189180b8ab8faea648e4766c3bfd7fcbEli FriedmanQualType ASTContext::getCorrespondingUnsignedType(QualType T) { 6226f60946222721d9ba3c059563935c17b84703187aDouglas Gregor assert(T->hasSignedIntegerRepresentation() && "Unexpected type"); 62276a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 62286a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner // Turn <4 x signed int> -> <4 x unsigned int> 62296a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner if (const VectorType *VTy = T->getAs<VectorType>()) 62306a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()), 6231e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VTy->getNumElements(), VTy->getVectorKind()); 62326a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 62336a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner // For enums, we return the unsigned version of the base type. 62346a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner if (const EnumType *ETy = T->getAs<EnumType>()) 6235ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman T = ETy->getDecl()->getIntegerType(); 62366a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner 62376a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner const BuiltinType *BTy = T->getAs<BuiltinType>(); 62386a2b9261bf9c973c7122d9d1febce24a38fa862dChris Lattner assert(BTy && "Unexpected signed integer type"); 6239ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman switch (BTy->getKind()) { 6240ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Char_S: 6241ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::SChar: 6242ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedCharTy; 6243ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Short: 6244ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedShortTy; 6245ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Int: 6246ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedIntTy; 6247ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::Long: 6248ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedLongTy; 6249ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman case BuiltinType::LongLong: 6250ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman return UnsignedLongLongTy; 62512df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case BuiltinType::Int128: 62522df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner return UnsignedInt128Ty; 6253ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman default: 6254b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unexpected signed integer type"); 6255ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman } 6256ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman} 6257ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman 62587b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios KyrtzidisASTMutationListener::~ASTMutationListener() { } 62597b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 626086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 626186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===// 626286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner// Builtin Type Computation 626386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner//===----------------------------------------------------------------------===// 626486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 626586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the 626633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// pointer over the consumed characters. This returns the resultant type. If 626733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// AllowTypeModifiers is false then modifier like * are not parsed, just basic 626833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// types. This allows "v2i*" to be parsed as a pointer to a v2i instead of 626933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner/// a vector of "i*". 627014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// 627114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// RequiresICE is filled in on return to indicate whether the value is required 627214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner/// to be an Integer Constant Expression. 62734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatic QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, 627486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ASTContext::GetBuiltinTypeError &Error, 627514e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner bool &RequiresICE, 627633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner bool AllowTypeModifiers) { 627786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Modifiers. 627886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner int HowLong = 0; 627986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner bool Signed = false, Unsigned = false; 628014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE = false; 6281393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner 628233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // Read the prefixed modifiers first. 628386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner bool Done = false; 628486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (!Done) { 628586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner switch (*Str++) { 62861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump default: Done = true; --Str; break; 6287393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner case 'I': 628814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE = true; 6289393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner break; 629086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'S': 629186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!"); 629286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Signed && "Can't use 'S' modifier multiple times!"); 629386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Signed = true; 629486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 629586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'U': 629686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Signed && "Can't use both 'S' and 'U' modifiers!"); 629786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Unsigned && "Can't use 'S' modifier multiple times!"); 629886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Unsigned = true; 629986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 630086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'L': 630186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong <= 2 && "Can't have LLLL modifier"); 630286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ++HowLong; 630386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 630486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 630586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 630686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 630786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner QualType Type; 63081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 630986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Read the base type. 631086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner switch (*Str++) { 6311b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown builtin type letter!"); 631286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'v': 631386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && 631486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'v'!"); 631586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.VoidTy; 631686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 631786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'f': 631886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && 631986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'f'!"); 632086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.FloatTy; 632186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 632286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'd': 632386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong < 2 && !Signed && !Unsigned && 632486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "Bad modifiers used with 'd'!"); 632586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (HowLong) 632686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.LongDoubleTy; 632786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 632886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.DoubleTy; 632986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 633086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 's': 633186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && "Bad modifiers used with 's'!"); 633286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Unsigned) 633386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.UnsignedShortTy; 633486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 633586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.ShortTy; 633686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 633786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'i': 633886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (HowLong == 3) 633986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty; 634086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (HowLong == 2) 634186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy; 634286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (HowLong == 1) 634386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy; 634486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 634586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy; 634686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 634786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'c': 634886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && "Bad modifiers used with 'c'!"); 634986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Signed) 635086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.SignedCharTy; 635186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else if (Unsigned) 635286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.UnsignedCharTy; 635386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner else 635486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.CharTy; 635586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 635686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'b': // boolean 635786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!"); 635886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.BoolTy; 635986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 636086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'z': // size_t. 636186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!"); 636286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getSizeType(); 636386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 636486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'F': 636586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getCFConstantStringType(); 636686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 6367ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian case 'G': 6368ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian Type = Context.getObjCIdType(); 6369ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian break; 6370ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian case 'H': 6371ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian Type = Context.getObjCSelType(); 6372ba8bda05fefd3bb2f1ef201784b685f715bdde29Fariborz Jahanian break; 637386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'a': 637486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getBuiltinVaListType(); 637586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Type.isNull() && "builtin va list type not initialized!"); 637686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 637786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'A': 637886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // This is a "reference" to a va_list; however, what exactly 637986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // this means depends on how va_list is defined. There are two 638086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // different kinds of va_list: ones passed by value, and ones 638186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // passed by reference. An example of a by-value va_list is 638286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // x86, where va_list is a char*. An example of by-ref va_list 638386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // is x86-64, where va_list is a __va_list_tag[1]. For x86, 638486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // we want this argument to be a char*&; for x86-64, we want 638586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // it to be a __va_list_tag*. 638686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getBuiltinVaListType(); 638786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(!Type.isNull() && "builtin va list type not initialized!"); 638814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner if (Type->isArrayType()) 638986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getArrayDecayedType(Type); 639014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner else 639186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Type = Context.getLValueReferenceType(Type); 639286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 639386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner case 'V': { 639486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner char *End; 639586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner unsigned NumElements = strtoul(Str, &End, 10); 639686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert(End != Str && "Missing vector size"); 639786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Str = End; 63981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 639914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ElementType = DecodeTypeFromStr(Str, Context, Error, 640014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE, false); 640114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Can't require vector ICE"); 640233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner 640333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // TODO: No way to make AltiVec vectors in builtins yet. 6404788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner Type = Context.getVectorType(ElementType, NumElements, 6405e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::GenericVector); 640686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner break; 640786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6408d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor case 'X': { 640914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE, 641014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner false); 641114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Can't require complex ICE"); 6412d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor Type = Context.getComplexType(ElementType); 6413d3a23b238a2b2c0f11e6ac4951c7410a8c5717bfDouglas Gregor break; 6414cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian } 6415cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian case 'Y' : { 6416cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian Type = Context.getPointerDiffType(); 6417cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian break; 6418cc075e4092900ac9eec9dc92e35096eae1ee29c7Fariborz Jahanian } 64199a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner case 'P': 6420c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor Type = Context.getFILEType(); 6421c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor if (Type.isNull()) { 6422f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Error = ASTContext::GE_Missing_stdio; 642386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 642486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6425fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump break; 64269a5a7e7351f78345a72c4956af25590f6d40ebcdChris Lattner case 'J': 6427f711c41dd9412a8182793259d355c4f6979ed5edMike Stump if (Signed) 6428782fa308a765aeac2acb39c4e697c937ec21185bMike Stump Type = Context.getsigjmp_bufType(); 6429f711c41dd9412a8182793259d355c4f6979ed5edMike Stump else 6430f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Type = Context.getjmp_bufType(); 6431f711c41dd9412a8182793259d355c4f6979ed5edMike Stump 6432fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump if (Type.isNull()) { 6433f711c41dd9412a8182793259d355c4f6979ed5edMike Stump Error = ASTContext::GE_Missing_setjmp; 6434fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump return QualType(); 6435fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump } 6436fd612dbb23cd31c03c898ae53ff18d0dfd8488f9Mike Stump break; 6437e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola case 'K': 6438e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!"); 6439e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola Type = Context.getucontext_tType(); 6440e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola 6441e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola if (Type.isNull()) { 6442e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola Error = ASTContext::GE_Missing_ucontext; 6443e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola return QualType(); 6444e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola } 6445e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola break; 6446782fa308a765aeac2acb39c4e697c937ec21185bMike Stump } 64471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 644833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // If there are modifiers and if we're allowed to parse them, go for it. 644933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Done = !AllowTypeModifiers; 645086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (!Done) { 6451187ab37a05b8f7015b9f39cc8cd9129a0c6d0b48John McCall switch (char c = *Str++) { 645233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner default: Done = true; --Str; break; 645333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case '*': 645433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case '&': { 645533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // Both pointers and references can have their pointee types 645633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // qualified with an address space. 645733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner char *End; 645833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner unsigned AddrSpace = strtoul(Str, &End, 10); 645933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner if (End != Str && AddrSpace != 0) { 646033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getAddrSpaceQualType(Type, AddrSpace); 646133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Str = End; 646233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner } 646333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner if (c == '*') 646433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getPointerType(Type); 646533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner else 646633daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getLValueReferenceType(Type); 646733daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 646833daae66462e8f51ee153463b32bdefd60c801aaChris Lattner } 646933daae66462e8f51ee153463b32bdefd60c801aaChris Lattner // FIXME: There's no way to have a built-in with an rvalue ref arg. 647033daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case 'C': 647133daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Type.withConst(); 647233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 647333daae66462e8f51ee153463b32bdefd60c801aaChris Lattner case 'D': 647433daae66462e8f51ee153463b32bdefd60c801aaChris Lattner Type = Context.getVolatileType(Type); 647533daae66462e8f51ee153463b32bdefd60c801aaChris Lattner break; 647618932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek case 'R': 647718932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek Type = Type.withRestrict(); 647818932a0f2a94a7813ec461d1118c39ecf8aa936fTed Kremenek break; 647986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 648086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 6481393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner 648214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert((!RequiresICE || Type->isIntegralOrEnumerationType()) && 6483393bd8e185692a451b2ba16bdfc9e7d3543b4217Chris Lattner "Integer constant 'I' type must be an integer"); 64841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 648586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return Type; 648686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner} 648786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 648886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner/// GetBuiltinType - Return the type for the specified builtin. 648933daae66462e8f51ee153463b32bdefd60c801aaChris LattnerQualType ASTContext::GetBuiltinType(unsigned Id, 649014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner GetBuiltinTypeError &Error, 64914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned *IntegerConstantArgs) const { 649233daae66462e8f51ee153463b32bdefd60c801aaChris Lattner const char *TypeStr = BuiltinInfo.GetTypeString(Id); 64931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 8> ArgTypes; 64951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 649614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner bool RequiresICE = false; 649786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Error = GE_None; 649814e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error, 649914e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner RequiresICE, true); 650086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Error != GE_None) 650186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 650214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 650314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE"); 650414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 650586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner while (TypeStr[0] && TypeStr[0] != '.') { 650614e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true); 650786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Error != GE_None) 650886df27bbdbb98c39ec2184695c0561209f91beddChris Lattner return QualType(); 650986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 651014e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner // If this argument is required to be an IntegerConstantExpression and the 651114e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner // caller cares, fill in the bitmask we return. 651214e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner if (RequiresICE && IntegerConstantArgs) 651314e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner *IntegerConstantArgs |= 1 << ArgTypes.size(); 651414e0e7436cf6650a72052baea1f8ebe644cef489Chris Lattner 651586df27bbdbb98c39ec2184695c0561209f91beddChris Lattner // Do array -> pointer decay. The builtin should use the decayed type. 651686df27bbdbb98c39ec2184695c0561209f91beddChris Lattner if (Ty->isArrayType()) 651786df27bbdbb98c39ec2184695c0561209f91beddChris Lattner Ty = getArrayDecayedType(Ty); 65181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 651986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner ArgTypes.push_back(Ty); 652086df27bbdbb98c39ec2184695c0561209f91beddChris Lattner } 652186df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 652286df27bbdbb98c39ec2184695c0561209f91beddChris Lattner assert((TypeStr[0] != '.' || TypeStr[1] == 0) && 652386df27bbdbb98c39ec2184695c0561209f91beddChris Lattner "'.' should only occur at end of builtin type list!"); 652486df27bbdbb98c39ec2184695c0561209f91beddChris Lattner 652500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall FunctionType::ExtInfo EI; 652600ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true); 652700ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall 652800ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall bool Variadic = (TypeStr[0] == '.'); 652900ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall 653000ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall // We really shouldn't be making a no-proto type here, especially in C++. 653100ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall if (ArgTypes.empty() && Variadic) 653200ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall return getFunctionNoProtoType(ResType, EI); 6533ce056bcaa1c97b89a4b2de2112c62d060863be2bDouglas Gregor 6534e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI; 653500ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall EPI.ExtInfo = EI; 653600ccbefcffeb88ea3e2e6323e594fa968753ad14John McCall EPI.Variadic = Variadic; 6537e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 6538e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall return getFunctionType(ResType, ArgTypes.data(), ArgTypes.size(), EPI); 653986df27bbdbb98c39ec2184695c0561209f91beddChris Lattner} 6540a95d75769edae299816ec7fd9bbcdf1ef617c5c9Eli Friedman 654190e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) { 654290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage External = GVA_StrongExternal; 654390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 654490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis Linkage L = FD->getLinkage(); 654590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (L) { 654690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case NoLinkage: 654790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case InternalLinkage: 654890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case UniqueExternalLinkage: 654990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_Internal; 655090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 655190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case ExternalLinkage: 655290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (FD->getTemplateSpecializationKind()) { 655390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_Undeclared: 655490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitSpecialization: 655590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis External = GVA_StrongExternal; 655690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis break; 655790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 655890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDefinition: 655990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_ExplicitTemplateInstantiation; 656090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 656190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDeclaration: 656290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ImplicitInstantiation: 656390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis External = GVA_TemplateInstantiation; 656490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis break; 656590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 656690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 656790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 656890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!FD->isInlined()) 656990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return External; 657090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 65714e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!getLangOpts().CPlusPlus || FD->hasAttr<GNUInlineAttr>()) { 657290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // GNU or C99 inline semantics. Determine whether this symbol should be 657390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // externally visible. 657490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->isInlineDefinitionExternallyVisible()) 657590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return External; 657690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 657790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // C99 inline semantics, where the symbol is not externally visible. 657890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_C99Inline; 657990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 658090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 658190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // C++0x [temp.explicit]p9: 658290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // [ Note: The intent is that an inline function that is the subject of 658390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // an explicit instantiation declaration will still be implicitly 658490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // instantiated when used so that the body can be considered for 658590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // inlining, but that no out-of-line copy of the inline function would be 658690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // generated in the translation unit. -- end note ] 658790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->getTemplateSpecializationKind() 658890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis == TSK_ExplicitInstantiationDeclaration) 658990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_C99Inline; 659090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 659190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_CXXInline; 659290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 659390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 659490e99a84ddd020e8fda79643748243725a2ed071Argyrios KyrtzidisGVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) { 659590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // If this is a static data member, compute the kind of template 659690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // specialization. Otherwise, this variable is not part of a 659790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // template. 659890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis TemplateSpecializationKind TSK = TSK_Undeclared; 659990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (VD->isStaticDataMember()) 660090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis TSK = VD->getTemplateSpecializationKind(); 660190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 660290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis Linkage L = VD->getLinkage(); 66034e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (L == ExternalLinkage && getLangOpts().CPlusPlus && 660490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis VD->getType()->getLinkage() == UniqueExternalLinkage) 660590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis L = UniqueExternalLinkage; 660690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 660790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (L) { 660890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case NoLinkage: 660990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case InternalLinkage: 661090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case UniqueExternalLinkage: 661190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_Internal; 661290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 661390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case ExternalLinkage: 661490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis switch (TSK) { 661590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_Undeclared: 661690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitSpecialization: 661790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_StrongExternal; 661890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 661990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDeclaration: 662090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis llvm_unreachable("Variable should not be instantiated"); 662190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Fall through to treat this like any other instantiation. 662290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 662390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ExplicitInstantiationDefinition: 662490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_ExplicitTemplateInstantiation; 662590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 662690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis case TSK_ImplicitInstantiation: 662790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return GVA_TemplateInstantiation; 662890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 662990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 663090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 66317530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid Linkage!"); 663290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 663390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 66344ac7c0bb39696e92fd220118fedc484c09a69870Argyrios Kyrtzidisbool ASTContext::DeclMustBeEmitted(const Decl *D) { 663590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 663690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!VD->isFileVarDecl()) 663790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 6638144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis } else if (!isa<FunctionDecl>(D)) 663990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 664090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 6641ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis // Weak references don't produce any output by themselves. 6642ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis if (D->hasAttr<WeakRefAttr>()) 6643ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis return false; 6644ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 664590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Aliases and used decls are required. 664690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>()) 664790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 664890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 664990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 665090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Forward declarations aren't required. 665110620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (!FD->doesThisDeclarationHaveABody()) 6652dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky return FD->doesDeclarationForceExternallyVisibleDefinition(); 665390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 665490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Constructors and destructors are required. 665590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>()) 665690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 665790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 665890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // The key function for a class is required. 665990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 666090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const CXXRecordDecl *RD = MD->getParent(); 666190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (MD->isOutOfLine() && RD->isDynamicClass()) { 666290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const CXXMethodDecl *KeyFunc = getKeyFunction(RD); 666390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl()) 666490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 666590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 666690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 666790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 666890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage Linkage = GetGVALinkageForFunction(FD); 666990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 667090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // static, static inline, always_inline, and extern inline functions can 667190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // always be deferred. Normal inline functions can be deferred in C99/C++. 667290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Implicit template instantiations can also be deferred in C++. 667390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (Linkage == GVA_Internal || Linkage == GVA_C99Inline || 66743a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) 667590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 667690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 667790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 667894da1587f7d584fc61df793229d197969f204cd9Douglas Gregor 667990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis const VarDecl *VD = cast<VarDecl>(D); 668090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis assert(VD->isFileVarDecl() && "Expected file scoped var"); 668190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 6682ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly) 6683ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis return false; 6684ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis 668590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // Structs that have non-trivial constructors or destructors are required. 668690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 668790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis // FIXME: Handle references. 6688023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt // FIXME: Be more selective about which constructors we care about. 668990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const RecordType *RT = VD->getType()->getAs<RecordType>()) { 669090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 6691023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt if (RD->hasDefinition() && !(RD->hasTrivialDefaultConstructor() && 6692023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialCopyConstructor() && 6693023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialMoveConstructor() && 6694023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt RD->hasTrivialDestructor())) 669590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 669690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 669790e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 669890e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 669990e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis GVALinkage L = GetGVALinkageForVariable(VD); 670090e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (L == GVA_Internal || L == GVA_TemplateInstantiation) { 670190e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis if (!(VD->getInit() && VD->getInit()->HasSideEffects(*this))) 670290e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return false; 670390e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis } 670490e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis 670590e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis return true; 670690e99a84ddd020e8fda79643748243725a2ed071Argyrios Kyrtzidis} 6707071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 6708ee743f903858e337434ac0335f147f4de4ecae05Charles DavisCallingConv ASTContext::getDefaultMethodCallConv() { 6709ee743f903858e337434ac0335f147f4de4ecae05Charles Davis // Pass through to the C++ ABI object 6710ee743f903858e337434ac0335f147f4de4ecae05Charles Davis return ABI->getDefaultMethodCallConv(); 6711ee743f903858e337434ac0335f147f4de4ecae05Charles Davis} 6712ee743f903858e337434ac0335f147f4de4ecae05Charles Davis 67134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const { 6714dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson // Pass through to the C++ ABI object 6715dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson return ABI->isNearlyEmpty(RD); 6716dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson} 6717dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson 671814110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *ASTContext::createMangleContext() { 6719bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor switch (Target->getCXXABI()) { 672014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_ARM: 672114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_Itanium: 672214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne return createItaniumMangleContext(*this, getDiagnostics()); 672314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne case CXXABI_Microsoft: 672414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne return createMicrosoftMangleContext(*this, getDiagnostics()); 672514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne } 6726b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unsupported ABI"); 672714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne} 672814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne 6729071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI::~CXXABI() {} 6730ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek 6731ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremeneksize_t ASTContext::getSideTableAllocatedMemory() const { 67320c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek return ASTRecordLayouts.getMemorySize() 67330c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(ObjCLayouts) 67340c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(KeyFunctions) 67350c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(ObjCImpls) 67360c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(BlockVarCopyInits) 67370c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(DeclAttrs) 67380c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromStaticDataMember) 67390c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUsingDecl) 67400c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) 67410c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) 67420c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(OverriddenMethods) 67430c8cd1ac55720276ad41fa7b4f8785bead5afd32Ted Kremenek + llvm::capacity_in_bytes(Types) 6744af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet + llvm::capacity_in_bytes(VariableArrayTypes) 67450d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet + llvm::capacity_in_bytes(ClassScopeSpecializationPattern); 6746ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek} 6747d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek 67489e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorunsigned ASTContext::getLambdaManglingNumber(CXXMethodDecl *CallOperator) { 67499e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor CXXRecordDecl *Lambda = CallOperator->getParent(); 67509e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor return LambdaMangleContexts[Lambda->getDeclContext()] 67519e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor .getManglingNumber(CallOperator); 67529e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor} 67539e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 67549e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 6755d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekvoid ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) { 6756d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek ParamIndices[D] = index; 6757d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek} 6758d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek 6759d211cb709510fbe7e75167b9feee0050851d001aTed Kremenekunsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const { 6760d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek ParameterIndexTable::const_iterator I = ParamIndices.find(D); 6761d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek assert(I != ParamIndices.end() && 6762d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek "ParmIndices lacks entry set by ParmVarDecl"); 6763d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek return I->second; 6764d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek} 6765