ASTImporter.cpp 309 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809
  1. //===- ASTImporter.cpp - Importing ASTs from other Contexts ---------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file defines the ASTImporter class which imports AST nodes from one
  10. // context into another context.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "clang/AST/ASTImporter.h"
  14. #include "clang/AST/ASTImporterSharedState.h"
  15. #include "clang/AST/ASTContext.h"
  16. #include "clang/AST/ASTDiagnostic.h"
  17. #include "clang/AST/ASTStructuralEquivalence.h"
  18. #include "clang/AST/Attr.h"
  19. #include "clang/AST/Decl.h"
  20. #include "clang/AST/DeclAccessPair.h"
  21. #include "clang/AST/DeclBase.h"
  22. #include "clang/AST/DeclCXX.h"
  23. #include "clang/AST/DeclFriend.h"
  24. #include "clang/AST/DeclGroup.h"
  25. #include "clang/AST/DeclObjC.h"
  26. #include "clang/AST/DeclTemplate.h"
  27. #include "clang/AST/DeclVisitor.h"
  28. #include "clang/AST/DeclarationName.h"
  29. #include "clang/AST/Expr.h"
  30. #include "clang/AST/ExprCXX.h"
  31. #include "clang/AST/ExprObjC.h"
  32. #include "clang/AST/ExternalASTSource.h"
  33. #include "clang/AST/LambdaCapture.h"
  34. #include "clang/AST/NestedNameSpecifier.h"
  35. #include "clang/AST/OperationKinds.h"
  36. #include "clang/AST/Stmt.h"
  37. #include "clang/AST/StmtCXX.h"
  38. #include "clang/AST/StmtObjC.h"
  39. #include "clang/AST/StmtVisitor.h"
  40. #include "clang/AST/TemplateBase.h"
  41. #include "clang/AST/TemplateName.h"
  42. #include "clang/AST/Type.h"
  43. #include "clang/AST/TypeLoc.h"
  44. #include "clang/AST/TypeVisitor.h"
  45. #include "clang/AST/UnresolvedSet.h"
  46. #include "clang/Basic/ExceptionSpecificationType.h"
  47. #include "clang/Basic/FileManager.h"
  48. #include "clang/Basic/IdentifierTable.h"
  49. #include "clang/Basic/LLVM.h"
  50. #include "clang/Basic/LangOptions.h"
  51. #include "clang/Basic/SourceLocation.h"
  52. #include "clang/Basic/SourceManager.h"
  53. #include "clang/Basic/Specifiers.h"
  54. #include "llvm/ADT/APSInt.h"
  55. #include "llvm/ADT/ArrayRef.h"
  56. #include "llvm/ADT/DenseMap.h"
  57. #include "llvm/ADT/None.h"
  58. #include "llvm/ADT/Optional.h"
  59. #include "llvm/ADT/ScopeExit.h"
  60. #include "llvm/ADT/STLExtras.h"
  61. #include "llvm/ADT/SmallVector.h"
  62. #include "llvm/Support/Casting.h"
  63. #include "llvm/Support/ErrorHandling.h"
  64. #include "llvm/Support/MemoryBuffer.h"
  65. #include <algorithm>
  66. #include <cassert>
  67. #include <cstddef>
  68. #include <memory>
  69. #include <type_traits>
  70. #include <utility>
  71. namespace clang {
  72. using llvm::make_error;
  73. using llvm::Error;
  74. using llvm::Expected;
  75. using ExpectedType = llvm::Expected<QualType>;
  76. using ExpectedStmt = llvm::Expected<Stmt *>;
  77. using ExpectedExpr = llvm::Expected<Expr *>;
  78. using ExpectedDecl = llvm::Expected<Decl *>;
  79. using ExpectedSLoc = llvm::Expected<SourceLocation>;
  80. using ExpectedName = llvm::Expected<DeclarationName>;
  81. std::string ImportError::toString() const {
  82. // FIXME: Improve error texts.
  83. switch (Error) {
  84. case NameConflict:
  85. return "NameConflict";
  86. case UnsupportedConstruct:
  87. return "UnsupportedConstruct";
  88. case Unknown:
  89. return "Unknown error";
  90. }
  91. llvm_unreachable("Invalid error code.");
  92. return "Invalid error code.";
  93. }
  94. void ImportError::log(raw_ostream &OS) const {
  95. OS << toString();
  96. }
  97. std::error_code ImportError::convertToErrorCode() const {
  98. llvm_unreachable("Function not implemented.");
  99. }
  100. char ImportError::ID;
  101. template <class T>
  102. SmallVector<Decl *, 2>
  103. getCanonicalForwardRedeclChain(Redeclarable<T>* D) {
  104. SmallVector<Decl *, 2> Redecls;
  105. for (auto *R : D->getFirstDecl()->redecls()) {
  106. if (R != D->getFirstDecl())
  107. Redecls.push_back(R);
  108. }
  109. Redecls.push_back(D->getFirstDecl());
  110. std::reverse(Redecls.begin(), Redecls.end());
  111. return Redecls;
  112. }
  113. SmallVector<Decl*, 2> getCanonicalForwardRedeclChain(Decl* D) {
  114. if (auto *FD = dyn_cast<FunctionDecl>(D))
  115. return getCanonicalForwardRedeclChain<FunctionDecl>(FD);
  116. if (auto *VD = dyn_cast<VarDecl>(D))
  117. return getCanonicalForwardRedeclChain<VarDecl>(VD);
  118. if (auto *TD = dyn_cast<TagDecl>(D))
  119. return getCanonicalForwardRedeclChain<TagDecl>(TD);
  120. llvm_unreachable("Bad declaration kind");
  121. }
  122. void updateFlags(const Decl *From, Decl *To) {
  123. // Check if some flags or attrs are new in 'From' and copy into 'To'.
  124. // FIXME: Other flags or attrs?
  125. if (From->isUsed(false) && !To->isUsed(false))
  126. To->setIsUsed();
  127. }
  128. class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, ExpectedType>,
  129. public DeclVisitor<ASTNodeImporter, ExpectedDecl>,
  130. public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
  131. ASTImporter &Importer;
  132. // Use this instead of Importer.importInto .
  133. template <typename ImportT>
  134. LLVM_NODISCARD Error importInto(ImportT &To, const ImportT &From) {
  135. return Importer.importInto(To, From);
  136. }
  137. // Use this to import pointers of specific type.
  138. template <typename ImportT>
  139. LLVM_NODISCARD Error importInto(ImportT *&To, ImportT *From) {
  140. auto ToOrErr = Importer.Import(From);
  141. if (ToOrErr)
  142. To = cast_or_null<ImportT>(*ToOrErr);
  143. return ToOrErr.takeError();
  144. }
  145. // Call the import function of ASTImporter for a baseclass of type `T` and
  146. // cast the return value to `T`.
  147. template <typename T>
  148. Expected<T *> import(T *From) {
  149. auto ToOrErr = Importer.Import(From);
  150. if (!ToOrErr)
  151. return ToOrErr.takeError();
  152. return cast_or_null<T>(*ToOrErr);
  153. }
  154. template <typename T>
  155. Expected<T *> import(const T *From) {
  156. return import(const_cast<T *>(From));
  157. }
  158. // Call the import function of ASTImporter for type `T`.
  159. template <typename T>
  160. Expected<T> import(const T &From) {
  161. return Importer.Import(From);
  162. }
  163. // Import an Optional<T> by importing the contained T, if any.
  164. template<typename T>
  165. Expected<Optional<T>> import(Optional<T> From) {
  166. if (!From)
  167. return Optional<T>();
  168. return import(*From);
  169. }
  170. template <class T>
  171. Expected<std::tuple<T>>
  172. importSeq(const T &From) {
  173. Expected<T> ToOrErr = import(From);
  174. if (!ToOrErr)
  175. return ToOrErr.takeError();
  176. return std::make_tuple<T>(std::move(*ToOrErr));
  177. }
  178. // Import multiple objects with a single function call.
  179. // This should work for every type for which a variant of `import` exists.
  180. // The arguments are processed from left to right and import is stopped on
  181. // first error.
  182. template <class THead, class... TTail>
  183. Expected<std::tuple<THead, TTail...>>
  184. importSeq(const THead &FromHead, const TTail &...FromTail) {
  185. Expected<std::tuple<THead>> ToHeadOrErr = importSeq(FromHead);
  186. if (!ToHeadOrErr)
  187. return ToHeadOrErr.takeError();
  188. Expected<std::tuple<TTail...>> ToTailOrErr = importSeq(FromTail...);
  189. if (!ToTailOrErr)
  190. return ToTailOrErr.takeError();
  191. return std::tuple_cat(*ToHeadOrErr, *ToTailOrErr);
  192. }
  193. // Wrapper for an overload set.
  194. template <typename ToDeclT> struct CallOverloadedCreateFun {
  195. template <typename... Args>
  196. auto operator()(Args &&... args)
  197. -> decltype(ToDeclT::Create(std::forward<Args>(args)...)) {
  198. return ToDeclT::Create(std::forward<Args>(args)...);
  199. }
  200. };
  201. // Always use these functions to create a Decl during import. There are
  202. // certain tasks which must be done after the Decl was created, e.g. we
  203. // must immediately register that as an imported Decl. The parameter `ToD`
  204. // will be set to the newly created Decl or if had been imported before
  205. // then to the already imported Decl. Returns a bool value set to true if
  206. // the `FromD` had been imported before.
  207. template <typename ToDeclT, typename FromDeclT, typename... Args>
  208. LLVM_NODISCARD bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
  209. Args &&... args) {
  210. // There may be several overloads of ToDeclT::Create. We must make sure
  211. // to call the one which would be chosen by the arguments, thus we use a
  212. // wrapper for the overload set.
  213. CallOverloadedCreateFun<ToDeclT> OC;
  214. return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
  215. std::forward<Args>(args)...);
  216. }
  217. // Use this overload if a special Type is needed to be created. E.g if we
  218. // want to create a `TypeAliasDecl` and assign that to a `TypedefNameDecl`
  219. // then:
  220. // TypedefNameDecl *ToTypedef;
  221. // GetImportedOrCreateDecl<TypeAliasDecl>(ToTypedef, FromD, ...);
  222. template <typename NewDeclT, typename ToDeclT, typename FromDeclT,
  223. typename... Args>
  224. LLVM_NODISCARD bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
  225. Args &&... args) {
  226. CallOverloadedCreateFun<NewDeclT> OC;
  227. return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
  228. std::forward<Args>(args)...);
  229. }
  230. // Use this version if a special create function must be
  231. // used, e.g. CXXRecordDecl::CreateLambda .
  232. template <typename ToDeclT, typename CreateFunT, typename FromDeclT,
  233. typename... Args>
  234. LLVM_NODISCARD bool
  235. GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
  236. FromDeclT *FromD, Args &&... args) {
  237. if (Importer.getImportDeclErrorIfAny(FromD)) {
  238. ToD = nullptr;
  239. return true; // Already imported but with error.
  240. }
  241. ToD = cast_or_null<ToDeclT>(Importer.GetAlreadyImportedOrNull(FromD));
  242. if (ToD)
  243. return true; // Already imported.
  244. ToD = CreateFun(std::forward<Args>(args)...);
  245. // Keep track of imported Decls.
  246. Importer.RegisterImportedDecl(FromD, ToD);
  247. InitializeImportedDecl(FromD, ToD);
  248. return false; // A new Decl is created.
  249. }
  250. void InitializeImportedDecl(Decl *FromD, Decl *ToD) {
  251. ToD->IdentifierNamespace = FromD->IdentifierNamespace;
  252. if (FromD->hasAttrs())
  253. for (const Attr *FromAttr : FromD->getAttrs()) {
  254. // FIXME: Return of the error here is not possible until store of
  255. // import errors is implemented.
  256. auto ToAttrOrErr = import(FromAttr);
  257. if (ToAttrOrErr)
  258. ToD->addAttr(*ToAttrOrErr);
  259. else
  260. llvm::consumeError(ToAttrOrErr.takeError());
  261. }
  262. if (FromD->isUsed())
  263. ToD->setIsUsed();
  264. if (FromD->isImplicit())
  265. ToD->setImplicit();
  266. }
  267. // Check if we have found an existing definition. Returns with that
  268. // definition if yes, otherwise returns null.
  269. Decl *FindAndMapDefinition(FunctionDecl *D, FunctionDecl *FoundFunction) {
  270. const FunctionDecl *Definition = nullptr;
  271. if (D->doesThisDeclarationHaveABody() &&
  272. FoundFunction->hasBody(Definition))
  273. return Importer.MapImported(D, const_cast<FunctionDecl *>(Definition));
  274. return nullptr;
  275. }
  276. public:
  277. explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) {}
  278. using TypeVisitor<ASTNodeImporter, ExpectedType>::Visit;
  279. using DeclVisitor<ASTNodeImporter, ExpectedDecl>::Visit;
  280. using StmtVisitor<ASTNodeImporter, ExpectedStmt>::Visit;
  281. // Importing types
  282. ExpectedType VisitType(const Type *T);
  283. ExpectedType VisitAtomicType(const AtomicType *T);
  284. ExpectedType VisitBuiltinType(const BuiltinType *T);
  285. ExpectedType VisitDecayedType(const DecayedType *T);
  286. ExpectedType VisitComplexType(const ComplexType *T);
  287. ExpectedType VisitPointerType(const PointerType *T);
  288. ExpectedType VisitBlockPointerType(const BlockPointerType *T);
  289. ExpectedType VisitLValueReferenceType(const LValueReferenceType *T);
  290. ExpectedType VisitRValueReferenceType(const RValueReferenceType *T);
  291. ExpectedType VisitMemberPointerType(const MemberPointerType *T);
  292. ExpectedType VisitConstantArrayType(const ConstantArrayType *T);
  293. ExpectedType VisitIncompleteArrayType(const IncompleteArrayType *T);
  294. ExpectedType VisitVariableArrayType(const VariableArrayType *T);
  295. ExpectedType VisitDependentSizedArrayType(const DependentSizedArrayType *T);
  296. // FIXME: DependentSizedExtVectorType
  297. ExpectedType VisitVectorType(const VectorType *T);
  298. ExpectedType VisitExtVectorType(const ExtVectorType *T);
  299. ExpectedType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
  300. ExpectedType VisitFunctionProtoType(const FunctionProtoType *T);
  301. ExpectedType VisitUnresolvedUsingType(const UnresolvedUsingType *T);
  302. ExpectedType VisitParenType(const ParenType *T);
  303. ExpectedType VisitTypedefType(const TypedefType *T);
  304. ExpectedType VisitTypeOfExprType(const TypeOfExprType *T);
  305. // FIXME: DependentTypeOfExprType
  306. ExpectedType VisitTypeOfType(const TypeOfType *T);
  307. ExpectedType VisitDecltypeType(const DecltypeType *T);
  308. ExpectedType VisitUnaryTransformType(const UnaryTransformType *T);
  309. ExpectedType VisitAutoType(const AutoType *T);
  310. ExpectedType VisitInjectedClassNameType(const InjectedClassNameType *T);
  311. // FIXME: DependentDecltypeType
  312. ExpectedType VisitRecordType(const RecordType *T);
  313. ExpectedType VisitEnumType(const EnumType *T);
  314. ExpectedType VisitAttributedType(const AttributedType *T);
  315. ExpectedType VisitTemplateTypeParmType(const TemplateTypeParmType *T);
  316. ExpectedType VisitSubstTemplateTypeParmType(
  317. const SubstTemplateTypeParmType *T);
  318. ExpectedType VisitTemplateSpecializationType(
  319. const TemplateSpecializationType *T);
  320. ExpectedType VisitElaboratedType(const ElaboratedType *T);
  321. ExpectedType VisitDependentNameType(const DependentNameType *T);
  322. ExpectedType VisitPackExpansionType(const PackExpansionType *T);
  323. ExpectedType VisitDependentTemplateSpecializationType(
  324. const DependentTemplateSpecializationType *T);
  325. ExpectedType VisitObjCInterfaceType(const ObjCInterfaceType *T);
  326. ExpectedType VisitObjCObjectType(const ObjCObjectType *T);
  327. ExpectedType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
  328. // Importing declarations
  329. Error ImportDeclParts(
  330. NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
  331. DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc);
  332. Error ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);
  333. Error ImportDeclarationNameLoc(
  334. const DeclarationNameInfo &From, DeclarationNameInfo &To);
  335. Error ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
  336. Error ImportDeclContext(
  337. Decl *From, DeclContext *&ToDC, DeclContext *&ToLexicalDC);
  338. Error ImportImplicitMethods(const CXXRecordDecl *From, CXXRecordDecl *To);
  339. Expected<CXXCastPath> ImportCastPath(CastExpr *E);
  340. using Designator = DesignatedInitExpr::Designator;
  341. /// What we should import from the definition.
  342. enum ImportDefinitionKind {
  343. /// Import the default subset of the definition, which might be
  344. /// nothing (if minimal import is set) or might be everything (if minimal
  345. /// import is not set).
  346. IDK_Default,
  347. /// Import everything.
  348. IDK_Everything,
  349. /// Import only the bare bones needed to establish a valid
  350. /// DeclContext.
  351. IDK_Basic
  352. };
  353. bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {
  354. return IDK == IDK_Everything ||
  355. (IDK == IDK_Default && !Importer.isMinimalImport());
  356. }
  357. Error ImportInitializer(VarDecl *From, VarDecl *To);
  358. Error ImportDefinition(
  359. RecordDecl *From, RecordDecl *To,
  360. ImportDefinitionKind Kind = IDK_Default);
  361. Error ImportDefinition(
  362. EnumDecl *From, EnumDecl *To,
  363. ImportDefinitionKind Kind = IDK_Default);
  364. Error ImportDefinition(
  365. ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,
  366. ImportDefinitionKind Kind = IDK_Default);
  367. Error ImportDefinition(
  368. ObjCProtocolDecl *From, ObjCProtocolDecl *To,
  369. ImportDefinitionKind Kind = IDK_Default);
  370. Error ImportTemplateArguments(
  371. const TemplateArgument *FromArgs, unsigned NumFromArgs,
  372. SmallVectorImpl<TemplateArgument> &ToArgs);
  373. Expected<TemplateArgument>
  374. ImportTemplateArgument(const TemplateArgument &From);
  375. template <typename InContainerTy>
  376. Error ImportTemplateArgumentListInfo(
  377. const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo);
  378. template<typename InContainerTy>
  379. Error ImportTemplateArgumentListInfo(
  380. SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
  381. const InContainerTy &Container, TemplateArgumentListInfo &Result);
  382. using TemplateArgsTy = SmallVector<TemplateArgument, 8>;
  383. using FunctionTemplateAndArgsTy =
  384. std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
  385. Expected<FunctionTemplateAndArgsTy>
  386. ImportFunctionTemplateWithTemplateArgsFromSpecialization(
  387. FunctionDecl *FromFD);
  388. Error ImportTemplateParameterLists(const DeclaratorDecl *FromD,
  389. DeclaratorDecl *ToD);
  390. Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD);
  391. Error ImportFunctionDeclBody(FunctionDecl *FromFD, FunctionDecl *ToFD);
  392. Error ImportDefaultArgOfParmVarDecl(const ParmVarDecl *FromParam,
  393. ParmVarDecl *ToParam);
  394. template <typename T>
  395. bool hasSameVisibilityContext(T *Found, T *From);
  396. bool IsStructuralMatch(Decl *From, Decl *To, bool Complain);
  397. bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
  398. bool Complain = true);
  399. bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
  400. bool Complain = true);
  401. bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
  402. bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
  403. bool IsStructuralMatch(FunctionTemplateDecl *From,
  404. FunctionTemplateDecl *To);
  405. bool IsStructuralMatch(FunctionDecl *From, FunctionDecl *To);
  406. bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
  407. bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
  408. ExpectedDecl VisitDecl(Decl *D);
  409. ExpectedDecl VisitImportDecl(ImportDecl *D);
  410. ExpectedDecl VisitEmptyDecl(EmptyDecl *D);
  411. ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);
  412. ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);
  413. ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);
  414. ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);
  415. ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
  416. ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
  417. ExpectedDecl VisitTypedefDecl(TypedefDecl *D);
  418. ExpectedDecl VisitTypeAliasDecl(TypeAliasDecl *D);
  419. ExpectedDecl VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
  420. ExpectedDecl VisitLabelDecl(LabelDecl *D);
  421. ExpectedDecl VisitEnumDecl(EnumDecl *D);
  422. ExpectedDecl VisitRecordDecl(RecordDecl *D);
  423. ExpectedDecl VisitEnumConstantDecl(EnumConstantDecl *D);
  424. ExpectedDecl VisitFunctionDecl(FunctionDecl *D);
  425. ExpectedDecl VisitCXXMethodDecl(CXXMethodDecl *D);
  426. ExpectedDecl VisitCXXConstructorDecl(CXXConstructorDecl *D);
  427. ExpectedDecl VisitCXXDestructorDecl(CXXDestructorDecl *D);
  428. ExpectedDecl VisitCXXConversionDecl(CXXConversionDecl *D);
  429. ExpectedDecl VisitFieldDecl(FieldDecl *D);
  430. ExpectedDecl VisitIndirectFieldDecl(IndirectFieldDecl *D);
  431. ExpectedDecl VisitFriendDecl(FriendDecl *D);
  432. ExpectedDecl VisitObjCIvarDecl(ObjCIvarDecl *D);
  433. ExpectedDecl VisitVarDecl(VarDecl *D);
  434. ExpectedDecl VisitImplicitParamDecl(ImplicitParamDecl *D);
  435. ExpectedDecl VisitParmVarDecl(ParmVarDecl *D);
  436. ExpectedDecl VisitObjCMethodDecl(ObjCMethodDecl *D);
  437. ExpectedDecl VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
  438. ExpectedDecl VisitObjCCategoryDecl(ObjCCategoryDecl *D);
  439. ExpectedDecl VisitObjCProtocolDecl(ObjCProtocolDecl *D);
  440. ExpectedDecl VisitLinkageSpecDecl(LinkageSpecDecl *D);
  441. ExpectedDecl VisitUsingDecl(UsingDecl *D);
  442. ExpectedDecl VisitUsingShadowDecl(UsingShadowDecl *D);
  443. ExpectedDecl VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
  444. ExpectedDecl VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
  445. ExpectedDecl VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
  446. Expected<ObjCTypeParamList *>
  447. ImportObjCTypeParamList(ObjCTypeParamList *list);
  448. ExpectedDecl VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
  449. ExpectedDecl VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
  450. ExpectedDecl VisitObjCImplementationDecl(ObjCImplementationDecl *D);
  451. ExpectedDecl VisitObjCPropertyDecl(ObjCPropertyDecl *D);
  452. ExpectedDecl VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
  453. ExpectedDecl VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
  454. ExpectedDecl VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
  455. ExpectedDecl VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
  456. ExpectedDecl VisitClassTemplateDecl(ClassTemplateDecl *D);
  457. ExpectedDecl VisitClassTemplateSpecializationDecl(
  458. ClassTemplateSpecializationDecl *D);
  459. ExpectedDecl VisitVarTemplateDecl(VarTemplateDecl *D);
  460. ExpectedDecl VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
  461. ExpectedDecl VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
  462. // Importing statements
  463. ExpectedStmt VisitStmt(Stmt *S);
  464. ExpectedStmt VisitGCCAsmStmt(GCCAsmStmt *S);
  465. ExpectedStmt VisitDeclStmt(DeclStmt *S);
  466. ExpectedStmt VisitNullStmt(NullStmt *S);
  467. ExpectedStmt VisitCompoundStmt(CompoundStmt *S);
  468. ExpectedStmt VisitCaseStmt(CaseStmt *S);
  469. ExpectedStmt VisitDefaultStmt(DefaultStmt *S);
  470. ExpectedStmt VisitLabelStmt(LabelStmt *S);
  471. ExpectedStmt VisitAttributedStmt(AttributedStmt *S);
  472. ExpectedStmt VisitIfStmt(IfStmt *S);
  473. ExpectedStmt VisitSwitchStmt(SwitchStmt *S);
  474. ExpectedStmt VisitWhileStmt(WhileStmt *S);
  475. ExpectedStmt VisitDoStmt(DoStmt *S);
  476. ExpectedStmt VisitForStmt(ForStmt *S);
  477. ExpectedStmt VisitGotoStmt(GotoStmt *S);
  478. ExpectedStmt VisitIndirectGotoStmt(IndirectGotoStmt *S);
  479. ExpectedStmt VisitContinueStmt(ContinueStmt *S);
  480. ExpectedStmt VisitBreakStmt(BreakStmt *S);
  481. ExpectedStmt VisitReturnStmt(ReturnStmt *S);
  482. // FIXME: MSAsmStmt
  483. // FIXME: SEHExceptStmt
  484. // FIXME: SEHFinallyStmt
  485. // FIXME: SEHTryStmt
  486. // FIXME: SEHLeaveStmt
  487. // FIXME: CapturedStmt
  488. ExpectedStmt VisitCXXCatchStmt(CXXCatchStmt *S);
  489. ExpectedStmt VisitCXXTryStmt(CXXTryStmt *S);
  490. ExpectedStmt VisitCXXForRangeStmt(CXXForRangeStmt *S);
  491. // FIXME: MSDependentExistsStmt
  492. ExpectedStmt VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);
  493. ExpectedStmt VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);
  494. ExpectedStmt VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);
  495. ExpectedStmt VisitObjCAtTryStmt(ObjCAtTryStmt *S);
  496. ExpectedStmt VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);
  497. ExpectedStmt VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);
  498. ExpectedStmt VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);
  499. // Importing expressions
  500. ExpectedStmt VisitExpr(Expr *E);
  501. ExpectedStmt VisitVAArgExpr(VAArgExpr *E);
  502. ExpectedStmt VisitChooseExpr(ChooseExpr *E);
  503. ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E);
  504. ExpectedStmt VisitPredefinedExpr(PredefinedExpr *E);
  505. ExpectedStmt VisitDeclRefExpr(DeclRefExpr *E);
  506. ExpectedStmt VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
  507. ExpectedStmt VisitDesignatedInitExpr(DesignatedInitExpr *E);
  508. ExpectedStmt VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
  509. ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E);
  510. ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E);
  511. ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E);
  512. ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E);
  513. ExpectedStmt VisitStringLiteral(StringLiteral *E);
  514. ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
  515. ExpectedStmt VisitAtomicExpr(AtomicExpr *E);
  516. ExpectedStmt VisitAddrLabelExpr(AddrLabelExpr *E);
  517. ExpectedStmt VisitConstantExpr(ConstantExpr *E);
  518. ExpectedStmt VisitParenExpr(ParenExpr *E);
  519. ExpectedStmt VisitParenListExpr(ParenListExpr *E);
  520. ExpectedStmt VisitStmtExpr(StmtExpr *E);
  521. ExpectedStmt VisitUnaryOperator(UnaryOperator *E);
  522. ExpectedStmt VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
  523. ExpectedStmt VisitBinaryOperator(BinaryOperator *E);
  524. ExpectedStmt VisitConditionalOperator(ConditionalOperator *E);
  525. ExpectedStmt VisitBinaryConditionalOperator(BinaryConditionalOperator *E);
  526. ExpectedStmt VisitOpaqueValueExpr(OpaqueValueExpr *E);
  527. ExpectedStmt VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
  528. ExpectedStmt VisitExpressionTraitExpr(ExpressionTraitExpr *E);
  529. ExpectedStmt VisitArraySubscriptExpr(ArraySubscriptExpr *E);
  530. ExpectedStmt VisitCompoundAssignOperator(CompoundAssignOperator *E);
  531. ExpectedStmt VisitImplicitCastExpr(ImplicitCastExpr *E);
  532. ExpectedStmt VisitExplicitCastExpr(ExplicitCastExpr *E);
  533. ExpectedStmt VisitOffsetOfExpr(OffsetOfExpr *OE);
  534. ExpectedStmt VisitCXXThrowExpr(CXXThrowExpr *E);
  535. ExpectedStmt VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
  536. ExpectedStmt VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
  537. ExpectedStmt VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
  538. ExpectedStmt VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
  539. ExpectedStmt VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
  540. ExpectedStmt VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);
  541. ExpectedStmt VisitPackExpansionExpr(PackExpansionExpr *E);
  542. ExpectedStmt VisitSizeOfPackExpr(SizeOfPackExpr *E);
  543. ExpectedStmt VisitCXXNewExpr(CXXNewExpr *E);
  544. ExpectedStmt VisitCXXDeleteExpr(CXXDeleteExpr *E);
  545. ExpectedStmt VisitCXXConstructExpr(CXXConstructExpr *E);
  546. ExpectedStmt VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
  547. ExpectedStmt VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
  548. ExpectedStmt VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
  549. ExpectedStmt VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
  550. ExpectedStmt VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
  551. ExpectedStmt VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
  552. ExpectedStmt VisitExprWithCleanups(ExprWithCleanups *E);
  553. ExpectedStmt VisitCXXThisExpr(CXXThisExpr *E);
  554. ExpectedStmt VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
  555. ExpectedStmt VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
  556. ExpectedStmt VisitMemberExpr(MemberExpr *E);
  557. ExpectedStmt VisitCallExpr(CallExpr *E);
  558. ExpectedStmt VisitLambdaExpr(LambdaExpr *LE);
  559. ExpectedStmt VisitInitListExpr(InitListExpr *E);
  560. ExpectedStmt VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E);
  561. ExpectedStmt VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E);
  562. ExpectedStmt VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);
  563. ExpectedStmt VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);
  564. ExpectedStmt VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
  565. ExpectedStmt VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
  566. ExpectedStmt VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);
  567. ExpectedStmt VisitTypeTraitExpr(TypeTraitExpr *E);
  568. ExpectedStmt VisitCXXTypeidExpr(CXXTypeidExpr *E);
  569. template<typename IIter, typename OIter>
  570. Error ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {
  571. using ItemT = typename std::remove_reference<decltype(*Obegin)>::type;
  572. for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
  573. Expected<ItemT> ToOrErr = import(*Ibegin);
  574. if (!ToOrErr)
  575. return ToOrErr.takeError();
  576. *Obegin = *ToOrErr;
  577. }
  578. return Error::success();
  579. }
  580. // Import every item from a container structure into an output container.
  581. // If error occurs, stops at first error and returns the error.
  582. // The output container should have space for all needed elements (it is not
  583. // expanded, new items are put into from the beginning).
  584. template<typename InContainerTy, typename OutContainerTy>
  585. Error ImportContainerChecked(
  586. const InContainerTy &InContainer, OutContainerTy &OutContainer) {
  587. return ImportArrayChecked(
  588. InContainer.begin(), InContainer.end(), OutContainer.begin());
  589. }
  590. template<typename InContainerTy, typename OIter>
  591. Error ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {
  592. return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin);
  593. }
  594. Error ImportOverriddenMethods(CXXMethodDecl *ToMethod,
  595. CXXMethodDecl *FromMethod);
  596. Expected<FunctionDecl *> FindFunctionTemplateSpecialization(
  597. FunctionDecl *FromFD);
  598. };
  599. template <typename InContainerTy>
  600. Error ASTNodeImporter::ImportTemplateArgumentListInfo(
  601. SourceLocation FromLAngleLoc, SourceLocation FromRAngleLoc,
  602. const InContainerTy &Container, TemplateArgumentListInfo &Result) {
  603. auto ToLAngleLocOrErr = import(FromLAngleLoc);
  604. if (!ToLAngleLocOrErr)
  605. return ToLAngleLocOrErr.takeError();
  606. auto ToRAngleLocOrErr = import(FromRAngleLoc);
  607. if (!ToRAngleLocOrErr)
  608. return ToRAngleLocOrErr.takeError();
  609. TemplateArgumentListInfo ToTAInfo(*ToLAngleLocOrErr, *ToRAngleLocOrErr);
  610. if (auto Err = ImportTemplateArgumentListInfo(Container, ToTAInfo))
  611. return Err;
  612. Result = ToTAInfo;
  613. return Error::success();
  614. }
  615. template <>
  616. Error ASTNodeImporter::ImportTemplateArgumentListInfo<TemplateArgumentListInfo>(
  617. const TemplateArgumentListInfo &From, TemplateArgumentListInfo &Result) {
  618. return ImportTemplateArgumentListInfo(
  619. From.getLAngleLoc(), From.getRAngleLoc(), From.arguments(), Result);
  620. }
  621. template <>
  622. Error ASTNodeImporter::ImportTemplateArgumentListInfo<
  623. ASTTemplateArgumentListInfo>(
  624. const ASTTemplateArgumentListInfo &From,
  625. TemplateArgumentListInfo &Result) {
  626. return ImportTemplateArgumentListInfo(
  627. From.LAngleLoc, From.RAngleLoc, From.arguments(), Result);
  628. }
  629. Expected<ASTNodeImporter::FunctionTemplateAndArgsTy>
  630. ASTNodeImporter::ImportFunctionTemplateWithTemplateArgsFromSpecialization(
  631. FunctionDecl *FromFD) {
  632. assert(FromFD->getTemplatedKind() ==
  633. FunctionDecl::TK_FunctionTemplateSpecialization);
  634. FunctionTemplateAndArgsTy Result;
  635. auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
  636. if (Error Err = importInto(std::get<0>(Result), FTSInfo->getTemplate()))
  637. return std::move(Err);
  638. // Import template arguments.
  639. auto TemplArgs = FTSInfo->TemplateArguments->asArray();
  640. if (Error Err = ImportTemplateArguments(TemplArgs.data(), TemplArgs.size(),
  641. std::get<1>(Result)))
  642. return std::move(Err);
  643. return Result;
  644. }
  645. template <>
  646. Expected<TemplateParameterList *>
  647. ASTNodeImporter::import(TemplateParameterList *From) {
  648. SmallVector<NamedDecl *, 4> To(From->size());
  649. if (Error Err = ImportContainerChecked(*From, To))
  650. return std::move(Err);
  651. ExpectedExpr ToRequiresClause = import(From->getRequiresClause());
  652. if (!ToRequiresClause)
  653. return ToRequiresClause.takeError();
  654. auto ToTemplateLocOrErr = import(From->getTemplateLoc());
  655. if (!ToTemplateLocOrErr)
  656. return ToTemplateLocOrErr.takeError();
  657. auto ToLAngleLocOrErr = import(From->getLAngleLoc());
  658. if (!ToLAngleLocOrErr)
  659. return ToLAngleLocOrErr.takeError();
  660. auto ToRAngleLocOrErr = import(From->getRAngleLoc());
  661. if (!ToRAngleLocOrErr)
  662. return ToRAngleLocOrErr.takeError();
  663. return TemplateParameterList::Create(
  664. Importer.getToContext(),
  665. *ToTemplateLocOrErr,
  666. *ToLAngleLocOrErr,
  667. To,
  668. *ToRAngleLocOrErr,
  669. *ToRequiresClause);
  670. }
  671. template <>
  672. Expected<TemplateArgument>
  673. ASTNodeImporter::import(const TemplateArgument &From) {
  674. switch (From.getKind()) {
  675. case TemplateArgument::Null:
  676. return TemplateArgument();
  677. case TemplateArgument::Type: {
  678. ExpectedType ToTypeOrErr = import(From.getAsType());
  679. if (!ToTypeOrErr)
  680. return ToTypeOrErr.takeError();
  681. return TemplateArgument(*ToTypeOrErr);
  682. }
  683. case TemplateArgument::Integral: {
  684. ExpectedType ToTypeOrErr = import(From.getIntegralType());
  685. if (!ToTypeOrErr)
  686. return ToTypeOrErr.takeError();
  687. return TemplateArgument(From, *ToTypeOrErr);
  688. }
  689. case TemplateArgument::Declaration: {
  690. Expected<ValueDecl *> ToOrErr = import(From.getAsDecl());
  691. if (!ToOrErr)
  692. return ToOrErr.takeError();
  693. ExpectedType ToTypeOrErr = import(From.getParamTypeForDecl());
  694. if (!ToTypeOrErr)
  695. return ToTypeOrErr.takeError();
  696. return TemplateArgument(*ToOrErr, *ToTypeOrErr);
  697. }
  698. case TemplateArgument::NullPtr: {
  699. ExpectedType ToTypeOrErr = import(From.getNullPtrType());
  700. if (!ToTypeOrErr)
  701. return ToTypeOrErr.takeError();
  702. return TemplateArgument(*ToTypeOrErr, /*isNullPtr*/true);
  703. }
  704. case TemplateArgument::Template: {
  705. Expected<TemplateName> ToTemplateOrErr = import(From.getAsTemplate());
  706. if (!ToTemplateOrErr)
  707. return ToTemplateOrErr.takeError();
  708. return TemplateArgument(*ToTemplateOrErr);
  709. }
  710. case TemplateArgument::TemplateExpansion: {
  711. Expected<TemplateName> ToTemplateOrErr =
  712. import(From.getAsTemplateOrTemplatePattern());
  713. if (!ToTemplateOrErr)
  714. return ToTemplateOrErr.takeError();
  715. return TemplateArgument(
  716. *ToTemplateOrErr, From.getNumTemplateExpansions());
  717. }
  718. case TemplateArgument::Expression:
  719. if (ExpectedExpr ToExpr = import(From.getAsExpr()))
  720. return TemplateArgument(*ToExpr);
  721. else
  722. return ToExpr.takeError();
  723. case TemplateArgument::Pack: {
  724. SmallVector<TemplateArgument, 2> ToPack;
  725. ToPack.reserve(From.pack_size());
  726. if (Error Err = ImportTemplateArguments(
  727. From.pack_begin(), From.pack_size(), ToPack))
  728. return std::move(Err);
  729. return TemplateArgument(
  730. llvm::makeArrayRef(ToPack).copy(Importer.getToContext()));
  731. }
  732. }
  733. llvm_unreachable("Invalid template argument kind");
  734. }
  735. template <>
  736. Expected<TemplateArgumentLoc>
  737. ASTNodeImporter::import(const TemplateArgumentLoc &TALoc) {
  738. Expected<TemplateArgument> ArgOrErr = import(TALoc.getArgument());
  739. if (!ArgOrErr)
  740. return ArgOrErr.takeError();
  741. TemplateArgument Arg = *ArgOrErr;
  742. TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo();
  743. TemplateArgumentLocInfo ToInfo;
  744. if (Arg.getKind() == TemplateArgument::Expression) {
  745. ExpectedExpr E = import(FromInfo.getAsExpr());
  746. if (!E)
  747. return E.takeError();
  748. ToInfo = TemplateArgumentLocInfo(*E);
  749. } else if (Arg.getKind() == TemplateArgument::Type) {
  750. if (auto TSIOrErr = import(FromInfo.getAsTypeSourceInfo()))
  751. ToInfo = TemplateArgumentLocInfo(*TSIOrErr);
  752. else
  753. return TSIOrErr.takeError();
  754. } else {
  755. auto ToTemplateQualifierLocOrErr =
  756. import(FromInfo.getTemplateQualifierLoc());
  757. if (!ToTemplateQualifierLocOrErr)
  758. return ToTemplateQualifierLocOrErr.takeError();
  759. auto ToTemplateNameLocOrErr = import(FromInfo.getTemplateNameLoc());
  760. if (!ToTemplateNameLocOrErr)
  761. return ToTemplateNameLocOrErr.takeError();
  762. auto ToTemplateEllipsisLocOrErr =
  763. import(FromInfo.getTemplateEllipsisLoc());
  764. if (!ToTemplateEllipsisLocOrErr)
  765. return ToTemplateEllipsisLocOrErr.takeError();
  766. ToInfo = TemplateArgumentLocInfo(
  767. *ToTemplateQualifierLocOrErr,
  768. *ToTemplateNameLocOrErr,
  769. *ToTemplateEllipsisLocOrErr);
  770. }
  771. return TemplateArgumentLoc(Arg, ToInfo);
  772. }
  773. template <>
  774. Expected<DeclGroupRef> ASTNodeImporter::import(const DeclGroupRef &DG) {
  775. if (DG.isNull())
  776. return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
  777. size_t NumDecls = DG.end() - DG.begin();
  778. SmallVector<Decl *, 1> ToDecls;
  779. ToDecls.reserve(NumDecls);
  780. for (Decl *FromD : DG) {
  781. if (auto ToDOrErr = import(FromD))
  782. ToDecls.push_back(*ToDOrErr);
  783. else
  784. return ToDOrErr.takeError();
  785. }
  786. return DeclGroupRef::Create(Importer.getToContext(),
  787. ToDecls.begin(),
  788. NumDecls);
  789. }
  790. template <>
  791. Expected<ASTNodeImporter::Designator>
  792. ASTNodeImporter::import(const Designator &D) {
  793. if (D.isFieldDesignator()) {
  794. IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());
  795. ExpectedSLoc ToDotLocOrErr = import(D.getDotLoc());
  796. if (!ToDotLocOrErr)
  797. return ToDotLocOrErr.takeError();
  798. ExpectedSLoc ToFieldLocOrErr = import(D.getFieldLoc());
  799. if (!ToFieldLocOrErr)
  800. return ToFieldLocOrErr.takeError();
  801. return Designator(ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
  802. }
  803. ExpectedSLoc ToLBracketLocOrErr = import(D.getLBracketLoc());
  804. if (!ToLBracketLocOrErr)
  805. return ToLBracketLocOrErr.takeError();
  806. ExpectedSLoc ToRBracketLocOrErr = import(D.getRBracketLoc());
  807. if (!ToRBracketLocOrErr)
  808. return ToRBracketLocOrErr.takeError();
  809. if (D.isArrayDesignator())
  810. return Designator(D.getFirstExprIndex(),
  811. *ToLBracketLocOrErr, *ToRBracketLocOrErr);
  812. ExpectedSLoc ToEllipsisLocOrErr = import(D.getEllipsisLoc());
  813. if (!ToEllipsisLocOrErr)
  814. return ToEllipsisLocOrErr.takeError();
  815. assert(D.isArrayRangeDesignator());
  816. return Designator(
  817. D.getFirstExprIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
  818. *ToRBracketLocOrErr);
  819. }
  820. template <>
  821. Expected<LambdaCapture> ASTNodeImporter::import(const LambdaCapture &From) {
  822. VarDecl *Var = nullptr;
  823. if (From.capturesVariable()) {
  824. if (auto VarOrErr = import(From.getCapturedVar()))
  825. Var = *VarOrErr;
  826. else
  827. return VarOrErr.takeError();
  828. }
  829. auto LocationOrErr = import(From.getLocation());
  830. if (!LocationOrErr)
  831. return LocationOrErr.takeError();
  832. SourceLocation EllipsisLoc;
  833. if (From.isPackExpansion())
  834. if (Error Err = importInto(EllipsisLoc, From.getEllipsisLoc()))
  835. return std::move(Err);
  836. return LambdaCapture(
  837. *LocationOrErr, From.isImplicit(), From.getCaptureKind(), Var,
  838. EllipsisLoc);
  839. }
  840. template <typename T>
  841. bool ASTNodeImporter::hasSameVisibilityContext(T *Found, T *From) {
  842. if (From->hasExternalFormalLinkage())
  843. return Found->hasExternalFormalLinkage();
  844. if (Importer.GetFromTU(Found) != From->getTranslationUnitDecl())
  845. return false;
  846. if (From->isInAnonymousNamespace())
  847. return Found->isInAnonymousNamespace();
  848. else
  849. return !Found->isInAnonymousNamespace() &&
  850. !Found->hasExternalFormalLinkage();
  851. }
  852. template <>
  853. bool ASTNodeImporter::hasSameVisibilityContext(TypedefNameDecl *Found,
  854. TypedefNameDecl *From) {
  855. if (From->isInAnonymousNamespace() && Found->isInAnonymousNamespace())
  856. return Importer.GetFromTU(Found) == From->getTranslationUnitDecl();
  857. return From->isInAnonymousNamespace() == Found->isInAnonymousNamespace();
  858. }
  859. } // namespace clang
  860. //----------------------------------------------------------------------------
  861. // Import Types
  862. //----------------------------------------------------------------------------
  863. using namespace clang;
  864. ExpectedType ASTNodeImporter::VisitType(const Type *T) {
  865. Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
  866. << T->getTypeClassName();
  867. return make_error<ImportError>(ImportError::UnsupportedConstruct);
  868. }
  869. ExpectedType ASTNodeImporter::VisitAtomicType(const AtomicType *T){
  870. ExpectedType UnderlyingTypeOrErr = import(T->getValueType());
  871. if (!UnderlyingTypeOrErr)
  872. return UnderlyingTypeOrErr.takeError();
  873. return Importer.getToContext().getAtomicType(*UnderlyingTypeOrErr);
  874. }
  875. ExpectedType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
  876. switch (T->getKind()) {
  877. #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
  878. case BuiltinType::Id: \
  879. return Importer.getToContext().SingletonId;
  880. #include "clang/Basic/OpenCLImageTypes.def"
  881. #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
  882. case BuiltinType::Id: \
  883. return Importer.getToContext().Id##Ty;
  884. #include "clang/Basic/OpenCLExtensionTypes.def"
  885. #define SVE_TYPE(Name, Id, SingletonId) \
  886. case BuiltinType::Id: \
  887. return Importer.getToContext().SingletonId;
  888. #include "clang/Basic/AArch64SVEACLETypes.def"
  889. #define SHARED_SINGLETON_TYPE(Expansion)
  890. #define BUILTIN_TYPE(Id, SingletonId) \
  891. case BuiltinType::Id: return Importer.getToContext().SingletonId;
  892. #include "clang/AST/BuiltinTypes.def"
  893. // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
  894. // context supports C++.
  895. // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
  896. // context supports ObjC.
  897. case BuiltinType::Char_U:
  898. // The context we're importing from has an unsigned 'char'. If we're
  899. // importing into a context with a signed 'char', translate to
  900. // 'unsigned char' instead.
  901. if (Importer.getToContext().getLangOpts().CharIsSigned)
  902. return Importer.getToContext().UnsignedCharTy;
  903. return Importer.getToContext().CharTy;
  904. case BuiltinType::Char_S:
  905. // The context we're importing from has an unsigned 'char'. If we're
  906. // importing into a context with a signed 'char', translate to
  907. // 'unsigned char' instead.
  908. if (!Importer.getToContext().getLangOpts().CharIsSigned)
  909. return Importer.getToContext().SignedCharTy;
  910. return Importer.getToContext().CharTy;
  911. case BuiltinType::WChar_S:
  912. case BuiltinType::WChar_U:
  913. // FIXME: If not in C++, shall we translate to the C equivalent of
  914. // wchar_t?
  915. return Importer.getToContext().WCharTy;
  916. }
  917. llvm_unreachable("Invalid BuiltinType Kind!");
  918. }
  919. ExpectedType ASTNodeImporter::VisitDecayedType(const DecayedType *T) {
  920. ExpectedType ToOriginalTypeOrErr = import(T->getOriginalType());
  921. if (!ToOriginalTypeOrErr)
  922. return ToOriginalTypeOrErr.takeError();
  923. return Importer.getToContext().getDecayedType(*ToOriginalTypeOrErr);
  924. }
  925. ExpectedType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
  926. ExpectedType ToElementTypeOrErr = import(T->getElementType());
  927. if (!ToElementTypeOrErr)
  928. return ToElementTypeOrErr.takeError();
  929. return Importer.getToContext().getComplexType(*ToElementTypeOrErr);
  930. }
  931. ExpectedType ASTNodeImporter::VisitPointerType(const PointerType *T) {
  932. ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
  933. if (!ToPointeeTypeOrErr)
  934. return ToPointeeTypeOrErr.takeError();
  935. return Importer.getToContext().getPointerType(*ToPointeeTypeOrErr);
  936. }
  937. ExpectedType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
  938. // FIXME: Check for blocks support in "to" context.
  939. ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
  940. if (!ToPointeeTypeOrErr)
  941. return ToPointeeTypeOrErr.takeError();
  942. return Importer.getToContext().getBlockPointerType(*ToPointeeTypeOrErr);
  943. }
  944. ExpectedType
  945. ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
  946. // FIXME: Check for C++ support in "to" context.
  947. ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
  948. if (!ToPointeeTypeOrErr)
  949. return ToPointeeTypeOrErr.takeError();
  950. return Importer.getToContext().getLValueReferenceType(*ToPointeeTypeOrErr);
  951. }
  952. ExpectedType
  953. ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
  954. // FIXME: Check for C++0x support in "to" context.
  955. ExpectedType ToPointeeTypeOrErr = import(T->getPointeeTypeAsWritten());
  956. if (!ToPointeeTypeOrErr)
  957. return ToPointeeTypeOrErr.takeError();
  958. return Importer.getToContext().getRValueReferenceType(*ToPointeeTypeOrErr);
  959. }
  960. ExpectedType
  961. ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
  962. // FIXME: Check for C++ support in "to" context.
  963. ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
  964. if (!ToPointeeTypeOrErr)
  965. return ToPointeeTypeOrErr.takeError();
  966. ExpectedType ClassTypeOrErr = import(QualType(T->getClass(), 0));
  967. if (!ClassTypeOrErr)
  968. return ClassTypeOrErr.takeError();
  969. return Importer.getToContext().getMemberPointerType(
  970. *ToPointeeTypeOrErr, (*ClassTypeOrErr).getTypePtr());
  971. }
  972. ExpectedType
  973. ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
  974. QualType ToElementType;
  975. const Expr *ToSizeExpr;
  976. if (auto Imp = importSeq(T->getElementType(), T->getSizeExpr()))
  977. std::tie(ToElementType, ToSizeExpr) = *Imp;
  978. else
  979. return Imp.takeError();
  980. return Importer.getToContext().getConstantArrayType(
  981. ToElementType, T->getSize(), ToSizeExpr, T->getSizeModifier(),
  982. T->getIndexTypeCVRQualifiers());
  983. }
  984. ExpectedType
  985. ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
  986. ExpectedType ToElementTypeOrErr = import(T->getElementType());
  987. if (!ToElementTypeOrErr)
  988. return ToElementTypeOrErr.takeError();
  989. return Importer.getToContext().getIncompleteArrayType(*ToElementTypeOrErr,
  990. T->getSizeModifier(),
  991. T->getIndexTypeCVRQualifiers());
  992. }
  993. ExpectedType
  994. ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
  995. QualType ToElementType;
  996. Expr *ToSizeExpr;
  997. SourceRange ToBracketsRange;
  998. if (auto Imp = importSeq(
  999. T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
  1000. std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
  1001. else
  1002. return Imp.takeError();
  1003. return Importer.getToContext().getVariableArrayType(
  1004. ToElementType, ToSizeExpr, T->getSizeModifier(),
  1005. T->getIndexTypeCVRQualifiers(), ToBracketsRange);
  1006. }
  1007. ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
  1008. const DependentSizedArrayType *T) {
  1009. QualType ToElementType;
  1010. Expr *ToSizeExpr;
  1011. SourceRange ToBracketsRange;
  1012. if (auto Imp = importSeq(
  1013. T->getElementType(), T->getSizeExpr(), T->getBracketsRange()))
  1014. std::tie(ToElementType, ToSizeExpr, ToBracketsRange) = *Imp;
  1015. else
  1016. return Imp.takeError();
  1017. // SizeExpr may be null if size is not specified directly.
  1018. // For example, 'int a[]'.
  1019. return Importer.getToContext().getDependentSizedArrayType(
  1020. ToElementType, ToSizeExpr, T->getSizeModifier(),
  1021. T->getIndexTypeCVRQualifiers(), ToBracketsRange);
  1022. }
  1023. ExpectedType ASTNodeImporter::VisitVectorType(const VectorType *T) {
  1024. ExpectedType ToElementTypeOrErr = import(T->getElementType());
  1025. if (!ToElementTypeOrErr)
  1026. return ToElementTypeOrErr.takeError();
  1027. return Importer.getToContext().getVectorType(*ToElementTypeOrErr,
  1028. T->getNumElements(),
  1029. T->getVectorKind());
  1030. }
  1031. ExpectedType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
  1032. ExpectedType ToElementTypeOrErr = import(T->getElementType());
  1033. if (!ToElementTypeOrErr)
  1034. return ToElementTypeOrErr.takeError();
  1035. return Importer.getToContext().getExtVectorType(*ToElementTypeOrErr,
  1036. T->getNumElements());
  1037. }
  1038. ExpectedType
  1039. ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
  1040. // FIXME: What happens if we're importing a function without a prototype
  1041. // into C++? Should we make it variadic?
  1042. ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
  1043. if (!ToReturnTypeOrErr)
  1044. return ToReturnTypeOrErr.takeError();
  1045. return Importer.getToContext().getFunctionNoProtoType(*ToReturnTypeOrErr,
  1046. T->getExtInfo());
  1047. }
  1048. ExpectedType
  1049. ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
  1050. ExpectedType ToReturnTypeOrErr = import(T->getReturnType());
  1051. if (!ToReturnTypeOrErr)
  1052. return ToReturnTypeOrErr.takeError();
  1053. // Import argument types
  1054. SmallVector<QualType, 4> ArgTypes;
  1055. for (const auto &A : T->param_types()) {
  1056. ExpectedType TyOrErr = import(A);
  1057. if (!TyOrErr)
  1058. return TyOrErr.takeError();
  1059. ArgTypes.push_back(*TyOrErr);
  1060. }
  1061. // Import exception types
  1062. SmallVector<QualType, 4> ExceptionTypes;
  1063. for (const auto &E : T->exceptions()) {
  1064. ExpectedType TyOrErr = import(E);
  1065. if (!TyOrErr)
  1066. return TyOrErr.takeError();
  1067. ExceptionTypes.push_back(*TyOrErr);
  1068. }
  1069. FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
  1070. FunctionProtoType::ExtProtoInfo ToEPI;
  1071. auto Imp = importSeq(
  1072. FromEPI.ExceptionSpec.NoexceptExpr,
  1073. FromEPI.ExceptionSpec.SourceDecl,
  1074. FromEPI.ExceptionSpec.SourceTemplate);
  1075. if (!Imp)
  1076. return Imp.takeError();
  1077. ToEPI.ExtInfo = FromEPI.ExtInfo;
  1078. ToEPI.Variadic = FromEPI.Variadic;
  1079. ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
  1080. ToEPI.TypeQuals = FromEPI.TypeQuals;
  1081. ToEPI.RefQualifier = FromEPI.RefQualifier;
  1082. ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;
  1083. ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;
  1084. std::tie(
  1085. ToEPI.ExceptionSpec.NoexceptExpr,
  1086. ToEPI.ExceptionSpec.SourceDecl,
  1087. ToEPI.ExceptionSpec.SourceTemplate) = *Imp;
  1088. return Importer.getToContext().getFunctionType(
  1089. *ToReturnTypeOrErr, ArgTypes, ToEPI);
  1090. }
  1091. ExpectedType ASTNodeImporter::VisitUnresolvedUsingType(
  1092. const UnresolvedUsingType *T) {
  1093. UnresolvedUsingTypenameDecl *ToD;
  1094. Decl *ToPrevD;
  1095. if (auto Imp = importSeq(T->getDecl(), T->getDecl()->getPreviousDecl()))
  1096. std::tie(ToD, ToPrevD) = *Imp;
  1097. else
  1098. return Imp.takeError();
  1099. return Importer.getToContext().getTypeDeclType(
  1100. ToD, cast_or_null<TypeDecl>(ToPrevD));
  1101. }
  1102. ExpectedType ASTNodeImporter::VisitParenType(const ParenType *T) {
  1103. ExpectedType ToInnerTypeOrErr = import(T->getInnerType());
  1104. if (!ToInnerTypeOrErr)
  1105. return ToInnerTypeOrErr.takeError();
  1106. return Importer.getToContext().getParenType(*ToInnerTypeOrErr);
  1107. }
  1108. ExpectedType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
  1109. Expected<TypedefNameDecl *> ToDeclOrErr = import(T->getDecl());
  1110. if (!ToDeclOrErr)
  1111. return ToDeclOrErr.takeError();
  1112. return Importer.getToContext().getTypeDeclType(*ToDeclOrErr);
  1113. }
  1114. ExpectedType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
  1115. ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
  1116. if (!ToExprOrErr)
  1117. return ToExprOrErr.takeError();
  1118. return Importer.getToContext().getTypeOfExprType(*ToExprOrErr);
  1119. }
  1120. ExpectedType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
  1121. ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
  1122. if (!ToUnderlyingTypeOrErr)
  1123. return ToUnderlyingTypeOrErr.takeError();
  1124. return Importer.getToContext().getTypeOfType(*ToUnderlyingTypeOrErr);
  1125. }
  1126. ExpectedType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
  1127. // FIXME: Make sure that the "to" context supports C++0x!
  1128. ExpectedExpr ToExprOrErr = import(T->getUnderlyingExpr());
  1129. if (!ToExprOrErr)
  1130. return ToExprOrErr.takeError();
  1131. ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
  1132. if (!ToUnderlyingTypeOrErr)
  1133. return ToUnderlyingTypeOrErr.takeError();
  1134. return Importer.getToContext().getDecltypeType(
  1135. *ToExprOrErr, *ToUnderlyingTypeOrErr);
  1136. }
  1137. ExpectedType
  1138. ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
  1139. ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
  1140. if (!ToBaseTypeOrErr)
  1141. return ToBaseTypeOrErr.takeError();
  1142. ExpectedType ToUnderlyingTypeOrErr = import(T->getUnderlyingType());
  1143. if (!ToUnderlyingTypeOrErr)
  1144. return ToUnderlyingTypeOrErr.takeError();
  1145. return Importer.getToContext().getUnaryTransformType(
  1146. *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr, T->getUTTKind());
  1147. }
  1148. ExpectedType ASTNodeImporter::VisitAutoType(const AutoType *T) {
  1149. // FIXME: Make sure that the "to" context supports C++11!
  1150. ExpectedType ToDeducedTypeOrErr = import(T->getDeducedType());
  1151. if (!ToDeducedTypeOrErr)
  1152. return ToDeducedTypeOrErr.takeError();
  1153. return Importer.getToContext().getAutoType(*ToDeducedTypeOrErr,
  1154. T->getKeyword(),
  1155. /*IsDependent*/false);
  1156. }
  1157. ExpectedType ASTNodeImporter::VisitInjectedClassNameType(
  1158. const InjectedClassNameType *T) {
  1159. Expected<CXXRecordDecl *> ToDeclOrErr = import(T->getDecl());
  1160. if (!ToDeclOrErr)
  1161. return ToDeclOrErr.takeError();
  1162. ExpectedType ToInjTypeOrErr = import(T->getInjectedSpecializationType());
  1163. if (!ToInjTypeOrErr)
  1164. return ToInjTypeOrErr.takeError();
  1165. // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading
  1166. // See comments in InjectedClassNameType definition for details
  1167. // return Importer.getToContext().getInjectedClassNameType(D, InjType);
  1168. enum {
  1169. TypeAlignmentInBits = 4,
  1170. TypeAlignment = 1 << TypeAlignmentInBits
  1171. };
  1172. return QualType(new (Importer.getToContext(), TypeAlignment)
  1173. InjectedClassNameType(*ToDeclOrErr, *ToInjTypeOrErr), 0);
  1174. }
  1175. ExpectedType ASTNodeImporter::VisitRecordType(const RecordType *T) {
  1176. Expected<RecordDecl *> ToDeclOrErr = import(T->getDecl());
  1177. if (!ToDeclOrErr)
  1178. return ToDeclOrErr.takeError();
  1179. return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
  1180. }
  1181. ExpectedType ASTNodeImporter::VisitEnumType(const EnumType *T) {
  1182. Expected<EnumDecl *> ToDeclOrErr = import(T->getDecl());
  1183. if (!ToDeclOrErr)
  1184. return ToDeclOrErr.takeError();
  1185. return Importer.getToContext().getTagDeclType(*ToDeclOrErr);
  1186. }
  1187. ExpectedType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {
  1188. ExpectedType ToModifiedTypeOrErr = import(T->getModifiedType());
  1189. if (!ToModifiedTypeOrErr)
  1190. return ToModifiedTypeOrErr.takeError();
  1191. ExpectedType ToEquivalentTypeOrErr = import(T->getEquivalentType());
  1192. if (!ToEquivalentTypeOrErr)
  1193. return ToEquivalentTypeOrErr.takeError();
  1194. return Importer.getToContext().getAttributedType(T->getAttrKind(),
  1195. *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr);
  1196. }
  1197. ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
  1198. const TemplateTypeParmType *T) {
  1199. Expected<TemplateTypeParmDecl *> ToDeclOrErr = import(T->getDecl());
  1200. if (!ToDeclOrErr)
  1201. return ToDeclOrErr.takeError();
  1202. return Importer.getToContext().getTemplateTypeParmType(
  1203. T->getDepth(), T->getIndex(), T->isParameterPack(), *ToDeclOrErr);
  1204. }
  1205. ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
  1206. const SubstTemplateTypeParmType *T) {
  1207. ExpectedType ReplacedOrErr = import(QualType(T->getReplacedParameter(), 0));
  1208. if (!ReplacedOrErr)
  1209. return ReplacedOrErr.takeError();
  1210. const TemplateTypeParmType *Replaced =
  1211. cast<TemplateTypeParmType>((*ReplacedOrErr).getTypePtr());
  1212. ExpectedType ToReplacementTypeOrErr = import(T->getReplacementType());
  1213. if (!ToReplacementTypeOrErr)
  1214. return ToReplacementTypeOrErr.takeError();
  1215. return Importer.getToContext().getSubstTemplateTypeParmType(
  1216. Replaced, (*ToReplacementTypeOrErr).getCanonicalType());
  1217. }
  1218. ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
  1219. const TemplateSpecializationType *T) {
  1220. auto ToTemplateOrErr = import(T->getTemplateName());
  1221. if (!ToTemplateOrErr)
  1222. return ToTemplateOrErr.takeError();
  1223. SmallVector<TemplateArgument, 2> ToTemplateArgs;
  1224. if (Error Err = ImportTemplateArguments(
  1225. T->getArgs(), T->getNumArgs(), ToTemplateArgs))
  1226. return std::move(Err);
  1227. QualType ToCanonType;
  1228. if (!QualType(T, 0).isCanonical()) {
  1229. QualType FromCanonType
  1230. = Importer.getFromContext().getCanonicalType(QualType(T, 0));
  1231. if (ExpectedType TyOrErr = import(FromCanonType))
  1232. ToCanonType = *TyOrErr;
  1233. else
  1234. return TyOrErr.takeError();
  1235. }
  1236. return Importer.getToContext().getTemplateSpecializationType(*ToTemplateOrErr,
  1237. ToTemplateArgs,
  1238. ToCanonType);
  1239. }
  1240. ExpectedType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
  1241. // Note: the qualifier in an ElaboratedType is optional.
  1242. auto ToQualifierOrErr = import(T->getQualifier());
  1243. if (!ToQualifierOrErr)
  1244. return ToQualifierOrErr.takeError();
  1245. ExpectedType ToNamedTypeOrErr = import(T->getNamedType());
  1246. if (!ToNamedTypeOrErr)
  1247. return ToNamedTypeOrErr.takeError();
  1248. Expected<TagDecl *> ToOwnedTagDeclOrErr = import(T->getOwnedTagDecl());
  1249. if (!ToOwnedTagDeclOrErr)
  1250. return ToOwnedTagDeclOrErr.takeError();
  1251. return Importer.getToContext().getElaboratedType(T->getKeyword(),
  1252. *ToQualifierOrErr,
  1253. *ToNamedTypeOrErr,
  1254. *ToOwnedTagDeclOrErr);
  1255. }
  1256. ExpectedType
  1257. ASTNodeImporter::VisitPackExpansionType(const PackExpansionType *T) {
  1258. ExpectedType ToPatternOrErr = import(T->getPattern());
  1259. if (!ToPatternOrErr)
  1260. return ToPatternOrErr.takeError();
  1261. return Importer.getToContext().getPackExpansionType(*ToPatternOrErr,
  1262. T->getNumExpansions());
  1263. }
  1264. ExpectedType ASTNodeImporter::VisitDependentTemplateSpecializationType(
  1265. const DependentTemplateSpecializationType *T) {
  1266. auto ToQualifierOrErr = import(T->getQualifier());
  1267. if (!ToQualifierOrErr)
  1268. return ToQualifierOrErr.takeError();
  1269. IdentifierInfo *ToName = Importer.Import(T->getIdentifier());
  1270. SmallVector<TemplateArgument, 2> ToPack;
  1271. ToPack.reserve(T->getNumArgs());
  1272. if (Error Err = ImportTemplateArguments(
  1273. T->getArgs(), T->getNumArgs(), ToPack))
  1274. return std::move(Err);
  1275. return Importer.getToContext().getDependentTemplateSpecializationType(
  1276. T->getKeyword(), *ToQualifierOrErr, ToName, ToPack);
  1277. }
  1278. ExpectedType
  1279. ASTNodeImporter::VisitDependentNameType(const DependentNameType *T) {
  1280. auto ToQualifierOrErr = import(T->getQualifier());
  1281. if (!ToQualifierOrErr)
  1282. return ToQualifierOrErr.takeError();
  1283. IdentifierInfo *Name = Importer.Import(T->getIdentifier());
  1284. QualType Canon;
  1285. if (T != T->getCanonicalTypeInternal().getTypePtr()) {
  1286. if (ExpectedType TyOrErr = import(T->getCanonicalTypeInternal()))
  1287. Canon = (*TyOrErr).getCanonicalType();
  1288. else
  1289. return TyOrErr.takeError();
  1290. }
  1291. return Importer.getToContext().getDependentNameType(T->getKeyword(),
  1292. *ToQualifierOrErr,
  1293. Name, Canon);
  1294. }
  1295. ExpectedType
  1296. ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
  1297. Expected<ObjCInterfaceDecl *> ToDeclOrErr = import(T->getDecl());
  1298. if (!ToDeclOrErr)
  1299. return ToDeclOrErr.takeError();
  1300. return Importer.getToContext().getObjCInterfaceType(*ToDeclOrErr);
  1301. }
  1302. ExpectedType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
  1303. ExpectedType ToBaseTypeOrErr = import(T->getBaseType());
  1304. if (!ToBaseTypeOrErr)
  1305. return ToBaseTypeOrErr.takeError();
  1306. SmallVector<QualType, 4> TypeArgs;
  1307. for (auto TypeArg : T->getTypeArgsAsWritten()) {
  1308. if (ExpectedType TyOrErr = import(TypeArg))
  1309. TypeArgs.push_back(*TyOrErr);
  1310. else
  1311. return TyOrErr.takeError();
  1312. }
  1313. SmallVector<ObjCProtocolDecl *, 4> Protocols;
  1314. for (auto *P : T->quals()) {
  1315. if (Expected<ObjCProtocolDecl *> ProtocolOrErr = import(P))
  1316. Protocols.push_back(*ProtocolOrErr);
  1317. else
  1318. return ProtocolOrErr.takeError();
  1319. }
  1320. return Importer.getToContext().getObjCObjectType(*ToBaseTypeOrErr, TypeArgs,
  1321. Protocols,
  1322. T->isKindOfTypeAsWritten());
  1323. }
  1324. ExpectedType
  1325. ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
  1326. ExpectedType ToPointeeTypeOrErr = import(T->getPointeeType());
  1327. if (!ToPointeeTypeOrErr)
  1328. return ToPointeeTypeOrErr.takeError();
  1329. return Importer.getToContext().getObjCObjectPointerType(*ToPointeeTypeOrErr);
  1330. }
  1331. //----------------------------------------------------------------------------
  1332. // Import Declarations
  1333. //----------------------------------------------------------------------------
  1334. Error ASTNodeImporter::ImportDeclParts(
  1335. NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC,
  1336. DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc) {
  1337. // Check if RecordDecl is in FunctionDecl parameters to avoid infinite loop.
  1338. // example: int struct_in_proto(struct data_t{int a;int b;} *d);
  1339. DeclContext *OrigDC = D->getDeclContext();
  1340. FunctionDecl *FunDecl;
  1341. if (isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
  1342. FunDecl->hasBody()) {
  1343. auto getLeafPointeeType = [](const Type *T) {
  1344. while (T->isPointerType() || T->isArrayType()) {
  1345. T = T->getPointeeOrArrayElementType();
  1346. }
  1347. return T;
  1348. };
  1349. for (const ParmVarDecl *P : FunDecl->parameters()) {
  1350. const Type *LeafT =
  1351. getLeafPointeeType(P->getType().getCanonicalType().getTypePtr());
  1352. auto *RT = dyn_cast<RecordType>(LeafT);
  1353. if (RT && RT->getDecl() == D) {
  1354. Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
  1355. << D->getDeclKindName();
  1356. return make_error<ImportError>(ImportError::UnsupportedConstruct);
  1357. }
  1358. }
  1359. }
  1360. // Import the context of this declaration.
  1361. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  1362. return Err;
  1363. // Import the name of this declaration.
  1364. if (Error Err = importInto(Name, D->getDeclName()))
  1365. return Err;
  1366. // Import the location of this declaration.
  1367. if (Error Err = importInto(Loc, D->getLocation()))
  1368. return Err;
  1369. ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
  1370. if (ToD)
  1371. if (Error Err = ASTNodeImporter(*this).ImportDefinitionIfNeeded(D, ToD))
  1372. return Err;
  1373. return Error::success();
  1374. }
  1375. Error ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
  1376. if (!FromD)
  1377. return Error::success();
  1378. if (!ToD)
  1379. if (Error Err = importInto(ToD, FromD))
  1380. return Err;
  1381. if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
  1382. if (RecordDecl *ToRecord = cast<RecordDecl>(ToD)) {
  1383. if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
  1384. !ToRecord->getDefinition()) {
  1385. if (Error Err = ImportDefinition(FromRecord, ToRecord))
  1386. return Err;
  1387. }
  1388. }
  1389. return Error::success();
  1390. }
  1391. if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
  1392. if (EnumDecl *ToEnum = cast<EnumDecl>(ToD)) {
  1393. if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
  1394. if (Error Err = ImportDefinition(FromEnum, ToEnum))
  1395. return Err;
  1396. }
  1397. }
  1398. return Error::success();
  1399. }
  1400. return Error::success();
  1401. }
  1402. Error
  1403. ASTNodeImporter::ImportDeclarationNameLoc(
  1404. const DeclarationNameInfo &From, DeclarationNameInfo& To) {
  1405. // NOTE: To.Name and To.Loc are already imported.
  1406. // We only have to import To.LocInfo.
  1407. switch (To.getName().getNameKind()) {
  1408. case DeclarationName::Identifier:
  1409. case DeclarationName::ObjCZeroArgSelector:
  1410. case DeclarationName::ObjCOneArgSelector:
  1411. case DeclarationName::ObjCMultiArgSelector:
  1412. case DeclarationName::CXXUsingDirective:
  1413. case DeclarationName::CXXDeductionGuideName:
  1414. return Error::success();
  1415. case DeclarationName::CXXOperatorName: {
  1416. if (auto ToRangeOrErr = import(From.getCXXOperatorNameRange()))
  1417. To.setCXXOperatorNameRange(*ToRangeOrErr);
  1418. else
  1419. return ToRangeOrErr.takeError();
  1420. return Error::success();
  1421. }
  1422. case DeclarationName::CXXLiteralOperatorName: {
  1423. if (ExpectedSLoc LocOrErr = import(From.getCXXLiteralOperatorNameLoc()))
  1424. To.setCXXLiteralOperatorNameLoc(*LocOrErr);
  1425. else
  1426. return LocOrErr.takeError();
  1427. return Error::success();
  1428. }
  1429. case DeclarationName::CXXConstructorName:
  1430. case DeclarationName::CXXDestructorName:
  1431. case DeclarationName::CXXConversionFunctionName: {
  1432. if (auto ToTInfoOrErr = import(From.getNamedTypeInfo()))
  1433. To.setNamedTypeInfo(*ToTInfoOrErr);
  1434. else
  1435. return ToTInfoOrErr.takeError();
  1436. return Error::success();
  1437. }
  1438. }
  1439. llvm_unreachable("Unknown name kind.");
  1440. }
  1441. Error
  1442. ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
  1443. if (Importer.isMinimalImport() && !ForceImport) {
  1444. auto ToDCOrErr = Importer.ImportContext(FromDC);
  1445. return ToDCOrErr.takeError();
  1446. }
  1447. // We use strict error handling in case of records and enums, but not
  1448. // with e.g. namespaces.
  1449. //
  1450. // FIXME Clients of the ASTImporter should be able to choose an
  1451. // appropriate error handling strategy for their needs. For instance,
  1452. // they may not want to mark an entire namespace as erroneous merely
  1453. // because there is an ODR error with two typedefs. As another example,
  1454. // the client may allow EnumConstantDecls with same names but with
  1455. // different values in two distinct translation units.
  1456. bool AccumulateChildErrors = isa<TagDecl>(FromDC);
  1457. Error ChildErrors = Error::success();
  1458. for (auto *From : FromDC->decls()) {
  1459. ExpectedDecl ImportedOrErr = import(From);
  1460. if (!ImportedOrErr) {
  1461. if (AccumulateChildErrors)
  1462. ChildErrors =
  1463. joinErrors(std::move(ChildErrors), ImportedOrErr.takeError());
  1464. else
  1465. consumeError(ImportedOrErr.takeError());
  1466. }
  1467. }
  1468. // We reorder declarations in RecordDecls because they may have another order
  1469. // in the "to" context than they have in the "from" context. This may happen
  1470. // e.g when we import a class like this:
  1471. // struct declToImport {
  1472. // int a = c + b;
  1473. // int b = 1;
  1474. // int c = 2;
  1475. // };
  1476. // During the import of `a` we import first the dependencies in sequence,
  1477. // thus the order would be `c`, `b`, `a`. We will get the normal order by
  1478. // first removing the already imported members and then adding them in the
  1479. // order as they apper in the "from" context.
  1480. //
  1481. // Keeping field order is vital because it determines structure layout.
  1482. //
  1483. // Here and below, we cannot call field_begin() method and its callers on
  1484. // ToDC if it has an external storage. Calling field_begin() will
  1485. // automatically load all the fields by calling
  1486. // LoadFieldsFromExternalStorage(). LoadFieldsFromExternalStorage() would
  1487. // call ASTImporter::Import(). This is because the ExternalASTSource
  1488. // interface in LLDB is implemented by the means of the ASTImporter. However,
  1489. // calling an import at this point would result in an uncontrolled import, we
  1490. // must avoid that.
  1491. const auto *FromRD = dyn_cast<RecordDecl>(FromDC);
  1492. if (!FromRD)
  1493. return ChildErrors;
  1494. auto ToDCOrErr = Importer.ImportContext(FromDC);
  1495. if (!ToDCOrErr) {
  1496. consumeError(std::move(ChildErrors));
  1497. return ToDCOrErr.takeError();
  1498. }
  1499. DeclContext *ToDC = *ToDCOrErr;
  1500. // Remove all declarations, which may be in wrong order in the
  1501. // lexical DeclContext and then add them in the proper order.
  1502. for (auto *D : FromRD->decls()) {
  1503. if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D) || isa<FriendDecl>(D)) {
  1504. assert(D && "DC contains a null decl");
  1505. Decl *ToD = Importer.GetAlreadyImportedOrNull(D);
  1506. // Remove only the decls which we successfully imported.
  1507. if (ToD) {
  1508. assert(ToDC == ToD->getLexicalDeclContext() && ToDC->containsDecl(ToD));
  1509. // Remove the decl from its wrong place in the linked list.
  1510. ToDC->removeDecl(ToD);
  1511. // Add the decl to the end of the linked list.
  1512. // This time it will be at the proper place because the enclosing for
  1513. // loop iterates in the original (good) order of the decls.
  1514. ToDC->addDeclInternal(ToD);
  1515. }
  1516. }
  1517. }
  1518. return ChildErrors;
  1519. }
  1520. Error ASTNodeImporter::ImportDeclContext(
  1521. Decl *FromD, DeclContext *&ToDC, DeclContext *&ToLexicalDC) {
  1522. auto ToDCOrErr = Importer.ImportContext(FromD->getDeclContext());
  1523. if (!ToDCOrErr)
  1524. return ToDCOrErr.takeError();
  1525. ToDC = *ToDCOrErr;
  1526. if (FromD->getDeclContext() != FromD->getLexicalDeclContext()) {
  1527. auto ToLexicalDCOrErr = Importer.ImportContext(
  1528. FromD->getLexicalDeclContext());
  1529. if (!ToLexicalDCOrErr)
  1530. return ToLexicalDCOrErr.takeError();
  1531. ToLexicalDC = *ToLexicalDCOrErr;
  1532. } else
  1533. ToLexicalDC = ToDC;
  1534. return Error::success();
  1535. }
  1536. Error ASTNodeImporter::ImportImplicitMethods(
  1537. const CXXRecordDecl *From, CXXRecordDecl *To) {
  1538. assert(From->isCompleteDefinition() && To->getDefinition() == To &&
  1539. "Import implicit methods to or from non-definition");
  1540. for (CXXMethodDecl *FromM : From->methods())
  1541. if (FromM->isImplicit()) {
  1542. Expected<CXXMethodDecl *> ToMOrErr = import(FromM);
  1543. if (!ToMOrErr)
  1544. return ToMOrErr.takeError();
  1545. }
  1546. return Error::success();
  1547. }
  1548. static Error setTypedefNameForAnonDecl(TagDecl *From, TagDecl *To,
  1549. ASTImporter &Importer) {
  1550. if (TypedefNameDecl *FromTypedef = From->getTypedefNameForAnonDecl()) {
  1551. if (ExpectedDecl ToTypedefOrErr = Importer.Import(FromTypedef))
  1552. To->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(*ToTypedefOrErr));
  1553. else
  1554. return ToTypedefOrErr.takeError();
  1555. }
  1556. return Error::success();
  1557. }
  1558. Error ASTNodeImporter::ImportDefinition(
  1559. RecordDecl *From, RecordDecl *To, ImportDefinitionKind Kind) {
  1560. auto DefinitionCompleter = [To]() {
  1561. // There are cases in LLDB when we first import a class without its
  1562. // members. The class will have DefinitionData, but no members. Then,
  1563. // importDefinition is called from LLDB, which tries to get the members, so
  1564. // when we get here, the class already has the DefinitionData set, so we
  1565. // must unset the CompleteDefinition here to be able to complete again the
  1566. // definition.
  1567. To->setCompleteDefinition(false);
  1568. To->completeDefinition();
  1569. };
  1570. if (To->getDefinition() || To->isBeingDefined()) {
  1571. if (Kind == IDK_Everything ||
  1572. // In case of lambdas, the class already has a definition ptr set, but
  1573. // the contained decls are not imported yet. Also, isBeingDefined was
  1574. // set in CXXRecordDecl::CreateLambda. We must import the contained
  1575. // decls here and finish the definition.
  1576. (To->isLambda() && shouldForceImportDeclContext(Kind))) {
  1577. Error Result = ImportDeclContext(From, /*ForceImport=*/true);
  1578. // Finish the definition of the lambda, set isBeingDefined to false.
  1579. if (To->isLambda())
  1580. DefinitionCompleter();
  1581. return Result;
  1582. }
  1583. return Error::success();
  1584. }
  1585. To->startDefinition();
  1586. // Complete the definition even if error is returned.
  1587. // The RecordDecl may be already part of the AST so it is better to
  1588. // have it in complete state even if something is wrong with it.
  1589. auto DefinitionCompleterScopeExit =
  1590. llvm::make_scope_exit(DefinitionCompleter);
  1591. if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
  1592. return Err;
  1593. // Add base classes.
  1594. auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
  1595. auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
  1596. if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
  1597. struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
  1598. struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
  1599. #define FIELD(Name, Width, Merge) \
  1600. ToData.Name = FromData.Name;
  1601. #include "clang/AST/CXXRecordDeclDefinitionBits.def"
  1602. // Copy over the data stored in RecordDeclBits
  1603. ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
  1604. SmallVector<CXXBaseSpecifier *, 4> Bases;
  1605. for (const auto &Base1 : FromCXX->bases()) {
  1606. ExpectedType TyOrErr = import(Base1.getType());
  1607. if (!TyOrErr)
  1608. return TyOrErr.takeError();
  1609. SourceLocation EllipsisLoc;
  1610. if (Base1.isPackExpansion()) {
  1611. if (ExpectedSLoc LocOrErr = import(Base1.getEllipsisLoc()))
  1612. EllipsisLoc = *LocOrErr;
  1613. else
  1614. return LocOrErr.takeError();
  1615. }
  1616. // Ensure that we have a definition for the base.
  1617. if (Error Err =
  1618. ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()))
  1619. return Err;
  1620. auto RangeOrErr = import(Base1.getSourceRange());
  1621. if (!RangeOrErr)
  1622. return RangeOrErr.takeError();
  1623. auto TSIOrErr = import(Base1.getTypeSourceInfo());
  1624. if (!TSIOrErr)
  1625. return TSIOrErr.takeError();
  1626. Bases.push_back(
  1627. new (Importer.getToContext()) CXXBaseSpecifier(
  1628. *RangeOrErr,
  1629. Base1.isVirtual(),
  1630. Base1.isBaseOfClass(),
  1631. Base1.getAccessSpecifierAsWritten(),
  1632. *TSIOrErr,
  1633. EllipsisLoc));
  1634. }
  1635. if (!Bases.empty())
  1636. ToCXX->setBases(Bases.data(), Bases.size());
  1637. }
  1638. if (shouldForceImportDeclContext(Kind))
  1639. if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
  1640. return Err;
  1641. return Error::success();
  1642. }
  1643. Error ASTNodeImporter::ImportInitializer(VarDecl *From, VarDecl *To) {
  1644. if (To->getAnyInitializer())
  1645. return Error::success();
  1646. Expr *FromInit = From->getInit();
  1647. if (!FromInit)
  1648. return Error::success();
  1649. ExpectedExpr ToInitOrErr = import(FromInit);
  1650. if (!ToInitOrErr)
  1651. return ToInitOrErr.takeError();
  1652. To->setInit(*ToInitOrErr);
  1653. if (From->isInitKnownICE()) {
  1654. EvaluatedStmt *Eval = To->ensureEvaluatedStmt();
  1655. Eval->CheckedICE = true;
  1656. Eval->IsICE = From->isInitICE();
  1657. }
  1658. // FIXME: Other bits to merge?
  1659. return Error::success();
  1660. }
  1661. Error ASTNodeImporter::ImportDefinition(
  1662. EnumDecl *From, EnumDecl *To, ImportDefinitionKind Kind) {
  1663. if (To->getDefinition() || To->isBeingDefined()) {
  1664. if (Kind == IDK_Everything)
  1665. return ImportDeclContext(From, /*ForceImport=*/true);
  1666. return Error::success();
  1667. }
  1668. To->startDefinition();
  1669. if (Error Err = setTypedefNameForAnonDecl(From, To, Importer))
  1670. return Err;
  1671. ExpectedType ToTypeOrErr =
  1672. import(Importer.getFromContext().getTypeDeclType(From));
  1673. if (!ToTypeOrErr)
  1674. return ToTypeOrErr.takeError();
  1675. ExpectedType ToPromotionTypeOrErr = import(From->getPromotionType());
  1676. if (!ToPromotionTypeOrErr)
  1677. return ToPromotionTypeOrErr.takeError();
  1678. if (shouldForceImportDeclContext(Kind))
  1679. if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
  1680. return Err;
  1681. // FIXME: we might need to merge the number of positive or negative bits
  1682. // if the enumerator lists don't match.
  1683. To->completeDefinition(*ToTypeOrErr, *ToPromotionTypeOrErr,
  1684. From->getNumPositiveBits(),
  1685. From->getNumNegativeBits());
  1686. return Error::success();
  1687. }
  1688. Error ASTNodeImporter::ImportTemplateArguments(
  1689. const TemplateArgument *FromArgs, unsigned NumFromArgs,
  1690. SmallVectorImpl<TemplateArgument> &ToArgs) {
  1691. for (unsigned I = 0; I != NumFromArgs; ++I) {
  1692. if (auto ToOrErr = import(FromArgs[I]))
  1693. ToArgs.push_back(*ToOrErr);
  1694. else
  1695. return ToOrErr.takeError();
  1696. }
  1697. return Error::success();
  1698. }
  1699. // FIXME: Do not forget to remove this and use only 'import'.
  1700. Expected<TemplateArgument>
  1701. ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
  1702. return import(From);
  1703. }
  1704. template <typename InContainerTy>
  1705. Error ASTNodeImporter::ImportTemplateArgumentListInfo(
  1706. const InContainerTy &Container, TemplateArgumentListInfo &ToTAInfo) {
  1707. for (const auto &FromLoc : Container) {
  1708. if (auto ToLocOrErr = import(FromLoc))
  1709. ToTAInfo.addArgument(*ToLocOrErr);
  1710. else
  1711. return ToLocOrErr.takeError();
  1712. }
  1713. return Error::success();
  1714. }
  1715. static StructuralEquivalenceKind
  1716. getStructuralEquivalenceKind(const ASTImporter &Importer) {
  1717. return Importer.isMinimalImport() ? StructuralEquivalenceKind::Minimal
  1718. : StructuralEquivalenceKind::Default;
  1719. }
  1720. bool ASTNodeImporter::IsStructuralMatch(Decl *From, Decl *To, bool Complain) {
  1721. StructuralEquivalenceContext Ctx(
  1722. Importer.getFromContext(), Importer.getToContext(),
  1723. Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
  1724. false, Complain);
  1725. return Ctx.IsEquivalent(From, To);
  1726. }
  1727. bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
  1728. RecordDecl *ToRecord, bool Complain) {
  1729. // Eliminate a potential failure point where we attempt to re-import
  1730. // something we're trying to import while completing ToRecord.
  1731. Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
  1732. if (ToOrigin) {
  1733. auto *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
  1734. if (ToOriginRecord)
  1735. ToRecord = ToOriginRecord;
  1736. }
  1737. StructuralEquivalenceContext Ctx(Importer.getFromContext(),
  1738. ToRecord->getASTContext(),
  1739. Importer.getNonEquivalentDecls(),
  1740. getStructuralEquivalenceKind(Importer),
  1741. false, Complain);
  1742. return Ctx.IsEquivalent(FromRecord, ToRecord);
  1743. }
  1744. bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
  1745. bool Complain) {
  1746. StructuralEquivalenceContext Ctx(
  1747. Importer.getFromContext(), Importer.getToContext(),
  1748. Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
  1749. false, Complain);
  1750. return Ctx.IsEquivalent(FromVar, ToVar);
  1751. }
  1752. bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
  1753. // Eliminate a potential failure point where we attempt to re-import
  1754. // something we're trying to import while completing ToEnum.
  1755. if (Decl *ToOrigin = Importer.GetOriginalDecl(ToEnum))
  1756. if (auto *ToOriginEnum = dyn_cast<EnumDecl>(ToOrigin))
  1757. ToEnum = ToOriginEnum;
  1758. StructuralEquivalenceContext Ctx(
  1759. Importer.getFromContext(), Importer.getToContext(),
  1760. Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer));
  1761. return Ctx.IsEquivalent(FromEnum, ToEnum);
  1762. }
  1763. bool ASTNodeImporter::IsStructuralMatch(FunctionTemplateDecl *From,
  1764. FunctionTemplateDecl *To) {
  1765. StructuralEquivalenceContext Ctx(
  1766. Importer.getFromContext(), Importer.getToContext(),
  1767. Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
  1768. false, false);
  1769. return Ctx.IsEquivalent(From, To);
  1770. }
  1771. bool ASTNodeImporter::IsStructuralMatch(FunctionDecl *From, FunctionDecl *To) {
  1772. StructuralEquivalenceContext Ctx(
  1773. Importer.getFromContext(), Importer.getToContext(),
  1774. Importer.getNonEquivalentDecls(), getStructuralEquivalenceKind(Importer),
  1775. false, false);
  1776. return Ctx.IsEquivalent(From, To);
  1777. }
  1778. bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
  1779. EnumConstantDecl *ToEC) {
  1780. const llvm::APSInt &FromVal = FromEC->getInitVal();
  1781. const llvm::APSInt &ToVal = ToEC->getInitVal();
  1782. return FromVal.isSigned() == ToVal.isSigned() &&
  1783. FromVal.getBitWidth() == ToVal.getBitWidth() &&
  1784. FromVal == ToVal;
  1785. }
  1786. bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
  1787. ClassTemplateDecl *To) {
  1788. StructuralEquivalenceContext Ctx(Importer.getFromContext(),
  1789. Importer.getToContext(),
  1790. Importer.getNonEquivalentDecls(),
  1791. getStructuralEquivalenceKind(Importer));
  1792. return Ctx.IsEquivalent(From, To);
  1793. }
  1794. bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
  1795. VarTemplateDecl *To) {
  1796. StructuralEquivalenceContext Ctx(Importer.getFromContext(),
  1797. Importer.getToContext(),
  1798. Importer.getNonEquivalentDecls(),
  1799. getStructuralEquivalenceKind(Importer));
  1800. return Ctx.IsEquivalent(From, To);
  1801. }
  1802. ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) {
  1803. Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
  1804. << D->getDeclKindName();
  1805. return make_error<ImportError>(ImportError::UnsupportedConstruct);
  1806. }
  1807. ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) {
  1808. Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
  1809. << D->getDeclKindName();
  1810. return make_error<ImportError>(ImportError::UnsupportedConstruct);
  1811. }
  1812. ExpectedDecl ASTNodeImporter::VisitEmptyDecl(EmptyDecl *D) {
  1813. // Import the context of this declaration.
  1814. DeclContext *DC, *LexicalDC;
  1815. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  1816. return std::move(Err);
  1817. // Import the location of this declaration.
  1818. ExpectedSLoc LocOrErr = import(D->getLocation());
  1819. if (!LocOrErr)
  1820. return LocOrErr.takeError();
  1821. EmptyDecl *ToD;
  1822. if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, *LocOrErr))
  1823. return ToD;
  1824. ToD->setLexicalDeclContext(LexicalDC);
  1825. LexicalDC->addDeclInternal(ToD);
  1826. return ToD;
  1827. }
  1828. ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
  1829. TranslationUnitDecl *ToD =
  1830. Importer.getToContext().getTranslationUnitDecl();
  1831. Importer.MapImported(D, ToD);
  1832. return ToD;
  1833. }
  1834. ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
  1835. ExpectedSLoc LocOrErr = import(D->getLocation());
  1836. if (!LocOrErr)
  1837. return LocOrErr.takeError();
  1838. auto ColonLocOrErr = import(D->getColonLoc());
  1839. if (!ColonLocOrErr)
  1840. return ColonLocOrErr.takeError();
  1841. // Import the context of this declaration.
  1842. auto DCOrErr = Importer.ImportContext(D->getDeclContext());
  1843. if (!DCOrErr)
  1844. return DCOrErr.takeError();
  1845. DeclContext *DC = *DCOrErr;
  1846. AccessSpecDecl *ToD;
  1847. if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), D->getAccess(),
  1848. DC, *LocOrErr, *ColonLocOrErr))
  1849. return ToD;
  1850. // Lexical DeclContext and Semantic DeclContext
  1851. // is always the same for the accessSpec.
  1852. ToD->setLexicalDeclContext(DC);
  1853. DC->addDeclInternal(ToD);
  1854. return ToD;
  1855. }
  1856. ExpectedDecl ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) {
  1857. auto DCOrErr = Importer.ImportContext(D->getDeclContext());
  1858. if (!DCOrErr)
  1859. return DCOrErr.takeError();
  1860. DeclContext *DC = *DCOrErr;
  1861. DeclContext *LexicalDC = DC;
  1862. SourceLocation ToLocation, ToRParenLoc;
  1863. Expr *ToAssertExpr;
  1864. StringLiteral *ToMessage;
  1865. if (auto Imp = importSeq(
  1866. D->getLocation(), D->getAssertExpr(), D->getMessage(), D->getRParenLoc()))
  1867. std::tie(ToLocation, ToAssertExpr, ToMessage, ToRParenLoc) = *Imp;
  1868. else
  1869. return Imp.takeError();
  1870. StaticAssertDecl *ToD;
  1871. if (GetImportedOrCreateDecl(
  1872. ToD, D, Importer.getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
  1873. ToRParenLoc, D->isFailed()))
  1874. return ToD;
  1875. ToD->setLexicalDeclContext(LexicalDC);
  1876. LexicalDC->addDeclInternal(ToD);
  1877. return ToD;
  1878. }
  1879. ExpectedDecl ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
  1880. // Import the major distinguishing characteristics of this namespace.
  1881. DeclContext *DC, *LexicalDC;
  1882. DeclarationName Name;
  1883. SourceLocation Loc;
  1884. NamedDecl *ToD;
  1885. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  1886. return std::move(Err);
  1887. if (ToD)
  1888. return ToD;
  1889. NamespaceDecl *MergeWithNamespace = nullptr;
  1890. if (!Name) {
  1891. // This is an anonymous namespace. Adopt an existing anonymous
  1892. // namespace if we can.
  1893. // FIXME: Not testable.
  1894. if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
  1895. MergeWithNamespace = TU->getAnonymousNamespace();
  1896. else
  1897. MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
  1898. } else {
  1899. SmallVector<NamedDecl *, 4> ConflictingDecls;
  1900. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  1901. for (auto *FoundDecl : FoundDecls) {
  1902. if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Namespace))
  1903. continue;
  1904. if (auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
  1905. MergeWithNamespace = FoundNS;
  1906. ConflictingDecls.clear();
  1907. break;
  1908. }
  1909. ConflictingDecls.push_back(FoundDecl);
  1910. }
  1911. if (!ConflictingDecls.empty()) {
  1912. ExpectedName NameOrErr = Importer.HandleNameConflict(
  1913. Name, DC, Decl::IDNS_Namespace, ConflictingDecls.data(),
  1914. ConflictingDecls.size());
  1915. if (NameOrErr)
  1916. Name = NameOrErr.get();
  1917. else
  1918. return NameOrErr.takeError();
  1919. }
  1920. }
  1921. ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
  1922. if (!BeginLocOrErr)
  1923. return BeginLocOrErr.takeError();
  1924. // Create the "to" namespace, if needed.
  1925. NamespaceDecl *ToNamespace = MergeWithNamespace;
  1926. if (!ToNamespace) {
  1927. if (GetImportedOrCreateDecl(
  1928. ToNamespace, D, Importer.getToContext(), DC, D->isInline(),
  1929. *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
  1930. /*PrevDecl=*/nullptr))
  1931. return ToNamespace;
  1932. ToNamespace->setLexicalDeclContext(LexicalDC);
  1933. LexicalDC->addDeclInternal(ToNamespace);
  1934. // If this is an anonymous namespace, register it as the anonymous
  1935. // namespace within its context.
  1936. if (!Name) {
  1937. if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
  1938. TU->setAnonymousNamespace(ToNamespace);
  1939. else
  1940. cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
  1941. }
  1942. }
  1943. Importer.MapImported(D, ToNamespace);
  1944. if (Error Err = ImportDeclContext(D))
  1945. return std::move(Err);
  1946. return ToNamespace;
  1947. }
  1948. ExpectedDecl ASTNodeImporter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
  1949. // Import the major distinguishing characteristics of this namespace.
  1950. DeclContext *DC, *LexicalDC;
  1951. DeclarationName Name;
  1952. SourceLocation Loc;
  1953. NamedDecl *LookupD;
  1954. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, LookupD, Loc))
  1955. return std::move(Err);
  1956. if (LookupD)
  1957. return LookupD;
  1958. // NOTE: No conflict resolution is done for namespace aliases now.
  1959. SourceLocation ToNamespaceLoc, ToAliasLoc, ToTargetNameLoc;
  1960. NestedNameSpecifierLoc ToQualifierLoc;
  1961. NamespaceDecl *ToNamespace;
  1962. if (auto Imp = importSeq(
  1963. D->getNamespaceLoc(), D->getAliasLoc(), D->getQualifierLoc(),
  1964. D->getTargetNameLoc(), D->getNamespace()))
  1965. std::tie(
  1966. ToNamespaceLoc, ToAliasLoc, ToQualifierLoc, ToTargetNameLoc,
  1967. ToNamespace) = *Imp;
  1968. else
  1969. return Imp.takeError();
  1970. IdentifierInfo *ToIdentifier = Importer.Import(D->getIdentifier());
  1971. NamespaceAliasDecl *ToD;
  1972. if (GetImportedOrCreateDecl(
  1973. ToD, D, Importer.getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
  1974. ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
  1975. return ToD;
  1976. ToD->setLexicalDeclContext(LexicalDC);
  1977. LexicalDC->addDeclInternal(ToD);
  1978. return ToD;
  1979. }
  1980. ExpectedDecl
  1981. ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
  1982. // Import the major distinguishing characteristics of this typedef.
  1983. DeclContext *DC, *LexicalDC;
  1984. DeclarationName Name;
  1985. SourceLocation Loc;
  1986. NamedDecl *ToD;
  1987. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  1988. return std::move(Err);
  1989. if (ToD)
  1990. return ToD;
  1991. // If this typedef is not in block scope, determine whether we've
  1992. // seen a typedef with the same name (that we can merge with) or any
  1993. // other entity by that name (which name lookup could conflict with).
  1994. // Note: Repeated typedefs are not valid in C99:
  1995. // 'typedef int T; typedef int T;' is invalid
  1996. // We do not care about this now.
  1997. if (!DC->isFunctionOrMethod()) {
  1998. SmallVector<NamedDecl *, 4> ConflictingDecls;
  1999. unsigned IDNS = Decl::IDNS_Ordinary;
  2000. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  2001. for (auto *FoundDecl : FoundDecls) {
  2002. if (!FoundDecl->isInIdentifierNamespace(IDNS))
  2003. continue;
  2004. if (auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
  2005. if (!hasSameVisibilityContext(FoundTypedef, D))
  2006. continue;
  2007. QualType FromUT = D->getUnderlyingType();
  2008. QualType FoundUT = FoundTypedef->getUnderlyingType();
  2009. if (Importer.IsStructurallyEquivalent(FromUT, FoundUT)) {
  2010. // If the "From" context has a complete underlying type but we
  2011. // already have a complete underlying type then return with that.
  2012. if (!FromUT->isIncompleteType() && !FoundUT->isIncompleteType())
  2013. return Importer.MapImported(D, FoundTypedef);
  2014. // FIXME Handle redecl chain. When you do that make consistent changes
  2015. // in ASTImporterLookupTable too.
  2016. } else {
  2017. ConflictingDecls.push_back(FoundDecl);
  2018. }
  2019. }
  2020. }
  2021. if (!ConflictingDecls.empty()) {
  2022. ExpectedName NameOrErr = Importer.HandleNameConflict(
  2023. Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
  2024. if (NameOrErr)
  2025. Name = NameOrErr.get();
  2026. else
  2027. return NameOrErr.takeError();
  2028. }
  2029. }
  2030. QualType ToUnderlyingType;
  2031. TypeSourceInfo *ToTypeSourceInfo;
  2032. SourceLocation ToBeginLoc;
  2033. if (auto Imp = importSeq(
  2034. D->getUnderlyingType(), D->getTypeSourceInfo(), D->getBeginLoc()))
  2035. std::tie(ToUnderlyingType, ToTypeSourceInfo, ToBeginLoc) = *Imp;
  2036. else
  2037. return Imp.takeError();
  2038. // Create the new typedef node.
  2039. // FIXME: ToUnderlyingType is not used.
  2040. TypedefNameDecl *ToTypedef;
  2041. if (IsAlias) {
  2042. if (GetImportedOrCreateDecl<TypeAliasDecl>(
  2043. ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
  2044. Name.getAsIdentifierInfo(), ToTypeSourceInfo))
  2045. return ToTypedef;
  2046. } else if (GetImportedOrCreateDecl<TypedefDecl>(
  2047. ToTypedef, D, Importer.getToContext(), DC, ToBeginLoc, Loc,
  2048. Name.getAsIdentifierInfo(), ToTypeSourceInfo))
  2049. return ToTypedef;
  2050. ToTypedef->setAccess(D->getAccess());
  2051. ToTypedef->setLexicalDeclContext(LexicalDC);
  2052. // Templated declarations should not appear in DeclContext.
  2053. TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(D) : nullptr;
  2054. if (!FromAlias || !FromAlias->getDescribedAliasTemplate())
  2055. LexicalDC->addDeclInternal(ToTypedef);
  2056. return ToTypedef;
  2057. }
  2058. ExpectedDecl ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
  2059. return VisitTypedefNameDecl(D, /*IsAlias=*/false);
  2060. }
  2061. ExpectedDecl ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
  2062. return VisitTypedefNameDecl(D, /*IsAlias=*/true);
  2063. }
  2064. ExpectedDecl
  2065. ASTNodeImporter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
  2066. // Import the major distinguishing characteristics of this typedef.
  2067. DeclContext *DC, *LexicalDC;
  2068. DeclarationName Name;
  2069. SourceLocation Loc;
  2070. NamedDecl *FoundD;
  2071. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, FoundD, Loc))
  2072. return std::move(Err);
  2073. if (FoundD)
  2074. return FoundD;
  2075. // If this typedef is not in block scope, determine whether we've
  2076. // seen a typedef with the same name (that we can merge with) or any
  2077. // other entity by that name (which name lookup could conflict with).
  2078. if (!DC->isFunctionOrMethod()) {
  2079. SmallVector<NamedDecl *, 4> ConflictingDecls;
  2080. unsigned IDNS = Decl::IDNS_Ordinary;
  2081. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  2082. for (auto *FoundDecl : FoundDecls) {
  2083. if (!FoundDecl->isInIdentifierNamespace(IDNS))
  2084. continue;
  2085. if (auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl))
  2086. return Importer.MapImported(D, FoundAlias);
  2087. ConflictingDecls.push_back(FoundDecl);
  2088. }
  2089. if (!ConflictingDecls.empty()) {
  2090. ExpectedName NameOrErr = Importer.HandleNameConflict(
  2091. Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
  2092. if (NameOrErr)
  2093. Name = NameOrErr.get();
  2094. else
  2095. return NameOrErr.takeError();
  2096. }
  2097. }
  2098. TemplateParameterList *ToTemplateParameters;
  2099. TypeAliasDecl *ToTemplatedDecl;
  2100. if (auto Imp = importSeq(D->getTemplateParameters(), D->getTemplatedDecl()))
  2101. std::tie(ToTemplateParameters, ToTemplatedDecl) = *Imp;
  2102. else
  2103. return Imp.takeError();
  2104. TypeAliasTemplateDecl *ToAlias;
  2105. if (GetImportedOrCreateDecl(ToAlias, D, Importer.getToContext(), DC, Loc,
  2106. Name, ToTemplateParameters, ToTemplatedDecl))
  2107. return ToAlias;
  2108. ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
  2109. ToAlias->setAccess(D->getAccess());
  2110. ToAlias->setLexicalDeclContext(LexicalDC);
  2111. LexicalDC->addDeclInternal(ToAlias);
  2112. return ToAlias;
  2113. }
  2114. ExpectedDecl ASTNodeImporter::VisitLabelDecl(LabelDecl *D) {
  2115. // Import the major distinguishing characteristics of this label.
  2116. DeclContext *DC, *LexicalDC;
  2117. DeclarationName Name;
  2118. SourceLocation Loc;
  2119. NamedDecl *ToD;
  2120. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  2121. return std::move(Err);
  2122. if (ToD)
  2123. return ToD;
  2124. assert(LexicalDC->isFunctionOrMethod());
  2125. LabelDecl *ToLabel;
  2126. if (D->isGnuLocal()) {
  2127. ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
  2128. if (!BeginLocOrErr)
  2129. return BeginLocOrErr.takeError();
  2130. if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
  2131. Name.getAsIdentifierInfo(), *BeginLocOrErr))
  2132. return ToLabel;
  2133. } else {
  2134. if (GetImportedOrCreateDecl(ToLabel, D, Importer.getToContext(), DC, Loc,
  2135. Name.getAsIdentifierInfo()))
  2136. return ToLabel;
  2137. }
  2138. Expected<LabelStmt *> ToStmtOrErr = import(D->getStmt());
  2139. if (!ToStmtOrErr)
  2140. return ToStmtOrErr.takeError();
  2141. ToLabel->setStmt(*ToStmtOrErr);
  2142. ToLabel->setLexicalDeclContext(LexicalDC);
  2143. LexicalDC->addDeclInternal(ToLabel);
  2144. return ToLabel;
  2145. }
  2146. ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
  2147. // Import the major distinguishing characteristics of this enum.
  2148. DeclContext *DC, *LexicalDC;
  2149. DeclarationName Name;
  2150. SourceLocation Loc;
  2151. NamedDecl *ToD;
  2152. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  2153. return std::move(Err);
  2154. if (ToD)
  2155. return ToD;
  2156. // Figure out what enum name we're looking for.
  2157. unsigned IDNS = Decl::IDNS_Tag;
  2158. DeclarationName SearchName = Name;
  2159. if (!SearchName && D->getTypedefNameForAnonDecl()) {
  2160. if (Error Err = importInto(
  2161. SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
  2162. return std::move(Err);
  2163. IDNS = Decl::IDNS_Ordinary;
  2164. } else if (Importer.getToContext().getLangOpts().CPlusPlus)
  2165. IDNS |= Decl::IDNS_Ordinary;
  2166. // We may already have an enum of the same name; try to find and match it.
  2167. if (!DC->isFunctionOrMethod() && SearchName) {
  2168. SmallVector<NamedDecl *, 4> ConflictingDecls;
  2169. auto FoundDecls =
  2170. Importer.findDeclsInToCtx(DC, SearchName);
  2171. for (auto *FoundDecl : FoundDecls) {
  2172. if (!FoundDecl->isInIdentifierNamespace(IDNS))
  2173. continue;
  2174. if (auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
  2175. if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
  2176. FoundDecl = Tag->getDecl();
  2177. }
  2178. if (auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
  2179. if (!hasSameVisibilityContext(FoundEnum, D))
  2180. continue;
  2181. if (IsStructuralMatch(D, FoundEnum))
  2182. return Importer.MapImported(D, FoundEnum);
  2183. ConflictingDecls.push_back(FoundDecl);
  2184. }
  2185. }
  2186. if (!ConflictingDecls.empty()) {
  2187. ExpectedName NameOrErr = Importer.HandleNameConflict(
  2188. SearchName, DC, IDNS, ConflictingDecls.data(),
  2189. ConflictingDecls.size());
  2190. if (NameOrErr)
  2191. Name = NameOrErr.get();
  2192. else
  2193. return NameOrErr.takeError();
  2194. }
  2195. }
  2196. SourceLocation ToBeginLoc;
  2197. NestedNameSpecifierLoc ToQualifierLoc;
  2198. QualType ToIntegerType;
  2199. if (auto Imp = importSeq(
  2200. D->getBeginLoc(), D->getQualifierLoc(), D->getIntegerType()))
  2201. std::tie(ToBeginLoc, ToQualifierLoc, ToIntegerType) = *Imp;
  2202. else
  2203. return Imp.takeError();
  2204. // Create the enum declaration.
  2205. EnumDecl *D2;
  2206. if (GetImportedOrCreateDecl(
  2207. D2, D, Importer.getToContext(), DC, ToBeginLoc,
  2208. Loc, Name.getAsIdentifierInfo(), nullptr, D->isScoped(),
  2209. D->isScopedUsingClassTag(), D->isFixed()))
  2210. return D2;
  2211. D2->setQualifierInfo(ToQualifierLoc);
  2212. D2->setIntegerType(ToIntegerType);
  2213. D2->setAccess(D->getAccess());
  2214. D2->setLexicalDeclContext(LexicalDC);
  2215. LexicalDC->addDeclInternal(D2);
  2216. // Import the definition
  2217. if (D->isCompleteDefinition())
  2218. if (Error Err = ImportDefinition(D, D2))
  2219. return std::move(Err);
  2220. return D2;
  2221. }
  2222. ExpectedDecl ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
  2223. bool IsFriendTemplate = false;
  2224. if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
  2225. IsFriendTemplate =
  2226. DCXX->getDescribedClassTemplate() &&
  2227. DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
  2228. Decl::FOK_None;
  2229. }
  2230. // Import the major distinguishing characteristics of this record.
  2231. DeclContext *DC = nullptr, *LexicalDC = nullptr;
  2232. DeclarationName Name;
  2233. SourceLocation Loc;
  2234. NamedDecl *ToD = nullptr;
  2235. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  2236. return std::move(Err);
  2237. if (ToD)
  2238. return ToD;
  2239. // Figure out what structure name we're looking for.
  2240. unsigned IDNS = Decl::IDNS_Tag;
  2241. DeclarationName SearchName = Name;
  2242. if (!SearchName && D->getTypedefNameForAnonDecl()) {
  2243. if (Error Err = importInto(
  2244. SearchName, D->getTypedefNameForAnonDecl()->getDeclName()))
  2245. return std::move(Err);
  2246. IDNS = Decl::IDNS_Ordinary;
  2247. } else if (Importer.getToContext().getLangOpts().CPlusPlus)
  2248. IDNS |= Decl::IDNS_Ordinary | Decl::IDNS_TagFriend;
  2249. // We may already have a record of the same name; try to find and match it.
  2250. RecordDecl *PrevDecl = nullptr;
  2251. if (!DC->isFunctionOrMethod() && !D->isLambda()) {
  2252. SmallVector<NamedDecl *, 4> ConflictingDecls;
  2253. auto FoundDecls =
  2254. Importer.findDeclsInToCtx(DC, SearchName);
  2255. if (!FoundDecls.empty()) {
  2256. // We're going to have to compare D against potentially conflicting Decls,
  2257. // so complete it.
  2258. if (D->hasExternalLexicalStorage() && !D->isCompleteDefinition())
  2259. D->getASTContext().getExternalSource()->CompleteType(D);
  2260. }
  2261. for (auto *FoundDecl : FoundDecls) {
  2262. if (!FoundDecl->isInIdentifierNamespace(IDNS))
  2263. continue;
  2264. Decl *Found = FoundDecl;
  2265. if (auto *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
  2266. if (const auto *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
  2267. Found = Tag->getDecl();
  2268. }
  2269. if (auto *FoundRecord = dyn_cast<RecordDecl>(Found)) {
  2270. // Do not emit false positive diagnostic in case of unnamed
  2271. // struct/union and in case of anonymous structs. Would be false
  2272. // because there may be several anonymous/unnamed structs in a class.
  2273. // E.g. these are both valid:
  2274. // struct A { // unnamed structs
  2275. // struct { struct A *next; } entry0;
  2276. // struct { struct A *next; } entry1;
  2277. // };
  2278. // struct X { struct { int a; }; struct { int b; }; }; // anon structs
  2279. if (!SearchName)
  2280. if (!IsStructuralMatch(D, FoundRecord, false))
  2281. continue;
  2282. if (!hasSameVisibilityContext(FoundRecord, D))
  2283. continue;
  2284. if (IsStructuralMatch(D, FoundRecord)) {
  2285. RecordDecl *FoundDef = FoundRecord->getDefinition();
  2286. if (D->isThisDeclarationADefinition() && FoundDef) {
  2287. // FIXME: Structural equivalence check should check for same
  2288. // user-defined methods.
  2289. Importer.MapImported(D, FoundDef);
  2290. if (const auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
  2291. auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
  2292. assert(FoundCXX && "Record type mismatch");
  2293. if (!Importer.isMinimalImport())
  2294. // FoundDef may not have every implicit method that D has
  2295. // because implicit methods are created only if they are used.
  2296. if (Error Err = ImportImplicitMethods(DCXX, FoundCXX))
  2297. return std::move(Err);
  2298. }
  2299. }
  2300. PrevDecl = FoundRecord->getMostRecentDecl();
  2301. break;
  2302. }
  2303. ConflictingDecls.push_back(FoundDecl);
  2304. } // kind is RecordDecl
  2305. } // for
  2306. if (!ConflictingDecls.empty() && SearchName) {
  2307. ExpectedName NameOrErr = Importer.HandleNameConflict(
  2308. SearchName, DC, IDNS, ConflictingDecls.data(),
  2309. ConflictingDecls.size());
  2310. if (NameOrErr)
  2311. Name = NameOrErr.get();
  2312. else
  2313. return NameOrErr.takeError();
  2314. }
  2315. }
  2316. ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
  2317. if (!BeginLocOrErr)
  2318. return BeginLocOrErr.takeError();
  2319. // Create the record declaration.
  2320. RecordDecl *D2 = nullptr;
  2321. CXXRecordDecl *D2CXX = nullptr;
  2322. if (auto *DCXX = dyn_cast<CXXRecordDecl>(D)) {
  2323. if (DCXX->isLambda()) {
  2324. auto TInfoOrErr = import(DCXX->getLambdaTypeInfo());
  2325. if (!TInfoOrErr)
  2326. return TInfoOrErr.takeError();
  2327. if (GetImportedOrCreateSpecialDecl(
  2328. D2CXX, CXXRecordDecl::CreateLambda, D, Importer.getToContext(),
  2329. DC, *TInfoOrErr, Loc, DCXX->isDependentLambda(),
  2330. DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
  2331. return D2CXX;
  2332. ExpectedDecl CDeclOrErr = import(DCXX->getLambdaContextDecl());
  2333. if (!CDeclOrErr)
  2334. return CDeclOrErr.takeError();
  2335. D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), *CDeclOrErr,
  2336. DCXX->hasKnownLambdaInternalLinkage());
  2337. } else if (DCXX->isInjectedClassName()) {
  2338. // We have to be careful to do a similar dance to the one in
  2339. // Sema::ActOnStartCXXMemberDeclarations
  2340. const bool DelayTypeCreation = true;
  2341. if (GetImportedOrCreateDecl(
  2342. D2CXX, D, Importer.getToContext(), D->getTagKind(), DC,
  2343. *BeginLocOrErr, Loc, Name.getAsIdentifierInfo(),
  2344. cast_or_null<CXXRecordDecl>(PrevDecl), DelayTypeCreation))
  2345. return D2CXX;
  2346. Importer.getToContext().getTypeDeclType(
  2347. D2CXX, dyn_cast<CXXRecordDecl>(DC));
  2348. } else {
  2349. if (GetImportedOrCreateDecl(D2CXX, D, Importer.getToContext(),
  2350. D->getTagKind(), DC, *BeginLocOrErr, Loc,
  2351. Name.getAsIdentifierInfo(),
  2352. cast_or_null<CXXRecordDecl>(PrevDecl)))
  2353. return D2CXX;
  2354. }
  2355. D2 = D2CXX;
  2356. D2->setAccess(D->getAccess());
  2357. D2->setLexicalDeclContext(LexicalDC);
  2358. if (!DCXX->getDescribedClassTemplate() || DCXX->isImplicit())
  2359. LexicalDC->addDeclInternal(D2);
  2360. if (LexicalDC != DC && D->isInIdentifierNamespace(Decl::IDNS_TagFriend))
  2361. DC->makeDeclVisibleInContext(D2);
  2362. if (ClassTemplateDecl *FromDescribed =
  2363. DCXX->getDescribedClassTemplate()) {
  2364. ClassTemplateDecl *ToDescribed;
  2365. if (Error Err = importInto(ToDescribed, FromDescribed))
  2366. return std::move(Err);
  2367. D2CXX->setDescribedClassTemplate(ToDescribed);
  2368. if (!DCXX->isInjectedClassName() && !IsFriendTemplate) {
  2369. // In a record describing a template the type should be an
  2370. // InjectedClassNameType (see Sema::CheckClassTemplate). Update the
  2371. // previously set type to the correct value here (ToDescribed is not
  2372. // available at record create).
  2373. // FIXME: The previous type is cleared but not removed from
  2374. // ASTContext's internal storage.
  2375. CXXRecordDecl *Injected = nullptr;
  2376. for (NamedDecl *Found : D2CXX->noload_lookup(Name)) {
  2377. auto *Record = dyn_cast<CXXRecordDecl>(Found);
  2378. if (Record && Record->isInjectedClassName()) {
  2379. Injected = Record;
  2380. break;
  2381. }
  2382. }
  2383. // Create an injected type for the whole redecl chain.
  2384. SmallVector<Decl *, 2> Redecls =
  2385. getCanonicalForwardRedeclChain(D2CXX);
  2386. for (auto *R : Redecls) {
  2387. auto *RI = cast<CXXRecordDecl>(R);
  2388. RI->setTypeForDecl(nullptr);
  2389. // Below we create a new injected type and assign that to the
  2390. // canonical decl, subsequent declarations in the chain will reuse
  2391. // that type.
  2392. Importer.getToContext().getInjectedClassNameType(
  2393. RI, ToDescribed->getInjectedClassNameSpecialization());
  2394. }
  2395. // Set the new type for the previous injected decl too.
  2396. if (Injected) {
  2397. Injected->setTypeForDecl(nullptr);
  2398. Importer.getToContext().getTypeDeclType(Injected, D2CXX);
  2399. }
  2400. }
  2401. } else if (MemberSpecializationInfo *MemberInfo =
  2402. DCXX->getMemberSpecializationInfo()) {
  2403. TemplateSpecializationKind SK =
  2404. MemberInfo->getTemplateSpecializationKind();
  2405. CXXRecordDecl *FromInst = DCXX->getInstantiatedFromMemberClass();
  2406. if (Expected<CXXRecordDecl *> ToInstOrErr = import(FromInst))
  2407. D2CXX->setInstantiationOfMemberClass(*ToInstOrErr, SK);
  2408. else
  2409. return ToInstOrErr.takeError();
  2410. if (ExpectedSLoc POIOrErr =
  2411. import(MemberInfo->getPointOfInstantiation()))
  2412. D2CXX->getMemberSpecializationInfo()->setPointOfInstantiation(
  2413. *POIOrErr);
  2414. else
  2415. return POIOrErr.takeError();
  2416. }
  2417. } else {
  2418. if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(),
  2419. D->getTagKind(), DC, *BeginLocOrErr, Loc,
  2420. Name.getAsIdentifierInfo(), PrevDecl))
  2421. return D2;
  2422. D2->setLexicalDeclContext(LexicalDC);
  2423. LexicalDC->addDeclInternal(D2);
  2424. }
  2425. if (auto QualifierLocOrErr = import(D->getQualifierLoc()))
  2426. D2->setQualifierInfo(*QualifierLocOrErr);
  2427. else
  2428. return QualifierLocOrErr.takeError();
  2429. if (D->isAnonymousStructOrUnion())
  2430. D2->setAnonymousStructOrUnion(true);
  2431. if (D->isCompleteDefinition())
  2432. if (Error Err = ImportDefinition(D, D2, IDK_Default))
  2433. return std::move(Err);
  2434. return D2;
  2435. }
  2436. ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
  2437. // Import the major distinguishing characteristics of this enumerator.
  2438. DeclContext *DC, *LexicalDC;
  2439. DeclarationName Name;
  2440. SourceLocation Loc;
  2441. NamedDecl *ToD;
  2442. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  2443. return std::move(Err);
  2444. if (ToD)
  2445. return ToD;
  2446. // Determine whether there are any other declarations with the same name and
  2447. // in the same context.
  2448. if (!LexicalDC->isFunctionOrMethod()) {
  2449. SmallVector<NamedDecl *, 4> ConflictingDecls;
  2450. unsigned IDNS = Decl::IDNS_Ordinary;
  2451. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  2452. for (auto *FoundDecl : FoundDecls) {
  2453. if (!FoundDecl->isInIdentifierNamespace(IDNS))
  2454. continue;
  2455. if (auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
  2456. if (IsStructuralMatch(D, FoundEnumConstant))
  2457. return Importer.MapImported(D, FoundEnumConstant);
  2458. ConflictingDecls.push_back(FoundDecl);
  2459. }
  2460. }
  2461. if (!ConflictingDecls.empty()) {
  2462. ExpectedName NameOrErr = Importer.HandleNameConflict(
  2463. Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
  2464. if (NameOrErr)
  2465. Name = NameOrErr.get();
  2466. else
  2467. return NameOrErr.takeError();
  2468. }
  2469. }
  2470. ExpectedType TypeOrErr = import(D->getType());
  2471. if (!TypeOrErr)
  2472. return TypeOrErr.takeError();
  2473. ExpectedExpr InitOrErr = import(D->getInitExpr());
  2474. if (!InitOrErr)
  2475. return InitOrErr.takeError();
  2476. EnumConstantDecl *ToEnumerator;
  2477. if (GetImportedOrCreateDecl(
  2478. ToEnumerator, D, Importer.getToContext(), cast<EnumDecl>(DC), Loc,
  2479. Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr, D->getInitVal()))
  2480. return ToEnumerator;
  2481. ToEnumerator->setAccess(D->getAccess());
  2482. ToEnumerator->setLexicalDeclContext(LexicalDC);
  2483. LexicalDC->addDeclInternal(ToEnumerator);
  2484. return ToEnumerator;
  2485. }
  2486. Error ASTNodeImporter::ImportTemplateParameterLists(const DeclaratorDecl *FromD,
  2487. DeclaratorDecl *ToD) {
  2488. unsigned int Num = FromD->getNumTemplateParameterLists();
  2489. if (Num == 0)
  2490. return Error::success();
  2491. SmallVector<TemplateParameterList *, 2> ToTPLists(Num);
  2492. for (unsigned int I = 0; I < Num; ++I)
  2493. if (Expected<TemplateParameterList *> ToTPListOrErr =
  2494. import(FromD->getTemplateParameterList(I)))
  2495. ToTPLists[I] = *ToTPListOrErr;
  2496. else
  2497. return ToTPListOrErr.takeError();
  2498. ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
  2499. return Error::success();
  2500. }
  2501. Error ASTNodeImporter::ImportTemplateInformation(
  2502. FunctionDecl *FromFD, FunctionDecl *ToFD) {
  2503. switch (FromFD->getTemplatedKind()) {
  2504. case FunctionDecl::TK_NonTemplate:
  2505. case FunctionDecl::TK_FunctionTemplate:
  2506. return Error::success();
  2507. case FunctionDecl::TK_MemberSpecialization: {
  2508. TemplateSpecializationKind TSK = FromFD->getTemplateSpecializationKind();
  2509. if (Expected<FunctionDecl *> InstFDOrErr =
  2510. import(FromFD->getInstantiatedFromMemberFunction()))
  2511. ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
  2512. else
  2513. return InstFDOrErr.takeError();
  2514. if (ExpectedSLoc POIOrErr = import(
  2515. FromFD->getMemberSpecializationInfo()->getPointOfInstantiation()))
  2516. ToFD->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr);
  2517. else
  2518. return POIOrErr.takeError();
  2519. return Error::success();
  2520. }
  2521. case FunctionDecl::TK_FunctionTemplateSpecialization: {
  2522. auto FunctionAndArgsOrErr =
  2523. ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
  2524. if (!FunctionAndArgsOrErr)
  2525. return FunctionAndArgsOrErr.takeError();
  2526. TemplateArgumentList *ToTAList = TemplateArgumentList::CreateCopy(
  2527. Importer.getToContext(), std::get<1>(*FunctionAndArgsOrErr));
  2528. auto *FTSInfo = FromFD->getTemplateSpecializationInfo();
  2529. TemplateArgumentListInfo ToTAInfo;
  2530. const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
  2531. if (FromTAArgsAsWritten)
  2532. if (Error Err = ImportTemplateArgumentListInfo(
  2533. *FromTAArgsAsWritten, ToTAInfo))
  2534. return Err;
  2535. ExpectedSLoc POIOrErr = import(FTSInfo->getPointOfInstantiation());
  2536. if (!POIOrErr)
  2537. return POIOrErr.takeError();
  2538. if (Error Err = ImportTemplateParameterLists(FromFD, ToFD))
  2539. return Err;
  2540. TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind();
  2541. ToFD->setFunctionTemplateSpecialization(
  2542. std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr,
  2543. TSK, FromTAArgsAsWritten ? &ToTAInfo : nullptr, *POIOrErr);
  2544. return Error::success();
  2545. }
  2546. case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
  2547. auto *FromInfo = FromFD->getDependentSpecializationInfo();
  2548. UnresolvedSet<8> TemplDecls;
  2549. unsigned NumTemplates = FromInfo->getNumTemplates();
  2550. for (unsigned I = 0; I < NumTemplates; I++) {
  2551. if (Expected<FunctionTemplateDecl *> ToFTDOrErr =
  2552. import(FromInfo->getTemplate(I)))
  2553. TemplDecls.addDecl(*ToFTDOrErr);
  2554. else
  2555. return ToFTDOrErr.takeError();
  2556. }
  2557. // Import TemplateArgumentListInfo.
  2558. TemplateArgumentListInfo ToTAInfo;
  2559. if (Error Err = ImportTemplateArgumentListInfo(
  2560. FromInfo->getLAngleLoc(), FromInfo->getRAngleLoc(),
  2561. llvm::makeArrayRef(
  2562. FromInfo->getTemplateArgs(), FromInfo->getNumTemplateArgs()),
  2563. ToTAInfo))
  2564. return Err;
  2565. ToFD->setDependentTemplateSpecialization(Importer.getToContext(),
  2566. TemplDecls, ToTAInfo);
  2567. return Error::success();
  2568. }
  2569. }
  2570. llvm_unreachable("All cases should be covered!");
  2571. }
  2572. Expected<FunctionDecl *>
  2573. ASTNodeImporter::FindFunctionTemplateSpecialization(FunctionDecl *FromFD) {
  2574. auto FunctionAndArgsOrErr =
  2575. ImportFunctionTemplateWithTemplateArgsFromSpecialization(FromFD);
  2576. if (!FunctionAndArgsOrErr)
  2577. return FunctionAndArgsOrErr.takeError();
  2578. FunctionTemplateDecl *Template;
  2579. TemplateArgsTy ToTemplArgs;
  2580. std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr;
  2581. void *InsertPos = nullptr;
  2582. auto *FoundSpec = Template->findSpecialization(ToTemplArgs, InsertPos);
  2583. return FoundSpec;
  2584. }
  2585. Error ASTNodeImporter::ImportFunctionDeclBody(FunctionDecl *FromFD,
  2586. FunctionDecl *ToFD) {
  2587. if (Stmt *FromBody = FromFD->getBody()) {
  2588. if (ExpectedStmt ToBodyOrErr = import(FromBody))
  2589. ToFD->setBody(*ToBodyOrErr);
  2590. else
  2591. return ToBodyOrErr.takeError();
  2592. }
  2593. return Error::success();
  2594. }
  2595. ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
  2596. SmallVector<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D);
  2597. auto RedeclIt = Redecls.begin();
  2598. // Import the first part of the decl chain. I.e. import all previous
  2599. // declarations starting from the canonical decl.
  2600. for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
  2601. ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
  2602. if (!ToRedeclOrErr)
  2603. return ToRedeclOrErr.takeError();
  2604. }
  2605. assert(*RedeclIt == D);
  2606. // Import the major distinguishing characteristics of this function.
  2607. DeclContext *DC, *LexicalDC;
  2608. DeclarationName Name;
  2609. SourceLocation Loc;
  2610. NamedDecl *ToD;
  2611. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  2612. return std::move(Err);
  2613. if (ToD)
  2614. return ToD;
  2615. FunctionDecl *FoundByLookup = nullptr;
  2616. FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate();
  2617. // If this is a function template specialization, then try to find the same
  2618. // existing specialization in the "to" context. The lookup below will not
  2619. // find any specialization, but would find the primary template; thus, we
  2620. // have to skip normal lookup in case of specializations.
  2621. // FIXME handle member function templates (TK_MemberSpecialization) similarly?
  2622. if (D->getTemplatedKind() ==
  2623. FunctionDecl::TK_FunctionTemplateSpecialization) {
  2624. auto FoundFunctionOrErr = FindFunctionTemplateSpecialization(D);
  2625. if (!FoundFunctionOrErr)
  2626. return FoundFunctionOrErr.takeError();
  2627. if (FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
  2628. if (Decl *Def = FindAndMapDefinition(D, FoundFunction))
  2629. return Def;
  2630. FoundByLookup = FoundFunction;
  2631. }
  2632. }
  2633. // Try to find a function in our own ("to") context with the same name, same
  2634. // type, and in the same context as the function we're importing.
  2635. else if (!LexicalDC->isFunctionOrMethod()) {
  2636. SmallVector<NamedDecl *, 4> ConflictingDecls;
  2637. unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
  2638. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  2639. for (auto *FoundDecl : FoundDecls) {
  2640. if (!FoundDecl->isInIdentifierNamespace(IDNS))
  2641. continue;
  2642. if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
  2643. if (!hasSameVisibilityContext(FoundFunction, D))
  2644. continue;
  2645. if (IsStructuralMatch(D, FoundFunction)) {
  2646. if (Decl *Def = FindAndMapDefinition(D, FoundFunction))
  2647. return Def;
  2648. FoundByLookup = FoundFunction;
  2649. break;
  2650. }
  2651. // FIXME: Check for overloading more carefully, e.g., by boosting
  2652. // Sema::IsOverload out to the AST library.
  2653. // Function overloading is okay in C++.
  2654. if (Importer.getToContext().getLangOpts().CPlusPlus)
  2655. continue;
  2656. // Complain about inconsistent function types.
  2657. Importer.ToDiag(Loc, diag::warn_odr_function_type_inconsistent)
  2658. << Name << D->getType() << FoundFunction->getType();
  2659. Importer.ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
  2660. << FoundFunction->getType();
  2661. ConflictingDecls.push_back(FoundDecl);
  2662. }
  2663. }
  2664. if (!ConflictingDecls.empty()) {
  2665. ExpectedName NameOrErr = Importer.HandleNameConflict(
  2666. Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
  2667. if (NameOrErr)
  2668. Name = NameOrErr.get();
  2669. else
  2670. return NameOrErr.takeError();
  2671. }
  2672. }
  2673. // We do not allow more than one in-class declaration of a function. This is
  2674. // because AST clients like VTableBuilder asserts on this. VTableBuilder
  2675. // assumes there is only one in-class declaration. Building a redecl
  2676. // chain would result in more than one in-class declaration for
  2677. // overrides (even if they are part of the same redecl chain inside the
  2678. // derived class.)
  2679. if (FoundByLookup) {
  2680. if (isa<CXXMethodDecl>(FoundByLookup)) {
  2681. if (D->getLexicalDeclContext() == D->getDeclContext()) {
  2682. if (!D->doesThisDeclarationHaveABody()) {
  2683. if (FunctionTemplateDecl *DescribedD =
  2684. D->getDescribedFunctionTemplate()) {
  2685. // Handle a "templated" function together with its described
  2686. // template. This avoids need for a similar check at import of the
  2687. // described template.
  2688. assert(FoundByLookup->getDescribedFunctionTemplate() &&
  2689. "Templated function mapped to non-templated?");
  2690. Importer.MapImported(DescribedD,
  2691. FoundByLookup->getDescribedFunctionTemplate());
  2692. }
  2693. return Importer.MapImported(D, FoundByLookup);
  2694. } else {
  2695. // Let's continue and build up the redecl chain in this case.
  2696. // FIXME Merge the functions into one decl.
  2697. }
  2698. }
  2699. }
  2700. }
  2701. DeclarationNameInfo NameInfo(Name, Loc);
  2702. // Import additional name location/type info.
  2703. if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
  2704. return std::move(Err);
  2705. QualType FromTy = D->getType();
  2706. bool usedDifferentExceptionSpec = false;
  2707. if (const auto *FromFPT = D->getType()->getAs<FunctionProtoType>()) {
  2708. FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
  2709. // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
  2710. // FunctionDecl that we are importing the FunctionProtoType for.
  2711. // To avoid an infinite recursion when importing, create the FunctionDecl
  2712. // with a simplified function type and update it afterwards.
  2713. if (FromEPI.ExceptionSpec.SourceDecl ||
  2714. FromEPI.ExceptionSpec.SourceTemplate ||
  2715. FromEPI.ExceptionSpec.NoexceptExpr) {
  2716. FunctionProtoType::ExtProtoInfo DefaultEPI;
  2717. FromTy = Importer.getFromContext().getFunctionType(
  2718. FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
  2719. usedDifferentExceptionSpec = true;
  2720. }
  2721. }
  2722. QualType T;
  2723. TypeSourceInfo *TInfo;
  2724. SourceLocation ToInnerLocStart, ToEndLoc;
  2725. NestedNameSpecifierLoc ToQualifierLoc;
  2726. if (auto Imp = importSeq(
  2727. FromTy, D->getTypeSourceInfo(), D->getInnerLocStart(),
  2728. D->getQualifierLoc(), D->getEndLoc()))
  2729. std::tie(T, TInfo, ToInnerLocStart, ToQualifierLoc, ToEndLoc) = *Imp;
  2730. else
  2731. return Imp.takeError();
  2732. // Import the function parameters.
  2733. SmallVector<ParmVarDecl *, 8> Parameters;
  2734. for (auto P : D->parameters()) {
  2735. if (Expected<ParmVarDecl *> ToPOrErr = import(P))
  2736. Parameters.push_back(*ToPOrErr);
  2737. else
  2738. return ToPOrErr.takeError();
  2739. }
  2740. // Create the imported function.
  2741. FunctionDecl *ToFunction = nullptr;
  2742. if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
  2743. Expr *ExplicitExpr = nullptr;
  2744. if (FromConstructor->getExplicitSpecifier().getExpr()) {
  2745. auto Imp = importSeq(FromConstructor->getExplicitSpecifier().getExpr());
  2746. if (!Imp)
  2747. return Imp.takeError();
  2748. std::tie(ExplicitExpr) = *Imp;
  2749. }
  2750. if (GetImportedOrCreateDecl<CXXConstructorDecl>(
  2751. ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
  2752. ToInnerLocStart, NameInfo, T, TInfo,
  2753. ExplicitSpecifier(
  2754. ExplicitExpr,
  2755. FromConstructor->getExplicitSpecifier().getKind()),
  2756. D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind()))
  2757. return ToFunction;
  2758. } else if (CXXDestructorDecl *FromDtor = dyn_cast<CXXDestructorDecl>(D)) {
  2759. auto Imp =
  2760. importSeq(const_cast<FunctionDecl *>(FromDtor->getOperatorDelete()),
  2761. FromDtor->getOperatorDeleteThisArg());
  2762. if (!Imp)
  2763. return Imp.takeError();
  2764. FunctionDecl *ToOperatorDelete;
  2765. Expr *ToThisArg;
  2766. std::tie(ToOperatorDelete, ToThisArg) = *Imp;
  2767. if (GetImportedOrCreateDecl<CXXDestructorDecl>(
  2768. ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
  2769. ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
  2770. D->isImplicit(), D->getConstexprKind()))
  2771. return ToFunction;
  2772. CXXDestructorDecl *ToDtor = cast<CXXDestructorDecl>(ToFunction);
  2773. ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg);
  2774. } else if (CXXConversionDecl *FromConversion =
  2775. dyn_cast<CXXConversionDecl>(D)) {
  2776. Expr *ExplicitExpr = nullptr;
  2777. if (FromConversion->getExplicitSpecifier().getExpr()) {
  2778. auto Imp = importSeq(FromConversion->getExplicitSpecifier().getExpr());
  2779. if (!Imp)
  2780. return Imp.takeError();
  2781. std::tie(ExplicitExpr) = *Imp;
  2782. }
  2783. if (GetImportedOrCreateDecl<CXXConversionDecl>(
  2784. ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
  2785. ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(),
  2786. ExplicitSpecifier(ExplicitExpr,
  2787. FromConversion->getExplicitSpecifier().getKind()),
  2788. D->getConstexprKind(), SourceLocation()))
  2789. return ToFunction;
  2790. } else if (auto *Method = dyn_cast<CXXMethodDecl>(D)) {
  2791. if (GetImportedOrCreateDecl<CXXMethodDecl>(
  2792. ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(DC),
  2793. ToInnerLocStart, NameInfo, T, TInfo, Method->getStorageClass(),
  2794. Method->isInlineSpecified(), D->getConstexprKind(),
  2795. SourceLocation()))
  2796. return ToFunction;
  2797. } else {
  2798. if (GetImportedOrCreateDecl(
  2799. ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart,
  2800. NameInfo, T, TInfo, D->getStorageClass(), D->isInlineSpecified(),
  2801. D->hasWrittenPrototype(), D->getConstexprKind()))
  2802. return ToFunction;
  2803. }
  2804. // Connect the redecl chain.
  2805. if (FoundByLookup) {
  2806. auto *Recent = const_cast<FunctionDecl *>(
  2807. FoundByLookup->getMostRecentDecl());
  2808. ToFunction->setPreviousDecl(Recent);
  2809. // FIXME Probably we should merge exception specifications. E.g. In the
  2810. // "To" context the existing function may have exception specification with
  2811. // noexcept-unevaluated, while the newly imported function may have an
  2812. // evaluated noexcept. A call to adjustExceptionSpec() on the imported
  2813. // decl and its redeclarations may be required.
  2814. }
  2815. ToFunction->setQualifierInfo(ToQualifierLoc);
  2816. ToFunction->setAccess(D->getAccess());
  2817. ToFunction->setLexicalDeclContext(LexicalDC);
  2818. ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
  2819. ToFunction->setTrivial(D->isTrivial());
  2820. ToFunction->setPure(D->isPure());
  2821. ToFunction->setDefaulted(D->isDefaulted());
  2822. ToFunction->setExplicitlyDefaulted(D->isExplicitlyDefaulted());
  2823. ToFunction->setDeletedAsWritten(D->isDeletedAsWritten());
  2824. ToFunction->setRangeEnd(ToEndLoc);
  2825. // Set the parameters.
  2826. for (auto *Param : Parameters) {
  2827. Param->setOwningFunction(ToFunction);
  2828. ToFunction->addDeclInternal(Param);
  2829. }
  2830. ToFunction->setParams(Parameters);
  2831. // We need to complete creation of FunctionProtoTypeLoc manually with setting
  2832. // params it refers to.
  2833. if (TInfo) {
  2834. if (auto ProtoLoc =
  2835. TInfo->getTypeLoc().IgnoreParens().getAs<FunctionProtoTypeLoc>()) {
  2836. for (unsigned I = 0, N = Parameters.size(); I != N; ++I)
  2837. ProtoLoc.setParam(I, Parameters[I]);
  2838. }
  2839. }
  2840. if (usedDifferentExceptionSpec) {
  2841. // Update FunctionProtoType::ExtProtoInfo.
  2842. if (ExpectedType TyOrErr = import(D->getType()))
  2843. ToFunction->setType(*TyOrErr);
  2844. else
  2845. return TyOrErr.takeError();
  2846. }
  2847. // Import the describing template function, if any.
  2848. if (FromFT) {
  2849. auto ToFTOrErr = import(FromFT);
  2850. if (!ToFTOrErr)
  2851. return ToFTOrErr.takeError();
  2852. }
  2853. // Import Ctor initializers.
  2854. if (auto *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
  2855. if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
  2856. SmallVector<CXXCtorInitializer *, 4> CtorInitializers(NumInitializers);
  2857. // Import first, then allocate memory and copy if there was no error.
  2858. if (Error Err = ImportContainerChecked(
  2859. FromConstructor->inits(), CtorInitializers))
  2860. return std::move(Err);
  2861. auto **Memory =
  2862. new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers];
  2863. std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory);
  2864. auto *ToCtor = cast<CXXConstructorDecl>(ToFunction);
  2865. ToCtor->setCtorInitializers(Memory);
  2866. ToCtor->setNumCtorInitializers(NumInitializers);
  2867. }
  2868. }
  2869. if (D->doesThisDeclarationHaveABody()) {
  2870. Error Err = ImportFunctionDeclBody(D, ToFunction);
  2871. if (Err)
  2872. return std::move(Err);
  2873. }
  2874. // FIXME: Other bits to merge?
  2875. // If it is a template, import all related things.
  2876. if (Error Err = ImportTemplateInformation(D, ToFunction))
  2877. return std::move(Err);
  2878. bool IsFriend = D->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend);
  2879. // TODO Can we generalize this approach to other AST nodes as well?
  2880. if (D->getDeclContext()->containsDeclAndLoad(D))
  2881. DC->addDeclInternal(ToFunction);
  2882. if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
  2883. LexicalDC->addDeclInternal(ToFunction);
  2884. // Friend declaration's lexical context is the befriending class, but the
  2885. // semantic context is the enclosing scope of the befriending class.
  2886. // We want the friend functions to be found in the semantic context by lookup.
  2887. // FIXME should we handle this generically in VisitFriendDecl?
  2888. // In Other cases when LexicalDC != DC we don't want it to be added,
  2889. // e.g out-of-class definitions like void B::f() {} .
  2890. if (LexicalDC != DC && IsFriend) {
  2891. DC->makeDeclVisibleInContext(ToFunction);
  2892. }
  2893. if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))
  2894. if (Error Err = ImportOverriddenMethods(cast<CXXMethodDecl>(ToFunction),
  2895. FromCXXMethod))
  2896. return std::move(Err);
  2897. // Import the rest of the chain. I.e. import all subsequent declarations.
  2898. for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
  2899. ExpectedDecl ToRedeclOrErr = import(*RedeclIt);
  2900. if (!ToRedeclOrErr)
  2901. return ToRedeclOrErr.takeError();
  2902. }
  2903. return ToFunction;
  2904. }
  2905. ExpectedDecl ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
  2906. return VisitFunctionDecl(D);
  2907. }
  2908. ExpectedDecl ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
  2909. return VisitCXXMethodDecl(D);
  2910. }
  2911. ExpectedDecl ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
  2912. return VisitCXXMethodDecl(D);
  2913. }
  2914. ExpectedDecl ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
  2915. return VisitCXXMethodDecl(D);
  2916. }
  2917. ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
  2918. // Import the major distinguishing characteristics of a variable.
  2919. DeclContext *DC, *LexicalDC;
  2920. DeclarationName Name;
  2921. SourceLocation Loc;
  2922. NamedDecl *ToD;
  2923. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  2924. return std::move(Err);
  2925. if (ToD)
  2926. return ToD;
  2927. // Determine whether we've already imported this field.
  2928. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  2929. for (auto *FoundDecl : FoundDecls) {
  2930. if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
  2931. // For anonymous fields, match up by index.
  2932. if (!Name &&
  2933. ASTImporter::getFieldIndex(D) !=
  2934. ASTImporter::getFieldIndex(FoundField))
  2935. continue;
  2936. if (Importer.IsStructurallyEquivalent(D->getType(),
  2937. FoundField->getType())) {
  2938. Importer.MapImported(D, FoundField);
  2939. // In case of a FieldDecl of a ClassTemplateSpecializationDecl, the
  2940. // initializer of a FieldDecl might not had been instantiated in the
  2941. // "To" context. However, the "From" context might instantiated that,
  2942. // thus we have to merge that.
  2943. if (Expr *FromInitializer = D->getInClassInitializer()) {
  2944. // We don't have yet the initializer set.
  2945. if (FoundField->hasInClassInitializer() &&
  2946. !FoundField->getInClassInitializer()) {
  2947. if (ExpectedExpr ToInitializerOrErr = import(FromInitializer))
  2948. FoundField->setInClassInitializer(*ToInitializerOrErr);
  2949. else {
  2950. // We can't return error here,
  2951. // since we already mapped D as imported.
  2952. // FIXME: warning message?
  2953. consumeError(ToInitializerOrErr.takeError());
  2954. return FoundField;
  2955. }
  2956. }
  2957. }
  2958. return FoundField;
  2959. }
  2960. // FIXME: Why is this case not handled with calling HandleNameConflict?
  2961. Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
  2962. << Name << D->getType() << FoundField->getType();
  2963. Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
  2964. << FoundField->getType();
  2965. return make_error<ImportError>(ImportError::NameConflict);
  2966. }
  2967. }
  2968. QualType ToType;
  2969. TypeSourceInfo *ToTInfo;
  2970. Expr *ToBitWidth;
  2971. SourceLocation ToInnerLocStart;
  2972. Expr *ToInitializer;
  2973. if (auto Imp = importSeq(
  2974. D->getType(), D->getTypeSourceInfo(), D->getBitWidth(),
  2975. D->getInnerLocStart(), D->getInClassInitializer()))
  2976. std::tie(
  2977. ToType, ToTInfo, ToBitWidth, ToInnerLocStart, ToInitializer) = *Imp;
  2978. else
  2979. return Imp.takeError();
  2980. FieldDecl *ToField;
  2981. if (GetImportedOrCreateDecl(ToField, D, Importer.getToContext(), DC,
  2982. ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
  2983. ToType, ToTInfo, ToBitWidth, D->isMutable(),
  2984. D->getInClassInitStyle()))
  2985. return ToField;
  2986. ToField->setAccess(D->getAccess());
  2987. ToField->setLexicalDeclContext(LexicalDC);
  2988. if (ToInitializer)
  2989. ToField->setInClassInitializer(ToInitializer);
  2990. ToField->setImplicit(D->isImplicit());
  2991. LexicalDC->addDeclInternal(ToField);
  2992. return ToField;
  2993. }
  2994. ExpectedDecl ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
  2995. // Import the major distinguishing characteristics of a variable.
  2996. DeclContext *DC, *LexicalDC;
  2997. DeclarationName Name;
  2998. SourceLocation Loc;
  2999. NamedDecl *ToD;
  3000. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3001. return std::move(Err);
  3002. if (ToD)
  3003. return ToD;
  3004. // Determine whether we've already imported this field.
  3005. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  3006. for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
  3007. if (auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
  3008. // For anonymous indirect fields, match up by index.
  3009. if (!Name &&
  3010. ASTImporter::getFieldIndex(D) !=
  3011. ASTImporter::getFieldIndex(FoundField))
  3012. continue;
  3013. if (Importer.IsStructurallyEquivalent(D->getType(),
  3014. FoundField->getType(),
  3015. !Name.isEmpty())) {
  3016. Importer.MapImported(D, FoundField);
  3017. return FoundField;
  3018. }
  3019. // If there are more anonymous fields to check, continue.
  3020. if (!Name && I < N-1)
  3021. continue;
  3022. // FIXME: Why is this case not handled with calling HandleNameConflict?
  3023. Importer.ToDiag(Loc, diag::warn_odr_field_type_inconsistent)
  3024. << Name << D->getType() << FoundField->getType();
  3025. Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
  3026. << FoundField->getType();
  3027. return make_error<ImportError>(ImportError::NameConflict);
  3028. }
  3029. }
  3030. // Import the type.
  3031. auto TypeOrErr = import(D->getType());
  3032. if (!TypeOrErr)
  3033. return TypeOrErr.takeError();
  3034. auto **NamedChain =
  3035. new (Importer.getToContext()) NamedDecl*[D->getChainingSize()];
  3036. unsigned i = 0;
  3037. for (auto *PI : D->chain())
  3038. if (Expected<NamedDecl *> ToD = import(PI))
  3039. NamedChain[i++] = *ToD;
  3040. else
  3041. return ToD.takeError();
  3042. llvm::MutableArrayRef<NamedDecl *> CH = {NamedChain, D->getChainingSize()};
  3043. IndirectFieldDecl *ToIndirectField;
  3044. if (GetImportedOrCreateDecl(ToIndirectField, D, Importer.getToContext(), DC,
  3045. Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH))
  3046. // FIXME here we leak `NamedChain` which is allocated before
  3047. return ToIndirectField;
  3048. ToIndirectField->setAccess(D->getAccess());
  3049. ToIndirectField->setLexicalDeclContext(LexicalDC);
  3050. LexicalDC->addDeclInternal(ToIndirectField);
  3051. return ToIndirectField;
  3052. }
  3053. ExpectedDecl ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {
  3054. // Import the major distinguishing characteristics of a declaration.
  3055. DeclContext *DC, *LexicalDC;
  3056. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  3057. return std::move(Err);
  3058. // Determine whether we've already imported this decl.
  3059. // FriendDecl is not a NamedDecl so we cannot use lookup.
  3060. auto *RD = cast<CXXRecordDecl>(DC);
  3061. FriendDecl *ImportedFriend = RD->getFirstFriend();
  3062. while (ImportedFriend) {
  3063. if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) {
  3064. if (IsStructuralMatch(D->getFriendDecl(), ImportedFriend->getFriendDecl(),
  3065. /*Complain=*/false))
  3066. return Importer.MapImported(D, ImportedFriend);
  3067. } else if (D->getFriendType() && ImportedFriend->getFriendType()) {
  3068. if (Importer.IsStructurallyEquivalent(
  3069. D->getFriendType()->getType(),
  3070. ImportedFriend->getFriendType()->getType(), true))
  3071. return Importer.MapImported(D, ImportedFriend);
  3072. }
  3073. ImportedFriend = ImportedFriend->getNextFriend();
  3074. }
  3075. // Not found. Create it.
  3076. FriendDecl::FriendUnion ToFU;
  3077. if (NamedDecl *FriendD = D->getFriendDecl()) {
  3078. NamedDecl *ToFriendD;
  3079. if (Error Err = importInto(ToFriendD, FriendD))
  3080. return std::move(Err);
  3081. if (FriendD->getFriendObjectKind() != Decl::FOK_None &&
  3082. !(FriendD->isInIdentifierNamespace(Decl::IDNS_NonMemberOperator)))
  3083. ToFriendD->setObjectOfFriendDecl(false);
  3084. ToFU = ToFriendD;
  3085. } else { // The friend is a type, not a decl.
  3086. if (auto TSIOrErr = import(D->getFriendType()))
  3087. ToFU = *TSIOrErr;
  3088. else
  3089. return TSIOrErr.takeError();
  3090. }
  3091. SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists);
  3092. auto **FromTPLists = D->getTrailingObjects<TemplateParameterList *>();
  3093. for (unsigned I = 0; I < D->NumTPLists; I++) {
  3094. if (auto ListOrErr = import(FromTPLists[I]))
  3095. ToTPLists[I] = *ListOrErr;
  3096. else
  3097. return ListOrErr.takeError();
  3098. }
  3099. auto LocationOrErr = import(D->getLocation());
  3100. if (!LocationOrErr)
  3101. return LocationOrErr.takeError();
  3102. auto FriendLocOrErr = import(D->getFriendLoc());
  3103. if (!FriendLocOrErr)
  3104. return FriendLocOrErr.takeError();
  3105. FriendDecl *FrD;
  3106. if (GetImportedOrCreateDecl(FrD, D, Importer.getToContext(), DC,
  3107. *LocationOrErr, ToFU,
  3108. *FriendLocOrErr, ToTPLists))
  3109. return FrD;
  3110. FrD->setAccess(D->getAccess());
  3111. FrD->setLexicalDeclContext(LexicalDC);
  3112. LexicalDC->addDeclInternal(FrD);
  3113. return FrD;
  3114. }
  3115. ExpectedDecl ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
  3116. // Import the major distinguishing characteristics of an ivar.
  3117. DeclContext *DC, *LexicalDC;
  3118. DeclarationName Name;
  3119. SourceLocation Loc;
  3120. NamedDecl *ToD;
  3121. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3122. return std::move(Err);
  3123. if (ToD)
  3124. return ToD;
  3125. // Determine whether we've already imported this ivar
  3126. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  3127. for (auto *FoundDecl : FoundDecls) {
  3128. if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
  3129. if (Importer.IsStructurallyEquivalent(D->getType(),
  3130. FoundIvar->getType())) {
  3131. Importer.MapImported(D, FoundIvar);
  3132. return FoundIvar;
  3133. }
  3134. Importer.ToDiag(Loc, diag::warn_odr_ivar_type_inconsistent)
  3135. << Name << D->getType() << FoundIvar->getType();
  3136. Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
  3137. << FoundIvar->getType();
  3138. return make_error<ImportError>(ImportError::NameConflict);
  3139. }
  3140. }
  3141. QualType ToType;
  3142. TypeSourceInfo *ToTypeSourceInfo;
  3143. Expr *ToBitWidth;
  3144. SourceLocation ToInnerLocStart;
  3145. if (auto Imp = importSeq(
  3146. D->getType(), D->getTypeSourceInfo(), D->getBitWidth(), D->getInnerLocStart()))
  3147. std::tie(ToType, ToTypeSourceInfo, ToBitWidth, ToInnerLocStart) = *Imp;
  3148. else
  3149. return Imp.takeError();
  3150. ObjCIvarDecl *ToIvar;
  3151. if (GetImportedOrCreateDecl(
  3152. ToIvar, D, Importer.getToContext(), cast<ObjCContainerDecl>(DC),
  3153. ToInnerLocStart, Loc, Name.getAsIdentifierInfo(),
  3154. ToType, ToTypeSourceInfo,
  3155. D->getAccessControl(),ToBitWidth, D->getSynthesize()))
  3156. return ToIvar;
  3157. ToIvar->setLexicalDeclContext(LexicalDC);
  3158. LexicalDC->addDeclInternal(ToIvar);
  3159. return ToIvar;
  3160. }
  3161. ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) {
  3162. SmallVector<Decl*, 2> Redecls = getCanonicalForwardRedeclChain(D);
  3163. auto RedeclIt = Redecls.begin();
  3164. // Import the first part of the decl chain. I.e. import all previous
  3165. // declarations starting from the canonical decl.
  3166. for (; RedeclIt != Redecls.end() && *RedeclIt != D; ++RedeclIt) {
  3167. ExpectedDecl RedeclOrErr = import(*RedeclIt);
  3168. if (!RedeclOrErr)
  3169. return RedeclOrErr.takeError();
  3170. }
  3171. assert(*RedeclIt == D);
  3172. // Import the major distinguishing characteristics of a variable.
  3173. DeclContext *DC, *LexicalDC;
  3174. DeclarationName Name;
  3175. SourceLocation Loc;
  3176. NamedDecl *ToD;
  3177. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3178. return std::move(Err);
  3179. if (ToD)
  3180. return ToD;
  3181. // Try to find a variable in our own ("to") context with the same name and
  3182. // in the same context as the variable we're importing.
  3183. VarDecl *FoundByLookup = nullptr;
  3184. if (D->isFileVarDecl()) {
  3185. SmallVector<NamedDecl *, 4> ConflictingDecls;
  3186. unsigned IDNS = Decl::IDNS_Ordinary;
  3187. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  3188. for (auto *FoundDecl : FoundDecls) {
  3189. if (!FoundDecl->isInIdentifierNamespace(IDNS))
  3190. continue;
  3191. if (auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
  3192. if (!hasSameVisibilityContext(FoundVar, D))
  3193. continue;
  3194. if (Importer.IsStructurallyEquivalent(D->getType(),
  3195. FoundVar->getType())) {
  3196. // The VarDecl in the "From" context has a definition, but in the
  3197. // "To" context we already have a definition.
  3198. VarDecl *FoundDef = FoundVar->getDefinition();
  3199. if (D->isThisDeclarationADefinition() && FoundDef)
  3200. // FIXME Check for ODR error if the two definitions have
  3201. // different initializers?
  3202. return Importer.MapImported(D, FoundDef);
  3203. // The VarDecl in the "From" context has an initializer, but in the
  3204. // "To" context we already have an initializer.
  3205. const VarDecl *FoundDInit = nullptr;
  3206. if (D->getInit() && FoundVar->getAnyInitializer(FoundDInit))
  3207. // FIXME Diagnose ODR error if the two initializers are different?
  3208. return Importer.MapImported(D, const_cast<VarDecl*>(FoundDInit));
  3209. FoundByLookup = FoundVar;
  3210. break;
  3211. }
  3212. const ArrayType *FoundArray
  3213. = Importer.getToContext().getAsArrayType(FoundVar->getType());
  3214. const ArrayType *TArray
  3215. = Importer.getToContext().getAsArrayType(D->getType());
  3216. if (FoundArray && TArray) {
  3217. if (isa<IncompleteArrayType>(FoundArray) &&
  3218. isa<ConstantArrayType>(TArray)) {
  3219. // Import the type.
  3220. if (auto TyOrErr = import(D->getType()))
  3221. FoundVar->setType(*TyOrErr);
  3222. else
  3223. return TyOrErr.takeError();
  3224. FoundByLookup = FoundVar;
  3225. break;
  3226. } else if (isa<IncompleteArrayType>(TArray) &&
  3227. isa<ConstantArrayType>(FoundArray)) {
  3228. FoundByLookup = FoundVar;
  3229. break;
  3230. }
  3231. }
  3232. Importer.ToDiag(Loc, diag::warn_odr_variable_type_inconsistent)
  3233. << Name << D->getType() << FoundVar->getType();
  3234. Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
  3235. << FoundVar->getType();
  3236. ConflictingDecls.push_back(FoundDecl);
  3237. }
  3238. }
  3239. if (!ConflictingDecls.empty()) {
  3240. ExpectedName NameOrErr = Importer.HandleNameConflict(
  3241. Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
  3242. if (NameOrErr)
  3243. Name = NameOrErr.get();
  3244. else
  3245. return NameOrErr.takeError();
  3246. }
  3247. }
  3248. QualType ToType;
  3249. TypeSourceInfo *ToTypeSourceInfo;
  3250. SourceLocation ToInnerLocStart;
  3251. NestedNameSpecifierLoc ToQualifierLoc;
  3252. if (auto Imp = importSeq(
  3253. D->getType(), D->getTypeSourceInfo(), D->getInnerLocStart(),
  3254. D->getQualifierLoc()))
  3255. std::tie(ToType, ToTypeSourceInfo, ToInnerLocStart, ToQualifierLoc) = *Imp;
  3256. else
  3257. return Imp.takeError();
  3258. // Create the imported variable.
  3259. VarDecl *ToVar;
  3260. if (GetImportedOrCreateDecl(ToVar, D, Importer.getToContext(), DC,
  3261. ToInnerLocStart, Loc,
  3262. Name.getAsIdentifierInfo(),
  3263. ToType, ToTypeSourceInfo,
  3264. D->getStorageClass()))
  3265. return ToVar;
  3266. ToVar->setQualifierInfo(ToQualifierLoc);
  3267. ToVar->setAccess(D->getAccess());
  3268. ToVar->setLexicalDeclContext(LexicalDC);
  3269. if (FoundByLookup) {
  3270. auto *Recent = const_cast<VarDecl *>(FoundByLookup->getMostRecentDecl());
  3271. ToVar->setPreviousDecl(Recent);
  3272. }
  3273. if (Error Err = ImportInitializer(D, ToVar))
  3274. return std::move(Err);
  3275. if (D->isConstexpr())
  3276. ToVar->setConstexpr(true);
  3277. if (D->getDeclContext()->containsDeclAndLoad(D))
  3278. DC->addDeclInternal(ToVar);
  3279. if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
  3280. LexicalDC->addDeclInternal(ToVar);
  3281. // Import the rest of the chain. I.e. import all subsequent declarations.
  3282. for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
  3283. ExpectedDecl RedeclOrErr = import(*RedeclIt);
  3284. if (!RedeclOrErr)
  3285. return RedeclOrErr.takeError();
  3286. }
  3287. return ToVar;
  3288. }
  3289. ExpectedDecl ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
  3290. // Parameters are created in the translation unit's context, then moved
  3291. // into the function declaration's context afterward.
  3292. DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
  3293. DeclarationName ToDeclName;
  3294. SourceLocation ToLocation;
  3295. QualType ToType;
  3296. if (auto Imp = importSeq(D->getDeclName(), D->getLocation(), D->getType()))
  3297. std::tie(ToDeclName, ToLocation, ToType) = *Imp;
  3298. else
  3299. return Imp.takeError();
  3300. // Create the imported parameter.
  3301. ImplicitParamDecl *ToParm = nullptr;
  3302. if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
  3303. ToLocation, ToDeclName.getAsIdentifierInfo(),
  3304. ToType, D->getParameterKind()))
  3305. return ToParm;
  3306. return ToParm;
  3307. }
  3308. Error ASTNodeImporter::ImportDefaultArgOfParmVarDecl(
  3309. const ParmVarDecl *FromParam, ParmVarDecl *ToParam) {
  3310. ToParam->setHasInheritedDefaultArg(FromParam->hasInheritedDefaultArg());
  3311. ToParam->setKNRPromoted(FromParam->isKNRPromoted());
  3312. if (FromParam->hasUninstantiatedDefaultArg()) {
  3313. if (auto ToDefArgOrErr = import(FromParam->getUninstantiatedDefaultArg()))
  3314. ToParam->setUninstantiatedDefaultArg(*ToDefArgOrErr);
  3315. else
  3316. return ToDefArgOrErr.takeError();
  3317. } else if (FromParam->hasUnparsedDefaultArg()) {
  3318. ToParam->setUnparsedDefaultArg();
  3319. } else if (FromParam->hasDefaultArg()) {
  3320. if (auto ToDefArgOrErr = import(FromParam->getDefaultArg()))
  3321. ToParam->setDefaultArg(*ToDefArgOrErr);
  3322. else
  3323. return ToDefArgOrErr.takeError();
  3324. }
  3325. return Error::success();
  3326. }
  3327. ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
  3328. // Parameters are created in the translation unit's context, then moved
  3329. // into the function declaration's context afterward.
  3330. DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
  3331. DeclarationName ToDeclName;
  3332. SourceLocation ToLocation, ToInnerLocStart;
  3333. QualType ToType;
  3334. TypeSourceInfo *ToTypeSourceInfo;
  3335. if (auto Imp = importSeq(
  3336. D->getDeclName(), D->getLocation(), D->getType(), D->getInnerLocStart(),
  3337. D->getTypeSourceInfo()))
  3338. std::tie(
  3339. ToDeclName, ToLocation, ToType, ToInnerLocStart,
  3340. ToTypeSourceInfo) = *Imp;
  3341. else
  3342. return Imp.takeError();
  3343. ParmVarDecl *ToParm;
  3344. if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
  3345. ToInnerLocStart, ToLocation,
  3346. ToDeclName.getAsIdentifierInfo(), ToType,
  3347. ToTypeSourceInfo, D->getStorageClass(),
  3348. /*DefaultArg*/ nullptr))
  3349. return ToParm;
  3350. // Set the default argument. It should be no problem if it was already done.
  3351. // Do not import the default expression before GetImportedOrCreateDecl call
  3352. // to avoid possible infinite import loop because circular dependency.
  3353. if (Error Err = ImportDefaultArgOfParmVarDecl(D, ToParm))
  3354. return std::move(Err);
  3355. if (D->isObjCMethodParameter()) {
  3356. ToParm->setObjCMethodScopeInfo(D->getFunctionScopeIndex());
  3357. ToParm->setObjCDeclQualifier(D->getObjCDeclQualifier());
  3358. } else {
  3359. ToParm->setScopeInfo(D->getFunctionScopeDepth(),
  3360. D->getFunctionScopeIndex());
  3361. }
  3362. return ToParm;
  3363. }
  3364. ExpectedDecl ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
  3365. // Import the major distinguishing characteristics of a method.
  3366. DeclContext *DC, *LexicalDC;
  3367. DeclarationName Name;
  3368. SourceLocation Loc;
  3369. NamedDecl *ToD;
  3370. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3371. return std::move(Err);
  3372. if (ToD)
  3373. return ToD;
  3374. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  3375. for (auto *FoundDecl : FoundDecls) {
  3376. if (auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
  3377. if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
  3378. continue;
  3379. // Check return types.
  3380. if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
  3381. FoundMethod->getReturnType())) {
  3382. Importer.ToDiag(Loc, diag::warn_odr_objc_method_result_type_inconsistent)
  3383. << D->isInstanceMethod() << Name << D->getReturnType()
  3384. << FoundMethod->getReturnType();
  3385. Importer.ToDiag(FoundMethod->getLocation(),
  3386. diag::note_odr_objc_method_here)
  3387. << D->isInstanceMethod() << Name;
  3388. return make_error<ImportError>(ImportError::NameConflict);
  3389. }
  3390. // Check the number of parameters.
  3391. if (D->param_size() != FoundMethod->param_size()) {
  3392. Importer.ToDiag(Loc, diag::warn_odr_objc_method_num_params_inconsistent)
  3393. << D->isInstanceMethod() << Name
  3394. << D->param_size() << FoundMethod->param_size();
  3395. Importer.ToDiag(FoundMethod->getLocation(),
  3396. diag::note_odr_objc_method_here)
  3397. << D->isInstanceMethod() << Name;
  3398. return make_error<ImportError>(ImportError::NameConflict);
  3399. }
  3400. // Check parameter types.
  3401. for (ObjCMethodDecl::param_iterator P = D->param_begin(),
  3402. PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
  3403. P != PEnd; ++P, ++FoundP) {
  3404. if (!Importer.IsStructurallyEquivalent((*P)->getType(),
  3405. (*FoundP)->getType())) {
  3406. Importer.FromDiag((*P)->getLocation(),
  3407. diag::warn_odr_objc_method_param_type_inconsistent)
  3408. << D->isInstanceMethod() << Name
  3409. << (*P)->getType() << (*FoundP)->getType();
  3410. Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
  3411. << (*FoundP)->getType();
  3412. return make_error<ImportError>(ImportError::NameConflict);
  3413. }
  3414. }
  3415. // Check variadic/non-variadic.
  3416. // Check the number of parameters.
  3417. if (D->isVariadic() != FoundMethod->isVariadic()) {
  3418. Importer.ToDiag(Loc, diag::warn_odr_objc_method_variadic_inconsistent)
  3419. << D->isInstanceMethod() << Name;
  3420. Importer.ToDiag(FoundMethod->getLocation(),
  3421. diag::note_odr_objc_method_here)
  3422. << D->isInstanceMethod() << Name;
  3423. return make_error<ImportError>(ImportError::NameConflict);
  3424. }
  3425. // FIXME: Any other bits we need to merge?
  3426. return Importer.MapImported(D, FoundMethod);
  3427. }
  3428. }
  3429. SourceLocation ToEndLoc;
  3430. QualType ToReturnType;
  3431. TypeSourceInfo *ToReturnTypeSourceInfo;
  3432. if (auto Imp = importSeq(
  3433. D->getEndLoc(), D->getReturnType(), D->getReturnTypeSourceInfo()))
  3434. std::tie(ToEndLoc, ToReturnType, ToReturnTypeSourceInfo) = *Imp;
  3435. else
  3436. return Imp.takeError();
  3437. ObjCMethodDecl *ToMethod;
  3438. if (GetImportedOrCreateDecl(
  3439. ToMethod, D, Importer.getToContext(), Loc,
  3440. ToEndLoc, Name.getObjCSelector(), ToReturnType,
  3441. ToReturnTypeSourceInfo, DC, D->isInstanceMethod(), D->isVariadic(),
  3442. D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
  3443. D->getImplementationControl(), D->hasRelatedResultType()))
  3444. return ToMethod;
  3445. // FIXME: When we decide to merge method definitions, we'll need to
  3446. // deal with implicit parameters.
  3447. // Import the parameters
  3448. SmallVector<ParmVarDecl *, 5> ToParams;
  3449. for (auto *FromP : D->parameters()) {
  3450. if (Expected<ParmVarDecl *> ToPOrErr = import(FromP))
  3451. ToParams.push_back(*ToPOrErr);
  3452. else
  3453. return ToPOrErr.takeError();
  3454. }
  3455. // Set the parameters.
  3456. for (auto *ToParam : ToParams) {
  3457. ToParam->setOwningFunction(ToMethod);
  3458. ToMethod->addDeclInternal(ToParam);
  3459. }
  3460. SmallVector<SourceLocation, 12> FromSelLocs;
  3461. D->getSelectorLocs(FromSelLocs);
  3462. SmallVector<SourceLocation, 12> ToSelLocs(FromSelLocs.size());
  3463. if (Error Err = ImportContainerChecked(FromSelLocs, ToSelLocs))
  3464. return std::move(Err);
  3465. ToMethod->setMethodParams(Importer.getToContext(), ToParams, ToSelLocs);
  3466. ToMethod->setLexicalDeclContext(LexicalDC);
  3467. LexicalDC->addDeclInternal(ToMethod);
  3468. return ToMethod;
  3469. }
  3470. ExpectedDecl ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
  3471. // Import the major distinguishing characteristics of a category.
  3472. DeclContext *DC, *LexicalDC;
  3473. DeclarationName Name;
  3474. SourceLocation Loc;
  3475. NamedDecl *ToD;
  3476. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3477. return std::move(Err);
  3478. if (ToD)
  3479. return ToD;
  3480. SourceLocation ToVarianceLoc, ToLocation, ToColonLoc;
  3481. TypeSourceInfo *ToTypeSourceInfo;
  3482. if (auto Imp = importSeq(
  3483. D->getVarianceLoc(), D->getLocation(), D->getColonLoc(),
  3484. D->getTypeSourceInfo()))
  3485. std::tie(ToVarianceLoc, ToLocation, ToColonLoc, ToTypeSourceInfo) = *Imp;
  3486. else
  3487. return Imp.takeError();
  3488. ObjCTypeParamDecl *Result;
  3489. if (GetImportedOrCreateDecl(
  3490. Result, D, Importer.getToContext(), DC, D->getVariance(),
  3491. ToVarianceLoc, D->getIndex(),
  3492. ToLocation, Name.getAsIdentifierInfo(),
  3493. ToColonLoc, ToTypeSourceInfo))
  3494. return Result;
  3495. Result->setLexicalDeclContext(LexicalDC);
  3496. return Result;
  3497. }
  3498. ExpectedDecl ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
  3499. // Import the major distinguishing characteristics of a category.
  3500. DeclContext *DC, *LexicalDC;
  3501. DeclarationName Name;
  3502. SourceLocation Loc;
  3503. NamedDecl *ToD;
  3504. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3505. return std::move(Err);
  3506. if (ToD)
  3507. return ToD;
  3508. ObjCInterfaceDecl *ToInterface;
  3509. if (Error Err = importInto(ToInterface, D->getClassInterface()))
  3510. return std::move(Err);
  3511. // Determine if we've already encountered this category.
  3512. ObjCCategoryDecl *MergeWithCategory
  3513. = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
  3514. ObjCCategoryDecl *ToCategory = MergeWithCategory;
  3515. if (!ToCategory) {
  3516. SourceLocation ToAtStartLoc, ToCategoryNameLoc;
  3517. SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
  3518. if (auto Imp = importSeq(
  3519. D->getAtStartLoc(), D->getCategoryNameLoc(),
  3520. D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
  3521. std::tie(
  3522. ToAtStartLoc, ToCategoryNameLoc,
  3523. ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
  3524. else
  3525. return Imp.takeError();
  3526. if (GetImportedOrCreateDecl(ToCategory, D, Importer.getToContext(), DC,
  3527. ToAtStartLoc, Loc,
  3528. ToCategoryNameLoc,
  3529. Name.getAsIdentifierInfo(), ToInterface,
  3530. /*TypeParamList=*/nullptr,
  3531. ToIvarLBraceLoc,
  3532. ToIvarRBraceLoc))
  3533. return ToCategory;
  3534. ToCategory->setLexicalDeclContext(LexicalDC);
  3535. LexicalDC->addDeclInternal(ToCategory);
  3536. // Import the type parameter list after MapImported, to avoid
  3537. // loops when bringing in their DeclContext.
  3538. if (auto PListOrErr = ImportObjCTypeParamList(D->getTypeParamList()))
  3539. ToCategory->setTypeParamList(*PListOrErr);
  3540. else
  3541. return PListOrErr.takeError();
  3542. // Import protocols
  3543. SmallVector<ObjCProtocolDecl *, 4> Protocols;
  3544. SmallVector<SourceLocation, 4> ProtocolLocs;
  3545. ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
  3546. = D->protocol_loc_begin();
  3547. for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
  3548. FromProtoEnd = D->protocol_end();
  3549. FromProto != FromProtoEnd;
  3550. ++FromProto, ++FromProtoLoc) {
  3551. if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
  3552. Protocols.push_back(*ToProtoOrErr);
  3553. else
  3554. return ToProtoOrErr.takeError();
  3555. if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
  3556. ProtocolLocs.push_back(*ToProtoLocOrErr);
  3557. else
  3558. return ToProtoLocOrErr.takeError();
  3559. }
  3560. // FIXME: If we're merging, make sure that the protocol list is the same.
  3561. ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
  3562. ProtocolLocs.data(), Importer.getToContext());
  3563. } else {
  3564. Importer.MapImported(D, ToCategory);
  3565. }
  3566. // Import all of the members of this category.
  3567. if (Error Err = ImportDeclContext(D))
  3568. return std::move(Err);
  3569. // If we have an implementation, import it as well.
  3570. if (D->getImplementation()) {
  3571. if (Expected<ObjCCategoryImplDecl *> ToImplOrErr =
  3572. import(D->getImplementation()))
  3573. ToCategory->setImplementation(*ToImplOrErr);
  3574. else
  3575. return ToImplOrErr.takeError();
  3576. }
  3577. return ToCategory;
  3578. }
  3579. Error ASTNodeImporter::ImportDefinition(
  3580. ObjCProtocolDecl *From, ObjCProtocolDecl *To, ImportDefinitionKind Kind) {
  3581. if (To->getDefinition()) {
  3582. if (shouldForceImportDeclContext(Kind))
  3583. if (Error Err = ImportDeclContext(From))
  3584. return Err;
  3585. return Error::success();
  3586. }
  3587. // Start the protocol definition
  3588. To->startDefinition();
  3589. // Import protocols
  3590. SmallVector<ObjCProtocolDecl *, 4> Protocols;
  3591. SmallVector<SourceLocation, 4> ProtocolLocs;
  3592. ObjCProtocolDecl::protocol_loc_iterator FromProtoLoc =
  3593. From->protocol_loc_begin();
  3594. for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
  3595. FromProtoEnd = From->protocol_end();
  3596. FromProto != FromProtoEnd;
  3597. ++FromProto, ++FromProtoLoc) {
  3598. if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
  3599. Protocols.push_back(*ToProtoOrErr);
  3600. else
  3601. return ToProtoOrErr.takeError();
  3602. if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
  3603. ProtocolLocs.push_back(*ToProtoLocOrErr);
  3604. else
  3605. return ToProtoLocOrErr.takeError();
  3606. }
  3607. // FIXME: If we're merging, make sure that the protocol list is the same.
  3608. To->setProtocolList(Protocols.data(), Protocols.size(),
  3609. ProtocolLocs.data(), Importer.getToContext());
  3610. if (shouldForceImportDeclContext(Kind)) {
  3611. // Import all of the members of this protocol.
  3612. if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
  3613. return Err;
  3614. }
  3615. return Error::success();
  3616. }
  3617. ExpectedDecl ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
  3618. // If this protocol has a definition in the translation unit we're coming
  3619. // from, but this particular declaration is not that definition, import the
  3620. // definition and map to that.
  3621. ObjCProtocolDecl *Definition = D->getDefinition();
  3622. if (Definition && Definition != D) {
  3623. if (ExpectedDecl ImportedDefOrErr = import(Definition))
  3624. return Importer.MapImported(D, *ImportedDefOrErr);
  3625. else
  3626. return ImportedDefOrErr.takeError();
  3627. }
  3628. // Import the major distinguishing characteristics of a protocol.
  3629. DeclContext *DC, *LexicalDC;
  3630. DeclarationName Name;
  3631. SourceLocation Loc;
  3632. NamedDecl *ToD;
  3633. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3634. return std::move(Err);
  3635. if (ToD)
  3636. return ToD;
  3637. ObjCProtocolDecl *MergeWithProtocol = nullptr;
  3638. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  3639. for (auto *FoundDecl : FoundDecls) {
  3640. if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
  3641. continue;
  3642. if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecl)))
  3643. break;
  3644. }
  3645. ObjCProtocolDecl *ToProto = MergeWithProtocol;
  3646. if (!ToProto) {
  3647. auto ToAtBeginLocOrErr = import(D->getAtStartLoc());
  3648. if (!ToAtBeginLocOrErr)
  3649. return ToAtBeginLocOrErr.takeError();
  3650. if (GetImportedOrCreateDecl(ToProto, D, Importer.getToContext(), DC,
  3651. Name.getAsIdentifierInfo(), Loc,
  3652. *ToAtBeginLocOrErr,
  3653. /*PrevDecl=*/nullptr))
  3654. return ToProto;
  3655. ToProto->setLexicalDeclContext(LexicalDC);
  3656. LexicalDC->addDeclInternal(ToProto);
  3657. }
  3658. Importer.MapImported(D, ToProto);
  3659. if (D->isThisDeclarationADefinition())
  3660. if (Error Err = ImportDefinition(D, ToProto))
  3661. return std::move(Err);
  3662. return ToProto;
  3663. }
  3664. ExpectedDecl ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
  3665. DeclContext *DC, *LexicalDC;
  3666. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  3667. return std::move(Err);
  3668. ExpectedSLoc ExternLocOrErr = import(D->getExternLoc());
  3669. if (!ExternLocOrErr)
  3670. return ExternLocOrErr.takeError();
  3671. ExpectedSLoc LangLocOrErr = import(D->getLocation());
  3672. if (!LangLocOrErr)
  3673. return LangLocOrErr.takeError();
  3674. bool HasBraces = D->hasBraces();
  3675. LinkageSpecDecl *ToLinkageSpec;
  3676. if (GetImportedOrCreateDecl(ToLinkageSpec, D, Importer.getToContext(), DC,
  3677. *ExternLocOrErr, *LangLocOrErr,
  3678. D->getLanguage(), HasBraces))
  3679. return ToLinkageSpec;
  3680. if (HasBraces) {
  3681. ExpectedSLoc RBraceLocOrErr = import(D->getRBraceLoc());
  3682. if (!RBraceLocOrErr)
  3683. return RBraceLocOrErr.takeError();
  3684. ToLinkageSpec->setRBraceLoc(*RBraceLocOrErr);
  3685. }
  3686. ToLinkageSpec->setLexicalDeclContext(LexicalDC);
  3687. LexicalDC->addDeclInternal(ToLinkageSpec);
  3688. return ToLinkageSpec;
  3689. }
  3690. ExpectedDecl ASTNodeImporter::VisitUsingDecl(UsingDecl *D) {
  3691. DeclContext *DC, *LexicalDC;
  3692. DeclarationName Name;
  3693. SourceLocation Loc;
  3694. NamedDecl *ToD = nullptr;
  3695. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3696. return std::move(Err);
  3697. if (ToD)
  3698. return ToD;
  3699. SourceLocation ToLoc, ToUsingLoc;
  3700. NestedNameSpecifierLoc ToQualifierLoc;
  3701. if (auto Imp = importSeq(
  3702. D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc()))
  3703. std::tie(ToLoc, ToUsingLoc, ToQualifierLoc) = *Imp;
  3704. else
  3705. return Imp.takeError();
  3706. DeclarationNameInfo NameInfo(Name, ToLoc);
  3707. if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
  3708. return std::move(Err);
  3709. UsingDecl *ToUsing;
  3710. if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
  3711. ToUsingLoc, ToQualifierLoc, NameInfo,
  3712. D->hasTypename()))
  3713. return ToUsing;
  3714. ToUsing->setLexicalDeclContext(LexicalDC);
  3715. LexicalDC->addDeclInternal(ToUsing);
  3716. if (NamedDecl *FromPattern =
  3717. Importer.getFromContext().getInstantiatedFromUsingDecl(D)) {
  3718. if (Expected<NamedDecl *> ToPatternOrErr = import(FromPattern))
  3719. Importer.getToContext().setInstantiatedFromUsingDecl(
  3720. ToUsing, *ToPatternOrErr);
  3721. else
  3722. return ToPatternOrErr.takeError();
  3723. }
  3724. for (UsingShadowDecl *FromShadow : D->shadows()) {
  3725. if (Expected<UsingShadowDecl *> ToShadowOrErr = import(FromShadow))
  3726. ToUsing->addShadowDecl(*ToShadowOrErr);
  3727. else
  3728. // FIXME: We return error here but the definition is already created
  3729. // and available with lookups. How to fix this?..
  3730. return ToShadowOrErr.takeError();
  3731. }
  3732. return ToUsing;
  3733. }
  3734. ExpectedDecl ASTNodeImporter::VisitUsingShadowDecl(UsingShadowDecl *D) {
  3735. DeclContext *DC, *LexicalDC;
  3736. DeclarationName Name;
  3737. SourceLocation Loc;
  3738. NamedDecl *ToD = nullptr;
  3739. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3740. return std::move(Err);
  3741. if (ToD)
  3742. return ToD;
  3743. Expected<UsingDecl *> ToUsingOrErr = import(D->getUsingDecl());
  3744. if (!ToUsingOrErr)
  3745. return ToUsingOrErr.takeError();
  3746. Expected<NamedDecl *> ToTargetOrErr = import(D->getTargetDecl());
  3747. if (!ToTargetOrErr)
  3748. return ToTargetOrErr.takeError();
  3749. UsingShadowDecl *ToShadow;
  3750. if (GetImportedOrCreateDecl(ToShadow, D, Importer.getToContext(), DC, Loc,
  3751. *ToUsingOrErr, *ToTargetOrErr))
  3752. return ToShadow;
  3753. ToShadow->setLexicalDeclContext(LexicalDC);
  3754. ToShadow->setAccess(D->getAccess());
  3755. if (UsingShadowDecl *FromPattern =
  3756. Importer.getFromContext().getInstantiatedFromUsingShadowDecl(D)) {
  3757. if (Expected<UsingShadowDecl *> ToPatternOrErr = import(FromPattern))
  3758. Importer.getToContext().setInstantiatedFromUsingShadowDecl(
  3759. ToShadow, *ToPatternOrErr);
  3760. else
  3761. // FIXME: We return error here but the definition is already created
  3762. // and available with lookups. How to fix this?..
  3763. return ToPatternOrErr.takeError();
  3764. }
  3765. LexicalDC->addDeclInternal(ToShadow);
  3766. return ToShadow;
  3767. }
  3768. ExpectedDecl ASTNodeImporter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
  3769. DeclContext *DC, *LexicalDC;
  3770. DeclarationName Name;
  3771. SourceLocation Loc;
  3772. NamedDecl *ToD = nullptr;
  3773. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3774. return std::move(Err);
  3775. if (ToD)
  3776. return ToD;
  3777. auto ToComAncestorOrErr = Importer.ImportContext(D->getCommonAncestor());
  3778. if (!ToComAncestorOrErr)
  3779. return ToComAncestorOrErr.takeError();
  3780. NamespaceDecl *ToNominatedNamespace;
  3781. SourceLocation ToUsingLoc, ToNamespaceKeyLocation, ToIdentLocation;
  3782. NestedNameSpecifierLoc ToQualifierLoc;
  3783. if (auto Imp = importSeq(
  3784. D->getNominatedNamespace(), D->getUsingLoc(),
  3785. D->getNamespaceKeyLocation(), D->getQualifierLoc(),
  3786. D->getIdentLocation()))
  3787. std::tie(
  3788. ToNominatedNamespace, ToUsingLoc, ToNamespaceKeyLocation,
  3789. ToQualifierLoc, ToIdentLocation) = *Imp;
  3790. else
  3791. return Imp.takeError();
  3792. UsingDirectiveDecl *ToUsingDir;
  3793. if (GetImportedOrCreateDecl(ToUsingDir, D, Importer.getToContext(), DC,
  3794. ToUsingLoc,
  3795. ToNamespaceKeyLocation,
  3796. ToQualifierLoc,
  3797. ToIdentLocation,
  3798. ToNominatedNamespace, *ToComAncestorOrErr))
  3799. return ToUsingDir;
  3800. ToUsingDir->setLexicalDeclContext(LexicalDC);
  3801. LexicalDC->addDeclInternal(ToUsingDir);
  3802. return ToUsingDir;
  3803. }
  3804. ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingValueDecl(
  3805. UnresolvedUsingValueDecl *D) {
  3806. DeclContext *DC, *LexicalDC;
  3807. DeclarationName Name;
  3808. SourceLocation Loc;
  3809. NamedDecl *ToD = nullptr;
  3810. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3811. return std::move(Err);
  3812. if (ToD)
  3813. return ToD;
  3814. SourceLocation ToLoc, ToUsingLoc, ToEllipsisLoc;
  3815. NestedNameSpecifierLoc ToQualifierLoc;
  3816. if (auto Imp = importSeq(
  3817. D->getNameInfo().getLoc(), D->getUsingLoc(), D->getQualifierLoc(),
  3818. D->getEllipsisLoc()))
  3819. std::tie(ToLoc, ToUsingLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
  3820. else
  3821. return Imp.takeError();
  3822. DeclarationNameInfo NameInfo(Name, ToLoc);
  3823. if (Error Err = ImportDeclarationNameLoc(D->getNameInfo(), NameInfo))
  3824. return std::move(Err);
  3825. UnresolvedUsingValueDecl *ToUsingValue;
  3826. if (GetImportedOrCreateDecl(ToUsingValue, D, Importer.getToContext(), DC,
  3827. ToUsingLoc, ToQualifierLoc, NameInfo,
  3828. ToEllipsisLoc))
  3829. return ToUsingValue;
  3830. ToUsingValue->setAccess(D->getAccess());
  3831. ToUsingValue->setLexicalDeclContext(LexicalDC);
  3832. LexicalDC->addDeclInternal(ToUsingValue);
  3833. return ToUsingValue;
  3834. }
  3835. ExpectedDecl ASTNodeImporter::VisitUnresolvedUsingTypenameDecl(
  3836. UnresolvedUsingTypenameDecl *D) {
  3837. DeclContext *DC, *LexicalDC;
  3838. DeclarationName Name;
  3839. SourceLocation Loc;
  3840. NamedDecl *ToD = nullptr;
  3841. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3842. return std::move(Err);
  3843. if (ToD)
  3844. return ToD;
  3845. SourceLocation ToUsingLoc, ToTypenameLoc, ToEllipsisLoc;
  3846. NestedNameSpecifierLoc ToQualifierLoc;
  3847. if (auto Imp = importSeq(
  3848. D->getUsingLoc(), D->getTypenameLoc(), D->getQualifierLoc(),
  3849. D->getEllipsisLoc()))
  3850. std::tie(ToUsingLoc, ToTypenameLoc, ToQualifierLoc, ToEllipsisLoc) = *Imp;
  3851. else
  3852. return Imp.takeError();
  3853. UnresolvedUsingTypenameDecl *ToUsing;
  3854. if (GetImportedOrCreateDecl(ToUsing, D, Importer.getToContext(), DC,
  3855. ToUsingLoc, ToTypenameLoc,
  3856. ToQualifierLoc, Loc, Name, ToEllipsisLoc))
  3857. return ToUsing;
  3858. ToUsing->setAccess(D->getAccess());
  3859. ToUsing->setLexicalDeclContext(LexicalDC);
  3860. LexicalDC->addDeclInternal(ToUsing);
  3861. return ToUsing;
  3862. }
  3863. Error ASTNodeImporter::ImportDefinition(
  3864. ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, ImportDefinitionKind Kind) {
  3865. if (To->getDefinition()) {
  3866. // Check consistency of superclass.
  3867. ObjCInterfaceDecl *FromSuper = From->getSuperClass();
  3868. if (FromSuper) {
  3869. if (auto FromSuperOrErr = import(FromSuper))
  3870. FromSuper = *FromSuperOrErr;
  3871. else
  3872. return FromSuperOrErr.takeError();
  3873. }
  3874. ObjCInterfaceDecl *ToSuper = To->getSuperClass();
  3875. if ((bool)FromSuper != (bool)ToSuper ||
  3876. (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
  3877. Importer.ToDiag(To->getLocation(),
  3878. diag::warn_odr_objc_superclass_inconsistent)
  3879. << To->getDeclName();
  3880. if (ToSuper)
  3881. Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
  3882. << To->getSuperClass()->getDeclName();
  3883. else
  3884. Importer.ToDiag(To->getLocation(),
  3885. diag::note_odr_objc_missing_superclass);
  3886. if (From->getSuperClass())
  3887. Importer.FromDiag(From->getSuperClassLoc(),
  3888. diag::note_odr_objc_superclass)
  3889. << From->getSuperClass()->getDeclName();
  3890. else
  3891. Importer.FromDiag(From->getLocation(),
  3892. diag::note_odr_objc_missing_superclass);
  3893. }
  3894. if (shouldForceImportDeclContext(Kind))
  3895. if (Error Err = ImportDeclContext(From))
  3896. return Err;
  3897. return Error::success();
  3898. }
  3899. // Start the definition.
  3900. To->startDefinition();
  3901. // If this class has a superclass, import it.
  3902. if (From->getSuperClass()) {
  3903. if (auto SuperTInfoOrErr = import(From->getSuperClassTInfo()))
  3904. To->setSuperClass(*SuperTInfoOrErr);
  3905. else
  3906. return SuperTInfoOrErr.takeError();
  3907. }
  3908. // Import protocols
  3909. SmallVector<ObjCProtocolDecl *, 4> Protocols;
  3910. SmallVector<SourceLocation, 4> ProtocolLocs;
  3911. ObjCInterfaceDecl::protocol_loc_iterator FromProtoLoc =
  3912. From->protocol_loc_begin();
  3913. for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
  3914. FromProtoEnd = From->protocol_end();
  3915. FromProto != FromProtoEnd;
  3916. ++FromProto, ++FromProtoLoc) {
  3917. if (Expected<ObjCProtocolDecl *> ToProtoOrErr = import(*FromProto))
  3918. Protocols.push_back(*ToProtoOrErr);
  3919. else
  3920. return ToProtoOrErr.takeError();
  3921. if (ExpectedSLoc ToProtoLocOrErr = import(*FromProtoLoc))
  3922. ProtocolLocs.push_back(*ToProtoLocOrErr);
  3923. else
  3924. return ToProtoLocOrErr.takeError();
  3925. }
  3926. // FIXME: If we're merging, make sure that the protocol list is the same.
  3927. To->setProtocolList(Protocols.data(), Protocols.size(),
  3928. ProtocolLocs.data(), Importer.getToContext());
  3929. // Import categories. When the categories themselves are imported, they'll
  3930. // hook themselves into this interface.
  3931. for (auto *Cat : From->known_categories()) {
  3932. auto ToCatOrErr = import(Cat);
  3933. if (!ToCatOrErr)
  3934. return ToCatOrErr.takeError();
  3935. }
  3936. // If we have an @implementation, import it as well.
  3937. if (From->getImplementation()) {
  3938. if (Expected<ObjCImplementationDecl *> ToImplOrErr =
  3939. import(From->getImplementation()))
  3940. To->setImplementation(*ToImplOrErr);
  3941. else
  3942. return ToImplOrErr.takeError();
  3943. }
  3944. if (shouldForceImportDeclContext(Kind)) {
  3945. // Import all of the members of this class.
  3946. if (Error Err = ImportDeclContext(From, /*ForceImport=*/true))
  3947. return Err;
  3948. }
  3949. return Error::success();
  3950. }
  3951. Expected<ObjCTypeParamList *>
  3952. ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
  3953. if (!list)
  3954. return nullptr;
  3955. SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
  3956. for (auto *fromTypeParam : *list) {
  3957. if (auto toTypeParamOrErr = import(fromTypeParam))
  3958. toTypeParams.push_back(*toTypeParamOrErr);
  3959. else
  3960. return toTypeParamOrErr.takeError();
  3961. }
  3962. auto LAngleLocOrErr = import(list->getLAngleLoc());
  3963. if (!LAngleLocOrErr)
  3964. return LAngleLocOrErr.takeError();
  3965. auto RAngleLocOrErr = import(list->getRAngleLoc());
  3966. if (!RAngleLocOrErr)
  3967. return RAngleLocOrErr.takeError();
  3968. return ObjCTypeParamList::create(Importer.getToContext(),
  3969. *LAngleLocOrErr,
  3970. toTypeParams,
  3971. *RAngleLocOrErr);
  3972. }
  3973. ExpectedDecl ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
  3974. // If this class has a definition in the translation unit we're coming from,
  3975. // but this particular declaration is not that definition, import the
  3976. // definition and map to that.
  3977. ObjCInterfaceDecl *Definition = D->getDefinition();
  3978. if (Definition && Definition != D) {
  3979. if (ExpectedDecl ImportedDefOrErr = import(Definition))
  3980. return Importer.MapImported(D, *ImportedDefOrErr);
  3981. else
  3982. return ImportedDefOrErr.takeError();
  3983. }
  3984. // Import the major distinguishing characteristics of an @interface.
  3985. DeclContext *DC, *LexicalDC;
  3986. DeclarationName Name;
  3987. SourceLocation Loc;
  3988. NamedDecl *ToD;
  3989. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  3990. return std::move(Err);
  3991. if (ToD)
  3992. return ToD;
  3993. // Look for an existing interface with the same name.
  3994. ObjCInterfaceDecl *MergeWithIface = nullptr;
  3995. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  3996. for (auto *FoundDecl : FoundDecls) {
  3997. if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
  3998. continue;
  3999. if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecl)))
  4000. break;
  4001. }
  4002. // Create an interface declaration, if one does not already exist.
  4003. ObjCInterfaceDecl *ToIface = MergeWithIface;
  4004. if (!ToIface) {
  4005. ExpectedSLoc AtBeginLocOrErr = import(D->getAtStartLoc());
  4006. if (!AtBeginLocOrErr)
  4007. return AtBeginLocOrErr.takeError();
  4008. if (GetImportedOrCreateDecl(
  4009. ToIface, D, Importer.getToContext(), DC,
  4010. *AtBeginLocOrErr, Name.getAsIdentifierInfo(),
  4011. /*TypeParamList=*/nullptr,
  4012. /*PrevDecl=*/nullptr, Loc, D->isImplicitInterfaceDecl()))
  4013. return ToIface;
  4014. ToIface->setLexicalDeclContext(LexicalDC);
  4015. LexicalDC->addDeclInternal(ToIface);
  4016. }
  4017. Importer.MapImported(D, ToIface);
  4018. // Import the type parameter list after MapImported, to avoid
  4019. // loops when bringing in their DeclContext.
  4020. if (auto ToPListOrErr =
  4021. ImportObjCTypeParamList(D->getTypeParamListAsWritten()))
  4022. ToIface->setTypeParamList(*ToPListOrErr);
  4023. else
  4024. return ToPListOrErr.takeError();
  4025. if (D->isThisDeclarationADefinition())
  4026. if (Error Err = ImportDefinition(D, ToIface))
  4027. return std::move(Err);
  4028. return ToIface;
  4029. }
  4030. ExpectedDecl
  4031. ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
  4032. ObjCCategoryDecl *Category;
  4033. if (Error Err = importInto(Category, D->getCategoryDecl()))
  4034. return std::move(Err);
  4035. ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
  4036. if (!ToImpl) {
  4037. DeclContext *DC, *LexicalDC;
  4038. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  4039. return std::move(Err);
  4040. SourceLocation ToLocation, ToAtStartLoc, ToCategoryNameLoc;
  4041. if (auto Imp = importSeq(
  4042. D->getLocation(), D->getAtStartLoc(), D->getCategoryNameLoc()))
  4043. std::tie(ToLocation, ToAtStartLoc, ToCategoryNameLoc) = *Imp;
  4044. else
  4045. return Imp.takeError();
  4046. if (GetImportedOrCreateDecl(
  4047. ToImpl, D, Importer.getToContext(), DC,
  4048. Importer.Import(D->getIdentifier()), Category->getClassInterface(),
  4049. ToLocation, ToAtStartLoc, ToCategoryNameLoc))
  4050. return ToImpl;
  4051. ToImpl->setLexicalDeclContext(LexicalDC);
  4052. LexicalDC->addDeclInternal(ToImpl);
  4053. Category->setImplementation(ToImpl);
  4054. }
  4055. Importer.MapImported(D, ToImpl);
  4056. if (Error Err = ImportDeclContext(D))
  4057. return std::move(Err);
  4058. return ToImpl;
  4059. }
  4060. ExpectedDecl
  4061. ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
  4062. // Find the corresponding interface.
  4063. ObjCInterfaceDecl *Iface;
  4064. if (Error Err = importInto(Iface, D->getClassInterface()))
  4065. return std::move(Err);
  4066. // Import the superclass, if any.
  4067. ObjCInterfaceDecl *Super;
  4068. if (Error Err = importInto(Super, D->getSuperClass()))
  4069. return std::move(Err);
  4070. ObjCImplementationDecl *Impl = Iface->getImplementation();
  4071. if (!Impl) {
  4072. // We haven't imported an implementation yet. Create a new @implementation
  4073. // now.
  4074. DeclContext *DC, *LexicalDC;
  4075. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  4076. return std::move(Err);
  4077. SourceLocation ToLocation, ToAtStartLoc, ToSuperClassLoc;
  4078. SourceLocation ToIvarLBraceLoc, ToIvarRBraceLoc;
  4079. if (auto Imp = importSeq(
  4080. D->getLocation(), D->getAtStartLoc(), D->getSuperClassLoc(),
  4081. D->getIvarLBraceLoc(), D->getIvarRBraceLoc()))
  4082. std::tie(
  4083. ToLocation, ToAtStartLoc, ToSuperClassLoc,
  4084. ToIvarLBraceLoc, ToIvarRBraceLoc) = *Imp;
  4085. else
  4086. return Imp.takeError();
  4087. if (GetImportedOrCreateDecl(Impl, D, Importer.getToContext(),
  4088. DC, Iface, Super,
  4089. ToLocation,
  4090. ToAtStartLoc,
  4091. ToSuperClassLoc,
  4092. ToIvarLBraceLoc,
  4093. ToIvarRBraceLoc))
  4094. return Impl;
  4095. Impl->setLexicalDeclContext(LexicalDC);
  4096. // Associate the implementation with the class it implements.
  4097. Iface->setImplementation(Impl);
  4098. Importer.MapImported(D, Iface->getImplementation());
  4099. } else {
  4100. Importer.MapImported(D, Iface->getImplementation());
  4101. // Verify that the existing @implementation has the same superclass.
  4102. if ((Super && !Impl->getSuperClass()) ||
  4103. (!Super && Impl->getSuperClass()) ||
  4104. (Super && Impl->getSuperClass() &&
  4105. !declaresSameEntity(Super->getCanonicalDecl(),
  4106. Impl->getSuperClass()))) {
  4107. Importer.ToDiag(Impl->getLocation(),
  4108. diag::warn_odr_objc_superclass_inconsistent)
  4109. << Iface->getDeclName();
  4110. // FIXME: It would be nice to have the location of the superclass
  4111. // below.
  4112. if (Impl->getSuperClass())
  4113. Importer.ToDiag(Impl->getLocation(),
  4114. diag::note_odr_objc_superclass)
  4115. << Impl->getSuperClass()->getDeclName();
  4116. else
  4117. Importer.ToDiag(Impl->getLocation(),
  4118. diag::note_odr_objc_missing_superclass);
  4119. if (D->getSuperClass())
  4120. Importer.FromDiag(D->getLocation(),
  4121. diag::note_odr_objc_superclass)
  4122. << D->getSuperClass()->getDeclName();
  4123. else
  4124. Importer.FromDiag(D->getLocation(),
  4125. diag::note_odr_objc_missing_superclass);
  4126. return make_error<ImportError>(ImportError::NameConflict);
  4127. }
  4128. }
  4129. // Import all of the members of this @implementation.
  4130. if (Error Err = ImportDeclContext(D))
  4131. return std::move(Err);
  4132. return Impl;
  4133. }
  4134. ExpectedDecl ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
  4135. // Import the major distinguishing characteristics of an @property.
  4136. DeclContext *DC, *LexicalDC;
  4137. DeclarationName Name;
  4138. SourceLocation Loc;
  4139. NamedDecl *ToD;
  4140. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  4141. return std::move(Err);
  4142. if (ToD)
  4143. return ToD;
  4144. // Check whether we have already imported this property.
  4145. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  4146. for (auto *FoundDecl : FoundDecls) {
  4147. if (auto *FoundProp = dyn_cast<ObjCPropertyDecl>(FoundDecl)) {
  4148. // Check property types.
  4149. if (!Importer.IsStructurallyEquivalent(D->getType(),
  4150. FoundProp->getType())) {
  4151. Importer.ToDiag(Loc, diag::warn_odr_objc_property_type_inconsistent)
  4152. << Name << D->getType() << FoundProp->getType();
  4153. Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
  4154. << FoundProp->getType();
  4155. return make_error<ImportError>(ImportError::NameConflict);
  4156. }
  4157. // FIXME: Check property attributes, getters, setters, etc.?
  4158. // Consider these properties to be equivalent.
  4159. Importer.MapImported(D, FoundProp);
  4160. return FoundProp;
  4161. }
  4162. }
  4163. QualType ToType;
  4164. TypeSourceInfo *ToTypeSourceInfo;
  4165. SourceLocation ToAtLoc, ToLParenLoc;
  4166. if (auto Imp = importSeq(
  4167. D->getType(), D->getTypeSourceInfo(), D->getAtLoc(), D->getLParenLoc()))
  4168. std::tie(ToType, ToTypeSourceInfo, ToAtLoc, ToLParenLoc) = *Imp;
  4169. else
  4170. return Imp.takeError();
  4171. // Create the new property.
  4172. ObjCPropertyDecl *ToProperty;
  4173. if (GetImportedOrCreateDecl(
  4174. ToProperty, D, Importer.getToContext(), DC, Loc,
  4175. Name.getAsIdentifierInfo(), ToAtLoc,
  4176. ToLParenLoc, ToType,
  4177. ToTypeSourceInfo, D->getPropertyImplementation()))
  4178. return ToProperty;
  4179. Selector ToGetterName, ToSetterName;
  4180. SourceLocation ToGetterNameLoc, ToSetterNameLoc;
  4181. ObjCMethodDecl *ToGetterMethodDecl, *ToSetterMethodDecl;
  4182. ObjCIvarDecl *ToPropertyIvarDecl;
  4183. if (auto Imp = importSeq(
  4184. D->getGetterName(), D->getSetterName(),
  4185. D->getGetterNameLoc(), D->getSetterNameLoc(),
  4186. D->getGetterMethodDecl(), D->getSetterMethodDecl(),
  4187. D->getPropertyIvarDecl()))
  4188. std::tie(
  4189. ToGetterName, ToSetterName,
  4190. ToGetterNameLoc, ToSetterNameLoc,
  4191. ToGetterMethodDecl, ToSetterMethodDecl,
  4192. ToPropertyIvarDecl) = *Imp;
  4193. else
  4194. return Imp.takeError();
  4195. ToProperty->setLexicalDeclContext(LexicalDC);
  4196. LexicalDC->addDeclInternal(ToProperty);
  4197. ToProperty->setPropertyAttributes(D->getPropertyAttributes());
  4198. ToProperty->setPropertyAttributesAsWritten(
  4199. D->getPropertyAttributesAsWritten());
  4200. ToProperty->setGetterName(ToGetterName, ToGetterNameLoc);
  4201. ToProperty->setSetterName(ToSetterName, ToSetterNameLoc);
  4202. ToProperty->setGetterMethodDecl(ToGetterMethodDecl);
  4203. ToProperty->setSetterMethodDecl(ToSetterMethodDecl);
  4204. ToProperty->setPropertyIvarDecl(ToPropertyIvarDecl);
  4205. return ToProperty;
  4206. }
  4207. ExpectedDecl
  4208. ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
  4209. ObjCPropertyDecl *Property;
  4210. if (Error Err = importInto(Property, D->getPropertyDecl()))
  4211. return std::move(Err);
  4212. DeclContext *DC, *LexicalDC;
  4213. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  4214. return std::move(Err);
  4215. auto *InImpl = cast<ObjCImplDecl>(LexicalDC);
  4216. // Import the ivar (for an @synthesize).
  4217. ObjCIvarDecl *Ivar = nullptr;
  4218. if (Error Err = importInto(Ivar, D->getPropertyIvarDecl()))
  4219. return std::move(Err);
  4220. ObjCPropertyImplDecl *ToImpl
  4221. = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
  4222. Property->getQueryKind());
  4223. if (!ToImpl) {
  4224. SourceLocation ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc;
  4225. if (auto Imp = importSeq(
  4226. D->getBeginLoc(), D->getLocation(), D->getPropertyIvarDeclLoc()))
  4227. std::tie(ToBeginLoc, ToLocation, ToPropertyIvarDeclLoc) = *Imp;
  4228. else
  4229. return Imp.takeError();
  4230. if (GetImportedOrCreateDecl(ToImpl, D, Importer.getToContext(), DC,
  4231. ToBeginLoc,
  4232. ToLocation, Property,
  4233. D->getPropertyImplementation(), Ivar,
  4234. ToPropertyIvarDeclLoc))
  4235. return ToImpl;
  4236. ToImpl->setLexicalDeclContext(LexicalDC);
  4237. LexicalDC->addDeclInternal(ToImpl);
  4238. } else {
  4239. // Check that we have the same kind of property implementation (@synthesize
  4240. // vs. @dynamic).
  4241. if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
  4242. Importer.ToDiag(ToImpl->getLocation(),
  4243. diag::warn_odr_objc_property_impl_kind_inconsistent)
  4244. << Property->getDeclName()
  4245. << (ToImpl->getPropertyImplementation()
  4246. == ObjCPropertyImplDecl::Dynamic);
  4247. Importer.FromDiag(D->getLocation(),
  4248. diag::note_odr_objc_property_impl_kind)
  4249. << D->getPropertyDecl()->getDeclName()
  4250. << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
  4251. return make_error<ImportError>(ImportError::NameConflict);
  4252. }
  4253. // For @synthesize, check that we have the same
  4254. if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
  4255. Ivar != ToImpl->getPropertyIvarDecl()) {
  4256. Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
  4257. diag::warn_odr_objc_synthesize_ivar_inconsistent)
  4258. << Property->getDeclName()
  4259. << ToImpl->getPropertyIvarDecl()->getDeclName()
  4260. << Ivar->getDeclName();
  4261. Importer.FromDiag(D->getPropertyIvarDeclLoc(),
  4262. diag::note_odr_objc_synthesize_ivar_here)
  4263. << D->getPropertyIvarDecl()->getDeclName();
  4264. return make_error<ImportError>(ImportError::NameConflict);
  4265. }
  4266. // Merge the existing implementation with the new implementation.
  4267. Importer.MapImported(D, ToImpl);
  4268. }
  4269. return ToImpl;
  4270. }
  4271. ExpectedDecl
  4272. ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
  4273. // For template arguments, we adopt the translation unit as our declaration
  4274. // context. This context will be fixed when the actual template declaration
  4275. // is created.
  4276. // FIXME: Import default argument.
  4277. ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
  4278. if (!BeginLocOrErr)
  4279. return BeginLocOrErr.takeError();
  4280. ExpectedSLoc LocationOrErr = import(D->getLocation());
  4281. if (!LocationOrErr)
  4282. return LocationOrErr.takeError();
  4283. TemplateTypeParmDecl *ToD = nullptr;
  4284. (void)GetImportedOrCreateDecl(
  4285. ToD, D, Importer.getToContext(),
  4286. Importer.getToContext().getTranslationUnitDecl(),
  4287. *BeginLocOrErr, *LocationOrErr,
  4288. D->getDepth(), D->getIndex(), Importer.Import(D->getIdentifier()),
  4289. D->wasDeclaredWithTypename(), D->isParameterPack());
  4290. return ToD;
  4291. }
  4292. ExpectedDecl
  4293. ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
  4294. DeclarationName ToDeclName;
  4295. SourceLocation ToLocation, ToInnerLocStart;
  4296. QualType ToType;
  4297. TypeSourceInfo *ToTypeSourceInfo;
  4298. if (auto Imp = importSeq(
  4299. D->getDeclName(), D->getLocation(), D->getType(), D->getTypeSourceInfo(),
  4300. D->getInnerLocStart()))
  4301. std::tie(
  4302. ToDeclName, ToLocation, ToType, ToTypeSourceInfo,
  4303. ToInnerLocStart) = *Imp;
  4304. else
  4305. return Imp.takeError();
  4306. // FIXME: Import default argument.
  4307. NonTypeTemplateParmDecl *ToD = nullptr;
  4308. (void)GetImportedOrCreateDecl(
  4309. ToD, D, Importer.getToContext(),
  4310. Importer.getToContext().getTranslationUnitDecl(),
  4311. ToInnerLocStart, ToLocation, D->getDepth(),
  4312. D->getPosition(), ToDeclName.getAsIdentifierInfo(), ToType,
  4313. D->isParameterPack(), ToTypeSourceInfo);
  4314. return ToD;
  4315. }
  4316. ExpectedDecl
  4317. ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
  4318. // Import the name of this declaration.
  4319. auto NameOrErr = import(D->getDeclName());
  4320. if (!NameOrErr)
  4321. return NameOrErr.takeError();
  4322. // Import the location of this declaration.
  4323. ExpectedSLoc LocationOrErr = import(D->getLocation());
  4324. if (!LocationOrErr)
  4325. return LocationOrErr.takeError();
  4326. // Import template parameters.
  4327. auto TemplateParamsOrErr = import(D->getTemplateParameters());
  4328. if (!TemplateParamsOrErr)
  4329. return TemplateParamsOrErr.takeError();
  4330. // FIXME: Import default argument.
  4331. TemplateTemplateParmDecl *ToD = nullptr;
  4332. (void)GetImportedOrCreateDecl(
  4333. ToD, D, Importer.getToContext(),
  4334. Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
  4335. D->getDepth(), D->getPosition(), D->isParameterPack(),
  4336. (*NameOrErr).getAsIdentifierInfo(),
  4337. *TemplateParamsOrErr);
  4338. return ToD;
  4339. }
  4340. // Returns the definition for a (forward) declaration of a TemplateDecl, if
  4341. // it has any definition in the redecl chain.
  4342. template <typename T> static auto getTemplateDefinition(T *D) -> T * {
  4343. assert(D->getTemplatedDecl() && "Should be called on templates only");
  4344. auto *ToTemplatedDef = D->getTemplatedDecl()->getDefinition();
  4345. if (!ToTemplatedDef)
  4346. return nullptr;
  4347. auto *TemplateWithDef = ToTemplatedDef->getDescribedTemplate();
  4348. return cast_or_null<T>(TemplateWithDef);
  4349. }
  4350. ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
  4351. bool IsFriend = D->getFriendObjectKind() != Decl::FOK_None;
  4352. // Import the major distinguishing characteristics of this class template.
  4353. DeclContext *DC, *LexicalDC;
  4354. DeclarationName Name;
  4355. SourceLocation Loc;
  4356. NamedDecl *ToD;
  4357. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  4358. return std::move(Err);
  4359. if (ToD)
  4360. return ToD;
  4361. ClassTemplateDecl *FoundByLookup = nullptr;
  4362. // We may already have a template of the same name; try to find and match it.
  4363. if (!DC->isFunctionOrMethod()) {
  4364. SmallVector<NamedDecl *, 4> ConflictingDecls;
  4365. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  4366. for (auto *FoundDecl : FoundDecls) {
  4367. if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary |
  4368. Decl::IDNS_TagFriend))
  4369. continue;
  4370. Decl *Found = FoundDecl;
  4371. auto *FoundTemplate = dyn_cast<ClassTemplateDecl>(Found);
  4372. if (FoundTemplate) {
  4373. if (IsStructuralMatch(D, FoundTemplate)) {
  4374. ClassTemplateDecl *TemplateWithDef =
  4375. getTemplateDefinition(FoundTemplate);
  4376. if (D->isThisDeclarationADefinition() && TemplateWithDef)
  4377. return Importer.MapImported(D, TemplateWithDef);
  4378. if (!FoundByLookup)
  4379. FoundByLookup = FoundTemplate;
  4380. // Search in all matches because there may be multiple decl chains,
  4381. // see ASTTests test ImportExistingFriendClassTemplateDef.
  4382. continue;
  4383. }
  4384. ConflictingDecls.push_back(FoundDecl);
  4385. }
  4386. }
  4387. if (!ConflictingDecls.empty()) {
  4388. ExpectedName NameOrErr = Importer.HandleNameConflict(
  4389. Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),
  4390. ConflictingDecls.size());
  4391. if (NameOrErr)
  4392. Name = NameOrErr.get();
  4393. else
  4394. return NameOrErr.takeError();
  4395. }
  4396. }
  4397. CXXRecordDecl *FromTemplated = D->getTemplatedDecl();
  4398. // Create the declaration that is being templated.
  4399. CXXRecordDecl *ToTemplated;
  4400. if (Error Err = importInto(ToTemplated, FromTemplated))
  4401. return std::move(Err);
  4402. // Create the class template declaration itself.
  4403. auto TemplateParamsOrErr = import(D->getTemplateParameters());
  4404. if (!TemplateParamsOrErr)
  4405. return TemplateParamsOrErr.takeError();
  4406. ClassTemplateDecl *D2;
  4407. if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
  4408. *TemplateParamsOrErr, ToTemplated))
  4409. return D2;
  4410. ToTemplated->setDescribedClassTemplate(D2);
  4411. D2->setAccess(D->getAccess());
  4412. D2->setLexicalDeclContext(LexicalDC);
  4413. if (D->getDeclContext()->containsDeclAndLoad(D))
  4414. DC->addDeclInternal(D2);
  4415. if (DC != LexicalDC && D->getLexicalDeclContext()->containsDeclAndLoad(D))
  4416. LexicalDC->addDeclInternal(D2);
  4417. if (FoundByLookup) {
  4418. auto *Recent =
  4419. const_cast<ClassTemplateDecl *>(FoundByLookup->getMostRecentDecl());
  4420. // It is possible that during the import of the class template definition
  4421. // we start the import of a fwd friend decl of the very same class template
  4422. // and we add the fwd friend decl to the lookup table. But the ToTemplated
  4423. // had been created earlier and by that time the lookup could not find
  4424. // anything existing, so it has no previous decl. Later, (still during the
  4425. // import of the fwd friend decl) we start to import the definition again
  4426. // and this time the lookup finds the previous fwd friend class template.
  4427. // In this case we must set up the previous decl for the templated decl.
  4428. if (!ToTemplated->getPreviousDecl()) {
  4429. assert(FoundByLookup->getTemplatedDecl() &&
  4430. "Found decl must have its templated decl set");
  4431. CXXRecordDecl *PrevTemplated =
  4432. FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
  4433. if (ToTemplated != PrevTemplated)
  4434. ToTemplated->setPreviousDecl(PrevTemplated);
  4435. }
  4436. D2->setPreviousDecl(Recent);
  4437. }
  4438. if (LexicalDC != DC && IsFriend)
  4439. DC->makeDeclVisibleInContext(D2);
  4440. if (FromTemplated->isCompleteDefinition() &&
  4441. !ToTemplated->isCompleteDefinition()) {
  4442. // FIXME: Import definition!
  4443. }
  4444. return D2;
  4445. }
  4446. ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl(
  4447. ClassTemplateSpecializationDecl *D) {
  4448. ClassTemplateDecl *ClassTemplate;
  4449. if (Error Err = importInto(ClassTemplate, D->getSpecializedTemplate()))
  4450. return std::move(Err);
  4451. // Import the context of this declaration.
  4452. DeclContext *DC, *LexicalDC;
  4453. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  4454. return std::move(Err);
  4455. // Import template arguments.
  4456. SmallVector<TemplateArgument, 2> TemplateArgs;
  4457. if (Error Err = ImportTemplateArguments(
  4458. D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
  4459. return std::move(Err);
  4460. // Try to find an existing specialization with these template arguments.
  4461. void *InsertPos = nullptr;
  4462. ClassTemplateSpecializationDecl *PrevDecl = nullptr;
  4463. ClassTemplatePartialSpecializationDecl *PartialSpec =
  4464. dyn_cast<ClassTemplatePartialSpecializationDecl>(D);
  4465. if (PartialSpec)
  4466. PrevDecl =
  4467. ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos);
  4468. else
  4469. PrevDecl = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
  4470. if (PrevDecl) {
  4471. if (IsStructuralMatch(D, PrevDecl)) {
  4472. if (D->isThisDeclarationADefinition() && PrevDecl->getDefinition()) {
  4473. Importer.MapImported(D, PrevDecl->getDefinition());
  4474. // Import those default field initializers which have been
  4475. // instantiated in the "From" context, but not in the "To" context.
  4476. for (auto *FromField : D->fields()) {
  4477. auto ToOrErr = import(FromField);
  4478. if (!ToOrErr)
  4479. return ToOrErr.takeError();
  4480. }
  4481. // Import those methods which have been instantiated in the
  4482. // "From" context, but not in the "To" context.
  4483. for (CXXMethodDecl *FromM : D->methods()) {
  4484. auto ToOrErr = import(FromM);
  4485. if (!ToOrErr)
  4486. return ToOrErr.takeError();
  4487. }
  4488. // TODO Import instantiated default arguments.
  4489. // TODO Import instantiated exception specifications.
  4490. //
  4491. // Generally, ASTCommon.h/DeclUpdateKind enum gives a very good hint
  4492. // what else could be fused during an AST merge.
  4493. return PrevDecl;
  4494. }
  4495. } else { // ODR violation.
  4496. // FIXME HandleNameConflict
  4497. return make_error<ImportError>(ImportError::NameConflict);
  4498. }
  4499. }
  4500. // Import the location of this declaration.
  4501. ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
  4502. if (!BeginLocOrErr)
  4503. return BeginLocOrErr.takeError();
  4504. ExpectedSLoc IdLocOrErr = import(D->getLocation());
  4505. if (!IdLocOrErr)
  4506. return IdLocOrErr.takeError();
  4507. // Create the specialization.
  4508. ClassTemplateSpecializationDecl *D2 = nullptr;
  4509. if (PartialSpec) {
  4510. // Import TemplateArgumentListInfo.
  4511. TemplateArgumentListInfo ToTAInfo;
  4512. const auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten();
  4513. if (Error Err = ImportTemplateArgumentListInfo(ASTTemplateArgs, ToTAInfo))
  4514. return std::move(Err);
  4515. QualType CanonInjType;
  4516. if (Error Err = importInto(
  4517. CanonInjType, PartialSpec->getInjectedSpecializationType()))
  4518. return std::move(Err);
  4519. CanonInjType = CanonInjType.getCanonicalType();
  4520. auto ToTPListOrErr = import(PartialSpec->getTemplateParameters());
  4521. if (!ToTPListOrErr)
  4522. return ToTPListOrErr.takeError();
  4523. if (GetImportedOrCreateDecl<ClassTemplatePartialSpecializationDecl>(
  4524. D2, D, Importer.getToContext(), D->getTagKind(), DC,
  4525. *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, ClassTemplate,
  4526. llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()),
  4527. ToTAInfo, CanonInjType,
  4528. cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl)))
  4529. return D2;
  4530. // Update InsertPos, because preceding import calls may have invalidated
  4531. // it by adding new specializations.
  4532. if (!ClassTemplate->findPartialSpecialization(TemplateArgs, InsertPos))
  4533. // Add this partial specialization to the class template.
  4534. ClassTemplate->AddPartialSpecialization(
  4535. cast<ClassTemplatePartialSpecializationDecl>(D2), InsertPos);
  4536. } else { // Not a partial specialization.
  4537. if (GetImportedOrCreateDecl(
  4538. D2, D, Importer.getToContext(), D->getTagKind(), DC,
  4539. *BeginLocOrErr, *IdLocOrErr, ClassTemplate, TemplateArgs,
  4540. PrevDecl))
  4541. return D2;
  4542. // Update InsertPos, because preceding import calls may have invalidated
  4543. // it by adding new specializations.
  4544. if (!ClassTemplate->findSpecialization(TemplateArgs, InsertPos))
  4545. // Add this specialization to the class template.
  4546. ClassTemplate->AddSpecialization(D2, InsertPos);
  4547. }
  4548. D2->setSpecializationKind(D->getSpecializationKind());
  4549. // Set the context of this specialization/instantiation.
  4550. D2->setLexicalDeclContext(LexicalDC);
  4551. // Add to the DC only if it was an explicit specialization/instantiation.
  4552. if (D2->isExplicitInstantiationOrSpecialization()) {
  4553. LexicalDC->addDeclInternal(D2);
  4554. }
  4555. // Import the qualifier, if any.
  4556. if (auto LocOrErr = import(D->getQualifierLoc()))
  4557. D2->setQualifierInfo(*LocOrErr);
  4558. else
  4559. return LocOrErr.takeError();
  4560. if (auto *TSI = D->getTypeAsWritten()) {
  4561. if (auto TInfoOrErr = import(TSI))
  4562. D2->setTypeAsWritten(*TInfoOrErr);
  4563. else
  4564. return TInfoOrErr.takeError();
  4565. if (auto LocOrErr = import(D->getTemplateKeywordLoc()))
  4566. D2->setTemplateKeywordLoc(*LocOrErr);
  4567. else
  4568. return LocOrErr.takeError();
  4569. if (auto LocOrErr = import(D->getExternLoc()))
  4570. D2->setExternLoc(*LocOrErr);
  4571. else
  4572. return LocOrErr.takeError();
  4573. }
  4574. if (D->getPointOfInstantiation().isValid()) {
  4575. if (auto POIOrErr = import(D->getPointOfInstantiation()))
  4576. D2->setPointOfInstantiation(*POIOrErr);
  4577. else
  4578. return POIOrErr.takeError();
  4579. }
  4580. D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind());
  4581. if (D->isCompleteDefinition())
  4582. if (Error Err = ImportDefinition(D, D2))
  4583. return std::move(Err);
  4584. return D2;
  4585. }
  4586. ExpectedDecl ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
  4587. // If this variable has a definition in the translation unit we're coming
  4588. // from,
  4589. // but this particular declaration is not that definition, import the
  4590. // definition and map to that.
  4591. auto *Definition =
  4592. cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
  4593. if (Definition && Definition != D->getTemplatedDecl()) {
  4594. if (ExpectedDecl ImportedDefOrErr = import(
  4595. Definition->getDescribedVarTemplate()))
  4596. return Importer.MapImported(D, *ImportedDefOrErr);
  4597. else
  4598. return ImportedDefOrErr.takeError();
  4599. }
  4600. // Import the major distinguishing characteristics of this variable template.
  4601. DeclContext *DC, *LexicalDC;
  4602. DeclarationName Name;
  4603. SourceLocation Loc;
  4604. NamedDecl *ToD;
  4605. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  4606. return std::move(Err);
  4607. if (ToD)
  4608. return ToD;
  4609. // We may already have a template of the same name; try to find and match it.
  4610. assert(!DC->isFunctionOrMethod() &&
  4611. "Variable templates cannot be declared at function scope");
  4612. SmallVector<NamedDecl *, 4> ConflictingDecls;
  4613. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  4614. for (auto *FoundDecl : FoundDecls) {
  4615. if (!FoundDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
  4616. continue;
  4617. Decl *Found = FoundDecl;
  4618. if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
  4619. if (IsStructuralMatch(D, FoundTemplate)) {
  4620. // The variable templates structurally match; call it the same template.
  4621. Importer.MapImported(D->getTemplatedDecl(),
  4622. FoundTemplate->getTemplatedDecl());
  4623. return Importer.MapImported(D, FoundTemplate);
  4624. }
  4625. ConflictingDecls.push_back(FoundDecl);
  4626. }
  4627. }
  4628. if (!ConflictingDecls.empty()) {
  4629. ExpectedName NameOrErr = Importer.HandleNameConflict(
  4630. Name, DC, Decl::IDNS_Ordinary, ConflictingDecls.data(),
  4631. ConflictingDecls.size());
  4632. if (NameOrErr)
  4633. Name = NameOrErr.get();
  4634. else
  4635. return NameOrErr.takeError();
  4636. }
  4637. VarDecl *DTemplated = D->getTemplatedDecl();
  4638. // Import the type.
  4639. // FIXME: Value not used?
  4640. ExpectedType TypeOrErr = import(DTemplated->getType());
  4641. if (!TypeOrErr)
  4642. return TypeOrErr.takeError();
  4643. // Create the declaration that is being templated.
  4644. VarDecl *ToTemplated;
  4645. if (Error Err = importInto(ToTemplated, DTemplated))
  4646. return std::move(Err);
  4647. // Create the variable template declaration itself.
  4648. auto TemplateParamsOrErr = import(D->getTemplateParameters());
  4649. if (!TemplateParamsOrErr)
  4650. return TemplateParamsOrErr.takeError();
  4651. VarTemplateDecl *ToVarTD;
  4652. if (GetImportedOrCreateDecl(ToVarTD, D, Importer.getToContext(), DC, Loc,
  4653. Name, *TemplateParamsOrErr, ToTemplated))
  4654. return ToVarTD;
  4655. ToTemplated->setDescribedVarTemplate(ToVarTD);
  4656. ToVarTD->setAccess(D->getAccess());
  4657. ToVarTD->setLexicalDeclContext(LexicalDC);
  4658. LexicalDC->addDeclInternal(ToVarTD);
  4659. if (DTemplated->isThisDeclarationADefinition() &&
  4660. !ToTemplated->isThisDeclarationADefinition()) {
  4661. // FIXME: Import definition!
  4662. }
  4663. return ToVarTD;
  4664. }
  4665. ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl(
  4666. VarTemplateSpecializationDecl *D) {
  4667. // If this record has a definition in the translation unit we're coming from,
  4668. // but this particular declaration is not that definition, import the
  4669. // definition and map to that.
  4670. VarDecl *Definition = D->getDefinition();
  4671. if (Definition && Definition != D) {
  4672. if (ExpectedDecl ImportedDefOrErr = import(Definition))
  4673. return Importer.MapImported(D, *ImportedDefOrErr);
  4674. else
  4675. return ImportedDefOrErr.takeError();
  4676. }
  4677. VarTemplateDecl *VarTemplate = nullptr;
  4678. if (Error Err = importInto(VarTemplate, D->getSpecializedTemplate()))
  4679. return std::move(Err);
  4680. // Import the context of this declaration.
  4681. DeclContext *DC, *LexicalDC;
  4682. if (Error Err = ImportDeclContext(D, DC, LexicalDC))
  4683. return std::move(Err);
  4684. // Import the location of this declaration.
  4685. ExpectedSLoc BeginLocOrErr = import(D->getBeginLoc());
  4686. if (!BeginLocOrErr)
  4687. return BeginLocOrErr.takeError();
  4688. auto IdLocOrErr = import(D->getLocation());
  4689. if (!IdLocOrErr)
  4690. return IdLocOrErr.takeError();
  4691. // Import template arguments.
  4692. SmallVector<TemplateArgument, 2> TemplateArgs;
  4693. if (Error Err = ImportTemplateArguments(
  4694. D->getTemplateArgs().data(), D->getTemplateArgs().size(), TemplateArgs))
  4695. return std::move(Err);
  4696. // Try to find an existing specialization with these template arguments.
  4697. void *InsertPos = nullptr;
  4698. VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
  4699. TemplateArgs, InsertPos);
  4700. if (D2) {
  4701. // We already have a variable template specialization with these template
  4702. // arguments.
  4703. // FIXME: Check for specialization vs. instantiation errors.
  4704. if (VarDecl *FoundDef = D2->getDefinition()) {
  4705. if (!D->isThisDeclarationADefinition() ||
  4706. IsStructuralMatch(D, FoundDef)) {
  4707. // The record types structurally match, or the "from" translation
  4708. // unit only had a forward declaration anyway; call it the same
  4709. // variable.
  4710. return Importer.MapImported(D, FoundDef);
  4711. }
  4712. }
  4713. } else {
  4714. // Import the type.
  4715. QualType T;
  4716. if (Error Err = importInto(T, D->getType()))
  4717. return std::move(Err);
  4718. auto TInfoOrErr = import(D->getTypeSourceInfo());
  4719. if (!TInfoOrErr)
  4720. return TInfoOrErr.takeError();
  4721. TemplateArgumentListInfo ToTAInfo;
  4722. if (Error Err = ImportTemplateArgumentListInfo(
  4723. D->getTemplateArgsInfo(), ToTAInfo))
  4724. return std::move(Err);
  4725. using PartVarSpecDecl = VarTemplatePartialSpecializationDecl;
  4726. // Create a new specialization.
  4727. if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) {
  4728. // Import TemplateArgumentListInfo
  4729. TemplateArgumentListInfo ArgInfos;
  4730. const auto *FromTAArgsAsWritten = FromPartial->getTemplateArgsAsWritten();
  4731. // NOTE: FromTAArgsAsWritten and template parameter list are non-null.
  4732. if (Error Err = ImportTemplateArgumentListInfo(
  4733. *FromTAArgsAsWritten, ArgInfos))
  4734. return std::move(Err);
  4735. auto ToTPListOrErr = import(FromPartial->getTemplateParameters());
  4736. if (!ToTPListOrErr)
  4737. return ToTPListOrErr.takeError();
  4738. PartVarSpecDecl *ToPartial;
  4739. if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC,
  4740. *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr,
  4741. VarTemplate, T, *TInfoOrErr,
  4742. D->getStorageClass(), TemplateArgs, ArgInfos))
  4743. return ToPartial;
  4744. if (Expected<PartVarSpecDecl *> ToInstOrErr = import(
  4745. FromPartial->getInstantiatedFromMember()))
  4746. ToPartial->setInstantiatedFromMember(*ToInstOrErr);
  4747. else
  4748. return ToInstOrErr.takeError();
  4749. if (FromPartial->isMemberSpecialization())
  4750. ToPartial->setMemberSpecialization();
  4751. D2 = ToPartial;
  4752. } else { // Full specialization
  4753. if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC,
  4754. *BeginLocOrErr, *IdLocOrErr, VarTemplate,
  4755. T, *TInfoOrErr,
  4756. D->getStorageClass(), TemplateArgs))
  4757. return D2;
  4758. }
  4759. if (D->getPointOfInstantiation().isValid()) {
  4760. if (ExpectedSLoc POIOrErr = import(D->getPointOfInstantiation()))
  4761. D2->setPointOfInstantiation(*POIOrErr);
  4762. else
  4763. return POIOrErr.takeError();
  4764. }
  4765. D2->setSpecializationKind(D->getSpecializationKind());
  4766. D2->setTemplateArgsInfo(ToTAInfo);
  4767. // Add this specialization to the class template.
  4768. VarTemplate->AddSpecialization(D2, InsertPos);
  4769. // Import the qualifier, if any.
  4770. if (auto LocOrErr = import(D->getQualifierLoc()))
  4771. D2->setQualifierInfo(*LocOrErr);
  4772. else
  4773. return LocOrErr.takeError();
  4774. if (D->isConstexpr())
  4775. D2->setConstexpr(true);
  4776. // Add the specialization to this context.
  4777. D2->setLexicalDeclContext(LexicalDC);
  4778. LexicalDC->addDeclInternal(D2);
  4779. D2->setAccess(D->getAccess());
  4780. }
  4781. if (Error Err = ImportInitializer(D, D2))
  4782. return std::move(Err);
  4783. return D2;
  4784. }
  4785. ExpectedDecl
  4786. ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
  4787. DeclContext *DC, *LexicalDC;
  4788. DeclarationName Name;
  4789. SourceLocation Loc;
  4790. NamedDecl *ToD;
  4791. if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
  4792. return std::move(Err);
  4793. if (ToD)
  4794. return ToD;
  4795. const FunctionTemplateDecl *FoundByLookup = nullptr;
  4796. // Try to find a function in our own ("to") context with the same name, same
  4797. // type, and in the same context as the function we're importing.
  4798. // FIXME Split this into a separate function.
  4799. if (!LexicalDC->isFunctionOrMethod()) {
  4800. unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_OrdinaryFriend;
  4801. auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
  4802. for (auto *FoundDecl : FoundDecls) {
  4803. if (!FoundDecl->isInIdentifierNamespace(IDNS))
  4804. continue;
  4805. if (auto *FoundTemplate = dyn_cast<FunctionTemplateDecl>(FoundDecl)) {
  4806. if (!hasSameVisibilityContext(FoundTemplate, D))
  4807. continue;
  4808. if (IsStructuralMatch(D, FoundTemplate)) {
  4809. FunctionTemplateDecl *TemplateWithDef =
  4810. getTemplateDefinition(FoundTemplate);
  4811. if (D->isThisDeclarationADefinition() && TemplateWithDef)
  4812. return Importer.MapImported(D, TemplateWithDef);
  4813. FoundByLookup = FoundTemplate;
  4814. break;
  4815. // TODO: handle conflicting names
  4816. }
  4817. }
  4818. }
  4819. }
  4820. auto ParamsOrErr = import(D->getTemplateParameters());
  4821. if (!ParamsOrErr)
  4822. return ParamsOrErr.takeError();
  4823. FunctionDecl *TemplatedFD;
  4824. if (Error Err = importInto(TemplatedFD, D->getTemplatedDecl()))
  4825. return std::move(Err);
  4826. FunctionTemplateDecl *ToFunc;
  4827. if (GetImportedOrCreateDecl(ToFunc, D, Importer.getToContext(), DC, Loc, Name,
  4828. *ParamsOrErr, TemplatedFD))
  4829. return ToFunc;
  4830. TemplatedFD->setDescribedFunctionTemplate(ToFunc);
  4831. ToFunc->setAccess(D->getAccess());
  4832. ToFunc->setLexicalDeclContext(LexicalDC);
  4833. LexicalDC->addDeclInternal(ToFunc);
  4834. if (FoundByLookup) {
  4835. auto *Recent =
  4836. const_cast<FunctionTemplateDecl *>(FoundByLookup->getMostRecentDecl());
  4837. if (!TemplatedFD->getPreviousDecl()) {
  4838. assert(FoundByLookup->getTemplatedDecl() &&
  4839. "Found decl must have its templated decl set");
  4840. auto *PrevTemplated =
  4841. FoundByLookup->getTemplatedDecl()->getMostRecentDecl();
  4842. if (TemplatedFD != PrevTemplated)
  4843. TemplatedFD->setPreviousDecl(PrevTemplated);
  4844. }
  4845. ToFunc->setPreviousDecl(Recent);
  4846. }
  4847. return ToFunc;
  4848. }
  4849. //----------------------------------------------------------------------------
  4850. // Import Statements
  4851. //----------------------------------------------------------------------------
  4852. ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) {
  4853. Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node)
  4854. << S->getStmtClassName();
  4855. return make_error<ImportError>(ImportError::UnsupportedConstruct);
  4856. }
  4857. ExpectedStmt ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) {
  4858. if (Importer.returnWithErrorInTest())
  4859. return make_error<ImportError>(ImportError::UnsupportedConstruct);
  4860. SmallVector<IdentifierInfo *, 4> Names;
  4861. for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
  4862. IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I));
  4863. // ToII is nullptr when no symbolic name is given for output operand
  4864. // see ParseStmtAsm::ParseAsmOperandsOpt
  4865. Names.push_back(ToII);
  4866. }
  4867. for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
  4868. IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I));
  4869. // ToII is nullptr when no symbolic name is given for input operand
  4870. // see ParseStmtAsm::ParseAsmOperandsOpt
  4871. Names.push_back(ToII);
  4872. }
  4873. SmallVector<StringLiteral *, 4> Clobbers;
  4874. for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) {
  4875. if (auto ClobberOrErr = import(S->getClobberStringLiteral(I)))
  4876. Clobbers.push_back(*ClobberOrErr);
  4877. else
  4878. return ClobberOrErr.takeError();
  4879. }
  4880. SmallVector<StringLiteral *, 4> Constraints;
  4881. for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
  4882. if (auto OutputOrErr = import(S->getOutputConstraintLiteral(I)))
  4883. Constraints.push_back(*OutputOrErr);
  4884. else
  4885. return OutputOrErr.takeError();
  4886. }
  4887. for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
  4888. if (auto InputOrErr = import(S->getInputConstraintLiteral(I)))
  4889. Constraints.push_back(*InputOrErr);
  4890. else
  4891. return InputOrErr.takeError();
  4892. }
  4893. SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs() +
  4894. S->getNumLabels());
  4895. if (Error Err = ImportContainerChecked(S->outputs(), Exprs))
  4896. return std::move(Err);
  4897. if (Error Err =
  4898. ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs()))
  4899. return std::move(Err);
  4900. if (Error Err = ImportArrayChecked(
  4901. S->labels(), Exprs.begin() + S->getNumOutputs() + S->getNumInputs()))
  4902. return std::move(Err);
  4903. ExpectedSLoc AsmLocOrErr = import(S->getAsmLoc());
  4904. if (!AsmLocOrErr)
  4905. return AsmLocOrErr.takeError();
  4906. auto AsmStrOrErr = import(S->getAsmString());
  4907. if (!AsmStrOrErr)
  4908. return AsmStrOrErr.takeError();
  4909. ExpectedSLoc RParenLocOrErr = import(S->getRParenLoc());
  4910. if (!RParenLocOrErr)
  4911. return RParenLocOrErr.takeError();
  4912. return new (Importer.getToContext()) GCCAsmStmt(
  4913. Importer.getToContext(),
  4914. *AsmLocOrErr,
  4915. S->isSimple(),
  4916. S->isVolatile(),
  4917. S->getNumOutputs(),
  4918. S->getNumInputs(),
  4919. Names.data(),
  4920. Constraints.data(),
  4921. Exprs.data(),
  4922. *AsmStrOrErr,
  4923. S->getNumClobbers(),
  4924. Clobbers.data(),
  4925. S->getNumLabels(),
  4926. *RParenLocOrErr);
  4927. }
  4928. ExpectedStmt ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
  4929. auto Imp = importSeq(S->getDeclGroup(), S->getBeginLoc(), S->getEndLoc());
  4930. if (!Imp)
  4931. return Imp.takeError();
  4932. DeclGroupRef ToDG;
  4933. SourceLocation ToBeginLoc, ToEndLoc;
  4934. std::tie(ToDG, ToBeginLoc, ToEndLoc) = *Imp;
  4935. return new (Importer.getToContext()) DeclStmt(ToDG, ToBeginLoc, ToEndLoc);
  4936. }
  4937. ExpectedStmt ASTNodeImporter::VisitNullStmt(NullStmt *S) {
  4938. ExpectedSLoc ToSemiLocOrErr = import(S->getSemiLoc());
  4939. if (!ToSemiLocOrErr)
  4940. return ToSemiLocOrErr.takeError();
  4941. return new (Importer.getToContext()) NullStmt(
  4942. *ToSemiLocOrErr, S->hasLeadingEmptyMacro());
  4943. }
  4944. ExpectedStmt ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
  4945. SmallVector<Stmt *, 8> ToStmts(S->size());
  4946. if (Error Err = ImportContainerChecked(S->body(), ToStmts))
  4947. return std::move(Err);
  4948. ExpectedSLoc ToLBracLocOrErr = import(S->getLBracLoc());
  4949. if (!ToLBracLocOrErr)
  4950. return ToLBracLocOrErr.takeError();
  4951. ExpectedSLoc ToRBracLocOrErr = import(S->getRBracLoc());
  4952. if (!ToRBracLocOrErr)
  4953. return ToRBracLocOrErr.takeError();
  4954. return CompoundStmt::Create(
  4955. Importer.getToContext(), ToStmts,
  4956. *ToLBracLocOrErr, *ToRBracLocOrErr);
  4957. }
  4958. ExpectedStmt ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
  4959. auto Imp = importSeq(
  4960. S->getLHS(), S->getRHS(), S->getSubStmt(), S->getCaseLoc(),
  4961. S->getEllipsisLoc(), S->getColonLoc());
  4962. if (!Imp)
  4963. return Imp.takeError();
  4964. Expr *ToLHS, *ToRHS;
  4965. Stmt *ToSubStmt;
  4966. SourceLocation ToCaseLoc, ToEllipsisLoc, ToColonLoc;
  4967. std::tie(ToLHS, ToRHS, ToSubStmt, ToCaseLoc, ToEllipsisLoc, ToColonLoc) =
  4968. *Imp;
  4969. auto *ToStmt = CaseStmt::Create(Importer.getToContext(), ToLHS, ToRHS,
  4970. ToCaseLoc, ToEllipsisLoc, ToColonLoc);
  4971. ToStmt->setSubStmt(ToSubStmt);
  4972. return ToStmt;
  4973. }
  4974. ExpectedStmt ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
  4975. auto Imp = importSeq(S->getDefaultLoc(), S->getColonLoc(), S->getSubStmt());
  4976. if (!Imp)
  4977. return Imp.takeError();
  4978. SourceLocation ToDefaultLoc, ToColonLoc;
  4979. Stmt *ToSubStmt;
  4980. std::tie(ToDefaultLoc, ToColonLoc, ToSubStmt) = *Imp;
  4981. return new (Importer.getToContext()) DefaultStmt(
  4982. ToDefaultLoc, ToColonLoc, ToSubStmt);
  4983. }
  4984. ExpectedStmt ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
  4985. auto Imp = importSeq(S->getIdentLoc(), S->getDecl(), S->getSubStmt());
  4986. if (!Imp)
  4987. return Imp.takeError();
  4988. SourceLocation ToIdentLoc;
  4989. LabelDecl *ToLabelDecl;
  4990. Stmt *ToSubStmt;
  4991. std::tie(ToIdentLoc, ToLabelDecl, ToSubStmt) = *Imp;
  4992. return new (Importer.getToContext()) LabelStmt(
  4993. ToIdentLoc, ToLabelDecl, ToSubStmt);
  4994. }
  4995. ExpectedStmt ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
  4996. ExpectedSLoc ToAttrLocOrErr = import(S->getAttrLoc());
  4997. if (!ToAttrLocOrErr)
  4998. return ToAttrLocOrErr.takeError();
  4999. ArrayRef<const Attr*> FromAttrs(S->getAttrs());
  5000. SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
  5001. if (Error Err = ImportContainerChecked(FromAttrs, ToAttrs))
  5002. return std::move(Err);
  5003. ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
  5004. if (!ToSubStmtOrErr)
  5005. return ToSubStmtOrErr.takeError();
  5006. return AttributedStmt::Create(
  5007. Importer.getToContext(), *ToAttrLocOrErr, ToAttrs, *ToSubStmtOrErr);
  5008. }
  5009. ExpectedStmt ASTNodeImporter::VisitIfStmt(IfStmt *S) {
  5010. auto Imp = importSeq(
  5011. S->getIfLoc(), S->getInit(), S->getConditionVariable(), S->getCond(),
  5012. S->getThen(), S->getElseLoc(), S->getElse());
  5013. if (!Imp)
  5014. return Imp.takeError();
  5015. SourceLocation ToIfLoc, ToElseLoc;
  5016. Stmt *ToInit, *ToThen, *ToElse;
  5017. VarDecl *ToConditionVariable;
  5018. Expr *ToCond;
  5019. std::tie(
  5020. ToIfLoc, ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc, ToElse) =
  5021. *Imp;
  5022. return IfStmt::Create(Importer.getToContext(), ToIfLoc, S->isConstexpr(),
  5023. ToInit, ToConditionVariable, ToCond, ToThen, ToElseLoc,
  5024. ToElse);
  5025. }
  5026. ExpectedStmt ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
  5027. auto Imp = importSeq(
  5028. S->getInit(), S->getConditionVariable(), S->getCond(),
  5029. S->getBody(), S->getSwitchLoc());
  5030. if (!Imp)
  5031. return Imp.takeError();
  5032. Stmt *ToInit, *ToBody;
  5033. VarDecl *ToConditionVariable;
  5034. Expr *ToCond;
  5035. SourceLocation ToSwitchLoc;
  5036. std::tie(ToInit, ToConditionVariable, ToCond, ToBody, ToSwitchLoc) = *Imp;
  5037. auto *ToStmt = SwitchStmt::Create(Importer.getToContext(), ToInit,
  5038. ToConditionVariable, ToCond);
  5039. ToStmt->setBody(ToBody);
  5040. ToStmt->setSwitchLoc(ToSwitchLoc);
  5041. // Now we have to re-chain the cases.
  5042. SwitchCase *LastChainedSwitchCase = nullptr;
  5043. for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
  5044. SC = SC->getNextSwitchCase()) {
  5045. Expected<SwitchCase *> ToSCOrErr = import(SC);
  5046. if (!ToSCOrErr)
  5047. return ToSCOrErr.takeError();
  5048. if (LastChainedSwitchCase)
  5049. LastChainedSwitchCase->setNextSwitchCase(*ToSCOrErr);
  5050. else
  5051. ToStmt->setSwitchCaseList(*ToSCOrErr);
  5052. LastChainedSwitchCase = *ToSCOrErr;
  5053. }
  5054. return ToStmt;
  5055. }
  5056. ExpectedStmt ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
  5057. auto Imp = importSeq(
  5058. S->getConditionVariable(), S->getCond(), S->getBody(), S->getWhileLoc());
  5059. if (!Imp)
  5060. return Imp.takeError();
  5061. VarDecl *ToConditionVariable;
  5062. Expr *ToCond;
  5063. Stmt *ToBody;
  5064. SourceLocation ToWhileLoc;
  5065. std::tie(ToConditionVariable, ToCond, ToBody, ToWhileLoc) = *Imp;
  5066. return WhileStmt::Create(Importer.getToContext(), ToConditionVariable, ToCond,
  5067. ToBody, ToWhileLoc);
  5068. }
  5069. ExpectedStmt ASTNodeImporter::VisitDoStmt(DoStmt *S) {
  5070. auto Imp = importSeq(
  5071. S->getBody(), S->getCond(), S->getDoLoc(), S->getWhileLoc(),
  5072. S->getRParenLoc());
  5073. if (!Imp)
  5074. return Imp.takeError();
  5075. Stmt *ToBody;
  5076. Expr *ToCond;
  5077. SourceLocation ToDoLoc, ToWhileLoc, ToRParenLoc;
  5078. std::tie(ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc) = *Imp;
  5079. return new (Importer.getToContext()) DoStmt(
  5080. ToBody, ToCond, ToDoLoc, ToWhileLoc, ToRParenLoc);
  5081. }
  5082. ExpectedStmt ASTNodeImporter::VisitForStmt(ForStmt *S) {
  5083. auto Imp = importSeq(
  5084. S->getInit(), S->getCond(), S->getConditionVariable(), S->getInc(),
  5085. S->getBody(), S->getForLoc(), S->getLParenLoc(), S->getRParenLoc());
  5086. if (!Imp)
  5087. return Imp.takeError();
  5088. Stmt *ToInit;
  5089. Expr *ToCond, *ToInc;
  5090. VarDecl *ToConditionVariable;
  5091. Stmt *ToBody;
  5092. SourceLocation ToForLoc, ToLParenLoc, ToRParenLoc;
  5093. std::tie(
  5094. ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc,
  5095. ToLParenLoc, ToRParenLoc) = *Imp;
  5096. return new (Importer.getToContext()) ForStmt(
  5097. Importer.getToContext(),
  5098. ToInit, ToCond, ToConditionVariable, ToInc, ToBody, ToForLoc, ToLParenLoc,
  5099. ToRParenLoc);
  5100. }
  5101. ExpectedStmt ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
  5102. auto Imp = importSeq(S->getLabel(), S->getGotoLoc(), S->getLabelLoc());
  5103. if (!Imp)
  5104. return Imp.takeError();
  5105. LabelDecl *ToLabel;
  5106. SourceLocation ToGotoLoc, ToLabelLoc;
  5107. std::tie(ToLabel, ToGotoLoc, ToLabelLoc) = *Imp;
  5108. return new (Importer.getToContext()) GotoStmt(
  5109. ToLabel, ToGotoLoc, ToLabelLoc);
  5110. }
  5111. ExpectedStmt ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
  5112. auto Imp = importSeq(S->getGotoLoc(), S->getStarLoc(), S->getTarget());
  5113. if (!Imp)
  5114. return Imp.takeError();
  5115. SourceLocation ToGotoLoc, ToStarLoc;
  5116. Expr *ToTarget;
  5117. std::tie(ToGotoLoc, ToStarLoc, ToTarget) = *Imp;
  5118. return new (Importer.getToContext()) IndirectGotoStmt(
  5119. ToGotoLoc, ToStarLoc, ToTarget);
  5120. }
  5121. ExpectedStmt ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
  5122. ExpectedSLoc ToContinueLocOrErr = import(S->getContinueLoc());
  5123. if (!ToContinueLocOrErr)
  5124. return ToContinueLocOrErr.takeError();
  5125. return new (Importer.getToContext()) ContinueStmt(*ToContinueLocOrErr);
  5126. }
  5127. ExpectedStmt ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
  5128. auto ToBreakLocOrErr = import(S->getBreakLoc());
  5129. if (!ToBreakLocOrErr)
  5130. return ToBreakLocOrErr.takeError();
  5131. return new (Importer.getToContext()) BreakStmt(*ToBreakLocOrErr);
  5132. }
  5133. ExpectedStmt ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
  5134. auto Imp = importSeq(
  5135. S->getReturnLoc(), S->getRetValue(), S->getNRVOCandidate());
  5136. if (!Imp)
  5137. return Imp.takeError();
  5138. SourceLocation ToReturnLoc;
  5139. Expr *ToRetValue;
  5140. const VarDecl *ToNRVOCandidate;
  5141. std::tie(ToReturnLoc, ToRetValue, ToNRVOCandidate) = *Imp;
  5142. return ReturnStmt::Create(Importer.getToContext(), ToReturnLoc, ToRetValue,
  5143. ToNRVOCandidate);
  5144. }
  5145. ExpectedStmt ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
  5146. auto Imp = importSeq(
  5147. S->getCatchLoc(), S->getExceptionDecl(), S->getHandlerBlock());
  5148. if (!Imp)
  5149. return Imp.takeError();
  5150. SourceLocation ToCatchLoc;
  5151. VarDecl *ToExceptionDecl;
  5152. Stmt *ToHandlerBlock;
  5153. std::tie(ToCatchLoc, ToExceptionDecl, ToHandlerBlock) = *Imp;
  5154. return new (Importer.getToContext()) CXXCatchStmt (
  5155. ToCatchLoc, ToExceptionDecl, ToHandlerBlock);
  5156. }
  5157. ExpectedStmt ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
  5158. ExpectedSLoc ToTryLocOrErr = import(S->getTryLoc());
  5159. if (!ToTryLocOrErr)
  5160. return ToTryLocOrErr.takeError();
  5161. ExpectedStmt ToTryBlockOrErr = import(S->getTryBlock());
  5162. if (!ToTryBlockOrErr)
  5163. return ToTryBlockOrErr.takeError();
  5164. SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
  5165. for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
  5166. CXXCatchStmt *FromHandler = S->getHandler(HI);
  5167. if (auto ToHandlerOrErr = import(FromHandler))
  5168. ToHandlers[HI] = *ToHandlerOrErr;
  5169. else
  5170. return ToHandlerOrErr.takeError();
  5171. }
  5172. return CXXTryStmt::Create(
  5173. Importer.getToContext(), *ToTryLocOrErr,*ToTryBlockOrErr, ToHandlers);
  5174. }
  5175. ExpectedStmt ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
  5176. auto Imp1 = importSeq(
  5177. S->getInit(), S->getRangeStmt(), S->getBeginStmt(), S->getEndStmt(),
  5178. S->getCond(), S->getInc(), S->getLoopVarStmt(), S->getBody());
  5179. if (!Imp1)
  5180. return Imp1.takeError();
  5181. auto Imp2 = importSeq(
  5182. S->getForLoc(), S->getCoawaitLoc(), S->getColonLoc(), S->getRParenLoc());
  5183. if (!Imp2)
  5184. return Imp2.takeError();
  5185. DeclStmt *ToRangeStmt, *ToBeginStmt, *ToEndStmt, *ToLoopVarStmt;
  5186. Expr *ToCond, *ToInc;
  5187. Stmt *ToInit, *ToBody;
  5188. std::tie(
  5189. ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
  5190. ToBody) = *Imp1;
  5191. SourceLocation ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc;
  5192. std::tie(ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc) = *Imp2;
  5193. return new (Importer.getToContext()) CXXForRangeStmt(
  5194. ToInit, ToRangeStmt, ToBeginStmt, ToEndStmt, ToCond, ToInc, ToLoopVarStmt,
  5195. ToBody, ToForLoc, ToCoawaitLoc, ToColonLoc, ToRParenLoc);
  5196. }
  5197. ExpectedStmt
  5198. ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
  5199. auto Imp = importSeq(
  5200. S->getElement(), S->getCollection(), S->getBody(),
  5201. S->getForLoc(), S->getRParenLoc());
  5202. if (!Imp)
  5203. return Imp.takeError();
  5204. Stmt *ToElement, *ToBody;
  5205. Expr *ToCollection;
  5206. SourceLocation ToForLoc, ToRParenLoc;
  5207. std::tie(ToElement, ToCollection, ToBody, ToForLoc, ToRParenLoc) = *Imp;
  5208. return new (Importer.getToContext()) ObjCForCollectionStmt(ToElement,
  5209. ToCollection,
  5210. ToBody,
  5211. ToForLoc,
  5212. ToRParenLoc);
  5213. }
  5214. ExpectedStmt ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
  5215. auto Imp = importSeq(
  5216. S->getAtCatchLoc(), S->getRParenLoc(), S->getCatchParamDecl(),
  5217. S->getCatchBody());
  5218. if (!Imp)
  5219. return Imp.takeError();
  5220. SourceLocation ToAtCatchLoc, ToRParenLoc;
  5221. VarDecl *ToCatchParamDecl;
  5222. Stmt *ToCatchBody;
  5223. std::tie(ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody) = *Imp;
  5224. return new (Importer.getToContext()) ObjCAtCatchStmt (
  5225. ToAtCatchLoc, ToRParenLoc, ToCatchParamDecl, ToCatchBody);
  5226. }
  5227. ExpectedStmt ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
  5228. ExpectedSLoc ToAtFinallyLocOrErr = import(S->getAtFinallyLoc());
  5229. if (!ToAtFinallyLocOrErr)
  5230. return ToAtFinallyLocOrErr.takeError();
  5231. ExpectedStmt ToAtFinallyStmtOrErr = import(S->getFinallyBody());
  5232. if (!ToAtFinallyStmtOrErr)
  5233. return ToAtFinallyStmtOrErr.takeError();
  5234. return new (Importer.getToContext()) ObjCAtFinallyStmt(*ToAtFinallyLocOrErr,
  5235. *ToAtFinallyStmtOrErr);
  5236. }
  5237. ExpectedStmt ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
  5238. auto Imp = importSeq(
  5239. S->getAtTryLoc(), S->getTryBody(), S->getFinallyStmt());
  5240. if (!Imp)
  5241. return Imp.takeError();
  5242. SourceLocation ToAtTryLoc;
  5243. Stmt *ToTryBody, *ToFinallyStmt;
  5244. std::tie(ToAtTryLoc, ToTryBody, ToFinallyStmt) = *Imp;
  5245. SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
  5246. for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
  5247. ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
  5248. if (ExpectedStmt ToCatchStmtOrErr = import(FromCatchStmt))
  5249. ToCatchStmts[CI] = *ToCatchStmtOrErr;
  5250. else
  5251. return ToCatchStmtOrErr.takeError();
  5252. }
  5253. return ObjCAtTryStmt::Create(Importer.getToContext(),
  5254. ToAtTryLoc, ToTryBody,
  5255. ToCatchStmts.begin(), ToCatchStmts.size(),
  5256. ToFinallyStmt);
  5257. }
  5258. ExpectedStmt ASTNodeImporter::VisitObjCAtSynchronizedStmt
  5259. (ObjCAtSynchronizedStmt *S) {
  5260. auto Imp = importSeq(
  5261. S->getAtSynchronizedLoc(), S->getSynchExpr(), S->getSynchBody());
  5262. if (!Imp)
  5263. return Imp.takeError();
  5264. SourceLocation ToAtSynchronizedLoc;
  5265. Expr *ToSynchExpr;
  5266. Stmt *ToSynchBody;
  5267. std::tie(ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody) = *Imp;
  5268. return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
  5269. ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
  5270. }
  5271. ExpectedStmt ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
  5272. ExpectedSLoc ToThrowLocOrErr = import(S->getThrowLoc());
  5273. if (!ToThrowLocOrErr)
  5274. return ToThrowLocOrErr.takeError();
  5275. ExpectedExpr ToThrowExprOrErr = import(S->getThrowExpr());
  5276. if (!ToThrowExprOrErr)
  5277. return ToThrowExprOrErr.takeError();
  5278. return new (Importer.getToContext()) ObjCAtThrowStmt(
  5279. *ToThrowLocOrErr, *ToThrowExprOrErr);
  5280. }
  5281. ExpectedStmt ASTNodeImporter::VisitObjCAutoreleasePoolStmt(
  5282. ObjCAutoreleasePoolStmt *S) {
  5283. ExpectedSLoc ToAtLocOrErr = import(S->getAtLoc());
  5284. if (!ToAtLocOrErr)
  5285. return ToAtLocOrErr.takeError();
  5286. ExpectedStmt ToSubStmtOrErr = import(S->getSubStmt());
  5287. if (!ToSubStmtOrErr)
  5288. return ToSubStmtOrErr.takeError();
  5289. return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(*ToAtLocOrErr,
  5290. *ToSubStmtOrErr);
  5291. }
  5292. //----------------------------------------------------------------------------
  5293. // Import Expressions
  5294. //----------------------------------------------------------------------------
  5295. ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) {
  5296. Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node)
  5297. << E->getStmtClassName();
  5298. return make_error<ImportError>(ImportError::UnsupportedConstruct);
  5299. }
  5300. ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) {
  5301. auto Imp = importSeq(
  5302. E->getBuiltinLoc(), E->getSubExpr(), E->getWrittenTypeInfo(),
  5303. E->getRParenLoc(), E->getType());
  5304. if (!Imp)
  5305. return Imp.takeError();
  5306. SourceLocation ToBuiltinLoc, ToRParenLoc;
  5307. Expr *ToSubExpr;
  5308. TypeSourceInfo *ToWrittenTypeInfo;
  5309. QualType ToType;
  5310. std::tie(ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType) =
  5311. *Imp;
  5312. return new (Importer.getToContext()) VAArgExpr(
  5313. ToBuiltinLoc, ToSubExpr, ToWrittenTypeInfo, ToRParenLoc, ToType,
  5314. E->isMicrosoftABI());
  5315. }
  5316. ExpectedStmt ASTNodeImporter::VisitChooseExpr(ChooseExpr *E) {
  5317. auto Imp = importSeq(E->getCond(), E->getLHS(), E->getRHS(),
  5318. E->getBuiltinLoc(), E->getRParenLoc(), E->getType());
  5319. if (!Imp)
  5320. return Imp.takeError();
  5321. Expr *ToCond;
  5322. Expr *ToLHS;
  5323. Expr *ToRHS;
  5324. SourceLocation ToBuiltinLoc, ToRParenLoc;
  5325. QualType ToType;
  5326. std::tie(ToCond, ToLHS, ToRHS, ToBuiltinLoc, ToRParenLoc, ToType) = *Imp;
  5327. ExprValueKind VK = E->getValueKind();
  5328. ExprObjectKind OK = E->getObjectKind();
  5329. bool TypeDependent = ToCond->isTypeDependent();
  5330. bool ValueDependent = ToCond->isValueDependent();
  5331. // The value of CondIsTrue only matters if the value is not
  5332. // condition-dependent.
  5333. bool CondIsTrue = !E->isConditionDependent() && E->isConditionTrue();
  5334. return new (Importer.getToContext())
  5335. ChooseExpr(ToBuiltinLoc, ToCond, ToLHS, ToRHS, ToType, VK, OK,
  5336. ToRParenLoc, CondIsTrue, TypeDependent, ValueDependent);
  5337. }
  5338. ExpectedStmt ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) {
  5339. ExpectedType TypeOrErr = import(E->getType());
  5340. if (!TypeOrErr)
  5341. return TypeOrErr.takeError();
  5342. ExpectedSLoc BeginLocOrErr = import(E->getBeginLoc());
  5343. if (!BeginLocOrErr)
  5344. return BeginLocOrErr.takeError();
  5345. return new (Importer.getToContext()) GNUNullExpr(*TypeOrErr, *BeginLocOrErr);
  5346. }
  5347. ExpectedStmt ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) {
  5348. auto Imp = importSeq(
  5349. E->getBeginLoc(), E->getType(), E->getFunctionName());
  5350. if (!Imp)
  5351. return Imp.takeError();
  5352. SourceLocation ToBeginLoc;
  5353. QualType ToType;
  5354. StringLiteral *ToFunctionName;
  5355. std::tie(ToBeginLoc, ToType, ToFunctionName) = *Imp;
  5356. return PredefinedExpr::Create(Importer.getToContext(), ToBeginLoc, ToType,
  5357. E->getIdentKind(), ToFunctionName);
  5358. }
  5359. ExpectedStmt ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
  5360. auto Imp = importSeq(
  5361. E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDecl(),
  5362. E->getLocation(), E->getType());
  5363. if (!Imp)
  5364. return Imp.takeError();
  5365. NestedNameSpecifierLoc ToQualifierLoc;
  5366. SourceLocation ToTemplateKeywordLoc, ToLocation;
  5367. ValueDecl *ToDecl;
  5368. QualType ToType;
  5369. std::tie(ToQualifierLoc, ToTemplateKeywordLoc, ToDecl, ToLocation, ToType) =
  5370. *Imp;
  5371. NamedDecl *ToFoundD = nullptr;
  5372. if (E->getDecl() != E->getFoundDecl()) {
  5373. auto FoundDOrErr = import(E->getFoundDecl());
  5374. if (!FoundDOrErr)
  5375. return FoundDOrErr.takeError();
  5376. ToFoundD = *FoundDOrErr;
  5377. }
  5378. TemplateArgumentListInfo ToTAInfo;
  5379. TemplateArgumentListInfo *ToResInfo = nullptr;
  5380. if (E->hasExplicitTemplateArgs()) {
  5381. if (Error Err =
  5382. ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
  5383. return std::move(Err);
  5384. ToResInfo = &ToTAInfo;
  5385. }
  5386. auto *ToE = DeclRefExpr::Create(
  5387. Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc, ToDecl,
  5388. E->refersToEnclosingVariableOrCapture(), ToLocation, ToType,
  5389. E->getValueKind(), ToFoundD, ToResInfo, E->isNonOdrUse());
  5390. if (E->hadMultipleCandidates())
  5391. ToE->setHadMultipleCandidates(true);
  5392. return ToE;
  5393. }
  5394. ExpectedStmt ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
  5395. ExpectedType TypeOrErr = import(E->getType());
  5396. if (!TypeOrErr)
  5397. return TypeOrErr.takeError();
  5398. return new (Importer.getToContext()) ImplicitValueInitExpr(*TypeOrErr);
  5399. }
  5400. ExpectedStmt ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
  5401. ExpectedExpr ToInitOrErr = import(E->getInit());
  5402. if (!ToInitOrErr)
  5403. return ToInitOrErr.takeError();
  5404. ExpectedSLoc ToEqualOrColonLocOrErr = import(E->getEqualOrColonLoc());
  5405. if (!ToEqualOrColonLocOrErr)
  5406. return ToEqualOrColonLocOrErr.takeError();
  5407. SmallVector<Expr *, 4> ToIndexExprs(E->getNumSubExprs() - 1);
  5408. // List elements from the second, the first is Init itself
  5409. for (unsigned I = 1, N = E->getNumSubExprs(); I < N; I++) {
  5410. if (ExpectedExpr ToArgOrErr = import(E->getSubExpr(I)))
  5411. ToIndexExprs[I - 1] = *ToArgOrErr;
  5412. else
  5413. return ToArgOrErr.takeError();
  5414. }
  5415. SmallVector<Designator, 4> ToDesignators(E->size());
  5416. if (Error Err = ImportContainerChecked(E->designators(), ToDesignators))
  5417. return std::move(Err);
  5418. return DesignatedInitExpr::Create(
  5419. Importer.getToContext(), ToDesignators,
  5420. ToIndexExprs, *ToEqualOrColonLocOrErr,
  5421. E->usesGNUSyntax(), *ToInitOrErr);
  5422. }
  5423. ExpectedStmt
  5424. ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
  5425. ExpectedType ToTypeOrErr = import(E->getType());
  5426. if (!ToTypeOrErr)
  5427. return ToTypeOrErr.takeError();
  5428. ExpectedSLoc ToLocationOrErr = import(E->getLocation());
  5429. if (!ToLocationOrErr)
  5430. return ToLocationOrErr.takeError();
  5431. return new (Importer.getToContext()) CXXNullPtrLiteralExpr(
  5432. *ToTypeOrErr, *ToLocationOrErr);
  5433. }
  5434. ExpectedStmt ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
  5435. ExpectedType ToTypeOrErr = import(E->getType());
  5436. if (!ToTypeOrErr)
  5437. return ToTypeOrErr.takeError();
  5438. ExpectedSLoc ToLocationOrErr = import(E->getLocation());
  5439. if (!ToLocationOrErr)
  5440. return ToLocationOrErr.takeError();
  5441. return IntegerLiteral::Create(
  5442. Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
  5443. }
  5444. ExpectedStmt ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) {
  5445. ExpectedType ToTypeOrErr = import(E->getType());
  5446. if (!ToTypeOrErr)
  5447. return ToTypeOrErr.takeError();
  5448. ExpectedSLoc ToLocationOrErr = import(E->getLocation());
  5449. if (!ToLocationOrErr)
  5450. return ToLocationOrErr.takeError();
  5451. return FloatingLiteral::Create(
  5452. Importer.getToContext(), E->getValue(), E->isExact(),
  5453. *ToTypeOrErr, *ToLocationOrErr);
  5454. }
  5455. ExpectedStmt ASTNodeImporter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
  5456. auto ToTypeOrErr = import(E->getType());
  5457. if (!ToTypeOrErr)
  5458. return ToTypeOrErr.takeError();
  5459. ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
  5460. if (!ToSubExprOrErr)
  5461. return ToSubExprOrErr.takeError();
  5462. return new (Importer.getToContext()) ImaginaryLiteral(
  5463. *ToSubExprOrErr, *ToTypeOrErr);
  5464. }
  5465. ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
  5466. ExpectedType ToTypeOrErr = import(E->getType());
  5467. if (!ToTypeOrErr)
  5468. return ToTypeOrErr.takeError();
  5469. ExpectedSLoc ToLocationOrErr = import(E->getLocation());
  5470. if (!ToLocationOrErr)
  5471. return ToLocationOrErr.takeError();
  5472. return new (Importer.getToContext()) CharacterLiteral(
  5473. E->getValue(), E->getKind(), *ToTypeOrErr, *ToLocationOrErr);
  5474. }
  5475. ExpectedStmt ASTNodeImporter::VisitStringLiteral(StringLiteral *E) {
  5476. ExpectedType ToTypeOrErr = import(E->getType());
  5477. if (!ToTypeOrErr)
  5478. return ToTypeOrErr.takeError();
  5479. SmallVector<SourceLocation, 4> ToLocations(E->getNumConcatenated());
  5480. if (Error Err = ImportArrayChecked(
  5481. E->tokloc_begin(), E->tokloc_end(), ToLocations.begin()))
  5482. return std::move(Err);
  5483. return StringLiteral::Create(
  5484. Importer.getToContext(), E->getBytes(), E->getKind(), E->isPascal(),
  5485. *ToTypeOrErr, ToLocations.data(), ToLocations.size());
  5486. }
  5487. ExpectedStmt ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
  5488. auto Imp = importSeq(
  5489. E->getLParenLoc(), E->getTypeSourceInfo(), E->getType(),
  5490. E->getInitializer());
  5491. if (!Imp)
  5492. return Imp.takeError();
  5493. SourceLocation ToLParenLoc;
  5494. TypeSourceInfo *ToTypeSourceInfo;
  5495. QualType ToType;
  5496. Expr *ToInitializer;
  5497. std::tie(ToLParenLoc, ToTypeSourceInfo, ToType, ToInitializer) = *Imp;
  5498. return new (Importer.getToContext()) CompoundLiteralExpr(
  5499. ToLParenLoc, ToTypeSourceInfo, ToType, E->getValueKind(),
  5500. ToInitializer, E->isFileScope());
  5501. }
  5502. ExpectedStmt ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) {
  5503. auto Imp = importSeq(
  5504. E->getBuiltinLoc(), E->getType(), E->getRParenLoc());
  5505. if (!Imp)
  5506. return Imp.takeError();
  5507. SourceLocation ToBuiltinLoc, ToRParenLoc;
  5508. QualType ToType;
  5509. std::tie(ToBuiltinLoc, ToType, ToRParenLoc) = *Imp;
  5510. SmallVector<Expr *, 6> ToExprs(E->getNumSubExprs());
  5511. if (Error Err = ImportArrayChecked(
  5512. E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(),
  5513. ToExprs.begin()))
  5514. return std::move(Err);
  5515. return new (Importer.getToContext()) AtomicExpr(
  5516. ToBuiltinLoc, ToExprs, ToType, E->getOp(), ToRParenLoc);
  5517. }
  5518. ExpectedStmt ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) {
  5519. auto Imp = importSeq(
  5520. E->getAmpAmpLoc(), E->getLabelLoc(), E->getLabel(), E->getType());
  5521. if (!Imp)
  5522. return Imp.takeError();
  5523. SourceLocation ToAmpAmpLoc, ToLabelLoc;
  5524. LabelDecl *ToLabel;
  5525. QualType ToType;
  5526. std::tie(ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType) = *Imp;
  5527. return new (Importer.getToContext()) AddrLabelExpr(
  5528. ToAmpAmpLoc, ToLabelLoc, ToLabel, ToType);
  5529. }
  5530. ExpectedStmt ASTNodeImporter::VisitConstantExpr(ConstantExpr *E) {
  5531. auto Imp = importSeq(E->getSubExpr());
  5532. if (!Imp)
  5533. return Imp.takeError();
  5534. Expr *ToSubExpr;
  5535. std::tie(ToSubExpr) = *Imp;
  5536. // TODO : Handle APValue::ValueKind that require importing.
  5537. APValue::ValueKind Kind = E->getResultAPValueKind();
  5538. if (Kind == APValue::Int || Kind == APValue::Float ||
  5539. Kind == APValue::FixedPoint || Kind == APValue::ComplexFloat ||
  5540. Kind == APValue::ComplexInt)
  5541. return ConstantExpr::Create(Importer.getToContext(), ToSubExpr,
  5542. E->getAPValueResult());
  5543. return ConstantExpr::Create(Importer.getToContext(), ToSubExpr);
  5544. }
  5545. ExpectedStmt ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
  5546. auto Imp = importSeq(E->getLParen(), E->getRParen(), E->getSubExpr());
  5547. if (!Imp)
  5548. return Imp.takeError();
  5549. SourceLocation ToLParen, ToRParen;
  5550. Expr *ToSubExpr;
  5551. std::tie(ToLParen, ToRParen, ToSubExpr) = *Imp;
  5552. return new (Importer.getToContext())
  5553. ParenExpr(ToLParen, ToRParen, ToSubExpr);
  5554. }
  5555. ExpectedStmt ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) {
  5556. SmallVector<Expr *, 4> ToExprs(E->getNumExprs());
  5557. if (Error Err = ImportContainerChecked(E->exprs(), ToExprs))
  5558. return std::move(Err);
  5559. ExpectedSLoc ToLParenLocOrErr = import(E->getLParenLoc());
  5560. if (!ToLParenLocOrErr)
  5561. return ToLParenLocOrErr.takeError();
  5562. ExpectedSLoc ToRParenLocOrErr = import(E->getRParenLoc());
  5563. if (!ToRParenLocOrErr)
  5564. return ToRParenLocOrErr.takeError();
  5565. return ParenListExpr::Create(Importer.getToContext(), *ToLParenLocOrErr,
  5566. ToExprs, *ToRParenLocOrErr);
  5567. }
  5568. ExpectedStmt ASTNodeImporter::VisitStmtExpr(StmtExpr *E) {
  5569. auto Imp = importSeq(
  5570. E->getSubStmt(), E->getType(), E->getLParenLoc(), E->getRParenLoc());
  5571. if (!Imp)
  5572. return Imp.takeError();
  5573. CompoundStmt *ToSubStmt;
  5574. QualType ToType;
  5575. SourceLocation ToLParenLoc, ToRParenLoc;
  5576. std::tie(ToSubStmt, ToType, ToLParenLoc, ToRParenLoc) = *Imp;
  5577. return new (Importer.getToContext()) StmtExpr(
  5578. ToSubStmt, ToType, ToLParenLoc, ToRParenLoc);
  5579. }
  5580. ExpectedStmt ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
  5581. auto Imp = importSeq(
  5582. E->getSubExpr(), E->getType(), E->getOperatorLoc());
  5583. if (!Imp)
  5584. return Imp.takeError();
  5585. Expr *ToSubExpr;
  5586. QualType ToType;
  5587. SourceLocation ToOperatorLoc;
  5588. std::tie(ToSubExpr, ToType, ToOperatorLoc) = *Imp;
  5589. return new (Importer.getToContext()) UnaryOperator(
  5590. ToSubExpr, E->getOpcode(), ToType, E->getValueKind(), E->getObjectKind(),
  5591. ToOperatorLoc, E->canOverflow());
  5592. }
  5593. ExpectedStmt
  5594. ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
  5595. auto Imp = importSeq(E->getType(), E->getOperatorLoc(), E->getRParenLoc());
  5596. if (!Imp)
  5597. return Imp.takeError();
  5598. QualType ToType;
  5599. SourceLocation ToOperatorLoc, ToRParenLoc;
  5600. std::tie(ToType, ToOperatorLoc, ToRParenLoc) = *Imp;
  5601. if (E->isArgumentType()) {
  5602. Expected<TypeSourceInfo *> ToArgumentTypeInfoOrErr =
  5603. import(E->getArgumentTypeInfo());
  5604. if (!ToArgumentTypeInfoOrErr)
  5605. return ToArgumentTypeInfoOrErr.takeError();
  5606. return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
  5607. E->getKind(), *ToArgumentTypeInfoOrErr, ToType, ToOperatorLoc,
  5608. ToRParenLoc);
  5609. }
  5610. ExpectedExpr ToArgumentExprOrErr = import(E->getArgumentExpr());
  5611. if (!ToArgumentExprOrErr)
  5612. return ToArgumentExprOrErr.takeError();
  5613. return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(
  5614. E->getKind(), *ToArgumentExprOrErr, ToType, ToOperatorLoc, ToRParenLoc);
  5615. }
  5616. ExpectedStmt ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
  5617. auto Imp = importSeq(
  5618. E->getLHS(), E->getRHS(), E->getType(), E->getOperatorLoc());
  5619. if (!Imp)
  5620. return Imp.takeError();
  5621. Expr *ToLHS, *ToRHS;
  5622. QualType ToType;
  5623. SourceLocation ToOperatorLoc;
  5624. std::tie(ToLHS, ToRHS, ToType, ToOperatorLoc) = *Imp;
  5625. return new (Importer.getToContext()) BinaryOperator(
  5626. ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
  5627. E->getObjectKind(), ToOperatorLoc, E->getFPFeatures());
  5628. }
  5629. ExpectedStmt ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) {
  5630. auto Imp = importSeq(
  5631. E->getCond(), E->getQuestionLoc(), E->getLHS(), E->getColonLoc(),
  5632. E->getRHS(), E->getType());
  5633. if (!Imp)
  5634. return Imp.takeError();
  5635. Expr *ToCond, *ToLHS, *ToRHS;
  5636. SourceLocation ToQuestionLoc, ToColonLoc;
  5637. QualType ToType;
  5638. std::tie(ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType) = *Imp;
  5639. return new (Importer.getToContext()) ConditionalOperator(
  5640. ToCond, ToQuestionLoc, ToLHS, ToColonLoc, ToRHS, ToType,
  5641. E->getValueKind(), E->getObjectKind());
  5642. }
  5643. ExpectedStmt ASTNodeImporter::VisitBinaryConditionalOperator(
  5644. BinaryConditionalOperator *E) {
  5645. auto Imp = importSeq(
  5646. E->getCommon(), E->getOpaqueValue(), E->getCond(), E->getTrueExpr(),
  5647. E->getFalseExpr(), E->getQuestionLoc(), E->getColonLoc(), E->getType());
  5648. if (!Imp)
  5649. return Imp.takeError();
  5650. Expr *ToCommon, *ToCond, *ToTrueExpr, *ToFalseExpr;
  5651. OpaqueValueExpr *ToOpaqueValue;
  5652. SourceLocation ToQuestionLoc, ToColonLoc;
  5653. QualType ToType;
  5654. std::tie(
  5655. ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr, ToQuestionLoc,
  5656. ToColonLoc, ToType) = *Imp;
  5657. return new (Importer.getToContext()) BinaryConditionalOperator(
  5658. ToCommon, ToOpaqueValue, ToCond, ToTrueExpr, ToFalseExpr,
  5659. ToQuestionLoc, ToColonLoc, ToType, E->getValueKind(),
  5660. E->getObjectKind());
  5661. }
  5662. ExpectedStmt ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
  5663. auto Imp = importSeq(
  5664. E->getBeginLoc(), E->getQueriedTypeSourceInfo(),
  5665. E->getDimensionExpression(), E->getEndLoc(), E->getType());
  5666. if (!Imp)
  5667. return Imp.takeError();
  5668. SourceLocation ToBeginLoc, ToEndLoc;
  5669. TypeSourceInfo *ToQueriedTypeSourceInfo;
  5670. Expr *ToDimensionExpression;
  5671. QualType ToType;
  5672. std::tie(
  5673. ToBeginLoc, ToQueriedTypeSourceInfo, ToDimensionExpression, ToEndLoc,
  5674. ToType) = *Imp;
  5675. return new (Importer.getToContext()) ArrayTypeTraitExpr(
  5676. ToBeginLoc, E->getTrait(), ToQueriedTypeSourceInfo, E->getValue(),
  5677. ToDimensionExpression, ToEndLoc, ToType);
  5678. }
  5679. ExpectedStmt ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
  5680. auto Imp = importSeq(
  5681. E->getBeginLoc(), E->getQueriedExpression(), E->getEndLoc(), E->getType());
  5682. if (!Imp)
  5683. return Imp.takeError();
  5684. SourceLocation ToBeginLoc, ToEndLoc;
  5685. Expr *ToQueriedExpression;
  5686. QualType ToType;
  5687. std::tie(ToBeginLoc, ToQueriedExpression, ToEndLoc, ToType) = *Imp;
  5688. return new (Importer.getToContext()) ExpressionTraitExpr(
  5689. ToBeginLoc, E->getTrait(), ToQueriedExpression, E->getValue(),
  5690. ToEndLoc, ToType);
  5691. }
  5692. ExpectedStmt ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
  5693. auto Imp = importSeq(
  5694. E->getLocation(), E->getType(), E->getSourceExpr());
  5695. if (!Imp)
  5696. return Imp.takeError();
  5697. SourceLocation ToLocation;
  5698. QualType ToType;
  5699. Expr *ToSourceExpr;
  5700. std::tie(ToLocation, ToType, ToSourceExpr) = *Imp;
  5701. return new (Importer.getToContext()) OpaqueValueExpr(
  5702. ToLocation, ToType, E->getValueKind(), E->getObjectKind(), ToSourceExpr);
  5703. }
  5704. ExpectedStmt ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
  5705. auto Imp = importSeq(
  5706. E->getLHS(), E->getRHS(), E->getType(), E->getRBracketLoc());
  5707. if (!Imp)
  5708. return Imp.takeError();
  5709. Expr *ToLHS, *ToRHS;
  5710. SourceLocation ToRBracketLoc;
  5711. QualType ToType;
  5712. std::tie(ToLHS, ToRHS, ToType, ToRBracketLoc) = *Imp;
  5713. return new (Importer.getToContext()) ArraySubscriptExpr(
  5714. ToLHS, ToRHS, ToType, E->getValueKind(), E->getObjectKind(),
  5715. ToRBracketLoc);
  5716. }
  5717. ExpectedStmt
  5718. ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
  5719. auto Imp = importSeq(
  5720. E->getLHS(), E->getRHS(), E->getType(), E->getComputationLHSType(),
  5721. E->getComputationResultType(), E->getOperatorLoc());
  5722. if (!Imp)
  5723. return Imp.takeError();
  5724. Expr *ToLHS, *ToRHS;
  5725. QualType ToType, ToComputationLHSType, ToComputationResultType;
  5726. SourceLocation ToOperatorLoc;
  5727. std::tie(ToLHS, ToRHS, ToType, ToComputationLHSType, ToComputationResultType,
  5728. ToOperatorLoc) = *Imp;
  5729. return new (Importer.getToContext()) CompoundAssignOperator(
  5730. ToLHS, ToRHS, E->getOpcode(), ToType, E->getValueKind(),
  5731. E->getObjectKind(), ToComputationLHSType, ToComputationResultType,
  5732. ToOperatorLoc, E->getFPFeatures());
  5733. }
  5734. Expected<CXXCastPath>
  5735. ASTNodeImporter::ImportCastPath(CastExpr *CE) {
  5736. CXXCastPath Path;
  5737. for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) {
  5738. if (auto SpecOrErr = import(*I))
  5739. Path.push_back(*SpecOrErr);
  5740. else
  5741. return SpecOrErr.takeError();
  5742. }
  5743. return Path;
  5744. }
  5745. ExpectedStmt ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
  5746. ExpectedType ToTypeOrErr = import(E->getType());
  5747. if (!ToTypeOrErr)
  5748. return ToTypeOrErr.takeError();
  5749. ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
  5750. if (!ToSubExprOrErr)
  5751. return ToSubExprOrErr.takeError();
  5752. Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
  5753. if (!ToBasePathOrErr)
  5754. return ToBasePathOrErr.takeError();
  5755. return ImplicitCastExpr::Create(
  5756. Importer.getToContext(), *ToTypeOrErr, E->getCastKind(), *ToSubExprOrErr,
  5757. &(*ToBasePathOrErr), E->getValueKind());
  5758. }
  5759. ExpectedStmt ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
  5760. auto Imp1 = importSeq(
  5761. E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten());
  5762. if (!Imp1)
  5763. return Imp1.takeError();
  5764. QualType ToType;
  5765. Expr *ToSubExpr;
  5766. TypeSourceInfo *ToTypeInfoAsWritten;
  5767. std::tie(ToType, ToSubExpr, ToTypeInfoAsWritten) = *Imp1;
  5768. Expected<CXXCastPath> ToBasePathOrErr = ImportCastPath(E);
  5769. if (!ToBasePathOrErr)
  5770. return ToBasePathOrErr.takeError();
  5771. CXXCastPath *ToBasePath = &(*ToBasePathOrErr);
  5772. switch (E->getStmtClass()) {
  5773. case Stmt::CStyleCastExprClass: {
  5774. auto *CCE = cast<CStyleCastExpr>(E);
  5775. ExpectedSLoc ToLParenLocOrErr = import(CCE->getLParenLoc());
  5776. if (!ToLParenLocOrErr)
  5777. return ToLParenLocOrErr.takeError();
  5778. ExpectedSLoc ToRParenLocOrErr = import(CCE->getRParenLoc());
  5779. if (!ToRParenLocOrErr)
  5780. return ToRParenLocOrErr.takeError();
  5781. return CStyleCastExpr::Create(
  5782. Importer.getToContext(), ToType, E->getValueKind(), E->getCastKind(),
  5783. ToSubExpr, ToBasePath, ToTypeInfoAsWritten, *ToLParenLocOrErr,
  5784. *ToRParenLocOrErr);
  5785. }
  5786. case Stmt::CXXFunctionalCastExprClass: {
  5787. auto *FCE = cast<CXXFunctionalCastExpr>(E);
  5788. ExpectedSLoc ToLParenLocOrErr = import(FCE->getLParenLoc());
  5789. if (!ToLParenLocOrErr)
  5790. return ToLParenLocOrErr.takeError();
  5791. ExpectedSLoc ToRParenLocOrErr = import(FCE->getRParenLoc());
  5792. if (!ToRParenLocOrErr)
  5793. return ToRParenLocOrErr.takeError();
  5794. return CXXFunctionalCastExpr::Create(
  5795. Importer.getToContext(), ToType, E->getValueKind(), ToTypeInfoAsWritten,
  5796. E->getCastKind(), ToSubExpr, ToBasePath, *ToLParenLocOrErr,
  5797. *ToRParenLocOrErr);
  5798. }
  5799. case Stmt::ObjCBridgedCastExprClass: {
  5800. auto *OCE = cast<ObjCBridgedCastExpr>(E);
  5801. ExpectedSLoc ToLParenLocOrErr = import(OCE->getLParenLoc());
  5802. if (!ToLParenLocOrErr)
  5803. return ToLParenLocOrErr.takeError();
  5804. ExpectedSLoc ToBridgeKeywordLocOrErr = import(OCE->getBridgeKeywordLoc());
  5805. if (!ToBridgeKeywordLocOrErr)
  5806. return ToBridgeKeywordLocOrErr.takeError();
  5807. return new (Importer.getToContext()) ObjCBridgedCastExpr(
  5808. *ToLParenLocOrErr, OCE->getBridgeKind(), E->getCastKind(),
  5809. *ToBridgeKeywordLocOrErr, ToTypeInfoAsWritten, ToSubExpr);
  5810. }
  5811. default:
  5812. llvm_unreachable("Cast expression of unsupported type!");
  5813. return make_error<ImportError>(ImportError::UnsupportedConstruct);
  5814. }
  5815. }
  5816. ExpectedStmt ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *E) {
  5817. SmallVector<OffsetOfNode, 4> ToNodes;
  5818. for (int I = 0, N = E->getNumComponents(); I < N; ++I) {
  5819. const OffsetOfNode &FromNode = E->getComponent(I);
  5820. SourceLocation ToBeginLoc, ToEndLoc;
  5821. if (FromNode.getKind() != OffsetOfNode::Base) {
  5822. auto Imp = importSeq(FromNode.getBeginLoc(), FromNode.getEndLoc());
  5823. if (!Imp)
  5824. return Imp.takeError();
  5825. std::tie(ToBeginLoc, ToEndLoc) = *Imp;
  5826. }
  5827. switch (FromNode.getKind()) {
  5828. case OffsetOfNode::Array:
  5829. ToNodes.push_back(
  5830. OffsetOfNode(ToBeginLoc, FromNode.getArrayExprIndex(), ToEndLoc));
  5831. break;
  5832. case OffsetOfNode::Base: {
  5833. auto ToBSOrErr = import(FromNode.getBase());
  5834. if (!ToBSOrErr)
  5835. return ToBSOrErr.takeError();
  5836. ToNodes.push_back(OffsetOfNode(*ToBSOrErr));
  5837. break;
  5838. }
  5839. case OffsetOfNode::Field: {
  5840. auto ToFieldOrErr = import(FromNode.getField());
  5841. if (!ToFieldOrErr)
  5842. return ToFieldOrErr.takeError();
  5843. ToNodes.push_back(OffsetOfNode(ToBeginLoc, *ToFieldOrErr, ToEndLoc));
  5844. break;
  5845. }
  5846. case OffsetOfNode::Identifier: {
  5847. IdentifierInfo *ToII = Importer.Import(FromNode.getFieldName());
  5848. ToNodes.push_back(OffsetOfNode(ToBeginLoc, ToII, ToEndLoc));
  5849. break;
  5850. }
  5851. }
  5852. }
  5853. SmallVector<Expr *, 4> ToExprs(E->getNumExpressions());
  5854. for (int I = 0, N = E->getNumExpressions(); I < N; ++I) {
  5855. ExpectedExpr ToIndexExprOrErr = import(E->getIndexExpr(I));
  5856. if (!ToIndexExprOrErr)
  5857. return ToIndexExprOrErr.takeError();
  5858. ToExprs[I] = *ToIndexExprOrErr;
  5859. }
  5860. auto Imp = importSeq(
  5861. E->getType(), E->getTypeSourceInfo(), E->getOperatorLoc(),
  5862. E->getRParenLoc());
  5863. if (!Imp)
  5864. return Imp.takeError();
  5865. QualType ToType;
  5866. TypeSourceInfo *ToTypeSourceInfo;
  5867. SourceLocation ToOperatorLoc, ToRParenLoc;
  5868. std::tie(ToType, ToTypeSourceInfo, ToOperatorLoc, ToRParenLoc) = *Imp;
  5869. return OffsetOfExpr::Create(
  5870. Importer.getToContext(), ToType, ToOperatorLoc, ToTypeSourceInfo, ToNodes,
  5871. ToExprs, ToRParenLoc);
  5872. }
  5873. ExpectedStmt ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
  5874. auto Imp = importSeq(
  5875. E->getType(), E->getOperand(), E->getBeginLoc(), E->getEndLoc());
  5876. if (!Imp)
  5877. return Imp.takeError();
  5878. QualType ToType;
  5879. Expr *ToOperand;
  5880. SourceLocation ToBeginLoc, ToEndLoc;
  5881. std::tie(ToType, ToOperand, ToBeginLoc, ToEndLoc) = *Imp;
  5882. CanThrowResult ToCanThrow;
  5883. if (E->isValueDependent())
  5884. ToCanThrow = CT_Dependent;
  5885. else
  5886. ToCanThrow = E->getValue() ? CT_Can : CT_Cannot;
  5887. return new (Importer.getToContext()) CXXNoexceptExpr(
  5888. ToType, ToOperand, ToCanThrow, ToBeginLoc, ToEndLoc);
  5889. }
  5890. ExpectedStmt ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) {
  5891. auto Imp = importSeq(E->getSubExpr(), E->getType(), E->getThrowLoc());
  5892. if (!Imp)
  5893. return Imp.takeError();
  5894. Expr *ToSubExpr;
  5895. QualType ToType;
  5896. SourceLocation ToThrowLoc;
  5897. std::tie(ToSubExpr, ToType, ToThrowLoc) = *Imp;
  5898. return new (Importer.getToContext()) CXXThrowExpr(
  5899. ToSubExpr, ToType, ToThrowLoc, E->isThrownVariableInScope());
  5900. }
  5901. ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
  5902. ExpectedSLoc ToUsedLocOrErr = import(E->getUsedLocation());
  5903. if (!ToUsedLocOrErr)
  5904. return ToUsedLocOrErr.takeError();
  5905. auto ToParamOrErr = import(E->getParam());
  5906. if (!ToParamOrErr)
  5907. return ToParamOrErr.takeError();
  5908. auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());
  5909. if (!UsedContextOrErr)
  5910. return UsedContextOrErr.takeError();
  5911. // Import the default arg if it was not imported yet.
  5912. // This is needed because it can happen that during the import of the
  5913. // default expression (from VisitParmVarDecl) the same ParmVarDecl is
  5914. // encountered here. The default argument for a ParmVarDecl is set in the
  5915. // ParmVarDecl only after it is imported (set in VisitParmVarDecl if not here,
  5916. // see VisitParmVarDecl).
  5917. ParmVarDecl *ToParam = *ToParamOrErr;
  5918. if (!ToParam->getDefaultArg()) {
  5919. Optional<ParmVarDecl *> FromParam = Importer.getImportedFromDecl(ToParam);
  5920. assert(FromParam && "ParmVarDecl was not imported?");
  5921. if (Error Err = ImportDefaultArgOfParmVarDecl(*FromParam, ToParam))
  5922. return std::move(Err);
  5923. }
  5924. return CXXDefaultArgExpr::Create(Importer.getToContext(), *ToUsedLocOrErr,
  5925. *ToParamOrErr, *UsedContextOrErr);
  5926. }
  5927. ExpectedStmt
  5928. ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
  5929. auto Imp = importSeq(
  5930. E->getType(), E->getTypeSourceInfo(), E->getRParenLoc());
  5931. if (!Imp)
  5932. return Imp.takeError();
  5933. QualType ToType;
  5934. TypeSourceInfo *ToTypeSourceInfo;
  5935. SourceLocation ToRParenLoc;
  5936. std::tie(ToType, ToTypeSourceInfo, ToRParenLoc) = *Imp;
  5937. return new (Importer.getToContext()) CXXScalarValueInitExpr(
  5938. ToType, ToTypeSourceInfo, ToRParenLoc);
  5939. }
  5940. ExpectedStmt
  5941. ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
  5942. ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
  5943. if (!ToSubExprOrErr)
  5944. return ToSubExprOrErr.takeError();
  5945. auto ToDtorOrErr = import(E->getTemporary()->getDestructor());
  5946. if (!ToDtorOrErr)
  5947. return ToDtorOrErr.takeError();
  5948. ASTContext &ToCtx = Importer.getToContext();
  5949. CXXTemporary *Temp = CXXTemporary::Create(ToCtx, *ToDtorOrErr);
  5950. return CXXBindTemporaryExpr::Create(ToCtx, Temp, *ToSubExprOrErr);
  5951. }
  5952. ExpectedStmt
  5953. ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
  5954. auto Imp = importSeq(
  5955. E->getConstructor(), E->getType(), E->getTypeSourceInfo(),
  5956. E->getParenOrBraceRange());
  5957. if (!Imp)
  5958. return Imp.takeError();
  5959. CXXConstructorDecl *ToConstructor;
  5960. QualType ToType;
  5961. TypeSourceInfo *ToTypeSourceInfo;
  5962. SourceRange ToParenOrBraceRange;
  5963. std::tie(ToConstructor, ToType, ToTypeSourceInfo, ToParenOrBraceRange) = *Imp;
  5964. SmallVector<Expr *, 8> ToArgs(E->getNumArgs());
  5965. if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
  5966. return std::move(Err);
  5967. return CXXTemporaryObjectExpr::Create(
  5968. Importer.getToContext(), ToConstructor, ToType, ToTypeSourceInfo, ToArgs,
  5969. ToParenOrBraceRange, E->hadMultipleCandidates(),
  5970. E->isListInitialization(), E->isStdInitListInitialization(),
  5971. E->requiresZeroInitialization());
  5972. }
  5973. ExpectedStmt
  5974. ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
  5975. auto Imp = importSeq(
  5976. E->getType(), E->GetTemporaryExpr(), E->getExtendingDecl());
  5977. if (!Imp)
  5978. return Imp.takeError();
  5979. QualType ToType;
  5980. Expr *ToTemporaryExpr;
  5981. const ValueDecl *ToExtendingDecl;
  5982. std::tie(ToType, ToTemporaryExpr, ToExtendingDecl) = *Imp;
  5983. auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr(
  5984. ToType, ToTemporaryExpr, E->isBoundToLvalueReference());
  5985. // FIXME: Should ManglingNumber get numbers associated with 'to' context?
  5986. ToMTE->setExtendingDecl(ToExtendingDecl, E->getManglingNumber());
  5987. return ToMTE;
  5988. }
  5989. ExpectedStmt ASTNodeImporter::VisitPackExpansionExpr(PackExpansionExpr *E) {
  5990. auto Imp = importSeq(
  5991. E->getType(), E->getPattern(), E->getEllipsisLoc());
  5992. if (!Imp)
  5993. return Imp.takeError();
  5994. QualType ToType;
  5995. Expr *ToPattern;
  5996. SourceLocation ToEllipsisLoc;
  5997. std::tie(ToType, ToPattern, ToEllipsisLoc) = *Imp;
  5998. return new (Importer.getToContext()) PackExpansionExpr(
  5999. ToType, ToPattern, ToEllipsisLoc, E->getNumExpansions());
  6000. }
  6001. ExpectedStmt ASTNodeImporter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
  6002. auto Imp = importSeq(
  6003. E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc());
  6004. if (!Imp)
  6005. return Imp.takeError();
  6006. SourceLocation ToOperatorLoc, ToPackLoc, ToRParenLoc;
  6007. NamedDecl *ToPack;
  6008. std::tie(ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc) = *Imp;
  6009. Optional<unsigned> Length;
  6010. if (!E->isValueDependent())
  6011. Length = E->getPackLength();
  6012. SmallVector<TemplateArgument, 8> ToPartialArguments;
  6013. if (E->isPartiallySubstituted()) {
  6014. if (Error Err = ImportTemplateArguments(
  6015. E->getPartialArguments().data(),
  6016. E->getPartialArguments().size(),
  6017. ToPartialArguments))
  6018. return std::move(Err);
  6019. }
  6020. return SizeOfPackExpr::Create(
  6021. Importer.getToContext(), ToOperatorLoc, ToPack, ToPackLoc, ToRParenLoc,
  6022. Length, ToPartialArguments);
  6023. }
  6024. ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) {
  6025. auto Imp = importSeq(
  6026. E->getOperatorNew(), E->getOperatorDelete(), E->getTypeIdParens(),
  6027. E->getArraySize(), E->getInitializer(), E->getType(),
  6028. E->getAllocatedTypeSourceInfo(), E->getSourceRange(),
  6029. E->getDirectInitRange());
  6030. if (!Imp)
  6031. return Imp.takeError();
  6032. FunctionDecl *ToOperatorNew, *ToOperatorDelete;
  6033. SourceRange ToTypeIdParens, ToSourceRange, ToDirectInitRange;
  6034. Optional<Expr *> ToArraySize;
  6035. Expr *ToInitializer;
  6036. QualType ToType;
  6037. TypeSourceInfo *ToAllocatedTypeSourceInfo;
  6038. std::tie(
  6039. ToOperatorNew, ToOperatorDelete, ToTypeIdParens, ToArraySize, ToInitializer,
  6040. ToType, ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange) = *Imp;
  6041. SmallVector<Expr *, 4> ToPlacementArgs(E->getNumPlacementArgs());
  6042. if (Error Err =
  6043. ImportContainerChecked(E->placement_arguments(), ToPlacementArgs))
  6044. return std::move(Err);
  6045. return CXXNewExpr::Create(
  6046. Importer.getToContext(), E->isGlobalNew(), ToOperatorNew,
  6047. ToOperatorDelete, E->passAlignment(), E->doesUsualArrayDeleteWantSize(),
  6048. ToPlacementArgs, ToTypeIdParens, ToArraySize, E->getInitializationStyle(),
  6049. ToInitializer, ToType, ToAllocatedTypeSourceInfo, ToSourceRange,
  6050. ToDirectInitRange);
  6051. }
  6052. ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
  6053. auto Imp = importSeq(
  6054. E->getType(), E->getOperatorDelete(), E->getArgument(), E->getBeginLoc());
  6055. if (!Imp)
  6056. return Imp.takeError();
  6057. QualType ToType;
  6058. FunctionDecl *ToOperatorDelete;
  6059. Expr *ToArgument;
  6060. SourceLocation ToBeginLoc;
  6061. std::tie(ToType, ToOperatorDelete, ToArgument, ToBeginLoc) = *Imp;
  6062. return new (Importer.getToContext()) CXXDeleteExpr(
  6063. ToType, E->isGlobalDelete(), E->isArrayForm(), E->isArrayFormAsWritten(),
  6064. E->doesUsualArrayDeleteWantSize(), ToOperatorDelete, ToArgument,
  6065. ToBeginLoc);
  6066. }
  6067. ExpectedStmt ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
  6068. auto Imp = importSeq(
  6069. E->getType(), E->getLocation(), E->getConstructor(),
  6070. E->getParenOrBraceRange());
  6071. if (!Imp)
  6072. return Imp.takeError();
  6073. QualType ToType;
  6074. SourceLocation ToLocation;
  6075. CXXConstructorDecl *ToConstructor;
  6076. SourceRange ToParenOrBraceRange;
  6077. std::tie(ToType, ToLocation, ToConstructor, ToParenOrBraceRange) = *Imp;
  6078. SmallVector<Expr *, 6> ToArgs(E->getNumArgs());
  6079. if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
  6080. return std::move(Err);
  6081. return CXXConstructExpr::Create(
  6082. Importer.getToContext(), ToType, ToLocation, ToConstructor,
  6083. E->isElidable(), ToArgs, E->hadMultipleCandidates(),
  6084. E->isListInitialization(), E->isStdInitListInitialization(),
  6085. E->requiresZeroInitialization(), E->getConstructionKind(),
  6086. ToParenOrBraceRange);
  6087. }
  6088. ExpectedStmt ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *E) {
  6089. ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
  6090. if (!ToSubExprOrErr)
  6091. return ToSubExprOrErr.takeError();
  6092. SmallVector<ExprWithCleanups::CleanupObject, 8> ToObjects(E->getNumObjects());
  6093. if (Error Err = ImportContainerChecked(E->getObjects(), ToObjects))
  6094. return std::move(Err);
  6095. return ExprWithCleanups::Create(
  6096. Importer.getToContext(), *ToSubExprOrErr, E->cleanupsHaveSideEffects(),
  6097. ToObjects);
  6098. }
  6099. ExpectedStmt ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
  6100. auto Imp = importSeq(
  6101. E->getCallee(), E->getType(), E->getRParenLoc());
  6102. if (!Imp)
  6103. return Imp.takeError();
  6104. Expr *ToCallee;
  6105. QualType ToType;
  6106. SourceLocation ToRParenLoc;
  6107. std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
  6108. SmallVector<Expr *, 4> ToArgs(E->getNumArgs());
  6109. if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
  6110. return std::move(Err);
  6111. return CXXMemberCallExpr::Create(Importer.getToContext(), ToCallee, ToArgs,
  6112. ToType, E->getValueKind(), ToRParenLoc);
  6113. }
  6114. ExpectedStmt ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) {
  6115. ExpectedType ToTypeOrErr = import(E->getType());
  6116. if (!ToTypeOrErr)
  6117. return ToTypeOrErr.takeError();
  6118. ExpectedSLoc ToLocationOrErr = import(E->getLocation());
  6119. if (!ToLocationOrErr)
  6120. return ToLocationOrErr.takeError();
  6121. return new (Importer.getToContext()) CXXThisExpr(
  6122. *ToLocationOrErr, *ToTypeOrErr, E->isImplicit());
  6123. }
  6124. ExpectedStmt ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
  6125. ExpectedType ToTypeOrErr = import(E->getType());
  6126. if (!ToTypeOrErr)
  6127. return ToTypeOrErr.takeError();
  6128. ExpectedSLoc ToLocationOrErr = import(E->getLocation());
  6129. if (!ToLocationOrErr)
  6130. return ToLocationOrErr.takeError();
  6131. return new (Importer.getToContext()) CXXBoolLiteralExpr(
  6132. E->getValue(), *ToTypeOrErr, *ToLocationOrErr);
  6133. }
  6134. ExpectedStmt ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
  6135. auto Imp1 = importSeq(
  6136. E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
  6137. E->getTemplateKeywordLoc(), E->getMemberDecl(), E->getType());
  6138. if (!Imp1)
  6139. return Imp1.takeError();
  6140. Expr *ToBase;
  6141. SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
  6142. NestedNameSpecifierLoc ToQualifierLoc;
  6143. ValueDecl *ToMemberDecl;
  6144. QualType ToType;
  6145. std::tie(
  6146. ToBase, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc, ToMemberDecl,
  6147. ToType) = *Imp1;
  6148. auto Imp2 = importSeq(
  6149. E->getFoundDecl().getDecl(), E->getMemberNameInfo().getName(),
  6150. E->getMemberNameInfo().getLoc(), E->getLAngleLoc(), E->getRAngleLoc());
  6151. if (!Imp2)
  6152. return Imp2.takeError();
  6153. NamedDecl *ToDecl;
  6154. DeclarationName ToName;
  6155. SourceLocation ToLoc, ToLAngleLoc, ToRAngleLoc;
  6156. std::tie(ToDecl, ToName, ToLoc, ToLAngleLoc, ToRAngleLoc) = *Imp2;
  6157. DeclAccessPair ToFoundDecl =
  6158. DeclAccessPair::make(ToDecl, E->getFoundDecl().getAccess());
  6159. DeclarationNameInfo ToMemberNameInfo(ToName, ToLoc);
  6160. TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;
  6161. if (E->hasExplicitTemplateArgs()) {
  6162. if (Error Err =
  6163. ImportTemplateArgumentListInfo(E->getLAngleLoc(), E->getRAngleLoc(),
  6164. E->template_arguments(), ToTAInfo))
  6165. return std::move(Err);
  6166. ResInfo = &ToTAInfo;
  6167. }
  6168. return MemberExpr::Create(Importer.getToContext(), ToBase, E->isArrow(),
  6169. ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
  6170. ToMemberDecl, ToFoundDecl, ToMemberNameInfo,
  6171. ResInfo, ToType, E->getValueKind(),
  6172. E->getObjectKind(), E->isNonOdrUse());
  6173. }
  6174. ExpectedStmt
  6175. ASTNodeImporter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
  6176. auto Imp = importSeq(
  6177. E->getBase(), E->getOperatorLoc(), E->getQualifierLoc(),
  6178. E->getScopeTypeInfo(), E->getColonColonLoc(), E->getTildeLoc());
  6179. if (!Imp)
  6180. return Imp.takeError();
  6181. Expr *ToBase;
  6182. SourceLocation ToOperatorLoc, ToColonColonLoc, ToTildeLoc;
  6183. NestedNameSpecifierLoc ToQualifierLoc;
  6184. TypeSourceInfo *ToScopeTypeInfo;
  6185. std::tie(
  6186. ToBase, ToOperatorLoc, ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc,
  6187. ToTildeLoc) = *Imp;
  6188. PseudoDestructorTypeStorage Storage;
  6189. if (IdentifierInfo *FromII = E->getDestroyedTypeIdentifier()) {
  6190. IdentifierInfo *ToII = Importer.Import(FromII);
  6191. ExpectedSLoc ToDestroyedTypeLocOrErr = import(E->getDestroyedTypeLoc());
  6192. if (!ToDestroyedTypeLocOrErr)
  6193. return ToDestroyedTypeLocOrErr.takeError();
  6194. Storage = PseudoDestructorTypeStorage(ToII, *ToDestroyedTypeLocOrErr);
  6195. } else {
  6196. if (auto ToTIOrErr = import(E->getDestroyedTypeInfo()))
  6197. Storage = PseudoDestructorTypeStorage(*ToTIOrErr);
  6198. else
  6199. return ToTIOrErr.takeError();
  6200. }
  6201. return new (Importer.getToContext()) CXXPseudoDestructorExpr(
  6202. Importer.getToContext(), ToBase, E->isArrow(), ToOperatorLoc,
  6203. ToQualifierLoc, ToScopeTypeInfo, ToColonColonLoc, ToTildeLoc, Storage);
  6204. }
  6205. ExpectedStmt ASTNodeImporter::VisitCXXDependentScopeMemberExpr(
  6206. CXXDependentScopeMemberExpr *E) {
  6207. auto Imp = importSeq(
  6208. E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
  6209. E->getTemplateKeywordLoc(), E->getFirstQualifierFoundInScope());
  6210. if (!Imp)
  6211. return Imp.takeError();
  6212. QualType ToType;
  6213. SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
  6214. NestedNameSpecifierLoc ToQualifierLoc;
  6215. NamedDecl *ToFirstQualifierFoundInScope;
  6216. std::tie(
  6217. ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
  6218. ToFirstQualifierFoundInScope) = *Imp;
  6219. Expr *ToBase = nullptr;
  6220. if (!E->isImplicitAccess()) {
  6221. if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
  6222. ToBase = *ToBaseOrErr;
  6223. else
  6224. return ToBaseOrErr.takeError();
  6225. }
  6226. TemplateArgumentListInfo ToTAInfo, *ResInfo = nullptr;
  6227. if (E->hasExplicitTemplateArgs()) {
  6228. if (Error Err = ImportTemplateArgumentListInfo(
  6229. E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
  6230. ToTAInfo))
  6231. return std::move(Err);
  6232. ResInfo = &ToTAInfo;
  6233. }
  6234. auto ToMemberNameInfoOrErr = importSeq(E->getMember(), E->getMemberLoc());
  6235. if (!ToMemberNameInfoOrErr)
  6236. return ToMemberNameInfoOrErr.takeError();
  6237. DeclarationNameInfo ToMemberNameInfo(
  6238. std::get<0>(*ToMemberNameInfoOrErr), std::get<1>(*ToMemberNameInfoOrErr));
  6239. // Import additional name location/type info.
  6240. if (Error Err = ImportDeclarationNameLoc(
  6241. E->getMemberNameInfo(), ToMemberNameInfo))
  6242. return std::move(Err);
  6243. return CXXDependentScopeMemberExpr::Create(
  6244. Importer.getToContext(), ToBase, ToType, E->isArrow(), ToOperatorLoc,
  6245. ToQualifierLoc, ToTemplateKeywordLoc, ToFirstQualifierFoundInScope,
  6246. ToMemberNameInfo, ResInfo);
  6247. }
  6248. ExpectedStmt
  6249. ASTNodeImporter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
  6250. auto Imp = importSeq(
  6251. E->getQualifierLoc(), E->getTemplateKeywordLoc(), E->getDeclName(),
  6252. E->getExprLoc(), E->getLAngleLoc(), E->getRAngleLoc());
  6253. if (!Imp)
  6254. return Imp.takeError();
  6255. NestedNameSpecifierLoc ToQualifierLoc;
  6256. SourceLocation ToTemplateKeywordLoc, ToExprLoc, ToLAngleLoc, ToRAngleLoc;
  6257. DeclarationName ToDeclName;
  6258. std::tie(
  6259. ToQualifierLoc, ToTemplateKeywordLoc, ToDeclName, ToExprLoc,
  6260. ToLAngleLoc, ToRAngleLoc) = *Imp;
  6261. DeclarationNameInfo ToNameInfo(ToDeclName, ToExprLoc);
  6262. if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
  6263. return std::move(Err);
  6264. TemplateArgumentListInfo ToTAInfo(ToLAngleLoc, ToRAngleLoc);
  6265. TemplateArgumentListInfo *ResInfo = nullptr;
  6266. if (E->hasExplicitTemplateArgs()) {
  6267. if (Error Err =
  6268. ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
  6269. return std::move(Err);
  6270. ResInfo = &ToTAInfo;
  6271. }
  6272. return DependentScopeDeclRefExpr::Create(
  6273. Importer.getToContext(), ToQualifierLoc, ToTemplateKeywordLoc,
  6274. ToNameInfo, ResInfo);
  6275. }
  6276. ExpectedStmt ASTNodeImporter::VisitCXXUnresolvedConstructExpr(
  6277. CXXUnresolvedConstructExpr *E) {
  6278. auto Imp = importSeq(
  6279. E->getLParenLoc(), E->getRParenLoc(), E->getTypeSourceInfo());
  6280. if (!Imp)
  6281. return Imp.takeError();
  6282. SourceLocation ToLParenLoc, ToRParenLoc;
  6283. TypeSourceInfo *ToTypeSourceInfo;
  6284. std::tie(ToLParenLoc, ToRParenLoc, ToTypeSourceInfo) = *Imp;
  6285. SmallVector<Expr *, 8> ToArgs(E->arg_size());
  6286. if (Error Err =
  6287. ImportArrayChecked(E->arg_begin(), E->arg_end(), ToArgs.begin()))
  6288. return std::move(Err);
  6289. return CXXUnresolvedConstructExpr::Create(
  6290. Importer.getToContext(), ToTypeSourceInfo, ToLParenLoc,
  6291. llvm::makeArrayRef(ToArgs), ToRParenLoc);
  6292. }
  6293. ExpectedStmt
  6294. ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
  6295. Expected<CXXRecordDecl *> ToNamingClassOrErr = import(E->getNamingClass());
  6296. if (!ToNamingClassOrErr)
  6297. return ToNamingClassOrErr.takeError();
  6298. auto ToQualifierLocOrErr = import(E->getQualifierLoc());
  6299. if (!ToQualifierLocOrErr)
  6300. return ToQualifierLocOrErr.takeError();
  6301. auto ToNameInfoOrErr = importSeq(E->getName(), E->getNameLoc());
  6302. if (!ToNameInfoOrErr)
  6303. return ToNameInfoOrErr.takeError();
  6304. DeclarationNameInfo ToNameInfo(
  6305. std::get<0>(*ToNameInfoOrErr), std::get<1>(*ToNameInfoOrErr));
  6306. // Import additional name location/type info.
  6307. if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
  6308. return std::move(Err);
  6309. UnresolvedSet<8> ToDecls;
  6310. for (auto *D : E->decls())
  6311. if (auto ToDOrErr = import(D))
  6312. ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
  6313. else
  6314. return ToDOrErr.takeError();
  6315. if (E->hasExplicitTemplateArgs() && E->getTemplateKeywordLoc().isValid()) {
  6316. TemplateArgumentListInfo ToTAInfo;
  6317. if (Error Err = ImportTemplateArgumentListInfo(
  6318. E->getLAngleLoc(), E->getRAngleLoc(), E->template_arguments(),
  6319. ToTAInfo))
  6320. return std::move(Err);
  6321. ExpectedSLoc ToTemplateKeywordLocOrErr = import(E->getTemplateKeywordLoc());
  6322. if (!ToTemplateKeywordLocOrErr)
  6323. return ToTemplateKeywordLocOrErr.takeError();
  6324. return UnresolvedLookupExpr::Create(
  6325. Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
  6326. *ToTemplateKeywordLocOrErr, ToNameInfo, E->requiresADL(), &ToTAInfo,
  6327. ToDecls.begin(), ToDecls.end());
  6328. }
  6329. return UnresolvedLookupExpr::Create(
  6330. Importer.getToContext(), *ToNamingClassOrErr, *ToQualifierLocOrErr,
  6331. ToNameInfo, E->requiresADL(), E->isOverloaded(), ToDecls.begin(),
  6332. ToDecls.end());
  6333. }
  6334. ExpectedStmt
  6335. ASTNodeImporter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
  6336. auto Imp1 = importSeq(
  6337. E->getType(), E->getOperatorLoc(), E->getQualifierLoc(),
  6338. E->getTemplateKeywordLoc());
  6339. if (!Imp1)
  6340. return Imp1.takeError();
  6341. QualType ToType;
  6342. SourceLocation ToOperatorLoc, ToTemplateKeywordLoc;
  6343. NestedNameSpecifierLoc ToQualifierLoc;
  6344. std::tie(ToType, ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc) = *Imp1;
  6345. auto Imp2 = importSeq(E->getName(), E->getNameLoc());
  6346. if (!Imp2)
  6347. return Imp2.takeError();
  6348. DeclarationNameInfo ToNameInfo(std::get<0>(*Imp2), std::get<1>(*Imp2));
  6349. // Import additional name location/type info.
  6350. if (Error Err = ImportDeclarationNameLoc(E->getNameInfo(), ToNameInfo))
  6351. return std::move(Err);
  6352. UnresolvedSet<8> ToDecls;
  6353. for (Decl *D : E->decls())
  6354. if (auto ToDOrErr = import(D))
  6355. ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
  6356. else
  6357. return ToDOrErr.takeError();
  6358. TemplateArgumentListInfo ToTAInfo;
  6359. TemplateArgumentListInfo *ResInfo = nullptr;
  6360. if (E->hasExplicitTemplateArgs()) {
  6361. if (Error Err =
  6362. ImportTemplateArgumentListInfo(E->template_arguments(), ToTAInfo))
  6363. return std::move(Err);
  6364. ResInfo = &ToTAInfo;
  6365. }
  6366. Expr *ToBase = nullptr;
  6367. if (!E->isImplicitAccess()) {
  6368. if (ExpectedExpr ToBaseOrErr = import(E->getBase()))
  6369. ToBase = *ToBaseOrErr;
  6370. else
  6371. return ToBaseOrErr.takeError();
  6372. }
  6373. return UnresolvedMemberExpr::Create(
  6374. Importer.getToContext(), E->hasUnresolvedUsing(), ToBase, ToType,
  6375. E->isArrow(), ToOperatorLoc, ToQualifierLoc, ToTemplateKeywordLoc,
  6376. ToNameInfo, ResInfo, ToDecls.begin(), ToDecls.end());
  6377. }
  6378. ExpectedStmt ASTNodeImporter::VisitCallExpr(CallExpr *E) {
  6379. auto Imp = importSeq(E->getCallee(), E->getType(), E->getRParenLoc());
  6380. if (!Imp)
  6381. return Imp.takeError();
  6382. Expr *ToCallee;
  6383. QualType ToType;
  6384. SourceLocation ToRParenLoc;
  6385. std::tie(ToCallee, ToType, ToRParenLoc) = *Imp;
  6386. unsigned NumArgs = E->getNumArgs();
  6387. llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
  6388. if (Error Err = ImportContainerChecked(E->arguments(), ToArgs))
  6389. return std::move(Err);
  6390. if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
  6391. return CXXOperatorCallExpr::Create(
  6392. Importer.getToContext(), OCE->getOperator(), ToCallee, ToArgs, ToType,
  6393. OCE->getValueKind(), ToRParenLoc, OCE->getFPFeatures(),
  6394. OCE->getADLCallKind());
  6395. }
  6396. return CallExpr::Create(Importer.getToContext(), ToCallee, ToArgs, ToType,
  6397. E->getValueKind(), ToRParenLoc, /*MinNumArgs=*/0,
  6398. E->getADLCallKind());
  6399. }
  6400. ExpectedStmt ASTNodeImporter::VisitLambdaExpr(LambdaExpr *E) {
  6401. CXXRecordDecl *FromClass = E->getLambdaClass();
  6402. auto ToClassOrErr = import(FromClass);
  6403. if (!ToClassOrErr)
  6404. return ToClassOrErr.takeError();
  6405. CXXRecordDecl *ToClass = *ToClassOrErr;
  6406. auto ToCallOpOrErr = import(E->getCallOperator());
  6407. if (!ToCallOpOrErr)
  6408. return ToCallOpOrErr.takeError();
  6409. SmallVector<LambdaCapture, 8> ToCaptures;
  6410. ToCaptures.reserve(E->capture_size());
  6411. for (const auto &FromCapture : E->captures()) {
  6412. if (auto ToCaptureOrErr = import(FromCapture))
  6413. ToCaptures.push_back(*ToCaptureOrErr);
  6414. else
  6415. return ToCaptureOrErr.takeError();
  6416. }
  6417. SmallVector<Expr *, 8> ToCaptureInits(E->capture_size());
  6418. if (Error Err = ImportContainerChecked(E->capture_inits(), ToCaptureInits))
  6419. return std::move(Err);
  6420. auto Imp = importSeq(
  6421. E->getIntroducerRange(), E->getCaptureDefaultLoc(), E->getEndLoc());
  6422. if (!Imp)
  6423. return Imp.takeError();
  6424. SourceRange ToIntroducerRange;
  6425. SourceLocation ToCaptureDefaultLoc, ToEndLoc;
  6426. std::tie(ToIntroducerRange, ToCaptureDefaultLoc, ToEndLoc) = *Imp;
  6427. return LambdaExpr::Create(
  6428. Importer.getToContext(), ToClass, ToIntroducerRange,
  6429. E->getCaptureDefault(), ToCaptureDefaultLoc, ToCaptures,
  6430. E->hasExplicitParameters(), E->hasExplicitResultType(), ToCaptureInits,
  6431. ToEndLoc, E->containsUnexpandedParameterPack());
  6432. }
  6433. ExpectedStmt ASTNodeImporter::VisitInitListExpr(InitListExpr *E) {
  6434. auto Imp = importSeq(E->getLBraceLoc(), E->getRBraceLoc(), E->getType());
  6435. if (!Imp)
  6436. return Imp.takeError();
  6437. SourceLocation ToLBraceLoc, ToRBraceLoc;
  6438. QualType ToType;
  6439. std::tie(ToLBraceLoc, ToRBraceLoc, ToType) = *Imp;
  6440. SmallVector<Expr *, 4> ToExprs(E->getNumInits());
  6441. if (Error Err = ImportContainerChecked(E->inits(), ToExprs))
  6442. return std::move(Err);
  6443. ASTContext &ToCtx = Importer.getToContext();
  6444. InitListExpr *To = new (ToCtx) InitListExpr(
  6445. ToCtx, ToLBraceLoc, ToExprs, ToRBraceLoc);
  6446. To->setType(ToType);
  6447. if (E->hasArrayFiller()) {
  6448. if (ExpectedExpr ToFillerOrErr = import(E->getArrayFiller()))
  6449. To->setArrayFiller(*ToFillerOrErr);
  6450. else
  6451. return ToFillerOrErr.takeError();
  6452. }
  6453. if (FieldDecl *FromFD = E->getInitializedFieldInUnion()) {
  6454. if (auto ToFDOrErr = import(FromFD))
  6455. To->setInitializedFieldInUnion(*ToFDOrErr);
  6456. else
  6457. return ToFDOrErr.takeError();
  6458. }
  6459. if (InitListExpr *SyntForm = E->getSyntacticForm()) {
  6460. if (auto ToSyntFormOrErr = import(SyntForm))
  6461. To->setSyntacticForm(*ToSyntFormOrErr);
  6462. else
  6463. return ToSyntFormOrErr.takeError();
  6464. }
  6465. // Copy InitListExprBitfields, which are not handled in the ctor of
  6466. // InitListExpr.
  6467. To->sawArrayRangeDesignator(E->hadArrayRangeDesignator());
  6468. return To;
  6469. }
  6470. ExpectedStmt ASTNodeImporter::VisitCXXStdInitializerListExpr(
  6471. CXXStdInitializerListExpr *E) {
  6472. ExpectedType ToTypeOrErr = import(E->getType());
  6473. if (!ToTypeOrErr)
  6474. return ToTypeOrErr.takeError();
  6475. ExpectedExpr ToSubExprOrErr = import(E->getSubExpr());
  6476. if (!ToSubExprOrErr)
  6477. return ToSubExprOrErr.takeError();
  6478. return new (Importer.getToContext()) CXXStdInitializerListExpr(
  6479. *ToTypeOrErr, *ToSubExprOrErr);
  6480. }
  6481. ExpectedStmt ASTNodeImporter::VisitCXXInheritedCtorInitExpr(
  6482. CXXInheritedCtorInitExpr *E) {
  6483. auto Imp = importSeq(E->getLocation(), E->getType(), E->getConstructor());
  6484. if (!Imp)
  6485. return Imp.takeError();
  6486. SourceLocation ToLocation;
  6487. QualType ToType;
  6488. CXXConstructorDecl *ToConstructor;
  6489. std::tie(ToLocation, ToType, ToConstructor) = *Imp;
  6490. return new (Importer.getToContext()) CXXInheritedCtorInitExpr(
  6491. ToLocation, ToType, ToConstructor, E->constructsVBase(),
  6492. E->inheritedFromVBase());
  6493. }
  6494. ExpectedStmt ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
  6495. auto Imp = importSeq(E->getType(), E->getCommonExpr(), E->getSubExpr());
  6496. if (!Imp)
  6497. return Imp.takeError();
  6498. QualType ToType;
  6499. Expr *ToCommonExpr, *ToSubExpr;
  6500. std::tie(ToType, ToCommonExpr, ToSubExpr) = *Imp;
  6501. return new (Importer.getToContext()) ArrayInitLoopExpr(
  6502. ToType, ToCommonExpr, ToSubExpr);
  6503. }
  6504. ExpectedStmt ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
  6505. ExpectedType ToTypeOrErr = import(E->getType());
  6506. if (!ToTypeOrErr)
  6507. return ToTypeOrErr.takeError();
  6508. return new (Importer.getToContext()) ArrayInitIndexExpr(*ToTypeOrErr);
  6509. }
  6510. ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
  6511. ExpectedSLoc ToBeginLocOrErr = import(E->getBeginLoc());
  6512. if (!ToBeginLocOrErr)
  6513. return ToBeginLocOrErr.takeError();
  6514. auto ToFieldOrErr = import(E->getField());
  6515. if (!ToFieldOrErr)
  6516. return ToFieldOrErr.takeError();
  6517. auto UsedContextOrErr = Importer.ImportContext(E->getUsedContext());
  6518. if (!UsedContextOrErr)
  6519. return UsedContextOrErr.takeError();
  6520. return CXXDefaultInitExpr::Create(
  6521. Importer.getToContext(), *ToBeginLocOrErr, *ToFieldOrErr, *UsedContextOrErr);
  6522. }
  6523. ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
  6524. auto Imp = importSeq(
  6525. E->getType(), E->getSubExpr(), E->getTypeInfoAsWritten(),
  6526. E->getOperatorLoc(), E->getRParenLoc(), E->getAngleBrackets());
  6527. if (!Imp)
  6528. return Imp.takeError();
  6529. QualType ToType;
  6530. Expr *ToSubExpr;
  6531. TypeSourceInfo *ToTypeInfoAsWritten;
  6532. SourceLocation ToOperatorLoc, ToRParenLoc;
  6533. SourceRange ToAngleBrackets;
  6534. std::tie(
  6535. ToType, ToSubExpr, ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc,
  6536. ToAngleBrackets) = *Imp;
  6537. ExprValueKind VK = E->getValueKind();
  6538. CastKind CK = E->getCastKind();
  6539. auto ToBasePathOrErr = ImportCastPath(E);
  6540. if (!ToBasePathOrErr)
  6541. return ToBasePathOrErr.takeError();
  6542. if (isa<CXXStaticCastExpr>(E)) {
  6543. return CXXStaticCastExpr::Create(
  6544. Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
  6545. ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
  6546. } else if (isa<CXXDynamicCastExpr>(E)) {
  6547. return CXXDynamicCastExpr::Create(
  6548. Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
  6549. ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
  6550. } else if (isa<CXXReinterpretCastExpr>(E)) {
  6551. return CXXReinterpretCastExpr::Create(
  6552. Importer.getToContext(), ToType, VK, CK, ToSubExpr, &(*ToBasePathOrErr),
  6553. ToTypeInfoAsWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
  6554. } else if (isa<CXXConstCastExpr>(E)) {
  6555. return CXXConstCastExpr::Create(
  6556. Importer.getToContext(), ToType, VK, ToSubExpr, ToTypeInfoAsWritten,
  6557. ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
  6558. } else {
  6559. llvm_unreachable("Unknown cast type");
  6560. return make_error<ImportError>();
  6561. }
  6562. }
  6563. ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(
  6564. SubstNonTypeTemplateParmExpr *E) {
  6565. auto Imp = importSeq(
  6566. E->getType(), E->getExprLoc(), E->getParameter(), E->getReplacement());
  6567. if (!Imp)
  6568. return Imp.takeError();
  6569. QualType ToType;
  6570. SourceLocation ToExprLoc;
  6571. NonTypeTemplateParmDecl *ToParameter;
  6572. Expr *ToReplacement;
  6573. std::tie(ToType, ToExprLoc, ToParameter, ToReplacement) = *Imp;
  6574. return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr(
  6575. ToType, E->getValueKind(), ToExprLoc, ToParameter, ToReplacement);
  6576. }
  6577. ExpectedStmt ASTNodeImporter::VisitTypeTraitExpr(TypeTraitExpr *E) {
  6578. auto Imp = importSeq(
  6579. E->getType(), E->getBeginLoc(), E->getEndLoc());
  6580. if (!Imp)
  6581. return Imp.takeError();
  6582. QualType ToType;
  6583. SourceLocation ToBeginLoc, ToEndLoc;
  6584. std::tie(ToType, ToBeginLoc, ToEndLoc) = *Imp;
  6585. SmallVector<TypeSourceInfo *, 4> ToArgs(E->getNumArgs());
  6586. if (Error Err = ImportContainerChecked(E->getArgs(), ToArgs))
  6587. return std::move(Err);
  6588. // According to Sema::BuildTypeTrait(), if E is value-dependent,
  6589. // Value is always false.
  6590. bool ToValue = (E->isValueDependent() ? false : E->getValue());
  6591. return TypeTraitExpr::Create(
  6592. Importer.getToContext(), ToType, ToBeginLoc, E->getTrait(), ToArgs,
  6593. ToEndLoc, ToValue);
  6594. }
  6595. ExpectedStmt ASTNodeImporter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
  6596. ExpectedType ToTypeOrErr = import(E->getType());
  6597. if (!ToTypeOrErr)
  6598. return ToTypeOrErr.takeError();
  6599. auto ToSourceRangeOrErr = import(E->getSourceRange());
  6600. if (!ToSourceRangeOrErr)
  6601. return ToSourceRangeOrErr.takeError();
  6602. if (E->isTypeOperand()) {
  6603. if (auto ToTSIOrErr = import(E->getTypeOperandSourceInfo()))
  6604. return new (Importer.getToContext()) CXXTypeidExpr(
  6605. *ToTypeOrErr, *ToTSIOrErr, *ToSourceRangeOrErr);
  6606. else
  6607. return ToTSIOrErr.takeError();
  6608. }
  6609. ExpectedExpr ToExprOperandOrErr = import(E->getExprOperand());
  6610. if (!ToExprOperandOrErr)
  6611. return ToExprOperandOrErr.takeError();
  6612. return new (Importer.getToContext()) CXXTypeidExpr(
  6613. *ToTypeOrErr, *ToExprOperandOrErr, *ToSourceRangeOrErr);
  6614. }
  6615. Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,
  6616. CXXMethodDecl *FromMethod) {
  6617. Error ImportErrors = Error::success();
  6618. for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {
  6619. if (auto ImportedOrErr = import(FromOverriddenMethod))
  6620. ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>(
  6621. (*ImportedOrErr)->getCanonicalDecl()));
  6622. else
  6623. ImportErrors =
  6624. joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
  6625. }
  6626. return ImportErrors;
  6627. }
  6628. ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
  6629. ASTContext &FromContext, FileManager &FromFileManager,
  6630. bool MinimalImport,
  6631. std::shared_ptr<ASTImporterSharedState> SharedState)
  6632. : SharedState(SharedState), ToContext(ToContext), FromContext(FromContext),
  6633. ToFileManager(ToFileManager), FromFileManager(FromFileManager),
  6634. Minimal(MinimalImport), ODRHandling(ODRHandlingType::Conservative) {
  6635. // Create a default state without the lookup table: LLDB case.
  6636. if (!SharedState) {
  6637. this->SharedState = std::make_shared<ASTImporterSharedState>();
  6638. }
  6639. ImportedDecls[FromContext.getTranslationUnitDecl()] =
  6640. ToContext.getTranslationUnitDecl();
  6641. }
  6642. ASTImporter::~ASTImporter() = default;
  6643. Optional<unsigned> ASTImporter::getFieldIndex(Decl *F) {
  6644. assert(F && (isa<FieldDecl>(*F) || isa<IndirectFieldDecl>(*F)) &&
  6645. "Try to get field index for non-field.");
  6646. auto *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
  6647. if (!Owner)
  6648. return None;
  6649. unsigned Index = 0;
  6650. for (const auto *D : Owner->decls()) {
  6651. if (D == F)
  6652. return Index;
  6653. if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
  6654. ++Index;
  6655. }
  6656. llvm_unreachable("Field was not found in its parent context.");
  6657. return None;
  6658. }
  6659. ASTImporter::FoundDeclsTy
  6660. ASTImporter::findDeclsInToCtx(DeclContext *DC, DeclarationName Name) {
  6661. // We search in the redecl context because of transparent contexts.
  6662. // E.g. a simple C language enum is a transparent context:
  6663. // enum E { A, B };
  6664. // Now if we had a global variable in the TU
  6665. // int A;
  6666. // then the enum constant 'A' and the variable 'A' violates ODR.
  6667. // We can diagnose this only if we search in the redecl context.
  6668. DeclContext *ReDC = DC->getRedeclContext();
  6669. if (SharedState->getLookupTable()) {
  6670. ASTImporterLookupTable::LookupResult LookupResult =
  6671. SharedState->getLookupTable()->lookup(ReDC, Name);
  6672. return FoundDeclsTy(LookupResult.begin(), LookupResult.end());
  6673. } else {
  6674. DeclContext::lookup_result NoloadLookupResult = ReDC->noload_lookup(Name);
  6675. FoundDeclsTy Result(NoloadLookupResult.begin(), NoloadLookupResult.end());
  6676. // We must search by the slow case of localUncachedLookup because that is
  6677. // working even if there is no LookupPtr for the DC. We could use
  6678. // DC::buildLookup() to create the LookupPtr, but that would load external
  6679. // decls again, we must avoid that case.
  6680. // Also, even if we had the LookupPtr, we must find Decls which are not
  6681. // in the LookupPtr, so we need the slow case.
  6682. // These cases are handled in ASTImporterLookupTable, but we cannot use
  6683. // that with LLDB since that traverses through the AST which initiates the
  6684. // load of external decls again via DC::decls(). And again, we must avoid
  6685. // loading external decls during the import.
  6686. if (Result.empty())
  6687. ReDC->localUncachedLookup(Name, Result);
  6688. return Result;
  6689. }
  6690. }
  6691. void ASTImporter::AddToLookupTable(Decl *ToD) {
  6692. SharedState->addDeclToLookup(ToD);
  6693. }
  6694. Expected<Decl *> ASTImporter::ImportImpl(Decl *FromD) {
  6695. // Import the decl using ASTNodeImporter.
  6696. ASTNodeImporter Importer(*this);
  6697. return Importer.Visit(FromD);
  6698. }
  6699. void ASTImporter::RegisterImportedDecl(Decl *FromD, Decl *ToD) {
  6700. MapImported(FromD, ToD);
  6701. }
  6702. Expected<QualType> ASTImporter::Import(QualType FromT) {
  6703. if (FromT.isNull())
  6704. return QualType{};
  6705. const Type *FromTy = FromT.getTypePtr();
  6706. // Check whether we've already imported this type.
  6707. llvm::DenseMap<const Type *, const Type *>::iterator Pos
  6708. = ImportedTypes.find(FromTy);
  6709. if (Pos != ImportedTypes.end())
  6710. return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
  6711. // Import the type
  6712. ASTNodeImporter Importer(*this);
  6713. ExpectedType ToTOrErr = Importer.Visit(FromTy);
  6714. if (!ToTOrErr)
  6715. return ToTOrErr.takeError();
  6716. // Record the imported type.
  6717. ImportedTypes[FromTy] = (*ToTOrErr).getTypePtr();
  6718. return ToContext.getQualifiedType(*ToTOrErr, FromT.getLocalQualifiers());
  6719. }
  6720. Expected<TypeSourceInfo *> ASTImporter::Import(TypeSourceInfo *FromTSI) {
  6721. if (!FromTSI)
  6722. return FromTSI;
  6723. // FIXME: For now we just create a "trivial" type source info based
  6724. // on the type and a single location. Implement a real version of this.
  6725. ExpectedType TOrErr = Import(FromTSI->getType());
  6726. if (!TOrErr)
  6727. return TOrErr.takeError();
  6728. ExpectedSLoc BeginLocOrErr = Import(FromTSI->getTypeLoc().getBeginLoc());
  6729. if (!BeginLocOrErr)
  6730. return BeginLocOrErr.takeError();
  6731. return ToContext.getTrivialTypeSourceInfo(*TOrErr, *BeginLocOrErr);
  6732. }
  6733. Expected<Attr *> ASTImporter::Import(const Attr *FromAttr) {
  6734. Attr *ToAttr = FromAttr->clone(ToContext);
  6735. if (auto ToRangeOrErr = Import(FromAttr->getRange()))
  6736. ToAttr->setRange(*ToRangeOrErr);
  6737. else
  6738. return ToRangeOrErr.takeError();
  6739. return ToAttr;
  6740. }
  6741. Decl *ASTImporter::GetAlreadyImportedOrNull(const Decl *FromD) const {
  6742. auto Pos = ImportedDecls.find(FromD);
  6743. if (Pos != ImportedDecls.end())
  6744. return Pos->second;
  6745. else
  6746. return nullptr;
  6747. }
  6748. TranslationUnitDecl *ASTImporter::GetFromTU(Decl *ToD) {
  6749. auto FromDPos = ImportedFromDecls.find(ToD);
  6750. if (FromDPos == ImportedFromDecls.end())
  6751. return nullptr;
  6752. return FromDPos->second->getTranslationUnitDecl();
  6753. }
  6754. Expected<Decl *> ASTImporter::Import(Decl *FromD) {
  6755. if (!FromD)
  6756. return nullptr;
  6757. // Push FromD to the stack, and remove that when we return.
  6758. ImportPath.push(FromD);
  6759. auto ImportPathBuilder =
  6760. llvm::make_scope_exit([this]() { ImportPath.pop(); });
  6761. // Check whether there was a previous failed import.
  6762. // If yes return the existing error.
  6763. if (auto Error = getImportDeclErrorIfAny(FromD))
  6764. return make_error<ImportError>(*Error);
  6765. // Check whether we've already imported this declaration.
  6766. Decl *ToD = GetAlreadyImportedOrNull(FromD);
  6767. if (ToD) {
  6768. // Already imported (possibly from another TU) and with an error.
  6769. if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
  6770. setImportDeclError(FromD, *Error);
  6771. return make_error<ImportError>(*Error);
  6772. }
  6773. // If FromD has some updated flags after last import, apply it
  6774. updateFlags(FromD, ToD);
  6775. // If we encounter a cycle during an import then we save the relevant part
  6776. // of the import path associated to the Decl.
  6777. if (ImportPath.hasCycleAtBack())
  6778. SavedImportPaths[FromD].push_back(ImportPath.copyCycleAtBack());
  6779. return ToD;
  6780. }
  6781. // Import the declaration.
  6782. ExpectedDecl ToDOrErr = ImportImpl(FromD);
  6783. if (!ToDOrErr) {
  6784. // Failed to import.
  6785. auto Pos = ImportedDecls.find(FromD);
  6786. if (Pos != ImportedDecls.end()) {
  6787. // Import failed after the object was created.
  6788. // Remove all references to it.
  6789. auto *ToD = Pos->second;
  6790. ImportedDecls.erase(Pos);
  6791. // ImportedDecls and ImportedFromDecls are not symmetric. It may happen
  6792. // (e.g. with namespaces) that several decls from the 'from' context are
  6793. // mapped to the same decl in the 'to' context. If we removed entries
  6794. // from the LookupTable here then we may end up removing them multiple
  6795. // times.
  6796. // The Lookuptable contains decls only which are in the 'to' context.
  6797. // Remove from the Lookuptable only if it is *imported* into the 'to'
  6798. // context (and do not remove it if it was added during the initial
  6799. // traverse of the 'to' context).
  6800. auto PosF = ImportedFromDecls.find(ToD);
  6801. if (PosF != ImportedFromDecls.end()) {
  6802. SharedState->removeDeclFromLookup(ToD);
  6803. ImportedFromDecls.erase(PosF);
  6804. }
  6805. // FIXME: AST may contain remaining references to the failed object.
  6806. // However, the ImportDeclErrors in the shared state contains all the
  6807. // failed objects together with their error.
  6808. }
  6809. // Error encountered for the first time.
  6810. // After takeError the error is not usable any more in ToDOrErr.
  6811. // Get a copy of the error object (any more simple solution for this?).
  6812. ImportError ErrOut;
  6813. handleAllErrors(ToDOrErr.takeError(),
  6814. [&ErrOut](const ImportError &E) { ErrOut = E; });
  6815. setImportDeclError(FromD, ErrOut);
  6816. // Set the error for the mapped to Decl, which is in the "to" context.
  6817. if (Pos != ImportedDecls.end())
  6818. SharedState->setImportDeclError(Pos->second, ErrOut);
  6819. // Set the error for all nodes which have been created before we
  6820. // recognized the error.
  6821. for (const auto &Path : SavedImportPaths[FromD])
  6822. for (Decl *FromDi : Path) {
  6823. setImportDeclError(FromDi, ErrOut);
  6824. //FIXME Should we remove these Decls from ImportedDecls?
  6825. // Set the error for the mapped to Decl, which is in the "to" context.
  6826. auto Ii = ImportedDecls.find(FromDi);
  6827. if (Ii != ImportedDecls.end())
  6828. SharedState->setImportDeclError(Ii->second, ErrOut);
  6829. // FIXME Should we remove these Decls from the LookupTable,
  6830. // and from ImportedFromDecls?
  6831. }
  6832. SavedImportPaths[FromD].clear();
  6833. // Do not return ToDOrErr, error was taken out of it.
  6834. return make_error<ImportError>(ErrOut);
  6835. }
  6836. ToD = *ToDOrErr;
  6837. // FIXME: Handle the "already imported with error" case. We can get here
  6838. // nullptr only if GetImportedOrCreateDecl returned nullptr (after a
  6839. // previously failed create was requested).
  6840. // Later GetImportedOrCreateDecl can be updated to return the error.
  6841. if (!ToD) {
  6842. auto Err = getImportDeclErrorIfAny(FromD);
  6843. assert(Err);
  6844. return make_error<ImportError>(*Err);
  6845. }
  6846. // We could import from the current TU without error. But previously we
  6847. // already had imported a Decl as `ToD` from another TU (with another
  6848. // ASTImporter object) and with an error.
  6849. if (auto Error = SharedState->getImportDeclErrorIfAny(ToD)) {
  6850. setImportDeclError(FromD, *Error);
  6851. return make_error<ImportError>(*Error);
  6852. }
  6853. // Make sure that ImportImpl registered the imported decl.
  6854. assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");
  6855. // Notify subclasses.
  6856. Imported(FromD, ToD);
  6857. updateFlags(FromD, ToD);
  6858. SavedImportPaths[FromD].clear();
  6859. return ToDOrErr;
  6860. }
  6861. Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {
  6862. if (!FromDC)
  6863. return FromDC;
  6864. ExpectedDecl ToDCOrErr = Import(cast<Decl>(FromDC));
  6865. if (!ToDCOrErr)
  6866. return ToDCOrErr.takeError();
  6867. auto *ToDC = cast<DeclContext>(*ToDCOrErr);
  6868. // When we're using a record/enum/Objective-C class/protocol as a context, we
  6869. // need it to have a definition.
  6870. if (auto *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
  6871. auto *FromRecord = cast<RecordDecl>(FromDC);
  6872. if (ToRecord->isCompleteDefinition()) {
  6873. // Do nothing.
  6874. } else if (FromRecord->isCompleteDefinition()) {
  6875. if (Error Err = ASTNodeImporter(*this).ImportDefinition(
  6876. FromRecord, ToRecord, ASTNodeImporter::IDK_Basic))
  6877. return std::move(Err);
  6878. } else {
  6879. CompleteDecl(ToRecord);
  6880. }
  6881. } else if (auto *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
  6882. auto *FromEnum = cast<EnumDecl>(FromDC);
  6883. if (ToEnum->isCompleteDefinition()) {
  6884. // Do nothing.
  6885. } else if (FromEnum->isCompleteDefinition()) {
  6886. if (Error Err = ASTNodeImporter(*this).ImportDefinition(
  6887. FromEnum, ToEnum, ASTNodeImporter::IDK_Basic))
  6888. return std::move(Err);
  6889. } else {
  6890. CompleteDecl(ToEnum);
  6891. }
  6892. } else if (auto *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
  6893. auto *FromClass = cast<ObjCInterfaceDecl>(FromDC);
  6894. if (ToClass->getDefinition()) {
  6895. // Do nothing.
  6896. } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
  6897. if (Error Err = ASTNodeImporter(*this).ImportDefinition(
  6898. FromDef, ToClass, ASTNodeImporter::IDK_Basic))
  6899. return std::move(Err);
  6900. } else {
  6901. CompleteDecl(ToClass);
  6902. }
  6903. } else if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
  6904. auto *FromProto = cast<ObjCProtocolDecl>(FromDC);
  6905. if (ToProto->getDefinition()) {
  6906. // Do nothing.
  6907. } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
  6908. if (Error Err = ASTNodeImporter(*this).ImportDefinition(
  6909. FromDef, ToProto, ASTNodeImporter::IDK_Basic))
  6910. return std::move(Err);
  6911. } else {
  6912. CompleteDecl(ToProto);
  6913. }
  6914. }
  6915. return ToDC;
  6916. }
  6917. Expected<Expr *> ASTImporter::Import(Expr *FromE) {
  6918. if (ExpectedStmt ToSOrErr = Import(cast_or_null<Stmt>(FromE)))
  6919. return cast_or_null<Expr>(*ToSOrErr);
  6920. else
  6921. return ToSOrErr.takeError();
  6922. }
  6923. Expected<Stmt *> ASTImporter::Import(Stmt *FromS) {
  6924. if (!FromS)
  6925. return nullptr;
  6926. // Check whether we've already imported this statement.
  6927. llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
  6928. if (Pos != ImportedStmts.end())
  6929. return Pos->second;
  6930. // Import the statement.
  6931. ASTNodeImporter Importer(*this);
  6932. ExpectedStmt ToSOrErr = Importer.Visit(FromS);
  6933. if (!ToSOrErr)
  6934. return ToSOrErr;
  6935. if (auto *ToE = dyn_cast<Expr>(*ToSOrErr)) {
  6936. auto *FromE = cast<Expr>(FromS);
  6937. // Copy ExprBitfields, which may not be handled in Expr subclasses
  6938. // constructors.
  6939. ToE->setValueKind(FromE->getValueKind());
  6940. ToE->setObjectKind(FromE->getObjectKind());
  6941. ToE->setTypeDependent(FromE->isTypeDependent());
  6942. ToE->setValueDependent(FromE->isValueDependent());
  6943. ToE->setInstantiationDependent(FromE->isInstantiationDependent());
  6944. ToE->setContainsUnexpandedParameterPack(
  6945. FromE->containsUnexpandedParameterPack());
  6946. }
  6947. // Record the imported statement object.
  6948. ImportedStmts[FromS] = *ToSOrErr;
  6949. return ToSOrErr;
  6950. }
  6951. Expected<NestedNameSpecifier *>
  6952. ASTImporter::Import(NestedNameSpecifier *FromNNS) {
  6953. if (!FromNNS)
  6954. return nullptr;
  6955. NestedNameSpecifier *Prefix = nullptr;
  6956. if (Error Err = importInto(Prefix, FromNNS->getPrefix()))
  6957. return std::move(Err);
  6958. switch (FromNNS->getKind()) {
  6959. case NestedNameSpecifier::Identifier:
  6960. assert(FromNNS->getAsIdentifier() && "NNS should contain identifier.");
  6961. return NestedNameSpecifier::Create(ToContext, Prefix,
  6962. Import(FromNNS->getAsIdentifier()));
  6963. case NestedNameSpecifier::Namespace:
  6964. if (ExpectedDecl NSOrErr = Import(FromNNS->getAsNamespace())) {
  6965. return NestedNameSpecifier::Create(ToContext, Prefix,
  6966. cast<NamespaceDecl>(*NSOrErr));
  6967. } else
  6968. return NSOrErr.takeError();
  6969. case NestedNameSpecifier::NamespaceAlias:
  6970. if (ExpectedDecl NSADOrErr = Import(FromNNS->getAsNamespaceAlias()))
  6971. return NestedNameSpecifier::Create(ToContext, Prefix,
  6972. cast<NamespaceAliasDecl>(*NSADOrErr));
  6973. else
  6974. return NSADOrErr.takeError();
  6975. case NestedNameSpecifier::Global:
  6976. return NestedNameSpecifier::GlobalSpecifier(ToContext);
  6977. case NestedNameSpecifier::Super:
  6978. if (ExpectedDecl RDOrErr = Import(FromNNS->getAsRecordDecl()))
  6979. return NestedNameSpecifier::SuperSpecifier(ToContext,
  6980. cast<CXXRecordDecl>(*RDOrErr));
  6981. else
  6982. return RDOrErr.takeError();
  6983. case NestedNameSpecifier::TypeSpec:
  6984. case NestedNameSpecifier::TypeSpecWithTemplate:
  6985. if (Expected<QualType> TyOrErr =
  6986. Import(QualType(FromNNS->getAsType(), 0u))) {
  6987. bool TSTemplate =
  6988. FromNNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate;
  6989. return NestedNameSpecifier::Create(ToContext, Prefix, TSTemplate,
  6990. TyOrErr->getTypePtr());
  6991. } else {
  6992. return TyOrErr.takeError();
  6993. }
  6994. }
  6995. llvm_unreachable("Invalid nested name specifier kind");
  6996. }
  6997. Expected<NestedNameSpecifierLoc>
  6998. ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
  6999. // Copied from NestedNameSpecifier mostly.
  7000. SmallVector<NestedNameSpecifierLoc , 8> NestedNames;
  7001. NestedNameSpecifierLoc NNS = FromNNS;
  7002. // Push each of the nested-name-specifiers's onto a stack for
  7003. // serialization in reverse order.
  7004. while (NNS) {
  7005. NestedNames.push_back(NNS);
  7006. NNS = NNS.getPrefix();
  7007. }
  7008. NestedNameSpecifierLocBuilder Builder;
  7009. while (!NestedNames.empty()) {
  7010. NNS = NestedNames.pop_back_val();
  7011. NestedNameSpecifier *Spec = nullptr;
  7012. if (Error Err = importInto(Spec, NNS.getNestedNameSpecifier()))
  7013. return std::move(Err);
  7014. NestedNameSpecifier::SpecifierKind Kind = Spec->getKind();
  7015. SourceLocation ToLocalBeginLoc, ToLocalEndLoc;
  7016. if (Kind != NestedNameSpecifier::Super) {
  7017. if (Error Err = importInto(ToLocalBeginLoc, NNS.getLocalBeginLoc()))
  7018. return std::move(Err);
  7019. if (Kind != NestedNameSpecifier::Global)
  7020. if (Error Err = importInto(ToLocalEndLoc, NNS.getLocalEndLoc()))
  7021. return std::move(Err);
  7022. }
  7023. switch (Kind) {
  7024. case NestedNameSpecifier::Identifier:
  7025. Builder.Extend(getToContext(), Spec->getAsIdentifier(), ToLocalBeginLoc,
  7026. ToLocalEndLoc);
  7027. break;
  7028. case NestedNameSpecifier::Namespace:
  7029. Builder.Extend(getToContext(), Spec->getAsNamespace(), ToLocalBeginLoc,
  7030. ToLocalEndLoc);
  7031. break;
  7032. case NestedNameSpecifier::NamespaceAlias:
  7033. Builder.Extend(getToContext(), Spec->getAsNamespaceAlias(),
  7034. ToLocalBeginLoc, ToLocalEndLoc);
  7035. break;
  7036. case NestedNameSpecifier::TypeSpec:
  7037. case NestedNameSpecifier::TypeSpecWithTemplate: {
  7038. SourceLocation ToTLoc;
  7039. if (Error Err = importInto(ToTLoc, NNS.getTypeLoc().getBeginLoc()))
  7040. return std::move(Err);
  7041. TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
  7042. QualType(Spec->getAsType(), 0), ToTLoc);
  7043. Builder.Extend(getToContext(), ToLocalBeginLoc, TSI->getTypeLoc(),
  7044. ToLocalEndLoc);
  7045. break;
  7046. }
  7047. case NestedNameSpecifier::Global:
  7048. Builder.MakeGlobal(getToContext(), ToLocalBeginLoc);
  7049. break;
  7050. case NestedNameSpecifier::Super: {
  7051. auto ToSourceRangeOrErr = Import(NNS.getSourceRange());
  7052. if (!ToSourceRangeOrErr)
  7053. return ToSourceRangeOrErr.takeError();
  7054. Builder.MakeSuper(getToContext(), Spec->getAsRecordDecl(),
  7055. ToSourceRangeOrErr->getBegin(),
  7056. ToSourceRangeOrErr->getEnd());
  7057. }
  7058. }
  7059. }
  7060. return Builder.getWithLocInContext(getToContext());
  7061. }
  7062. Expected<TemplateName> ASTImporter::Import(TemplateName From) {
  7063. switch (From.getKind()) {
  7064. case TemplateName::Template:
  7065. if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl()))
  7066. return TemplateName(cast<TemplateDecl>(*ToTemplateOrErr));
  7067. else
  7068. return ToTemplateOrErr.takeError();
  7069. case TemplateName::OverloadedTemplate: {
  7070. OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
  7071. UnresolvedSet<2> ToTemplates;
  7072. for (auto *I : *FromStorage) {
  7073. if (auto ToOrErr = Import(I))
  7074. ToTemplates.addDecl(cast<NamedDecl>(*ToOrErr));
  7075. else
  7076. return ToOrErr.takeError();
  7077. }
  7078. return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
  7079. ToTemplates.end());
  7080. }
  7081. case TemplateName::AssumedTemplate: {
  7082. AssumedTemplateStorage *FromStorage = From.getAsAssumedTemplateName();
  7083. auto DeclNameOrErr = Import(FromStorage->getDeclName());
  7084. if (!DeclNameOrErr)
  7085. return DeclNameOrErr.takeError();
  7086. return ToContext.getAssumedTemplateName(*DeclNameOrErr);
  7087. }
  7088. case TemplateName::QualifiedTemplate: {
  7089. QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
  7090. auto QualifierOrErr = Import(QTN->getQualifier());
  7091. if (!QualifierOrErr)
  7092. return QualifierOrErr.takeError();
  7093. if (ExpectedDecl ToTemplateOrErr = Import(From.getAsTemplateDecl()))
  7094. return ToContext.getQualifiedTemplateName(
  7095. *QualifierOrErr, QTN->hasTemplateKeyword(),
  7096. cast<TemplateDecl>(*ToTemplateOrErr));
  7097. else
  7098. return ToTemplateOrErr.takeError();
  7099. }
  7100. case TemplateName::DependentTemplate: {
  7101. DependentTemplateName *DTN = From.getAsDependentTemplateName();
  7102. auto QualifierOrErr = Import(DTN->getQualifier());
  7103. if (!QualifierOrErr)
  7104. return QualifierOrErr.takeError();
  7105. if (DTN->isIdentifier()) {
  7106. return ToContext.getDependentTemplateName(*QualifierOrErr,
  7107. Import(DTN->getIdentifier()));
  7108. }
  7109. return ToContext.getDependentTemplateName(*QualifierOrErr,
  7110. DTN->getOperator());
  7111. }
  7112. case TemplateName::SubstTemplateTemplateParm: {
  7113. SubstTemplateTemplateParmStorage *Subst =
  7114. From.getAsSubstTemplateTemplateParm();
  7115. ExpectedDecl ParamOrErr = Import(Subst->getParameter());
  7116. if (!ParamOrErr)
  7117. return ParamOrErr.takeError();
  7118. auto ReplacementOrErr = Import(Subst->getReplacement());
  7119. if (!ReplacementOrErr)
  7120. return ReplacementOrErr.takeError();
  7121. return ToContext.getSubstTemplateTemplateParm(
  7122. cast<TemplateTemplateParmDecl>(*ParamOrErr), *ReplacementOrErr);
  7123. }
  7124. case TemplateName::SubstTemplateTemplateParmPack: {
  7125. SubstTemplateTemplateParmPackStorage *SubstPack
  7126. = From.getAsSubstTemplateTemplateParmPack();
  7127. ExpectedDecl ParamOrErr = Import(SubstPack->getParameterPack());
  7128. if (!ParamOrErr)
  7129. return ParamOrErr.takeError();
  7130. ASTNodeImporter Importer(*this);
  7131. auto ArgPackOrErr =
  7132. Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
  7133. if (!ArgPackOrErr)
  7134. return ArgPackOrErr.takeError();
  7135. return ToContext.getSubstTemplateTemplateParmPack(
  7136. cast<TemplateTemplateParmDecl>(*ParamOrErr), *ArgPackOrErr);
  7137. }
  7138. }
  7139. llvm_unreachable("Invalid template name kind");
  7140. }
  7141. Expected<SourceLocation> ASTImporter::Import(SourceLocation FromLoc) {
  7142. if (FromLoc.isInvalid())
  7143. return SourceLocation{};
  7144. SourceManager &FromSM = FromContext.getSourceManager();
  7145. bool IsBuiltin = FromSM.isWrittenInBuiltinFile(FromLoc);
  7146. std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
  7147. Expected<FileID> ToFileIDOrErr = Import(Decomposed.first, IsBuiltin);
  7148. if (!ToFileIDOrErr)
  7149. return ToFileIDOrErr.takeError();
  7150. SourceManager &ToSM = ToContext.getSourceManager();
  7151. return ToSM.getComposedLoc(*ToFileIDOrErr, Decomposed.second);
  7152. }
  7153. Expected<SourceRange> ASTImporter::Import(SourceRange FromRange) {
  7154. SourceLocation ToBegin, ToEnd;
  7155. if (Error Err = importInto(ToBegin, FromRange.getBegin()))
  7156. return std::move(Err);
  7157. if (Error Err = importInto(ToEnd, FromRange.getEnd()))
  7158. return std::move(Err);
  7159. return SourceRange(ToBegin, ToEnd);
  7160. }
  7161. Expected<FileID> ASTImporter::Import(FileID FromID, bool IsBuiltin) {
  7162. llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
  7163. if (Pos != ImportedFileIDs.end())
  7164. return Pos->second;
  7165. SourceManager &FromSM = FromContext.getSourceManager();
  7166. SourceManager &ToSM = ToContext.getSourceManager();
  7167. const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
  7168. // Map the FromID to the "to" source manager.
  7169. FileID ToID;
  7170. if (FromSLoc.isExpansion()) {
  7171. const SrcMgr::ExpansionInfo &FromEx = FromSLoc.getExpansion();
  7172. ExpectedSLoc ToSpLoc = Import(FromEx.getSpellingLoc());
  7173. if (!ToSpLoc)
  7174. return ToSpLoc.takeError();
  7175. ExpectedSLoc ToExLocS = Import(FromEx.getExpansionLocStart());
  7176. if (!ToExLocS)
  7177. return ToExLocS.takeError();
  7178. unsigned TokenLen = FromSM.getFileIDSize(FromID);
  7179. SourceLocation MLoc;
  7180. if (FromEx.isMacroArgExpansion()) {
  7181. MLoc = ToSM.createMacroArgExpansionLoc(*ToSpLoc, *ToExLocS, TokenLen);
  7182. } else {
  7183. if (ExpectedSLoc ToExLocE = Import(FromEx.getExpansionLocEnd()))
  7184. MLoc = ToSM.createExpansionLoc(*ToSpLoc, *ToExLocS, *ToExLocE, TokenLen,
  7185. FromEx.isExpansionTokenRange());
  7186. else
  7187. return ToExLocE.takeError();
  7188. }
  7189. ToID = ToSM.getFileID(MLoc);
  7190. } else {
  7191. const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
  7192. if (!IsBuiltin) {
  7193. // Include location of this file.
  7194. ExpectedSLoc ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
  7195. if (!ToIncludeLoc)
  7196. return ToIncludeLoc.takeError();
  7197. if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
  7198. // FIXME: We probably want to use getVirtualFile(), so we don't hit the
  7199. // disk again
  7200. // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
  7201. // than mmap the files several times.
  7202. auto Entry =
  7203. ToFileManager.getFile(Cache->OrigEntry->getName());
  7204. // FIXME: The filename may be a virtual name that does probably not
  7205. // point to a valid file and we get no Entry here. In this case try with
  7206. // the memory buffer below.
  7207. if (Entry)
  7208. ToID = ToSM.createFileID(*Entry, *ToIncludeLoc,
  7209. FromSLoc.getFile().getFileCharacteristic());
  7210. }
  7211. }
  7212. if (ToID.isInvalid() || IsBuiltin) {
  7213. // FIXME: We want to re-use the existing MemoryBuffer!
  7214. bool Invalid = true;
  7215. const llvm::MemoryBuffer *FromBuf =
  7216. Cache->getBuffer(FromContext.getDiagnostics(),
  7217. FromSM.getFileManager(), SourceLocation{}, &Invalid);
  7218. if (!FromBuf || Invalid)
  7219. // FIXME: Use a new error kind?
  7220. return llvm::make_error<ImportError>(ImportError::Unknown);
  7221. std::unique_ptr<llvm::MemoryBuffer> ToBuf =
  7222. llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
  7223. FromBuf->getBufferIdentifier());
  7224. ToID = ToSM.createFileID(std::move(ToBuf),
  7225. FromSLoc.getFile().getFileCharacteristic());
  7226. }
  7227. }
  7228. assert(ToID.isValid() && "Unexpected invalid fileID was created.");
  7229. ImportedFileIDs[FromID] = ToID;
  7230. if (FileIDImportHandler)
  7231. FileIDImportHandler(ToID, FromID);
  7232. return ToID;
  7233. }
  7234. Expected<CXXCtorInitializer *> ASTImporter::Import(CXXCtorInitializer *From) {
  7235. ExpectedExpr ToExprOrErr = Import(From->getInit());
  7236. if (!ToExprOrErr)
  7237. return ToExprOrErr.takeError();
  7238. auto LParenLocOrErr = Import(From->getLParenLoc());
  7239. if (!LParenLocOrErr)
  7240. return LParenLocOrErr.takeError();
  7241. auto RParenLocOrErr = Import(From->getRParenLoc());
  7242. if (!RParenLocOrErr)
  7243. return RParenLocOrErr.takeError();
  7244. if (From->isBaseInitializer()) {
  7245. auto ToTInfoOrErr = Import(From->getTypeSourceInfo());
  7246. if (!ToTInfoOrErr)
  7247. return ToTInfoOrErr.takeError();
  7248. SourceLocation EllipsisLoc;
  7249. if (From->isPackExpansion())
  7250. if (Error Err = importInto(EllipsisLoc, From->getEllipsisLoc()))
  7251. return std::move(Err);
  7252. return new (ToContext) CXXCtorInitializer(
  7253. ToContext, *ToTInfoOrErr, From->isBaseVirtual(), *LParenLocOrErr,
  7254. *ToExprOrErr, *RParenLocOrErr, EllipsisLoc);
  7255. } else if (From->isMemberInitializer()) {
  7256. ExpectedDecl ToFieldOrErr = Import(From->getMember());
  7257. if (!ToFieldOrErr)
  7258. return ToFieldOrErr.takeError();
  7259. auto MemberLocOrErr = Import(From->getMemberLocation());
  7260. if (!MemberLocOrErr)
  7261. return MemberLocOrErr.takeError();
  7262. return new (ToContext) CXXCtorInitializer(
  7263. ToContext, cast_or_null<FieldDecl>(*ToFieldOrErr), *MemberLocOrErr,
  7264. *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
  7265. } else if (From->isIndirectMemberInitializer()) {
  7266. ExpectedDecl ToIFieldOrErr = Import(From->getIndirectMember());
  7267. if (!ToIFieldOrErr)
  7268. return ToIFieldOrErr.takeError();
  7269. auto MemberLocOrErr = Import(From->getMemberLocation());
  7270. if (!MemberLocOrErr)
  7271. return MemberLocOrErr.takeError();
  7272. return new (ToContext) CXXCtorInitializer(
  7273. ToContext, cast_or_null<IndirectFieldDecl>(*ToIFieldOrErr),
  7274. *MemberLocOrErr, *LParenLocOrErr, *ToExprOrErr, *RParenLocOrErr);
  7275. } else if (From->isDelegatingInitializer()) {
  7276. auto ToTInfoOrErr = Import(From->getTypeSourceInfo());
  7277. if (!ToTInfoOrErr)
  7278. return ToTInfoOrErr.takeError();
  7279. return new (ToContext)
  7280. CXXCtorInitializer(ToContext, *ToTInfoOrErr, *LParenLocOrErr,
  7281. *ToExprOrErr, *RParenLocOrErr);
  7282. } else {
  7283. // FIXME: assert?
  7284. return make_error<ImportError>();
  7285. }
  7286. }
  7287. Expected<CXXBaseSpecifier *>
  7288. ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) {
  7289. auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
  7290. if (Pos != ImportedCXXBaseSpecifiers.end())
  7291. return Pos->second;
  7292. Expected<SourceRange> ToSourceRange = Import(BaseSpec->getSourceRange());
  7293. if (!ToSourceRange)
  7294. return ToSourceRange.takeError();
  7295. Expected<TypeSourceInfo *> ToTSI = Import(BaseSpec->getTypeSourceInfo());
  7296. if (!ToTSI)
  7297. return ToTSI.takeError();
  7298. ExpectedSLoc ToEllipsisLoc = Import(BaseSpec->getEllipsisLoc());
  7299. if (!ToEllipsisLoc)
  7300. return ToEllipsisLoc.takeError();
  7301. CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier(
  7302. *ToSourceRange, BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(),
  7303. BaseSpec->getAccessSpecifierAsWritten(), *ToTSI, *ToEllipsisLoc);
  7304. ImportedCXXBaseSpecifiers[BaseSpec] = Imported;
  7305. return Imported;
  7306. }
  7307. Error ASTImporter::ImportDefinition(Decl *From) {
  7308. ExpectedDecl ToOrErr = Import(From);
  7309. if (!ToOrErr)
  7310. return ToOrErr.takeError();
  7311. Decl *To = *ToOrErr;
  7312. auto *FromDC = cast<DeclContext>(From);
  7313. ASTNodeImporter Importer(*this);
  7314. if (auto *ToRecord = dyn_cast<RecordDecl>(To)) {
  7315. if (!ToRecord->getDefinition()) {
  7316. return Importer.ImportDefinition(
  7317. cast<RecordDecl>(FromDC), ToRecord,
  7318. ASTNodeImporter::IDK_Everything);
  7319. }
  7320. }
  7321. if (auto *ToEnum = dyn_cast<EnumDecl>(To)) {
  7322. if (!ToEnum->getDefinition()) {
  7323. return Importer.ImportDefinition(
  7324. cast<EnumDecl>(FromDC), ToEnum, ASTNodeImporter::IDK_Everything);
  7325. }
  7326. }
  7327. if (auto *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
  7328. if (!ToIFace->getDefinition()) {
  7329. return Importer.ImportDefinition(
  7330. cast<ObjCInterfaceDecl>(FromDC), ToIFace,
  7331. ASTNodeImporter::IDK_Everything);
  7332. }
  7333. }
  7334. if (auto *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
  7335. if (!ToProto->getDefinition()) {
  7336. return Importer.ImportDefinition(
  7337. cast<ObjCProtocolDecl>(FromDC), ToProto,
  7338. ASTNodeImporter::IDK_Everything);
  7339. }
  7340. }
  7341. return Importer.ImportDeclContext(FromDC, true);
  7342. }
  7343. Expected<DeclarationName> ASTImporter::Import(DeclarationName FromName) {
  7344. if (!FromName)
  7345. return DeclarationName{};
  7346. switch (FromName.getNameKind()) {
  7347. case DeclarationName::Identifier:
  7348. return DeclarationName(Import(FromName.getAsIdentifierInfo()));
  7349. case DeclarationName::ObjCZeroArgSelector:
  7350. case DeclarationName::ObjCOneArgSelector:
  7351. case DeclarationName::ObjCMultiArgSelector:
  7352. if (auto ToSelOrErr = Import(FromName.getObjCSelector()))
  7353. return DeclarationName(*ToSelOrErr);
  7354. else
  7355. return ToSelOrErr.takeError();
  7356. case DeclarationName::CXXConstructorName: {
  7357. if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
  7358. return ToContext.DeclarationNames.getCXXConstructorName(
  7359. ToContext.getCanonicalType(*ToTyOrErr));
  7360. else
  7361. return ToTyOrErr.takeError();
  7362. }
  7363. case DeclarationName::CXXDestructorName: {
  7364. if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
  7365. return ToContext.DeclarationNames.getCXXDestructorName(
  7366. ToContext.getCanonicalType(*ToTyOrErr));
  7367. else
  7368. return ToTyOrErr.takeError();
  7369. }
  7370. case DeclarationName::CXXDeductionGuideName: {
  7371. if (auto ToTemplateOrErr = Import(FromName.getCXXDeductionGuideTemplate()))
  7372. return ToContext.DeclarationNames.getCXXDeductionGuideName(
  7373. cast<TemplateDecl>(*ToTemplateOrErr));
  7374. else
  7375. return ToTemplateOrErr.takeError();
  7376. }
  7377. case DeclarationName::CXXConversionFunctionName: {
  7378. if (auto ToTyOrErr = Import(FromName.getCXXNameType()))
  7379. return ToContext.DeclarationNames.getCXXConversionFunctionName(
  7380. ToContext.getCanonicalType(*ToTyOrErr));
  7381. else
  7382. return ToTyOrErr.takeError();
  7383. }
  7384. case DeclarationName::CXXOperatorName:
  7385. return ToContext.DeclarationNames.getCXXOperatorName(
  7386. FromName.getCXXOverloadedOperator());
  7387. case DeclarationName::CXXLiteralOperatorName:
  7388. return ToContext.DeclarationNames.getCXXLiteralOperatorName(
  7389. Import(FromName.getCXXLiteralIdentifier()));
  7390. case DeclarationName::CXXUsingDirective:
  7391. // FIXME: STATICS!
  7392. return DeclarationName::getUsingDirectiveName();
  7393. }
  7394. llvm_unreachable("Invalid DeclarationName Kind!");
  7395. }
  7396. IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
  7397. if (!FromId)
  7398. return nullptr;
  7399. IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName());
  7400. if (!ToId->getBuiltinID() && FromId->getBuiltinID())
  7401. ToId->setBuiltinID(FromId->getBuiltinID());
  7402. return ToId;
  7403. }
  7404. Expected<Selector> ASTImporter::Import(Selector FromSel) {
  7405. if (FromSel.isNull())
  7406. return Selector{};
  7407. SmallVector<IdentifierInfo *, 4> Idents;
  7408. Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
  7409. for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
  7410. Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
  7411. return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
  7412. }
  7413. Expected<DeclarationName> ASTImporter::HandleNameConflict(DeclarationName Name,
  7414. DeclContext *DC,
  7415. unsigned IDNS,
  7416. NamedDecl **Decls,
  7417. unsigned NumDecls) {
  7418. if (ODRHandling == ODRHandlingType::Conservative)
  7419. // Report error at any name conflict.
  7420. return make_error<ImportError>(ImportError::NameConflict);
  7421. else
  7422. // Allow to create the new Decl with the same name.
  7423. return Name;
  7424. }
  7425. DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
  7426. if (LastDiagFromFrom)
  7427. ToContext.getDiagnostics().notePriorDiagnosticFrom(
  7428. FromContext.getDiagnostics());
  7429. LastDiagFromFrom = false;
  7430. return ToContext.getDiagnostics().Report(Loc, DiagID);
  7431. }
  7432. DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
  7433. if (!LastDiagFromFrom)
  7434. FromContext.getDiagnostics().notePriorDiagnosticFrom(
  7435. ToContext.getDiagnostics());
  7436. LastDiagFromFrom = true;
  7437. return FromContext.getDiagnostics().Report(Loc, DiagID);
  7438. }
  7439. void ASTImporter::CompleteDecl (Decl *D) {
  7440. if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
  7441. if (!ID->getDefinition())
  7442. ID->startDefinition();
  7443. }
  7444. else if (auto *PD = dyn_cast<ObjCProtocolDecl>(D)) {
  7445. if (!PD->getDefinition())
  7446. PD->startDefinition();
  7447. }
  7448. else if (auto *TD = dyn_cast<TagDecl>(D)) {
  7449. if (!TD->getDefinition() && !TD->isBeingDefined()) {
  7450. TD->startDefinition();
  7451. TD->setCompleteDefinition(true);
  7452. }
  7453. }
  7454. else {
  7455. assert(0 && "CompleteDecl called on a Decl that can't be completed");
  7456. }
  7457. }
  7458. Decl *ASTImporter::MapImported(Decl *From, Decl *To) {
  7459. llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(From);
  7460. assert((Pos == ImportedDecls.end() || Pos->second == To) &&
  7461. "Try to import an already imported Decl");
  7462. if (Pos != ImportedDecls.end())
  7463. return Pos->second;
  7464. ImportedDecls[From] = To;
  7465. // This mapping should be maintained only in this function. Therefore do not
  7466. // check for additional consistency.
  7467. ImportedFromDecls[To] = From;
  7468. AddToLookupTable(To);
  7469. return To;
  7470. }
  7471. llvm::Optional<ImportError>
  7472. ASTImporter::getImportDeclErrorIfAny(Decl *FromD) const {
  7473. auto Pos = ImportDeclErrors.find(FromD);
  7474. if (Pos != ImportDeclErrors.end())
  7475. return Pos->second;
  7476. else
  7477. return Optional<ImportError>();
  7478. }
  7479. void ASTImporter::setImportDeclError(Decl *From, ImportError Error) {
  7480. auto InsertRes = ImportDeclErrors.insert({From, Error});
  7481. (void)InsertRes;
  7482. // Either we set the error for the first time, or we already had set one and
  7483. // now we want to set the same error.
  7484. assert(InsertRes.second || InsertRes.first->second.Error == Error.Error);
  7485. }
  7486. bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
  7487. bool Complain) {
  7488. llvm::DenseMap<const Type *, const Type *>::iterator Pos =
  7489. ImportedTypes.find(From.getTypePtr());
  7490. if (Pos != ImportedTypes.end()) {
  7491. if (ExpectedType ToFromOrErr = Import(From)) {
  7492. if (ToContext.hasSameType(*ToFromOrErr, To))
  7493. return true;
  7494. } else {
  7495. llvm::consumeError(ToFromOrErr.takeError());
  7496. }
  7497. }
  7498. StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
  7499. getStructuralEquivalenceKind(*this), false,
  7500. Complain);
  7501. return Ctx.IsEquivalent(From, To);
  7502. }