ASTImporter.cpp 300 KB

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